Fetching at a Particular Level in a Set
Description
While fetching through the primary table of a set allows you to retrieve each composite record, you can also fetch only child or parent records from a specific level in the set.
Fetching Only Child Records
If the table object pointer for a fetch method is for a child table in a one-to-many link, only those child records related to the current parent record are retrieved. The <TBL>.FETCH_FIRST() and <TBL>.FETCH_LAST() methods retrieve the first and last related child records, and the <TBL>.FETCH_EOF() method returns TRUE if a <TBL>.FETCH_NEXT() or <TBL>.FETCH_PREV() method has tried to fetch beyond these related records.
For example, the following script counts the number of items related to the current invoice:
'Get pointer to primary table of invoice.set tbl = table.current() count = 0 'Get pointer to inv_item table in the set child_tbl = table.get("inv_item") child_tbl.fetch_first() while .NOT. child_tbl.fetch_eof() count = count + 1 child_tbl.fetch_next() end while trace.writeln(str(count) )
Fetching Only Parent Records With Fetch Outlining
When fetching through a set with one or more levels of one-to-many links, the number of child and grandchild records that pertain to each parent record can be numerous. This results in many composite records between each parent record.
For example, suppose a Customer table is linked one-to-many to the Inv_head table which, in turn, is linked one-to-many to the Inv_item table. The following script counts the total number of invoice line items for all customers:
tbl = table.current() count = 0 tbl.fetch_first() while .NOT. tbl.fetch_eof() count = count + 1 tbl.fetch_next() end while trace.writeln(str(count) )
This script fetches a composite record for each child record at the lowest level in the set (i.e., Inv_item ).
To fetch from one parent record to another without fetching through child records, assign the fetch outline level. The outline level indicates how far down in a set Alpha Anywhere will retrieve multiple child records.
Outline Levels
The record fetching behaves as if the one-to-many tables below the outline level do not exist. For example, the following script counts the number of customers by fetching with the outline level set to 1:
tbl = table.current() count = 0 outline_level = 1 tbl.fetch_first(outline_level) while .NOT. tbl.fetch_eof() count = count + 1 tbl.fetch_next(outline_level) end while trace.writeln(str(count) )
Changing the outline level to 2 computes the number of invoices for all customers. The SCANNING() function is also added to avoid counting customers with no invoices:
tbl = table.current() count = 0 outline_level = 2 tbl.fetch_first(outline_level) while .NOT. tbl.fetch_eof() if scanning("INV_HEAD") then count = count + 1 end if tbl.fetch_next(outline_level) end while trace.writeln(str(count) )
By using both an object pointer to a child table and the outline level setting, you can fetch through only the child records from a specific child table. For example, the following script counts only the number of invoices for the current customer:
tbl = table.current() count = 0 outline_level = 1 inv_head_pointer = tbl.GET("INV_HEAD") inv_head_pointer.fetch_first(outline_level) while .NOT. inv_head_pointer.fetch_eof() count = count + 1 inv_head_pointer.fetch_next(outline_level) end while trace.writeln(str(count) )
Assign the outline level to the level of the table containing the parent records you want to fetch. All one-to-many child and grandchild records of that parent are skipped. One-to-one child records related to the parent and/or related to any levels above the parent are fetched. Set the outline level to 0 (the default) to include all the tables in the set.
See Also