M[UMPS] Functions - $O[RDER]

Introduced in the 1984 ANSI M[UMPS] language standard.

This function returns information about other defined information in a data-structure, based on the collating sequence in use for that data-structure.

Assume that of global variable ^A the following elements exist (see diagram):

The code SET ID=-1 FOR K=1:1:25 SET ID=$ORDER(^A(ID)) will cause the following values to be assigned to the local variable ID:
"2", "3", "4", "34", "-5A", "5A", "A", "AB", "AD", "B", "", "-34", "-4", "-3", "-2", "2", "3", "4", "34", "-5A", "5A", "A", "AB", "AD" and "B".

Reference   Value
$ORDER(^A(-34))   -4
$ORDER(^A(34))   "-5A"
$ORDER(^A("B"))   ""
$ORDER(^A(3,1))   2
$ORDER(^A(3,10))   ""
$ORDER(^A(3,10,""))   3
$ORDER(^A(3,10,3))   ""
$ORDER(^A(-2))   2
$ORDER(^A("-5A"))   "5A"

Assume that a database contains a set of customer records, organized by name of customers

^Demog("AlphaName","BAKER")=988
^Demog("AlphaName","HUSKINS")=12345
^Demog("AlphaName","ROSSMAN")=123
^Demog("AlphaName","SHIMPACH")=345
^Demog("AlphaName","SOUTHERN")=876
^Demog("AlphaName","XANDER")=1098

In order to process only a specific sub-range of that data-set, code like the following segment could be considered:

Write "Enter first letter(s): " Read start
Set name=start,done=0,index="AlphaName"
For  Do  Quit:done
. Do:$Data(^Demog(index,name))
. . ; Process one customer
. . Quit
. Set name=$Order(^Demog(index,name))
. Set:$Extract(name,1,$Length(start)'=start done=1
. Quit

Of course, it is always possible that there are multiple customers with the same name, in which case it would make sense to organize the data as:

^Demog("AlphaName","BAKER",988)=""
^Demog("AlphaName","HUSKINS",12345)=""
^Demog("AlphaName","HUSKINS",12399)=""
^Demog("AlphaName","ROSSMAN",123)=""
^Demog("AlphaName","SHIMPACH",345)=""
^Demog("AlphaName","SOUTHERN",876)=""
^Demog("AlphaName","XANDER",106)=""
^Demog("AlphaName","XANDER",1098)=""

Note that in this structure all information is in the subscripts, and that the data-value, equal to empty strings for all elements, is really irrelevant.

To process a sub-set, code like the following segment could be used:

Write "Enter first letter(s): " Read start
Set name=start,done=0,index="AlphaName"
For  Do  Quit:done
. Set cust="" For  Do  Quit:cust=""
. . Set cust=$Order(^Demog(index,name,cust))
. . Quit:cust=""
. . ; Process one customer
. . Quit
. Set name=$Order(^Demog(index,name))
. Set:$Extract(name,1,$Length(start)'=start done=1
. Quit

Addition in the 1995 ANSI M[UMPS] language standard (reverse traversal):

Reference   Value
$ORDER(^A(3,1),1)   2
$ORDER(^A(3,10),1)   ""
$ORDER(^A(3,10,""),1)   3
$ORDER(^A(3,10,3),1)   ""
$ORDER(^A(3,1),-1)   ""
$ORDER(^A(3,10),-1)   2
$ORDER(^A(3,10,""),-1)   3
$ORDER(^A(""),-1)   "B"

Examples with naked references:

$ORDER(GLVN)
SET ^ABC(1,2)="reset naked indicator"
; Naked indicator is now ^ABC(1,
SET ^(3,4)=$ORDER(^(5,6))

; 1. fetch ^(5,6) = ^ABC(1,5,6)
; 2. store ^(3,4) = ^ABC(1,5,3,4)
; Naked indicator is now: ^ABC(1,5,3,


This document is © Ed de Moel, 1995-2005.
It is part of a book by Ed de Moel that is published under the title "M[UMPS] by Example" (ISBN 0-918118-42-5).
Printed copies of the book are no longer available.