|
|
#25 |
|
Участник
|
Отвечаю где у меня вызывается createErrorAdjustment. Вот весь метод:
<div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]protected[/color] [color=:blue]void[/color] updateReceiptAdjustmentTrans( InventTrans _receipt, CostAmount _adjustmentLater ) { InventSettlement settlementReceipt; InventSettlement settlementIssue; InventTrans issue; CostAmount allocateValue; InventQty allocateQty; CostAmount settleValue; CostAmount settleValueDec; CostAmount adjustment; CostAmount errorAmount; ; [color=:blue]if[/color] (this.inventModelGroup(inventCostList.ItemId).standardCost) { adjustment = Currency::amount(_receipt.costAmountStd) - Currency::amount(_receipt.costValue()); [color=:blue]if[/color] (adjustment != 0) _receipt.updateStdCostAdjust(adjustment,inventClosing.transDate,inventClosing.voucher,_receipt.dimensionF inancial()); } [color=:blue]if[/color] (_receipt.qty != 0 && _receipt.qtySettled > 0) { adjustment = Currency::amount((_receipt.costValue() - _adjustmentLater) / _receipt.qty * _receipt.qtySettled - _receipt.costAmountSettled); [color=:blue]if[/color] (adjustment && abs(adjustment) < inventClosing.MinTransferValue) { this.createErrorAdjustment(_receipt,-adjustment); adjustment = 0; } allocateQty = _receipt.qtySettled; allocateValue = adjustment; [color=:blue]if[/color] (allocateValue != 0) { [color=:blue]while[/color] [color=:blue]select[/color] forcePlaceholders [color=:blue]forceSelectOrder[/color] [color=:blue]forceNestedloop[/color] [color=:blue]forupdate[/color] #settlementFieldList [color=:blue]from[/color] settlementReceipt [color=:blue]index[/color] hint RecIdTypeIdx [color=:blue]where[/color] settlementReceipt.transRecId [color=:blue]==[/color] _receipt.recId && settlementReceipt.settleType [color=:blue]==[/color] InventSettleType::Receipt && settlementReceipt.inventTransId [color=:blue]==[/color] _receipt.inventTransId && settlementReceipt.InventTransCurrency_RU [color=:blue]==[/color] inventTransCurrency && settlementReceipt.cancelled [color=:blue]==[/color] 0 && settlementReceipt.qtySettled > 0 join [color=:blue]forupdate[/color] [color=:blue]firstOnly[/color] #settlementFieldList [color=:blue]from[/color] settlementIssue [color=:blue]index[/color] hint TransactionIdx [color=:blue]where[/color] settlementIssue.settleTransId [color=:blue]==[/color] settlementReceipt.settleTransId && settlementIssue.settleType [color=:blue]==[/color] InventSettleType::Issue && settlementReceipt.InventTransCurrency_RU [color=:blue]==[/color] inventTransCurrency && settlementIssue.cancelled [color=:blue]==[/color] 0 && settlementIssue.QtySettled < 0 { settleValueDec = settlementReceipt.qtySettled * adjustment / _receipt.qtySettled; settleValue = Currency::amount(settleValueDec); [color=:blue]if[/color] (abs(settleValueDec) < abs(settleValue)) settleValue += (settleValueDec > 0 [color=:blue]?[/color] -roundOffUnit : roundOffUnit); settleValue = abs(settleValue) > abs(allocateValue) [color=:blue]?[/color] allocateValue: settleValue; allocateQty -= settlementReceipt.qtySettled; allocateValue -= settleValue; [color=:blue]if[/color] (settleValue != 0) { [color=:blue]if[/color] (mapInventTrans && mapInventTrans.[color=:blue]exists[/color](settlementIssue.TransRecId)) issue = mapInventTrans.lookup(settlementIssue.TransRecId); [color=:blue]else[/color] issue = settlementIssue.inventTrans([color=:blue]true[/color]); [color=:blue]if[/color] (! issue.recId) { this.createErrorAdjustment(_receipt,-settleValue); } [color=:blue]else[/color] { [color=:blue]if[/color] (issue.costValue() - settleValue > 0) { errorAmount = issue.costValue() - settleValue; this.createErrorAdjustment(_receipt,errorAmount); settleValue -= errorAmount; } _receipt.costAmountSettled += settleValue; issue.costAmountSettled -= settleValue; issue.costAmountAdjustment -= settleValue; this.updateInventTrans(issue); [color=:blue]if[/color] (settlementReceipt.transDate [color=:blue]==[/color] inventClosing.transDate && settlementReceipt.voucher [color=:blue]==[/color] inventClosing.voucher) { settlementReceipt.costAmountSettled += settleValue; settlementReceipt.update(); settlementIssue.costAmountSettled -= settleValue; settlementIssue.costAmountAdjustment -= settleValue; settlementIssue.update(); } [color=:blue]else[/color] { this.updateSettlementReceipt(settlementReceipt,settleValue); this.updateSettlementIssue(settlementIssue,settleValue); } this.updateTrans(issue,-settleValue); } } [color=:blue]if[/color] (allocateQty [color=:blue]==[/color] 0) { [color=:blue]break[/color]; } } this.updateInventTrans(_receipt); [color=:blue]if[/color] (allocateValue != 0) this.createErrorAdjustment(_receipt,-allocateValue); } } [color=:blue]return[/color]; }</div> Так вот, в мною приведенном примере (см. приложение) в строчке: <div class='XPPtop'>X++</div><div class='XPP'> adjustment = Currency::amount((_receipt.costValue() - _adjustmentLater) / _receipt.qty * _receipt.qtySettled - _receipt.costAmountSettled);</div> расчитывается то самое: (1009,33/101)*39 - 389,7=0,04 и если вы заметили, то перестановка скобок (то что вы советовали), недает здесь эффекта. Потом процедура заходит в цикл и начинает вычислять ошибку по каждому сопоставлению: <div class='XPPtop'>X++</div><div class='XPP'> settleValueDec = settlementReceipt.qtySettled * adjustment / _receipt.qtySettled; settleValue = Currency::amount(settleValueDec);</div> а так как ошибка каждый раз меньше 0.005 то в этом куске: <div class='XPPtop'>X++</div><div class='XPP'> allocateQty -= settlementReceipt.qtySettled; allocateValue -= settleValue;</div> переменная allocateValue уменьшается каждый раз на 0. Т.е. учитываю что: <div class='XPPtop'>X++</div><div class='XPP'> allocateValue = adjustment;</div> она остается равной 0,04. Затем, при выходе из цикла мы видим последник строчки: <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]if[/color] (allocateValue != 0) this.createErrorAdjustment(_receipt,-allocateValue);</div> таким вот образом этот метод и делает корректировку прихода на 0,04 копейки!!! Появилась мысль: после закрытия склада, расщеплять проводки прихода, таким образом чтобы в новой проводке получившейся количество было равно сопоставленному количеству, а сумма равнялась сопоставленной сумме! Естественно что в другой проводке от соответствующих количеств и сумм, отнимать суммы и количества новой. Ну, чтобы общие суммы оставались правильными. Ну вобщем вы поняли, для того чтобы получилась одна закрытая проводка и одна открытая, и естественно в закрытой выставим ValueOpen=0 и дату закрытия Голова кипит.Как вы смотрите на такую идею? |
|
|