Thank you for your replies.
Tom, xrvorre (the orderline) is deleted at the end of processing it.
Code:
FIND xrvorre2 WHERE RECID(xrvorre2) = RECID(xrvorre) EXCLUSIVE-LOCK.
DELETE xrvorre2.
There is never any TRANSACTION defined except for the FOR EACH loop. I honestly do not know why, this is ancient coding made before I even worked here.
There are about 20 to maybe 30 programs run from the main-loop, all including the shared buffers I listed, but doing nothing but read the contents.
Another program does this:
Code:
FIND xrvor-b WHERE RECID(xrvor-b) = RECID(xrvor) EXCLUSIVE-LOCK.
ASSIGN xrvor-b.avoorvv = 0
xrvor-b.avoor = 0.
xrvor are the orders themselves.
We log the contents of xrvorre by just dumping it to file at the moment.
We found another interesting thing, it might be coincidence, maybe not.
I changed the FOR EACH loop to use local buffers (bxrvor, bxrvorre, defined as local buffers).
Code:
DEFINE BUFFER bxrvorre FOR xrvorre.
DEFINE BUFFER bxbfil FOR xbfil.
DEFINE BUFFER bxbkal FOR xbkal.
DEFINE BUFFER bxbjnb FOR xbjnb.
DEFINE BUFFER bxbpar FOR xbpar.
DEFINE BUFFER bxbdag FOR xbdag.
DEFINE BUFFER bmbdag FOR mbdag.
DEFINE BUFFER bxrvor FOR xrvor.
DEFINE BUFFER bxbbek FOR xbbek.
DEFINE BUFFER bxrvorve FOR xrvorve.
DEFINE BUFFER bxbval FOR xbval.
DEFINE BUFFER bafnemer FOR xbnaw.
DEFINE BUFFER blandafnemer FOR xblnd.
DEFINE BUFFER blandverzend FOR xblnd.
DEFINE BUFFER bbetaaldebiteur FOR xbnaw.
DEFINE BUFFER bxbafn FOR xbafn.
FOR bxbfil NO-LOCK
WHERE bxbfil.rbvnr EQ filreg#,
FIRST bxbkal NO-LOCK
WHERE bxbkal.rbvnr EQ bxbfil.cbasi
AND bxbkal.ddatu GE faktdate#,
FIRST bxbjnb NO-LOCK
WHERE bxbjnb.rbvnr EQ bxbfil.cbasi,
FIRST bxbpar NO-LOCK
WHERE bxbpar.rpara EQ "PARM",
FIRST bxbdag NO-LOCK
WHERE bxbdag.rbvnr EQ bxbfil.cbasi,
FIRST bmbdag NO-LOCK
WHERE bmbdag.rc_filbas EQ bxbfil.cbasi,
EACH wfvpref NO-LOCK
WHERE wfvpref.rc_regfil EQ bxbfil.rbvnr
AND wfvpref.rc_vpref GE rpreffr#
AND wfvpref.rc_vpref LE rprefto#
:
/* ----------------------------
TRANSACTIE PER FACTUUR
---------------------------- */
DO TRANSACTION:
FOR EACH bxrvor NO-LOCK
WHERE bxrvor.rbvnr EQ bxbfil.rbvnr
AND bxrvor.rpref EQ wfvpref.rc_vpref
AND bxrvor.rordn GE rordnfr#
AND bxrvor.rordn LE rordnto#
AND bxrvor.cverz GE cverzfr#
AND bxrvor.cverz LE cverzto#
AND bxrvor.rords GE rordsfr#
AND bxrvor.rords LE rordsto#
AND bxrvor.radrebd GE radrefr#
AND bxrvor.radrebd LE radreto#
AND (INT(bxrvor.fgere) + INT(fbalie#) NE 0)
AND bxrvor.fbusy EQ FALSE
AND bxrvor.fblok EQ FALSE
AND bxrvor.ffakt EQ TRUE
/* -----------------------------------------------------------------
CA 28906 Controle op verplichte controlestap ivm rechtsreekse orders
----------------------------------------------------------------m */
AND NOT CAN-FIND (FIRST xrvot
WHERE xrvot.rbvnr EQ filreg#
AND xrvot.rmodu EQ 'XV'
AND xrvot.rtras EQ 'VERK'
AND xrvot.rpref EQ bxrvor.rpref
AND xrvot.rordn EQ bxrvor.rordn
AND xrvot.fverp EQ TRUE
AND xrvot.fstap EQ FALSE
USE-INDEX xrvot)
,
FIRST bxbafn NO-LOCK
WHERE bxbafn.rbvnr EQ bxbfil.cbasi
AND bxbafn.radre EQ bxrvor.radrebd,
FIRST xbors NO-LOCK
WHERE xbors.rbvnr EQ bxbfil.cbasi
AND xbors.rords EQ bxrvor.rords
AND xbors.fexp EQ FALSE,
FIRST bxbbek NO-LOCK
WHERE bxbbek.rbvnr EQ bxbfil.cbasi
AND bxbbek.rbeta EQ bxrvor.rbeta,
FIRST bxrvorve NO-LOCK
OF bxrvor,
FIRST bxbval NO-LOCK
WHERE bxbval.rbvnr EQ bxbfil.cfina
AND bxbval.rvalu EQ bxrvor.rvalu,
FIRST bbetaaldebiteur NO-LOCK
WHERE bbetaaldebiteur.rbvnr EQ bxbfil.cbasi
AND bbetaaldebiteur.radrg EQ "AFNR"
AND bbetaaldebiteur.radre EQ bxrvor.radrebd
AND bbetaaldebiteur.qadre EQ 0,
FIRST bafnemer NO-LOCK
WHERE bafnemer.rbvnr EQ bxbfil.cbasi
AND bafnemer.radrg EQ "AFNR"
AND bafnemer.radre EQ bxrvor.radre
AND bafnemer.qadre EQ 0,
FIRST blandafnemer NO-LOCK
WHERE blandafnemer.rbvnr EQ bxbfil.cbasi
AND blandafnemer.rland EQ bafnemer.rland,
FIRST blandverzend NO-LOCK
WHERE blandverzend.rbvnr EQ bxbfil.cbasi
AND blandverzend.rland EQ bxrvorve.rland,
EACH bxrvorre OF bxrvor NO-LOCK
WHERE bxrvorre.cstatbe EQ "J"
OR bxrvorre.cstatte EQ "J"
OR bxrvorre.cstatko EQ "J"
OR bxrvorre.cstatem EQ "J"
OR (bxrvorre.cstatve EQ "J" AND bxrvorre.qfakt NE 0)
BREAK BY bxrvor.radrebd
BY bxrvor.radre
BY bxrvor.rbeta /* een betalingskonditie per faktuur */
BY bxrvor.rlandr /* een btw regime per faktuur */
BY bxrvor.rvalu /* een valuta per faktuur */
BY bxrvor.rklas /* een btwklasse per faktuur */
BY bbetaaldebiteur.radre
BY bxrvor.cverz /* CA 23012 */
BY bxrvor.rpref
BY bxrvor.rordn
BY bxrvorre.rrgln:
FIND xbfil WHERE ROWID(xbfil) = ROWID(bxbfil) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbfil THEN DO:
MESSAGE "xbfil niet gevonden." SKIP
"Sleutel:" bxbfil.rbvnr SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xbkal WHERE ROWID(xbkal) = ROWID(bxbkal) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbkal THEN DO:
MESSAGE "xbkal niet gevonden." SKIP
"Sleutel:" bxbkal.rbvnr bxbkal.ddatu SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xbjnb WHERE ROWID(xbjnb) = ROWID(bxbjnb) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbjnb THEN DO:
MESSAGE "xbjnb niet gevonden." SKIP
"Sleutel:" bxbjnb.rbvnr SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xbpar WHERE ROWID(xbpar) = ROWID(bxbpar) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbpar THEN DO:
MESSAGE "xbpar niet gevonden." SKIP
"Sleutel:" bxbpar.rpara SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xbdag WHERE ROWID(xbdag) = ROWID(bxbdag) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbdag THEN DO:
MESSAGE "xbdag niet gevonden." SKIP
"Sleutel:" bxbdag.rbvnr SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND mbdag WHERE ROWID(mbdag) = ROWID(bmbdag) NO-LOCK NO-ERROR.
IF NOT AVAILABLE mbdag THEN DO:
MESSAGE "mbdag niet gevonden." SKIP
"Sleutel:" bmbdag.rc_filbas SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xrvor WHERE ROWID(xrvor) = ROWID(bxrvor) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xrvor THEN DO:
MESSAGE "xrvor niet gevonden." SKIP
"Sleutel:" bxrvor.rbvnr bxrvor.rpref bxrvor.rordn SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xbbek WHERE ROWID(xbbek) = ROWID(bxbbek) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbbek THEN DO:
MESSAGE "xbbek niet gevonden." SKIP
"Sleutel:" bxbbek.rbvnr bxbbek.rbeta SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xrvorve WHERE ROWID(xrvorve) = ROWID(bxrvorve) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xrvorve THEN DO:
MESSAGE "xrvorve niet gevonden." SKIP
"Sleutel:" bxrvorve.rbvnr bxrvorve.rpref bxrvorve.rordn SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xbval WHERE ROWID(xbval) = ROWID(bxbval) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbval THEN DO:
MESSAGE "xbval niet gevonden." SKIP
"Sleutel:" bxbval.rbvnr bxbval.rvalu SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND afnemer WHERE ROWID(afnemer) = ROWID(bafnemer) NO-LOCK NO-ERROR.
IF NOT AVAILABLE afnemer THEN DO:
MESSAGE "afnemer (xbnaw) niet gevonden." SKIP
"Sleutel:" bafnemer.rbvnr bafnemer.radrg bafnemer.radre bafnemer.qadre SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND landafnemer WHERE ROWID(landafnemer) = ROWID(blandafnemer) NO-LOCK NO-ERROR.
IF NOT AVAILABLE landafnemer THEN DO:
MESSAGE "landafnemer (xblnd) niet gevonden." SKIP
"Sleutel:" blandafnemer.rbvnr blandafnemer.rland SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND landverzend WHERE ROWID(landverzend) = ROWID(blandverzend) NO-LOCK NO-ERROR.
IF NOT AVAILABLE landverzend THEN DO:
MESSAGE "landverzend (xblnd) niet gevonden." SKIP
"Sleutel:" blandverzend.rbvnr blandverzend.rland SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND betaaldebiteur WHERE ROWID(betaaldebiteur) = ROWID(bbetaaldebiteur) NO-LOCK NO-ERROR.
IF NOT AVAILABLE betaaldebiteur THEN DO:
MESSAGE "betaaldebiteur (xbnaw) niet gevonden." SKIP
"Sleutel:" bbetaaldebiteur.rbvnr bbetaaldebiteur.radrg bbetaaldebiteur.radre
bbetaaldebiteur.qadre SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xrvorre WHERE ROWID(xrvorre) = ROWID(bxrvorre) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xrvorre THEN DO:
MESSAGE "xrvorre niet gevonden." SKIP
"Sleutel:" bxrvorre.rbvnr bxrvorre.rpref bxrvorre.rordn bxrvorre.rrgln SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
FIND xbafn WHERE ROWID(xbafn) = ROWID(bxbafn) NO-LOCK NO-ERROR.
IF NOT AVAILABLE xbafn THEN DO:
MESSAGE "xbafn niet gevonden." SKIP
"Sleutel:" bxbafn.rbvnr bxbafn.radre SKIP(2)
"Waarschuw applicatiebeheer!"
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
UNDO, LEAVE.
END.
We write in a file some of the contents of the bxrvorre and after getting the (shared buffers) xrvorre we write that contents to file too.
It happens that the bxrvorre is correct, but the xrvorre is not. It is really weird.
@trx
I understand what you mean, but the last changes on the record we are discussing is in the afternoon, after that a few hours nothing. Late in the afternoon someone else starts invoicing and some of the records (1 or 2 per invoice run) are not correct.
Tom, my hunch are the shared buffers, but there is nothing to proof that. Also it is not clear why this is 'suddenly' happing. Therefore I was wondering if this could have anything to do with resources. But that would result in all kinds of errors in the .lg files.
@Tom
A rollback is not likely. What we see in the auditing files is this:
creation of the records.
Assigning the values
deleting of the records (with the correct contents).
That is all. My conclusion, based on auditing data, is that the correct record was deleted during invoicing. So why was it not processed with the correct contents?