Taking the following example code, I can an error when running "Must assign a user query to a data-source that is a join before filling" (11980)
I've tried changing the data source srcOrderLine to a query as well (on the tables ORDER_LINE and PRODUCT), but I then get all the orderline records in the database.
Must be doing something obvious and simple wrong?!
DEFINE TEMP-TABLE ttOrder LIKE order. DEFINE TEMP-TABLE ttOrderLine LIKE orderline FIELD ProductRef AS CHAR FIELD ProductDescription AS CHAR. DEFINE DATASET dsOrder FOR ttOrder, ttOrderLine DATA-RELATION OrderOrderLine FOR ttOrder, ttOrderLine RELATION-FIELDS (ttOrder.order_number, ttOrderLine.order_number). DEFINE QUERY qOrder FOR CUSTOMER, ORDER. DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder. DEFINE DATA-SOURCE srcOrderLine FOR ORDERLINE KEYS (ORDER_NUMBER), PRODUCT KEYS (PRODUCT_NUMBER). QUERY qOrder:QUERY-PREPARE("FOR EACH CUSTOMER WHERE CUSTOMER_REFERENCE = '1111111' NO-LOCK, " + "LAST ORDER OF CUSTOMER NO-LOCK"). BUFFER ttOrder:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrder:HANDLE). BUFFER ttOrderLine:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrderLine:HANDLE). DATASET dsOrder:FILL().
Child data sources need to be joined to the parent temp-table, ttOrder in this case. The prepare has to be done after the attach for this to be allowed.
---------
.
BUFFER ttOline:ATTACH-DATA-SOURCE(DATA-SOURCE srcOline:HANDLE). QUERY qOrderLine:QUERY-PREPARE("FOR EACH OrderLine OF ttOrder, " + "FIRST Item OF OrderLine")
DEFINE QUERY qOrder FOR CUSTOMER, ORDER.
DEFINE TEMP-TABLE ttOrder LIKE order.
DEFINE TEMP-TABLE ttOrderLine LIKE orderline
FIELD ProductRef AS CHAR
FIELD ProductDescription AS CHAR.
DEFINE DATA-SOURCE srcOrderLine FOR ORDERLINE KEYS (ORDER_NUMBER), PRODUCT KEYS (PRODUCT_NUMBER).
Elsworth Burmeister |
Developer - Managed Services |
Cell: +27 83 777 3072 Email: eburmeister@elcb.co.za |
|
ELCB Information Services (Pty) Ltd |
Customer Service Email elcb@elcb.co.za · www.elcb.co.za |
E A S T L O N D O N Tel: +27(43) 704 0700 Fax: +27(43) 704 0701 |
J O H A N N E S B U R G Tel: +27(11) 879 6179 Fax: +27(11) 454 0384 |
P O R T E L I Z A B E T H Tel: +27(41) 373 0529 Fax: +27(86) 650 0135 |
Taking the following example code, I can an error when running "Must assign a user query to a data-source that is a join before filling" (11980)
I've tried changing the data source srcOrderLine to a query as well (on the tables ORDER_LINE and PRODUCT), but I then get all the orderline records in the database.
Must be doing something obvious and simple wrong?!
DEFINE TEMP-TABLE ttOrder LIKE order.
DEFINE TEMP-TABLE ttOrderLine LIKE orderline
FIELD ProductRef AS CHAR
FIELD ProductDescription AS CHAR.
DEFINE DATASET dsOrder FOR ttOrder, ttOrderLine
DATA-RELATION OrderOrderLine FOR ttOrder, ttOrderLine
RELATION-FIELDS (ttOrder.order_number, ttOrderLine.order_number).
DEFINE QUERY qOrder FOR CUSTOMER, ORDER.
DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder.
DEFINE DATA-SOURCE srcOrderLine FOR ORDERLINE KEYS (ORDER_NUMBER), PRODUCT KEYS (PRODUCT_NUMBER).
QUERY qOrder:QUERY-PREPARE("FOR EACH CUSTOMER WHERE CUSTOMER_REFERENCE = '1111111' NO-LOCK, " +
"LAST ORDER OF CUSTOMER NO-LOCK").
BUFFER ttOrder:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrder:HANDLE).
BUFFER ttOrderLine:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrderLine:HANDLE).
DATASET dsOrder:FILL().
Flag this post as spam/abuse.
Thanks for the reply, but not sure that works for me.
Probably a better example (with a different error!) is against the sports 2000 database. Take the example below, which gives an error stating that "Must assign a user query to a data-source that is a join before filling" 11980
DEFINE TEMP-TABLE ttOrder LIKE-SEQUENTIAL Order FIELD OrderTotal AS DECIMAL FIELD CustName LIKE Customer.Name FIELD RepName LIKE SalesRep.RepName. DEFINE TEMP-TABLE ttOline LIKE-SEQUENTIAL OrderLine FIELD ItemName LIKE ITEM.ItemName FIELD Weight LIKE ITEM.Weight FIELD OnHand LIKE ITEM.OnHand FIELD OnOrder LIKE ITEM.OnOrder. DEFINE DATASET dsOrder FOR ttOrder, ttOline DATA-RELATION OrderToOrderLine FOR ttOrder, ttOline RELATION-FIELDS (OrderNum, OrderNum). DEFINE QUERY qOrder FOR Order, Customer, SalesRep. DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder Order KEYS (OrderNum), Customer KEYS (CustNum), SalesRep KEYS (SalesRep). DEFINE DATA-SOURCE srcOline FOR OrderLine KEYS (OrderNum), Item KEYS (ItemNum). QUERY qOrder:QUERY-PREPARE("FOR EACH Order WHERE Order.OrderNum = 1, " + "FIRST Customer OF Order, FIRST SalesRep OF Order"). BUFFER ttOrder:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrder:HANDLE, "Customer.Name,CustName"). BUFFER ttOline:ATTACH-DATA-SOURCE(DATA-SOURCE srcOline:HANDLE). DATASET dsOrder:FILL(). BUFFER ttOrder:DETACH-DATA-SOURCE(). BUFFER ttOline:DETACH-DATA-SOURCE().
So, replacing the second datasource to reference a query, but that gives an error 7327 (because I've referenced the order table), however, removing the reference to the order table means I get every order line the database;
DEFINE TEMP-TABLE ttOrder LIKE-SEQUENTIAL Order FIELD OrderTotal AS DECIMAL FIELD CustName LIKE Customer.Name FIELD RepName LIKE SalesRep.RepName. DEFINE TEMP-TABLE ttOline LIKE-SEQUENTIAL OrderLine FIELD ItemName LIKE ITEM.ItemName FIELD Weight LIKE ITEM.Weight FIELD OnHand LIKE ITEM.OnHand FIELD OnOrder LIKE ITEM.OnOrder. DEFINE DATASET dsOrder FOR ttOrder, ttOline DATA-RELATION OrderToOrderLine FOR ttOrder, ttOline RELATION-FIELDS (OrderNum, OrderNum). DEFINE QUERY qOrder FOR Order, Customer, SalesRep. DEFINE QUERY qOrderLine FOR OrderLine, ITEM. DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder Order KEYS (OrderNum), Customer KEYS (CustNum), SalesRep KEYS (SalesRep). DEFINE DATA-SOURCE srcOline FOR QUERY qOrderLine OrderLine KEYS (LineNum), ITEM KEYS (ItemNum). QUERY qOrder:QUERY-PREPARE("FOR EACH Order WHERE Order.OrderNum = 1, " + "FIRST Customer OF Order, FIRST SalesRep OF Order"). BUFFER ttOrder:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrder:HANDLE, "Customer.Name,CustName"). QUERY qOrderLine:QUERY-PREPARE("FOR EACH OrderLine OF Order, " + "FIRST Item OF OrderLine"). BUFFER ttOline:ATTACH-DATA-SOURCE(DATA-SOURCE srcOline:HANDLE). DATASET dsOrder:FILL(). BUFFER ttOrder:DETACH-DATA-SOURCE(). BUFFER ttOline:DETACH-DATA-SOURCE().
Child data sources need to be joined to the parent temp-table, ttOrder in this case. The prepare has to be done after the attach for this to be allowed.
---------
.
BUFFER ttOline:ATTACH-DATA-SOURCE(DATA-SOURCE srcOline:HANDLE). QUERY qOrderLine:QUERY-PREPARE("FOR EACH OrderLine OF ttOrder, " + "FIRST Item OF OrderLine")
This topic is being discussed in another thread. See
Thanks, does the trick. Was that in the documentation ?
Yes, the "ProDataSets, by John Sadd (Expert Series)" document discusses this in the "Defining a query on a child table" section.