DRAGON CITY  SYSTEMS

Vast Smalltalk Problems ( Bugs if you will :-)
Written July 2006

As I find more problem of interest I will post them here, they may in fact  not be bugs,  just misunderstandings of VAST and Smalltalk in general on my part so feel free to dismiss them or not as it pleases you :-)



1) Programmatically extracting data items from a ODBC results set.

What I wanted to do was access the resultsSet  of a MultiRowQuery programatically, ie: get the data and manipulate
by my own code. I was quite happy with using the standard generated form feature of MultiRowQuery to display this data
on the form.

I originally tried to do the example from the VAST DB users guide, Pages 28 - 29. Section "Displaying rows as strings"
only to find that it just did not work as described!.

Problems I encountered: ( note: I was using a different SQL table to the example)

So, after help from the VAST news group, I tried a few ideas, and achieved the desired results thus.

Wanted result:





The VAST Form setup:



You press the 'Load Diary' button, a MultiRowQuery  (MrQuery) executes some SQL code ( against a Intersystems Cache' DB using ODBC here), which displays the Grid via zestAllRecs resultSet 'tear off'. After the SQL code is sucessfully executed, an attached Method  (listItems ) then iterates over the resultSet (zestAllRecs) and forms the lines in the List Box. The connection between MrQuery & listItems is a event 'onQuerySuccessful', the connection from listItems and the ListBox is 'normal to items'
.
The result of  listItems is the same data untouched - its an exercise after all !


The SQL Query :

    Select ZestDiary.bookingDate, ZestDiary.bookingTime, ZestDiary.bookingDesc From ZestDiary.ZestDiary

The query is defined 'inside' MrQuery Properties.

( Note this is SQL for Cache'  , other SQL's will differ)

The method : listitems

listItems accesses the resultSet directly via code, ie: no VA connection lines are used on the form, the lable (name) of the resultsSet icon is used, ie: the subpartNamed 'zestAllRecs' in the below code.

!ZestDiary1 publicMethods !

listItems

" this code is attached to a SQL QUERY, if query is sucessfull this code is executes,
it traverses the RESULTS TABLE of the SQL QUERY
and forms a OrderedCollection of Strings ( each string contains 3 fields )

Note: 'zestAllRecs' is a resultSet of the SQL Query

The collection is displayed in a list box on a form.
"
| items address rows rec |

items := OrderedCollection new.

((self subpartNamed: 'zestAllRecs')
valueOfAttributeNamed: #rows selector: #'IS_rows')
do: [:each |
each isNil ifFalse: [
address := (each at: 'bookingDate') asString, ', ',
(each at: 'bookingTime') asString, ', ',
( each at: 'bookingDesc').
items add: address.
] ].

^items. ! !


Summary:

The problem appeared to be that the published code expected to be accessing 
instance(s) of AbtQueryResultTable (actually
AbtMultiRowResultTable or AbtSingleRowResultTable 
however the actual  instance  was '<something>ofRows, quite different. Marten Feldtmann's posting kindly showed how to find out just what instance type I was actually trying the process
by executing this code :  (self subpartNamed: 'zestAllRecs') inspect.   ( or something similar) inside listItems.