Direct access to a global without SQL
Hi everyone,
I have this global with 2 informations in it: Reference (ex: 1329) and Code (ex: JMMK-G1D6).
^DataTest = 3
^DataTest(1) = $lb("","1329","JMMK-G1D6")
^DataTest(2) = $lb("","1516","AMEV-GVPF")
^DataTest(3) = $lb("","2333","4QC6-4HW3")
With ObjectScript, i want to test if Reference 1516 exists in the global.
In the InterSystems portal, i can do it with SQL (SELECT count(*) FROM DataTest where Reference = '1516'), but can we do the same in ObjectScript without SQL and manipulating the global directly ?
Thanks for help.
@maxime keltsma
You can traverse the entire global with a loop and $Order function.
A simple routine to traverse your global can be:
Teste Set ^DataTest = 3 Set ^DataTest(1) = $lb("","1329","JMMK-G1D6") Set ^DataTest(2) = $lb("","1516","AMEV-GVPF") Set ^DataTest(3) = $lb("","2333","4QC6-4HW3") Set key = "" // Print the header filds Write "Reference", $Char(9), "Code" , ! For { // first parameter is global and key, // second parameter opredr to travers globa. 1 = ascending subscript order (the default) or –1 = descending // third is target that receives the value if the key is defined Set key = $Order(^DataTest(key), 1, data) If (key = "") { Quit // Exit for loop } Set reference = $ListGet(data, 2) Set code = $ListGet(data, 3) // Write reference, $Char(9), code, ! }
Output o execution:
> Reference Code
> 1329 JMMK-G1D6
> 1516 AMEV-GVPF
> 2333 4QC6-4HW3
See Using Globals Object Script Tutorial , $Order Function for more examples e details.
Set Found=0 Set Id="" For { Set Id=$order(^DataTest(Id)) Quit:Id="" If $listget(^DataTest(Id),2)=1516 { Set Found=1 Quit } } If Found Write "Found 1516 in Id: ",Id,!
So, there's 2 ways to read this, either we want an "exists" check, or following the SQL, we want a count of all instances. This snippet can be set to do either case based on the existscheck boolean. Ideally though, you would have an index defined, and this could be read much more efficiently than having to scan an entire global
set count=0 set existscheck=0 //Set to 1 if we only want to find first instance set targetValue=1329 set key = "" for { set key = $ORDER(^DataTest(key)) quit:key="" if targetvalue = +$LG(^DataTest(key),2) do $INCREMENT(count) quit:existscheck&&count } w !,"Count value is "_count
couple of options:
1. $order the global checking the list content as others have already mentioned
2. if there is a SQLIndex defined for the field. You can check the index location directly via objectscript, this would save you ordering through possibly billions of lines of data
3. define the SQL column to for Reference to use columnar storage, also single global retrieve to get a $list of rowids.