In answer to the "Why?" questions...

Assume you have a generic "Person" record, and now you want to treat this "Person" as a "Doctor" record where Doctor is an Extension of Person. When the Person record was created, it was not known that this represented person was a going to be doctor record at some point in the future. The person record was created, properties set to values, and saved, linked referenced (i.e. "used" as a Person record). Now at some point later, there is a need to make a "Doctor" record out of this "Person" record. Since anything you could do with/to a Person record can be done with a Doctor record and Doctor only adds functionality (and possibly overriding methods), creating a "new" Doctor record and then replicating data values will not update any references to the "Person" record (and may not even be identifiable from just the Person record to begin with), but morphing that instance of a Person into an instance of a Doctor will preserve all of the references that might exist while enabling the new properties and methods of a Doctor.


I created a callable ZenMethod function that allows me to pass in the table component ID, the SQL Table name and the Row ID, that will jump the table to the correct page and row to match the ID passed in.

Method jumpTable(componentID as %String, tableName As %String, id As %String, pageSize As %Integer) [ ZenMethod ]
  set SQLtxt = "SELECT *, CEILING(%vid/"_pageSize_") PageNum, {fn MOD(%vid,"_pageSize_")} RelRowId FROM ( SELECT ID FROM "_tableName_") WHERE ID = "_id
  set sql1 = ##class(%ResultSet).%New()
  do sql1.Prepare(SQLtxt)
  do sql1.Execute()
  while sql1.Next() {
    set page = sql1.Get("PageNum")
    set row = sql1.Get("RelRowId")
  set Table = %page.%GetComponentById(componentID)
  set Table.selectedIndex = (row-1)
  set Table.currPage = page

This then can be used for any table on any zen page.


My problem is that my table (which *is* filled via an SQL) can have multiple pages of "displayed sub-sets" (i.e. the Page Size of the table, controlled by the Table Navigator), and when I launch the page directly with an instance ID passed by URL value, I can load the form, but I don't see anyway to figure out which page and which row to "jump to" and "select" programmatically. (my use case is relatively simple, as I don't have any client side filters or sorting that is done, just a "result set being displayed"

This may well have been the issue, "File full" tripped complete journaling off and subsequent save fail "undo" was failing to rollback. This makes sense. Thanks

This of course run smack up against "what is being required" of system admins by security departments compared to ACTUAL security. Never confuse useful with required.

Knowing how to force the "less secure, but mandated" patterns is really what my question was about.

Using a coding is sometimes more appropriate for logic readability over expressing and executing a query.


Hi -

I see my problem, I was being over sensitive to the feedback in the wizard ("Package Contains Invalid Dot Syntax"), and had I just continued with the rest of the "sub-package" naming, everything would have worked fine.

Getting closer...


OK, So I've created my "new template", but I do not see ANY place where ANY of these templates are callable (my new one or any of the shipped ones). There is nothing I can see in any of the "help" files that indicate where or how these templates are called in any context.

I'm clearly missing a step or connection someplace...

How do I actually USE a new template? (my new thing isn't showing up on the "Templates" list, even after cycling Atelier)

Hi Joyce -

That SOUNDS good, but I don't have a "Preferences" menu anyplace (this is running on Windoze)... and there doesn't seem to be anything like your describing (at least not that I have found yet)