Exercise 5: First Lookup Class
Click here to return to the exercise description in the main part of the tutorial.
-
Using VS Code - ObjectScript, create a new class. Use ObjectScript for the package name and Lookup1 for the class name. You'll see this code:
Class ObjectScript.Lookup1 { }
-
Within the {}, write the Main() method.
Class ObjectScript.Lookup1 { /// main loop section, dispatch to different methods based on user input ClassMethod Main() { while ..GetInput(.type, .search) { if (type = "help") { do ..Help() } elseif (type = "dob") { do ..DOB(search) } } } }
-
Next, write the GetInput() method.
Class ObjectScript.Lookup1 { /// prompt user for a lookup string, return search type and search string ClassMethod GetInput(output type as %String, output search as %String) as %Boolean { read !, "Lookup: ", lookup return:(lookup = "") 0 // user entered nothing so return FALSE if (lookup = "?") { set type = "help", search = "" } elseif (##class(ObjectScript.DataEntry4).ValidDOB(lookup, .convdate)) { set type = "dob", search = convdate } else { set (type, search) = "" } return 1 } }
-
Next, write the Help() method.
Class ObjectScript.Lookup1 { /// display lookup options ClassMethod Help() { write !, "You can enter:", !?10, "* date of birth", ! } }
-
Next, write the DOB() method, which takes the internal DOB as an argument. It starts by using $Data on ^PersonI("DOB", intdob) to see if the internal date of birth exists in the global; notice the single quote (negation) before $Data. If there are matches, the $Order loop finds all the IDs for that date of birth, starting at the beginning (set id = ""), and continuing until the end (quit:(id = "")). It also numbers the matches using For.
Class ObjectScript.Lookup1 { /// exact date of birth lookup ClassMethod DOB(intdob as %Date) { // is the date of birth in the index? if '$data(^PersonI("DOB", intdob) ) { write "...no matches" quit } write "...finding birthday matches" // loop through IDs, and number them set id = "" for count = 1:1 { set id = $order(^PersonI("DOB", intdob, id)) quit:(id = "") write !, count, ") " do ..DisplayLine(id) } } }
-
Last, write the DisplayLine() method, which is similar to Display() from ObjectScript.DataEntry4.
Class ObjectScript.Lookup1 { //// given an ID, retrieve data and write it on a line ClassMethod DisplayLine(id as %Integer) { set $listbuild(name, phone, intdob) = ^PersonD(id) /* the line above is equivalent to set answers = ^PersonD(id), name = $list(answers, 1), phone = $list(answers, 2), intdob = $list(answers, 3) */ write name, ?20, phone, ?35, $zdate(intdob, 2) } }
-
Click the Save and Compile buttons.
-
Start the Terminal, and run your method, by typing do ##class(ObjectScript.Lookup1).Main().