Kbase P169591: 4GL/ABL: Errors (7328) & (11876) generated invoking the QUERY-PREPARE( ) method on a prodataset chi
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  10/03/2011 |
|
Status: Verified
SYMPTOM(s):
4GL/ABL: Errors (7328) & (11876) generated invoking the QUERY-PREPARE( ) method on a ProDataSet child query.
<database name> <buffer name> <field name> must be a quoted constant or an unabbreviated, unambiguous buffer/field reference for buffers known to query <name>. (7328)
FILL of buffer <name> with user-supplied query requires that the query be QUERY-PREPARED. (11876)
ttCustomer Custnnum must be a quoted constant or an unabbreviated, unambiguous buffer/field reference for buffers known to query . (7328)
FILL of buffer ttOrder with user-supplied query requires that the query be QUERY-PREPARED. (11876)
The errors (7328) & (11876) are generated by code building a ProDataSet child buffer DATA-SOURCE query that references the parent buffer.
In the following sample code, error (7328) is generated by the statement: qOrder:QUERY-PREPARE (cOrderQueryString). And eerror (11876) is generated by the statement: DATASET dsCustomerOrder:FILL(). This last statement fails as a consequence of the first error:
DEFINE VARIABLE qCustomer AS HANDLE NO-UNDO.
DEFINE VARIABLE qOrder AS HANDLE NO-UNDO.
DEFINE VARIABLE bCustomer AS HANDLE NO-UNDO.
DEFINE VARIABLE bOrder AS HANDLE NO-UNDO.
DEFINE VARIABLE srCustomer AS HANDLE NO-UNDO.
DEFINE VARIABLE srOrder AS HANDLE NO-UNDO.
DEFINE VARIABLE cCustomerQueryString AS CHARACTER NO-UNDO.
DEFINE VARIABLE cOrderQueryString AS CHARACTER NO-UNDO.
/* Create prodataset object */
DEFINE TEMP-TABLE ttCustomer LIKE Customer.
DEFINE TEMP-TABLE ttOrder LIKE Order.
DEFINE DATASET dsCustomerOrder FOR ttCustomer, ttOrder
DATA-RELATION drCustomerOrder FOR ttCustomer, ttOrder
RELATION-FIELDS (Custnum,Custnum).
/* Create Customer Query */
CREATE QUERY qCustomer.
qCustomer:ADD-BUFFER(BUFFER Customer:handle).
cCustomerQueryString = "FOR EACH Customer NO-LOCK".
CREATE DATA-SOURCE srCustomer.
srCustomer:QUERY = qCustomer.
BUFFER ttCustomer:HANDLE:ATTACH-DATA-SOURCE(srCustomer).
qCustomer:QUERY-PREPARE (cCustomerQueryString).
/* Create Order Query */
CREATE QUERY qOrder.
qOrder:ADD-BUFFER(BUFFER Order:handle).
cOrderQueryString = "FOR EACH Order NO-LOCK WHERE Order.Custnum = ttCustomer.Custnum AND ttCustomer.CreditLimit > 10000 AND ttCustomer.Country = 'FRANCE'".
CREATE DATA-SOURCE srOrder.
srOrder:QUERY = qOrder.
qOrder:QUERY-PREPARE (cOrderQueryString).
BUFFER ttOrder:HANDLE:ATTACH-DATA-SOURCE(srOrder).
DATASET dsCustomerOrder:FILL().
FACT(s) (Environment):
OpenEdge 10.x
All Supported Operating Systems
CAUSE:
Error (7328) is generated because the QUERY-PREPARE method was invoked before the DATA-SOURCE was attached to the child buffer handle 'BUFFER ttOrder:HANDLE' .
Error (11876) is generated as a consequence of the first error. That is because the QUERY-PREPARE method invocation failed.
FIX:
Attache the DATA-SOURCE to the child buffer handle before invoking QUERY-PREPARE. Simply place the statement: BUFFER ttOrder:HANDLE:ATTACH-DATA-SOURCE(srOrder). before the statement: qOrder:QUERY-PREPARE (cOrderQueryString).
DEFINE VARIABLE qCustomer AS HANDLE NO-UNDO.
DEFINE VARIABLE qOrder AS HANDLE NO-UNDO.
DEFINE VARIABLE bCustomer AS HANDLE NO-UNDO.
DEFINE VARIABLE bOrder AS HANDLE NO-UNDO.
DEFINE VARIABLE srCustomer AS HANDLE NO-UNDO.
DEFINE VARIABLE srOrder AS HANDLE NO-UNDO.
DEFINE VARIABLE cCustomerQueryString AS CHARACTER NO-UNDO.
DEFINE VARIABLE cOrderQueryString AS CHARACTER NO-UNDO.
/* Create prodataset object */
DEFINE TEMP-TABLE ttCustomer LIKE Customer.
DEFINE TEMP-TABLE ttOrder LIKE Order.
DEFINE DATASET dsCustomerOrder FOR ttCustomer, ttOrder
DATA-RELATION drCustomerOrder FOR ttCustomer, ttOrder
RELATION-FIELDS (Custnum,Custnum).
/* Create Customer Query */
CREATE QUERY qCustomer.
qCustomer:ADD-BUFFER(BUFFER Customer:handle).
cCustomerQueryString = "FOR EACH Customer NO-LOCK".
CREATE DATA-SOURCE srCustomer.
srCustomer:QUERY = qCustomer.
BUFFER ttCustomer:HANDLE:ATTACH-DATA-SOURCE(srCustomer).
qCustomer:QUERY-PREPARE (cCustomerQueryString).
/* Create Order Query */
CREATE QUERY qOrder.
qOrder:ADD-BUFFER(BUFFER Order:handle).
cOrderQueryString = "FOR EACH Order NO-LOCK WHERE Order.Custnum = ttCustomer.Custnum AND ttCustomer.CreditLimit > 10000 AND ttCustomer.Country = 'FRANCE'".
CREATE DATA-SOURCE srOrder.
srOrder:QUERY = qOrder.
BUFFER ttOrder:HANDLE:ATTACH-DATA-SOURCE(srOrder).
qOrder:QUERY-PREPARE (cOrderQueryString).
DATASET dsCustomerOrder:FILL().