Consultor Eletrônico



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().