親子関係に関連する5つのテーブルがあります。table1 -> table2->table3->table4->table5 のように、ここで矢印は親から子への関係を示します。prodataset in progress 4GL を使用してこれらの関連テーブルからレコードを取得するにはどうすればよいですか? このシナリオのクエリを定義するにはどうすればよいですか?
3710 次
1 に答える
0
1 つのテーブルが結合された例を次に示します。FIRST 形式を使用して cQuery にテーブルを追加するだけです。
ASSIGN
cQuery = "FOR EACH table1 NO-LOCK ":U
+ " WHERE table1.product_obj = ":U + QUOTER(cProduct)
+ " AND table1.role_obj = ":U + QUOTER(cRole)
+ " ,FIRST table2 NO-LOCK ":U
+ " WHERE table2.criterion_obj = table1.criterion_obj":U.
hQuery:SET-BUFFERS(BUFFER table1:HANDLE, BUFFER table2:HANDLE).
hQuery:QUERY-PREPARE(cQuery) NO-ERROR.
hQuery:QUERY-OPEN() NO-ERROR.
hQuery:GET-FIRST() NO-ERROR.
DO WHILE NOT hQuery:QUERY-OFF-END:
<put logic here>
hQuery:GET-NEXT() NO-ERROR.
END.
============
ProDataSet の場合、一時テーブルを定義してから ProDataSet を作成する必要があります
マニュアルの例:
DEFINE TEMP-TABLE ttOrder LIKE Order
FIELD OrderTotal AS DECIMAL
FIELD CustName LIKE Customer.NAME
FIELD RepName LIKE SalesRep.RepName.
DEFINE TEMP-TABLE ttOline LIKE OrderLine.
DEFINE TEMP-TABLE ttItem
FIELD ItemNum LIKE ITEM.ItemNum
FIELD ItemName LIKE ITEM.ItemName
FIELD Price LIKE ITEM.Price
FIELD Weight LIKE ITEM.Weight
FIELD OnHand LIKE ITEM.OnHand
FIELD OnOrder LIKE ITEM.OnOrder.
DEFINE DATASET dsOrder FOR ttOrder, ttOline, ttItem
DATA-RELATION OrderLine FOR ttOrder, ttOline
RELATION-FIELDS (OrderNum, OrderNum)
DATA-RELATION LineItem FOR ttOline, ttItem
RELATION-FIELDS (ItemNum, ItemNum).
DEFINE VARIABLE hDSOrder AS HANDLE NO-UNDO.
hDSOrder = DATASET dsOrder:HANDLE.
DEFINE QUERY qOrder FOR Order, Customer, SalesRep.
DEFINE QUERY qItem FOR ITEM.
DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder
Order KEYS (OrderNum), Customer KEYS (CustNum), SalesRep KEYS (SalesRep).
DEFINE DATA-SOURCE srcOline FOR OrderLine.
DEFINE DATA-SOURCE srcItem FOR QUERY qItem ITEM KEYS (ItemNum).
BUFFER ttOrder:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrder:HANDLE,
"Customer.Name,CustName").
BUFFER ttOline:ATTACH-DATA-SOURCE(DATA-SOURCE srcOline:HANDLE).
BUFFER ttItem:ATTACH-DATA-SOURCE(DATA-SOURCE srcItem:HANDLE).
QUERY qOrder:QUERY-PREPARE("FOR EACH Order WHERE Order.OrderNum = 1, " +
"FIRST Customer OF Order, FIRST SalesRep OF Order"). /* setup query to fill
dataset */
hDSOrder:FILL(). /* fill the ProDataSet as a whole */
于 2013-10-29T11:05:35.257 に答える