How to catch errors using triggers

jdrouil

New Member
The easiest way is to replace a qad function with a wrapper program that runs the vanilla qad program. But, before running the qad function, you can set triggers based on activity that will follow in the qad function.

Here is an example.

/*program xxsbpap.p - replaces arsbpap.p in the menu*/

{mfdeclre.i}
DEF var tmp-hdl AS handle NO-UNDO.
DEF var billto LIKE ad_addr NO-UNDO.
DEF var trans_nbr LIKE sbi_xmission NO-UNDO.
DEF var selfbill LIKE sbi_nbr NO-UNDO.
DEF var sb_recid AS RECID NO-UNDO.
DEF var ar_recid AS RECID NO-UNDO.
DEF var ws-total AS decimal NO-UNDO.
{xxcmhcr1.i}
/* RETRIEVE THE SELF-BILL RECORD, SELF-BILL NUMBER AND BILL-TO TO STORE */
ON go anywhere
DO:
IF focus:frame-name eq "a" AND
CAN-DO("bill_to,transmission_nbr,selfbill_nbr", focus:name) THEN
DO:

ASSIGN billto = ""
trans_nbr = ""
selfbill = ""
sb_recid = ?
tmp-hdl = FOCUS.
FOR EACH t-err:
DELETE t-err.
END.
DO WHILE tmp-hdl ne ?:
IF tmp-hdl:name eq "bill_to" THEN
billto = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "transmission_nbr" THEN
trans_nbr = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "selfbill_nbr" THEN
selfbill = tmp-hdl:screen-value.
tmp-hdl = tmp-hdl:prev-sibling.
END.
IF billto eq "" OR trans_nbr eq "" OR selfbill eq "" THEN
DO:
tmp-hdl = FOCUS.
DO WHILE tmp-hdl ne ?:
IF tmp-hdl:name eq "bill_to" THEN
billto = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "transmission_nbr" THEN
trans_nbr = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "selfbill_nbr" THEN
selfbill = tmp-hdl:screen-value.
tmp-hdl = tmp-hdl:next-sibling.
END.
END.
FIND FIRST sbi_mstr
WHERE sbi_bill = billto AND sbi_nbr = selfbill
NO-ERROR.
IF AVAILABLE sbi_mstr THEN
DO: /*Penny Rounding Issue*/
/*message 'aaa1-'. pause.*/
ASSIGN
ws-total = 0.
FOR EACH sbid_det WHERE sbid_bill = sbi_bill
AND sbid_nbr = sbi_nbr:
ASSIGN
sbid_amt = round(sbid_amt,2)
ws-total = ws-total + sbid_amt.
.
FIND FIRST six_ref WHERE six_trnbr = sbid_trnbr.
ASSIGN
six_amt = round(six_amt,2).
END.
ASSIGN
sbi_amt = ws-total
sbi_ctrl_amt = ws-total
sb_recid = RECID(sbi_mstr).
END.
END.
END.

ON WRITE OF ard_det /*This is where you insert edits or
supplemental table updates.*/

DO:
FIND ih_hist NO-LOCK WHERE ih_inv_nbr eq ard_ref NO-ERROR.
FIND sbi_mstr NO-LOCK WHERE RECID(sbi_mstr) eq sb_recid NO-ERROR.
FIND ar_mstr NO-LOCK WHERE ar_nbr eq ard_nbr NO-ERROR.


assign ard_amt = round(ard_amt,2).

IF NOT AVAILABLE sbi_mstr OR NOT AVAILABLE ar_mstr OR NOT AVAILABLE ih_hist
THEN
RETURN.


END.


{gprun.i ""arsbpap.p""}
 

jdrouil

New Member
The easiest way is to replace a qad function with a wrapper program that runs the vanilla qad program. But, before running the qad function, you can set triggers based on activity that will follow in the qad function.

Here is an example of a QAD trigger program wrapper.

/*program xxsbpap.p - replaces arsbpap.p in the menu*/

{mfdeclre.i}
DEF var tmp-hdl AS handle NO-UNDO.
DEF var billto LIKE ad_addr NO-UNDO.
DEF var trans_nbr LIKE sbi_xmission NO-UNDO.
DEF var selfbill LIKE sbi_nbr NO-UNDO.
DEF var sb_recid AS RECID NO-UNDO.
DEF var ar_recid AS RECID NO-UNDO.
DEF var ws-total AS decimal NO-UNDO.
{xxcmhcr1.i}
/* RETRIEVE THE SELF-BILL RECORD, SELF-BILL NUMBER AND BILL-TO TO STORE */
ON go anywhere
DO:
IF focus:frame-name eq "a" AND
CAN-DO("bill_to,transmission_nbr,selfbill_nbr", focus:name) THEN
DO:

ASSIGN billto = ""
trans_nbr = ""
selfbill = ""
sb_recid = ?
tmp-hdl = FOCUS.
FOR EACH t-err:
DELETE t-err.
END.
DO WHILE tmp-hdl ne ?:
IF tmp-hdl:name eq "bill_to" THEN
billto = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "transmission_nbr" THEN
trans_nbr = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "selfbill_nbr" THEN
selfbill = tmp-hdl:screen-value.
tmp-hdl = tmp-hdl:prev-sibling.
END.
IF billto eq "" OR trans_nbr eq "" OR selfbill eq "" THEN
DO:
tmp-hdl = FOCUS.
DO WHILE tmp-hdl ne ?:
IF tmp-hdl:name eq "bill_to" THEN
billto = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "transmission_nbr" THEN
trans_nbr = tmp-hdl:screen-value.
ELSE
IF tmp-hdl:name eq "selfbill_nbr" THEN
selfbill = tmp-hdl:screen-value.
tmp-hdl = tmp-hdl:next-sibling.
END.
END.
FIND FIRST sbi_mstr
WHERE sbi_bill = billto AND sbi_nbr = selfbill
NO-ERROR.
IF AVAILABLE sbi_mstr THEN
DO: /*Penny Rounding Issue*/
/*message 'aaa1-'. pause.*/
ASSIGN
ws-total = 0.
FOR EACH sbid_det WHERE sbid_bill = sbi_bill
AND sbid_nbr = sbi_nbr:
ASSIGN
sbid_amt = round(sbid_amt,2)
ws-total = ws-total + sbid_amt.
.
FIND FIRST six_ref WHERE six_trnbr = sbid_trnbr.
ASSIGN
six_amt = round(six_amt,2).
END.
ASSIGN
sbi_amt = ws-total
sbi_ctrl_amt = ws-total
sb_recid = RECID(sbi_mstr).
END.
END.
END.

ON WRITE OF ard_det /*This is where you insert edits or
supplemental table updates.*/

DO:
FIND ih_hist NO-LOCK WHERE ih_inv_nbr eq ard_ref NO-ERROR.
FIND sbi_mstr NO-LOCK WHERE RECID(sbi_mstr) eq sb_recid NO-ERROR.
FIND ar_mstr NO-LOCK WHERE ar_nbr eq ard_nbr NO-ERROR.


assign ard_amt = round(ard_amt,2).

IF NOT AVAILABLE sbi_mstr OR NOT AVAILABLE ar_mstr OR NOT AVAILABLE ih_hist
THEN
RETURN.


END.


{gprun.i ""arsbpap.p""}

Hope this helps!
Joe Drouillard www.avenue-systems.com
 
Top