我最近修改了默认报表207销售发票并创建了自定义报表。我有一个请求是显示当前发票所涵盖的每个货件的发票上的货件信息。特别是我需要显示以下值:
标准报告仅显示已过帐的发货日期和数量,仅显示一个货件(我相信它是最后一个)。它没有显示“出货号”。
在进行必要的更改时,我遇到了一些问题,很难找到有关findPostedShipmentDate()
函数的任何信息,因此我决定在此处发布我的解决方案。
问题是:
答案 0 :(得分:1)
在函数"Sales Invoice Line"::OnAfterGetRecord()
中调用函数findPostedShipmentDate()
。此功能执行多次检查以查找过账日期,并在必要时调用填写表“SalesShipmentBuffer”的函数GenerateBufferFromValueEntry()
,该表临时存储当前“销售发票行”记录的所有货件信息:
CASE "Sales Invoice Line".Type OF
"Sales Invoice Line".Type::Item:
GenerateBufferFromValueEntry("Sales Invoice Line");
...
之后,它会对缓冲区表执行多次检查,并再次删除这些条目(稍后会详细介绍)。
在GenerateBufferFromValueEntry
中发生以下情况。实际的货件信息存储在ItemLedgerEntry
(32)表中,为了找到正确的行,使用了ValueEntry
(5802)表,其中包含正确的密钥(ValueEntry."Item Ledger Entry No."
)。
除了现有的范围过滤器,我还需要添加一行来限制Item No.
的范围,我不得不删除Entry No.
的范围过滤器。我还修改了函数AddBufferEntry
,以便另外从交货单中获取包含ItemLedgerEntry."Document No."
的{{1}}。这是完整的代码:
Shipment No.
在TotalQuantity := SalesInvoiceLine2."Quantity (Base)";
ValueEntry.SETCURRENTKEY("Document No.");
ValueEntry.SETRANGE("Document No.",SalesInvoiceLine2."Document No.");
ValueEntry.SETRANGE("Posting Date","Sales Invoice Header"."Posting Date");
ValueEntry.SETRANGE(ValueEntry."Item No.", "Sales Invoice Line"."No."); //Added
ValueEntry.SETRANGE("Item Charge No.",'');
//ValueEntry.SETFILTER("Entry No.",'%1..',FirstValueEntryNo); //Removed
IF ValueEntry.FIND('-') THEN BEGIN
REPEAT
IF ItemLedgerEntry.GET(ValueEntry."Item Ledger Entry No.") THEN BEGIN
IF SalesInvoiceLine2."Qty. per Unit of Measure" <> 0 THEN
Quantity := ValueEntry."Invoiced Quantity" /
SalesInvoiceLine2."Qty. per Unit of Measure"
ELSE
Quantity := ValueEntry."Invoiced Quantity";
AddBufferEntry(
SalesInvoiceLine2,
-Quantity,
ItemLedgerEntry."Posting Date",
ItemLedgerEntry."Document No."); //Added
TotalQuantity := TotalQuantity + ValueEntry."Invoiced Quantity";
END;
FirstValueEntryNo := ValueEntry."Entry No." + 1;
UNTIL (ValueEntry.NEXT = 0) OR (TotalQuantity = 0);
END;
函数中,我还删除了前几行,以防止函数在FindPostedShipmentDate
填充之前退出:
SalesShipmentBuffer
在IF "Sales Invoice Line"."Shipment No." <> '' THEN
IF SalesShipmentHeader.GET("Sales Invoice Line"."Shipment No.") THEN
EXIT(SalesShipmentHeader."Posting Date");
IF "Sales Invoice Header"."Order No."='' THEN
EXIT("Sales Invoice Header"."Posting Date");
的最后一部分,FindPostedShipmentDate
的记录再次被删除,一开始看起来有点奇怪(它对我有用)。原因是即使在调用SalesShipmentBuffer
和DELETE
函数之后,记录变量也会在调用这些函数之前保留存储在记录中的值。因此,结果是DELETEALL
表被清除,因此对于SalesShipmentBuffer
函数的下一次运行它是空的,但是值仍然可以在报告中使用。另一个令人困惑的部分是,实际上做了一件非常简单的事情,看起来非常复杂。如果缓冲区只包含一行,则删除该行,否则如果它包含多行,则首先计算所有数量字段的总和,然后删除所有行。
无论如何,我只需要进行一次更改,即删除以下行,因为findPostedShipmentDate()
字段现在包含货件编号而不是发票编号< / em>的
Document No.
以下是其余代码:
SalesShipmentBuffer.SETRANGE("Document No.","Sales Invoice Line"."Document No.");
就是这样。现在我只需要修改DataItem源条目以在报告上显示必要的字段。 我必须做的更改实际上并没有那么多,但代码根本没有记录,当我搜索此问题或涉及的功能时,我找不到太多信息。所以我希望我的帖子有用,以防有人遇到类似的问题。
一方面没有,我不明白为什么上面的代码段是用这样的连线编写的,为什么,我相信(虽然我还没有验证过),它可以简化为下面的代码,这是更多可读。如果您认为我的分析错误,请留下评论。
SalesShipmentBuffer.SETRANGE("Line No." ,"Sales Invoice Line"."Line No.");
SalesShipmentBuffer.SETRANGE("No." ,"Sales Invoice Line"."No.");
IF SalesShipmentBuffer.FIND('-') THEN BEGIN
SalesShipmentBuffer2 := SalesShipmentBuffer;
IF SalesShipmentBuffer.NEXT = 0 THEN BEGIN
SalesShipmentBuffer.GET(
SalesShipmentBuffer2."Document No.",
SalesShipmentBuffer2."Line No.",
SalesShipmentBuffer2."Entry No."
);
SalesShipmentBuffer.DELETE;
EXIT(SalesShipmentBuffer2."Posting Date");
END ;
SalesShipmentBuffer.CALCSUMS(Quantity);
IF SalesShipmentBuffer.Quantity <> "Sales Invoice Line".Quantity THEN BEGIN
SalesShipmentBuffer.DELETEALL;
EXIT("Sales Invoice Header"."Posting Date");
END;
END ELSE
EXIT("Sales Invoice Header"."Posting Date");