lcCurOrderNo = Order_List.cordno SELECT vitems lcCurOrder = ORDER('vitems') SET ORDER TO TAG ordkey IN vitems SCAN FOR vitems.clordno = Order_List.cordno lcTableBckQty = OldVal('nbackqty', 'vitems') lcBufferedBckQty = vitems.nbackqty lnDeltaBckQty = lcBufferedBckQty - lcTableBckQty lcTabledBackRec = OldVal('dbackrec', 'vitems') lcBufferdBbackRec = vitems.dbackrec lnDeltadBackRec = Int(Val(Dtos(lcBufferdBbackRec))) ; - Int(Val(Dtos(lcTabledBackRec))) More calcualtion and CASE statement CASE lcBufferedRecQty = 0 AND lnDeltadBackRec <> 0 lnOnHandQty = lcBufferedBckQty lnOnOrderQty = lcBufferedBckQty llBufferedVCmpFlg = IIF( lcBufferedBckQty = lnOrdered , .T. , .F.) More case statments and and other wise statement setting above to zero and .F. IF lnOnHandQty <> 0 && update on hand qty, on order qty, and completion flag RLOCK('instock') && make sure on order and on hand quantities are NEVER less than 0 lnOnOrd = IIF(instock.nonord - lnOnHandQty * lnConvFac >= 0 , ; instock.nonord - lnOnHandQty * lnConvFac , 0 ) lnQty = IIF(instock.nqty + lnOnOrderQty * lnConvFac >= 0 , ; instock.nqty + lnOnOrderQty * lnConvFac , 0 ) REPLACE ; instock.nonord WITH lnOnOrd, ; instock.nqty WITH lnQty, ; instock.ddatestamp WITH DATE(), ; instock.ctimestamp WITH TIME() ; IN instock TABLEUPDATE(0,.T.,'instock') && save changes since table is buffereed UNLOCK IN instock IF llBufferedVCmpFlg <> llTableVCmpFlg && update completion flag in vitems RLOCK('vitems') REPLACE vitems.lvCmpFlg WITH llBufferedVCmpFlg ; IN vitems TABLEUPDATE(0,.T.,'vitems') && save changes since table is buffereed UNLOCK IN vitems ENDIF ENDIF ENDSCANYour RLOCK(... function calls **can** return .F. and you have made no allowance for that.