web
You’re offline. This is a read only version of the page.
close
Skip to main content

Announcements

No record found.

News and Announcements icon
Community site session details

Community site session details

Session Id :
Small and medium business | Business Central, N...
Suggested Answer

Display item tracking info (lot/serial no.) on invoice – Word layout

(9) ShareShare
ReportReport
Posted on by 18
Hi everyone,
 
I'm currently customizing the Word layout for sales invoices in Business Central (standard report 1306 – Sales - Invoice), and I need to display item tracking information (specifically lot numbers or serial numbers) directly on the invoice, underneath each related item line.
I have access to the Word layout through report layout customization, but I don’t see any tracking fields in the XML mapping pane (no Lot No., Serial No., etc.).
I assume these fields are not included in the default dataset.
Has anyone done this before?
  • Do I need to create a reportextension to add Tracking Specification data to the dataset?
  • If so, how do I link tracking lines to the invoice lines?
  • Is there any simpler workaround to get this info into the Word layout?
Thanks a lot in advance for your help! 
I have the same question (1)
  • Suggested answer
    Khushbu Rajvi. Profile Picture
    22,132 Super User 2026 Season 1 on at
  • Suggested answer
    YUN ZHU Profile Picture
    99,090 Super User 2026 Season 1 on at
    You can refer to report 208 "Sales - Shipment", which is a standard function.
     
    Thanks.
    ZHU
  • Suggested answer
    Jainam M. Kothari Profile Picture
    15,805 Super User 2026 Season 1 on at
  • NW-04021233-0 Profile Picture
    2 on at
    Hey
    Did anyone find a solution for this 
     

    i got the solution for any one else who would want  email me
        
        dataset
        {
            dataitem(Header; "Sales Invoice Header")
            {
                DataItemTableView = sorting("No.");
                RequestFilterFields = "No.", "Sell-to Customer No.", "No. Printed";
                RequestFilterHeading = 'Posted Sales Invoice';
                column(CompanyAddress1; CompanyAddr[1])
                {
                }
                column(CompanyAddress2; CompanyAddr[2])
                {
                }
                column(CompanyAddress3; CompanyAddr[3])
                {
                }
                column(CompanyAddress4; CompanyAddr[4])
                {
                }
                column(CompanyAddress5; CompanyAddr[5])
                {
                }
                column(CompanyAddress6; CompanyAddr[6])
                {
                }
                column(CompanyAddress7; CompanyAddr[7])
                {
                }
                column(CompanyAddress8; CompanyAddr[8])
                {
                }
                column(CompanyHomePage; CompanyInfo."Home Page")
                {
                }
                column(CompanyEMail; CompanyInfo."E-Mail")
                {
                }
                column(CompanyPicture; DummyCompanyInfo.Picture)
                {
                }
                column(CompanyPhoneNo; CompanyInfo."Phone No.")
                {
                }
                column(CompanyPhoneNo_Lbl; CompanyInfoPhoneNoLbl)
                {
                }
                column(CompanyGiroNo; CompanyInfo."Giro No.")
                {
                }
                column(CompanyGiroNo_Lbl; CompanyInfoGiroNoLbl)
                {
                }
                column(CompanyBankName; CompanyBankAccount.Name)
                {
                }
                column(CompanyBankName_Lbl; CompanyInfoBankNameLbl)
                {
                }
                column(CompanyBankBranchNo; CompanyBankAccount."Bank Branch No.")
                {
                }
                column(CompanyBankBranchNo_Lbl; CompanyBankAccount.FieldCaption("Bank Branch No."))
                {
                }
                column(CompanyBankAccountNo; CompanyBankAccount."Bank Account No.")
                {
                }
                column(CompanyBankAccountNo_Lbl; CompanyInfoBankAccNoLbl)
                {
                }
                column(CompanyIBAN; CompanyBankAccount.IBAN)
                {
                }
                column(CompanyIBAN_Lbl; CompanyBankAccount.FieldCaption(IBAN))
                {
                }
                column(CompanySWIFT; CompanyBankAccount."SWIFT Code")
                {
                }
                column(CompanySWIFT_Lbl; CompanyBankAccount.FieldCaption("SWIFT Code"))
                {
                }
                column(CompanyLogoPosition; CompanyLogoPosition)
                {
                }
                column(CompanyRegistrationNumber; CompanyInfo.GetRegistrationNumber())
                {
                }
                column(CompanyRegistrationNumber_Lbl; CompanyInfo.GetRegistrationNumberLbl())
                {
                }
                column(CompanyVATRegNo; CompanyInfo.GetVATRegistrationNumber())
                {
                }
                column(CompanyVATRegNo_Lbl; CompanyInfo.GetVATRegistrationNumberLbl())
                {
                }
                column(CompanyVATRegistrationNo; CompanyInfo.GetVATRegistrationNumber())
                {
                }
                column(CompanyVATRegistrationNo_Lbl; CompanyInfo.GetVATRegistrationNumberLbl())
                {
                }
                column(CompanyLegalOffice; LegalOfficeTxt)
                {
                }
                column(CompanyLegalOffice_Lbl; LegalOfficeLbl)
                {
                }
                column(CompanyCustomGiro; CustomGiroTxt)
                {
                }
                column(CompanyCustomGiro_Lbl; CustomGiroLbl)
                {
                }
                column(CompanyLegalStatement; LegalStatementLbl)
                {
                }
                column(DisplayAdditionalFeeNote; DisplayAdditionalFeeNote)
                {
                }
                column(CustomerAddress1; CustAddr[1])
                {
                }
                column(CustomerAddress2; CustAddr[2])
                {
                }
                column(CustomerAddress3; CustAddr[3])
                {
                }
                column(CustomerAddress4; CustAddr[4])
                {
                }
                column(CustomerAddress5; CustAddr[5])
                {
                }
                column(CustomerAddress6; CustAddr[6])
                {
                }
                column(CustomerAddress7; CustAddr[7])
                {
                }
                column(CustomerAddress8; CustAddr[8])
                {
                }
                column(CustomerPostalBarCode; FormatAddr.PostalBarCode(1))
                {
                }
                column(YourReference; "Your Reference")
                {
                }
                column(YourReference_Lbl; FieldCaption("Your Reference"))
                {
                }
                column(ShipmentMethodDescription; ShipmentMethod.Description)
                {
                }
                column(ShipmentMethodDescription_Lbl; ShptMethodDescLbl)
                {
                }
                column(ShipmentDate; Format("Shipment Date", 0, 4))
                {
                }
                column(ShipmentDate_Lbl; FieldCaption("Shipment Date"))
                {
                }
                column(Shipment_Lbl; ShipmentLbl)
                {
                }
                column(ShowShippingAddress; ShowShippingAddr)
                {
                }
                column(ShipToAddress_Lbl; ShiptoAddrLbl)
                {
                }
                column(ShipToAddress1; ShipToAddr[1])
                {
                }
                column(ShipToAddress2; ShipToAddr[2])
                {
                }
                column(ShipToAddress3; ShipToAddr[3])
                {
                }
                column(ShipToAddress4; ShipToAddr[4])
                {
                }
                column(ShipToAddress5; ShipToAddr[5])
                {
                }
                column(ShipToAddress6; ShipToAddr[6])
                {
                }
                column(ShipToAddress7; ShipToAddr[7])
                {
                }
                column(ShipToAddress8; ShipToAddr[8])
                {
                }
                column(ShipToPhoneNo; Header."Ship-to Phone No.")
                {
                }
                column(SellToContactPhoneNoLbl; SellToContactPhoneNoLbl)
                {
                }
                column(SellToContactMobilePhoneNoLbl; SellToContactMobilePhoneNoLbl)
                {
                }
                column(SellToContactEmailLbl; SellToContactEmailLbl)
                {
                }
                column(BillToContactPhoneNoLbl; BillToContactPhoneNoLbl)
                {
                }
                column(BillToContactMobilePhoneNoLbl; BillToContactMobilePhoneNoLbl)
                {
                }
                column(BillToContactEmailLbl; BillToContactEmailLbl)
                {
                }
                column(SellToContactPhoneNo; SellToContact."Phone No.")
                {
                }
                column(SellToContactMobilePhoneNo; SellToContact."Mobile Phone No.")
                {
                }
                column(SellToContactEmail; SellToContact."E-Mail")
                {
                }
                column(BillToContactPhoneNo; BillToContact."Phone No.")
                {
                }
                column(BillToContactMobilePhoneNo; BillToContact."Mobile Phone No.")
                {
                }
                column(BillToContactEmail; BillToContact."E-Mail")
                {
                }
                column(PaymentTermsDescription; PaymentTerms.Description)
                {
                }
                column(PaymentTermsDescription_Lbl; PaymentTermsDescLbl)
                {
                }
                column(PaymentMethodDescription; PaymentMethod.Description)
                {
                }
                column(PaymentMethodDescription_Lbl; PaymentMethodDescLbl)
                {
                }
                column(BilltoCustumerNo; "Bill-to Customer No.")
                {
                }
                column(BilltoCustomerNo_Lbl; FieldCaption("Bill-to Customer No."))
                {
                }
                column(DocumentDate; Format("Document Date", 0, 4))
                {
                }
                column(DocumentDate_Lbl; FieldCaption("Document Date"))
                {
                }
                column(DueDate; Format("Due Date", 0, 4))
                {
                }
                column(DueDate_Lbl; FieldCaption("Due Date"))
                {
                }
                //mynie this
                column(ShowLotSN_Option; ShowLotSN) { }
                column(DocumentNo; "No.")
                {
                }
                column(DocumentNo_Lbl; InvNoLbl)
                {
                }
                column(OrderNo; "Order No.")
                {
                }
                column(OrderNo_Lbl; FieldCaption("Order No."))
                {
                }
                column(PricesIncludingVAT; "Prices Including VAT")
                {
                }
                column(PricesIncludingVAT_Lbl; FieldCaption("Prices Including VAT"))
                {
                }
                column(PricesIncludingVATYesNo; Format("Prices Including VAT"))
                {
                }
                column(SalesPerson_Lbl; SalespersonLbl)
                {
                }
                column(SalesPersonBlank_Lbl; SalesPersonText)
                {
                }
                column(SalesPersonName; SalespersonPurchaser.Name)
                {
                }
                column(SelltoCustomerNo; "Sell-to Customer No.")
                {
                }
                column(SelltoCustomerNo_Lbl; FieldCaption("Sell-to Customer No."))
                {
                }
                column(VATRegistrationNo; GetCustomerVATRegistrationNumber())
                {
                }
                column(VATRegistrationNo_Lbl; GetCustomerVATRegistrationNumberLbl())
                {
                }
                column(GlobalLocationNumber; GetCustomerGlobalLocationNumber())
                {
                }
                column(GlobalLocationNumber_Lbl; GetCustomerGlobalLocationNumberLbl())
                {
                }
                column(SellToFaxNo; GetSellToCustomerFaxNo())
                {
                }
                column(SellToPhoneNo; "Sell-to Phone No.")
                {
                }
                column(PaymentReference; GetPaymentReference())
                {
                }
                column(From_Lbl; FromLbl)
                {
                }
                column(BilledTo_Lbl; BilledToLbl)
                {
                }
                column(ChecksPayable_Lbl; ChecksPayableText)
                {
                }
                column(PaymentReference_Lbl; GetPaymentReferenceLbl())
                {
                }
                column(LegalEntityType; Cust.GetLegalEntityType())
                {
                }
                column(LegalEntityType_Lbl; Cust.GetLegalEntityTypeLbl())
                {
                }
                column(Copy_Lbl; CopyLbl)
                {
                }
                column(EMail_Header_Lbl; EMailLbl)
                {
                }
                column(HomePage_Header_Lbl; HomePageLbl)
                {
                }
                column(InvoiceDiscountBaseAmount_Lbl; InvDiscBaseAmtLbl)
                {
                }
                column(InvoiceDiscountAmount_Lbl; InvDiscountAmtLbl)
                {
                }
                column(LineAmountAfterInvoiceDiscount_Lbl; LineAmtAfterInvDiscLbl)
                {
                }
                column(LocalCurrency_Lbl; LocalCurrencyLbl)
                {
                }
                column(ExchangeRateAsText; ExchangeRateText)
                {
                }
                column(Page_Lbl; PageLbl)
                {
                }
                column(SalesInvoiceLineDiscount_Lbl; SalesInvLineDiscLbl)
                {
                }
                column(Questions_Lbl; QuestionsLbl)
                {
                }
                column(Contact_Lbl; CompanyInfo.GetContactUsText())
                {
                }
                column(DocumentTitle_Lbl; DocumentCaption())
                {
                }
                column(YourDocumentTitle_Lbl; YourSalesInvoiceLbl)
                {
                }
                column(Thanks_Lbl; ThanksLbl)
                {
                }
                column(ShowWorkDescription; ShowWorkDescription)
                {
                }
                column(RemainingAmount; RemainingAmount)
                {
                }
                column(RemainingAmountText; RemainingAmountTxt)
                {
                }
                column(Subtotal_Lbl; SubtotalLbl)
                {
                }
                column(Total_Lbl; TotalLbl)
                {
                }
                column(VATAmount_Lbl; VATAmtLbl)
                {
                }
                column(VATBase_Lbl; VATBaseLbl)
                {
                }
                column(VATAmountSpecification_Lbl; VATAmtSpecificationLbl)
                {
                }
                column(VATClauses_Lbl; VATClausesLbl)
                {
                }
                column(VATIdentifier_Lbl; VATIdentifierLbl)
                {
                }
                column(VATPercentage_Lbl; VATPercentageLbl)
                {
                }
                column(VATClause_Lbl; VATClause.TableCaption())
                {
                }
                column(PackageTrackingNo; "Package Tracking No.")
                {
                }
                column(PackageTrackingNo_Lbl; FieldCaption("Package Tracking No."))
                {
                }
                column(ShippingAgentCode; "Shipping Agent Code")
                {
                }
                column(ShippingAgentCode_Lbl; FieldCaption("Shipping Agent Code"))
                {
                }
                column(PaymentInstructions_Txt; PaymentInstructionsTxt)
                {
                }
                column(ExternalDocumentNo; "External Document No.")
                {
                }
                column(ExternalDocumentNo_Lbl; FieldCaption("External Document No."))
                {
                }
                dataitem(Line; "Sales Invoice Line")
                {
                    DataItemLink = "Document No." = field("No.");
                    DataItemLinkReference = Header;
                    DataItemTableView = sorting("Document No.", "Line No.");
                    column(LineNo_Line; "Line No.")
                    {
                    }
                    column(AmountExcludingVAT_Line; Amount)
                    {
                        AutoFormatExpression = GetCurrencyCode();
                        AutoFormatType = 1;
                    }
                    column(AmountExcludingVAT_Line_Lbl; FieldCaption(Amount))
                    {
                    }
                    column(AmountIncludingVAT_Line; "Amount Including VAT")
                    {
                        AutoFormatExpression = GetCurrencyCode();
                        AutoFormatType = 1;
                    }
                    column(AmountIncludingVAT_Line_Lbl; FieldCaption("Amount Including VAT"))
                    {
                        AutoFormatExpression = GetCurrencyCode();
                        AutoFormatType = 1;
                    }
                    column(Description_Line; Description)
                    {
                    }
                    column(Description_Line_Lbl; FieldCaption(Description))
                    {
                    }
                    column(LineDiscountPercent_Line; "Line Discount %")
                    {
                    }
                    column(LineDiscountPercentText_Line; LineDiscountPctText)
                    {
                    }
                    column(LineAmount_Line; FormattedLineAmount)
                    {
                        AutoFormatExpression = GetCurrencyCode();
                        AutoFormatType = 1;
                    }
                    column(LineAmount_Line_Lbl; FieldCaption("Line Amount"))
                    {
                    }
                    column(ItemNo_Line; "No.")
                    {
                    }
                    column(ItemNo_Line_Lbl; FieldCaption("No."))
                    {
                    }
                    column(ItemReferenceNo_Line; "Item Reference No.")
                    {
                    }
                    column(ItemReferenceNo_Line_Lbl; FieldCaption("Item Reference No."))
                    {
                    }
                    column(ShipmentDate_Line; Format("Shipment Date"))
                    {
                    }
                    column(ShipmentDate_Line_Lbl; PostedShipmentDateLbl)
                    {
                    }
                    column(Quantity_Line; FormattedQuantity)
                    {
                    }
                    column(Quantity_Line_Lbl; FieldCaption(Quantity))
                    {
                    }
                    column(Type_Line; Format(Type))
                    {
                    }
                    column(UnitPrice; FormattedUnitPrice)
                    {
                        AutoFormatExpression = GetCurrencyCode();
                        AutoFormatType = 2;
                    }
                    column(UnitPrice_Lbl; FieldCaption("Unit Price"))
                    {
                    }
                    column(UnitOfMeasure; "Unit of Measure")
                    {
                    }
                    column(UnitOfMeasure_Lbl; FieldCaption("Unit of Measure"))
                    {
                    }
                    column(VATIdentifier_Line; "VAT Identifier")
                    {
                    }
                    column(VATIdentifier_Line_Lbl; FieldCaption("VAT Identifier"))
                    {
                    }
                    column(VATPct_Line; FormattedVATPct)
                    {
                    }
                    column(VATPct_Line_Lbl; FieldCaption("VAT %"))
                    {
                    }
                    column(TransHeaderAmount; TransHeaderAmount)
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(JobTaskNo_Lbl; JobTaskNoLbl)
                    {
                    }
                    column(JobTaskNo; JobTaskNo)
                    {
                    }
                    column(JobTaskDescription; JobTaskDescription)
                    {
                    }
                    column(JobTaskDesc_Lbl; JobTaskDescLbl)
                    {
                    }
                    column(JobNo_Lbl; JobNoLbl)
                    {
                    }
                    column(JobNo; JobNo)
                    {
                    }
                    column(Unit_Lbl; UnitLbl)
                    {
                    }
                    column(Qty_Lbl; QtyLbl)
                    {
                    }
                    column(Price_Lbl; PriceLbl)
                    {
                    }
                    column(PricePer_Lbl; PricePerLbl)
                    {
                    }
                         dataitem(ShipmentLine; "Sales Shipment Buffer")
                    {
                        DataItemTableView = sorting("Document No.", "Line No.", "Entry No.");
                        UseTemporary = true;
                        column(DocumentNo_ShipmentLine; "Document No.")
                        {
                        }
                        column(PostingDate_ShipmentLine; Format("Posting Date"))
                        {
                        }
                        column(PostingDate_ShipmentLine_Lbl; FieldCaption("Posting Date"))
                        {
                        }
                        column(Quantity_ShipmentLine; Quantity)
                        {
                            DecimalPlaces = 0 : 5;
                        }
                        column(Quantity_ShipmentLine_Lbl; FieldCaption(Quantity))
                        {
                        }
                        trigger OnPreDataItem()
                        begin
                            if not DisplayShipmentInformation then
                                CurrReport.Break();
                            SetRange("Line No.", Line."Line No.");
                        end;
                    }
                    dataitem(ValueEntry; "Value Entry")
                {
                    DataItemLink =
                        "Document No." = field("Document No."),
                        "Document Line No." = field("Line No.");
                        DataItemLinkReference = Line;
                    DataItemTableView = where(
                        "Document Type" = const("Sales Invoice"),
                        "Invoiced Quantity" = filter(<> 0),
                        "Item Ledger Entry No." = filter(<> 0)
                    );
                    dataitem(ItemLedgerEntry; "Item Ledger Entry")
                    {
                        DataItemLink =
                            "Entry No." = field("Item Ledger Entry No.");
                            DataItemLinkReference = ValueEntry;
                        
                        column(ItemNo; "Item No.") { }
                        column(Description;Description) { }
                        column(LotNo; "Lot No.") { }
                        column(ExpirationDate; "Expiration Date") { }
                        column(TrackingQty; Quantity) { }
                    }
                    trigger OnPreDataItem()
                    begin
                        if not ShowLotSN then
                            CurrReport.Break();
                    end;
                    }
                    dataitem(AssemblyLine; "Posted Assembly Line")
                    {
                        DataItemTableView = sorting("Document No.", "Line No.");
                        UseTemporary = true;
                        column(LineNo_AssemblyLine; "No.")
                        {
                        }
                        column(Description_AssemblyLine; Description)
                        {
                        }
                        column(Quantity_AssemblyLine; Quantity)
                        {
                            DecimalPlaces = 0 : 5;
                        }
                        column(UnitOfMeasure_AssemblyLine; GetUOMText("Unit of Measure Code"))
                        {
                        }
                        column(VariantCode_AssemblyLine; "Variant Code")
                        {
                        }
                        trigger OnPreDataItem()
                        var
                            ValueEntry: Record "Value Entry";
                        begin
                            Clear(AssemblyLine);
                            if not DisplayAssemblyInformation then
                                CurrReport.Break();
                            GetAssemblyLinesForDocument(
                              AssemblyLine, ValueEntry."Document Type"::"Sales Invoice", Line."Document No.", Line."Line No.");
                        end;
                    }
                    trigger OnAfterGetRecord()
                    begin
                        InitializeShipmentLine();
                        if Type = Type::"G/L Account" then
                            "No." := '';
                        OnBeforeLineOnAfterGetRecord(Header, Line);
                        if "Line Discount %" = 0 then
                            LineDiscountPctText := ''
                        else
                            LineDiscountPctText := StrSubstNo('%1%', -Round("Line Discount %", 0.1));
                        InsertVATAmountLine(VATAmountLine, Line);
                        TransHeaderAmount += PrevLineAmount;
                        PrevLineAmount := "Line Amount";
                        TotalSubTotal += "Line Amount";
                        TotalInvDiscAmount -= "Inv. Discount Amount";
                        TotalAmount += Amount;
                        TotalAmountVAT += "Amount Including VAT" - Amount;
                        TotalAmountInclVAT += "Amount Including VAT";
                        TotalPaymentDiscOnVAT += -("Line Amount" - "Inv. Discount Amount" - "Amount Including VAT");
                        if FormatDocument.HideDocumentLine(HideLinesWithZeroQuantity, Line, FieldNo(Quantity)) then
                            CurrReport.Skip();
                        if FirstLineHasBeenOutput then
                            Clear(DummyCompanyInfo.Picture);
                        FirstLineHasBeenOutput := true;
                        JobNo := "Job No.";
                        JobTaskNo := "Job Task No.";
                        if JobTaskNo <> '' then begin
                            JobTaskNoLbl := JobTaskNoLbl2;
                            JobTaskDescription := GetJobTaskDescription(JobNo, JobTaskNo);
                        end else begin
                            JobTaskDescription := '';
                            JobTaskNoLbl := '';
                        end;
                        if JobNo <> '' then
                            JobNoLbl := JobNoLbl2
                        else
                            JobNoLbl := '';
                        FormatLineValues(Line);
                    end;
                    trigger OnPreDataItem()
                    begin
                        VATAmountLine.DeleteAll();
                        VATClauseLine.DeleteAll();
                        ShipmentLine.Reset();
                        ShipmentLine.DeleteAll();
                        MoreLines := Find('+');
                        while MoreLines and (Description = '') and ("No." = '') and (Quantity = 0) and (Amount = 0) do
                            MoreLines := Next(-1) <> 0;
                        if not MoreLines then
                            CurrReport.Break();
                        SetRange("Line No.", 0, "Line No.");
                        TransHeaderAmount := 0;
                        PrevLineAmount := 0;
                        FirstLineHasBeenOutput := false;
                        DummyCompanyInfo.Picture := CompanyInfo.Picture;
                        OnAfterLineOnPreDataItem(Header, Line);
                    end;
                }
                dataitem(WorkDescriptionLines; "Integer")
                {
                    DataItemTableView = sorting(Number) where(Number = filter(1 .. 99999));
                    column(WorkDescriptionLineNumber; Number)
                    {
                    }
                    column(WorkDescriptionLine; WorkDescriptionLine)
                    {
                    }
                    trigger OnAfterGetRecord()
                    var
                        TypeHelper: Codeunit "Type Helper";
                    begin
                        if WorkDescriptionInstream.EOS then
                            CurrReport.Break();
                        WorkDescriptionLine := TypeHelper.ReadAsTextWithSeparator(WorkDescriptionInstream, TypeHelper.LFSeparator());
                    end;
                    trigger OnPostDataItem()
                    begin
                        Clear(WorkDescriptionInstream)
                    end;
                    trigger OnPreDataItem()
                    begin
                        if not ShowWorkDescription then
                            CurrReport.Break();
                        Header."Work Description".CreateInStream(WorkDescriptionInstream, TEXTENCODING::UTF8);
                    end;
                }
                dataitem(VATAmountLine; "VAT Amount Line")
                {
                    DataItemTableView = sorting("VAT Identifier", "VAT Calculation Type", "Tax Group Code", "Use Tax", Positive);
                    UseTemporary = true;
                    column(InvoiceDiscountAmount_VATAmountLine; "Invoice Discount Amount")
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(InvoiceDiscountAmount_VATAmountLine_Lbl; FieldCaption("Invoice Discount Amount"))
                    {
                    }
                    column(InvoiceDiscountBaseAmount_VATAmountLine; "Inv. Disc. Base Amount")
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(InvoiceDiscountBaseAmount_VATAmountLine_Lbl; FieldCaption("Inv. Disc. Base Amount"))
                    {
                    }
                    column(LineAmount_VatAmountLine; "Line Amount")
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(LineAmount_VatAmountLine_Lbl; FieldCaption("Line Amount"))
                    {
                    }
                    column(VATAmount_VatAmountLine; "VAT Amount")
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(VATAmount_VatAmountLine_Lbl; FieldCaption("VAT Amount"))
                    {
                    }
                    column(VATAmountLCY_VATAmountLine; VATAmountLCY)
                    {
                    }
                    column(VATAmountLCY_VATAmountLine_Lbl; VATAmountLCYLbl)
                    {
                    }
                    column(VATBase_VatAmountLine; "VAT Base")
                    {
                        AutoFormatExpression = Line.GetCurrencyCode();
                        AutoFormatType = 1;
                    }
                    column(VATBase_VatAmountLine_Lbl; FieldCaption("VAT Base"))
                    {
                    }
                    column(VATBaseLCY_VATAmountLine; VATBaseLCY)
                    {
                    }
                    column(VATBaseLCY_VATAmountLine_Lbl; VATBaseLCYLbl)
                    {
                    }
                    column(VATIdentifier_VatAmountLine; "VAT Identifier")
                    {
                    }
                    column(VATIdentifier_VatAmountLine_Lbl; FieldCaption("VAT Identifier"))
                    {
                    }
                    column(VATPct_VatAmountLine; "VAT %")
                    {
                        DecimalPlaces = 0 : 5;
                    }
                    column(VATPct_VatAmountLine_Lbl; FieldCaption("VAT %"))
                    {
                    }
                    column(NoOfVATIdentifiers; Count)
                    {
                    }
                    trigger OnAfterGetRecord()
                    begin
                        VATBaseLCY :=
                          GetBaseLCY(
                            Header."Posting Date", Header."Currency Code",
                            Header."Currency Factor");
                        VATAmountLCY :=
                          GetAmountLCY(
                            Header."Posting Date", Header."Currency Code",
                            Header."Currency Factor");
                        TotalVATBaseLCY += VATBaseLCY;
                        TotalVATAmountLCY += VATAmountLCY;
                        TotalVATBaseOnVATAmtLine += "VAT Base";
                        TotalVATAmountOnVATAmtLine += "VAT Amount";
                        if ShowVATClause("VAT Clause Code") and ShouldInsertVATClauseLine() then begin
                            VATClauseLine := VATAmountLine;
                            if VATClauseLine.Insert() then;
                        end;
                    end;
                    trigger OnPreDataItem()
                    begin
                        Clear(VATBaseLCY);
                        Clear(VATAmountLCY);
                        TotalVATBaseLCY := 0;
                        TotalVATAmountLCY := 0;
                        TotalVATBaseOnVATAmtLine := 0;
                        TotalVATAmountOnVATAmtLine := 0;
                    end;
                }
                dataitem(VATClauseLine; "VAT Amount Line")
                {
                    DataItemTableView = sorting("VAT Identifier", "VAT Calculation Type", "Tax Group Code", "Use Tax", Positive);
                    UseTemporary = true;
                    column(VATClausesHeader; VATClausesText)
                    {
                    }
                    column(VATIdentifier_VATClauseLine; "VAT Identifier")
                    {
                    }
                    column(Code_VATClauseLine; VATClause.Code)
                    {
                    }
                    column(Code_VATClauseLine_Lbl; VATClause.FieldCaption(Code))
                    {
                    }
                    column(Description_VATClauseLine; VATClauseText)
                    {
                    }
                    column(Description2_VATClauseLine; VATClause."Description 2")
                    {
                    }
                    column(VATAmount_VATClauseLine; "VAT Amount")
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(NoOfVATClauses; Count)
                    {
                    }
                    trigger OnAfterGetRecord()
                    begin
                        if "VAT Clause Code" = '' then
                            CurrReport.Skip();
                        if not VATClause.Get("VAT Clause Code") then
                            CurrReport.Skip();
                        VATClauseText := VATClause.GetDescriptionText(Header);
                    end;
                    trigger OnPreDataItem()
                    begin
                        if Count = 0 then
                            VATClausesText := ''
                        else
                            VATClausesText := VATClausesLbl;
                    end;
                }
                dataitem(ReportTotalsLine; "Report Totals Buffer")
                {
                    DataItemTableView = sorting("Line No.");
                    UseTemporary = true;
                    column(Description_ReportTotalsLine; Description)
                    {
                    }
                    column(Amount_ReportTotalsLine; Amount)
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(AmountFormatted_ReportTotalsLine; "Amount Formatted")
                    {
                        AutoFormatExpression = Header."Currency Code";
                        AutoFormatType = 1;
                    }
                    column(FontBold_ReportTotalsLine; "Font Bold")
                    {
                    }
                    column(FontUnderline_ReportTotalsLine; "Font Underline")
                    {
                    }
                    trigger OnPreDataItem()
                    begin
                        CreateReportTotalLines();
                    end;
                }
                dataitem(LineFee; "Integer")
                {
                    DataItemTableView = sorting(Number) order(ascending) where(Number = filter(1 ..));
                    column(LineFeeCaptionText; TempLineFeeNoteOnReportHist.ReportText)
                    {
                    }
                    trigger OnAfterGetRecord()
                    begin
                        if not DisplayAdditionalFeeNote then
                            CurrReport.Break();
                        if Number = 1 then begin
                            if not TempLineFeeNoteOnReportHist.FindSet() then
                                CurrReport.Break()
                        end else
                            if TempLineFeeNoteOnReportHist.Next() = 0 then
                                CurrReport.Break();
                    end;
                }
                dataitem(PaymentReportingArgument; "Payment Reporting Argument")
                {
                    DataItemTableView = sorting(Key);
                    UseTemporary = true;
                    column(PaymentServiceLogo; Logo)
                    {
                    }
                    column(PaymentServiceLogo_UrlText; "URL Caption")
                    {
                    }
                    column(PaymentServiceLogo_Url; GetTargetURL())
                    {
                    }
                    column(PaymentServiceText_UrlText; "URL Caption")
                    {
                    }
                    column(PaymentServiceText_Url; GetTargetURL())
                    {
                    }
                }
                dataitem(LeftHeader; "Name/Value Buffer")
                {
                    DataItemTableView = sorting(ID);
                    UseTemporary = true;
                    column(LeftHeaderName; Name)
                    {
                    }
                    column(LeftHeaderValue; Value)
                    {
                    }
                }
                dataitem(RightHeader; "Name/Value Buffer")
                {
                    DataItemTableView = sorting(ID);
                    UseTemporary = true;
                    column(RightHeaderName; Name)
                    {
                    }
                    column(RightHeaderValue; Value)
                    {
                    }
                }
                dataitem(LetterText; "Integer")
                {
                    DataItemTableView = sorting(Number) where(Number = const(1));
                    column(GreetingText; GreetingLbl)
                    {
                    }
                    column(BodyText; BodyLbl)
                    {
                    }
                    column(ClosingText; ClosingLbl)
                    {
                    }
                    column(PmtDiscText; PmtDiscText)
                    {
                    }
                    trigger OnPreDataItem()
                    begin
                        PmtDiscText := '';
                        if Header."Payment Discount %" <> 0 then
                            PmtDiscText := StrSubstNo(PmtDiscTxt, Header."Pmt. Discount Date", Header."Payment Discount %");
                    end;
                }
                dataitem(Totals; "Integer")
                {
                    DataItemTableView = sorting(Number) where(Number = const(1));
                    column(TotalNetAmount; Format(TotalAmount, 0, AutoFormat.ResolveAutoFormat(Enum::"Auto Format"::AmountFormat, Header."Currency Code")))
                    {
                    }
                    column(TotalVATBaseLCY; TotalVATBaseLCY)
                    {
                    }
                    column(TotalAmountIncludingVAT; Format(TotalAmountInclVAT, 0, AutoFormat.ResolveAutoFormat(Enum::"Auto Format"::AmountFormat, Header."Currency Code")))
                    {
                    }
                    column(TotalVATAmount; Format(TotalAmountVAT, 0, AutoFormat.ResolveAutoFormat(Enum::"Auto Format"::AmountFormat, Header."Currency Code")))
                    {
                    }
                    column(TotalVATAmountLCY; TotalVATAmountLCY)
                    {
                    }
                    column(TotalInvoiceDiscountAmount; Format(TotalInvDiscAmount, 0, AutoFormat.ResolveAutoFormat(Enum::"Auto Format"::AmountFormat, Header."Currency Code")))
                    {
                    }
                    column(TotalPaymentDiscountOnVAT; TotalPaymentDiscOnVAT)
                    {
                    }
                    column(TotalVATAmountText; VATAmountLine.VATAmountText())
                    {
                    }
                    column(TotalExcludingVATText; TotalExclVATText)
                    {
                    }
                    column(TotalIncludingVATText; TotalInclVATText)
                    {
                    }
                    column(TotalSubTotal; Format(TotalSubTotal, 0, AutoFormat.ResolveAutoFormat(Enum::"Auto Format"::AmountFormat, Header."Currency Code")))
                    {
                    }
                    column(TotalSubTotalMinusInvoiceDiscount; Format(TotalSubTotal + TotalInvDiscAmount, 0, AutoFormat.ResolveAutoFormat(Enum::"Auto Format"::AmountFormat, Header."Currency Code")))
                    {
                    }
                    column(TotalText; TotalText)
                    {
                    }
                    column(TotalAmountExclInclVAT; Format(TotalAmountExclInclVATValue, 0, AutoFormat.ResolveAutoFormat(Enum::"Auto Format"::AmountFormat, Header."Currency Code")))
                    {
                    }
                    column(TotalAmountExclInclVATText; TotalAmountExclInclVATTextValue)
                    {
                    }
                    column(TotalVATBaseOnVATAmtLine; TotalVATBaseOnVATAmtLine)
                    {
                    }
                    column(TotalVATAmountOnVATAmtLine; TotalVATAmountOnVATAmtLine)
                    {
                    }
                    column(CurrencyCode; CurrCode)
                    {
                    }
                    column(CurrencySymbol; CurrSymbol)
                    {
                    }
                    trigger OnPreDataItem()
                    begin
                        if Header."Prices Including VAT" then begin
                            TotalAmountExclInclVATTextValue := TotalExclVATText;
                            TotalAmountExclInclVATValue := TotalAmount;
                        end else begin
                            TotalAmountExclInclVATTextValue := TotalInclVATText;
                            TotalAmountExclInclVATValue := TotalAmountInclVAT;
                        end;
                    end;
                }
                trigger OnAfterGetRecord()
                var
                    CurrencyExchangeRate: Record "Currency Exchange Rate";
                    PaymentServiceSetup: Record "Payment Service Setup";
                    Currency: Record Currency;
                    GeneralLedgerSetup: Record "General Ledger Setup";
                begin
                    CurrReport.Language := LanguageMgt.GetLanguageIdOrDefault("Language Code");
                    CurrReport.FormatRegion := LanguageMgt.GetFormatRegionOrDefault("Format Region");
                    FormatAddr.SetLanguageCode("Language Code");
                    if not IsReportInPreviewMode() then
                        CODEUNIT.Run(CODEUNIT::"Sales Inv.-Printed", Header);
                    OnHeaderOnAfterGetRecordOnAfterUpdateNoPrinted(IsReportInPreviewMode(), Header);
                    CalcFields("Work Description");
                    ShowWorkDescription := "Work Description".HasValue;
                    ChecksPayableText := StrSubstNo(ChecksPayableLbl, CompanyInfo.Name);
                    FormatAddressFields(Header);
                    FormatDocumentFields(Header);
                    if SellToContact.Get("Sell-to Contact No.") then;
                    if BillToContact.Get("Bill-to Contact No.") then;
                    if not CompanyBankAccount.Get(Header."Company Bank Account Code") then
                        CompanyBankAccount.CopyBankFieldsFromCompanyInfo(CompanyInfo);
                    FillLeftHeader();
                    FillRightHeader();
                    if not Cust.Get("Bill-to Customer No.") then
                        Clear(Cust);
                    if "Currency Code" <> '' then begin
                        CurrencyExchangeRate.FindCurrency("Posting Date", "Currency Code", 1);
                        CalculatedExchRate :=
                          Round(1 / "Currency Factor" * CurrencyExchangeRate."Exchange Rate Amount", 0.000001);
                        ExchangeRateText := StrSubstNo(ExchangeRateTxt, CalculatedExchRate, CurrencyExchangeRate."Exchange Rate Amount");
                        CurrCode := "Currency Code";
                        if Currency.Get("Currency Code") then
                            CurrSymbol := Currency.GetCurrencySymbol();
                    end else
                        if GeneralLedgerSetup.Get() then begin
                            CurrCode := GeneralLedgerSetup."LCY Code";
                            CurrSymbol := GeneralLedgerSetup.GetCurrencySymbol();
                        end;
                    GetLineFeeNoteOnReportHist("No.");
                    PaymentServiceSetup.CreateReportingArgs(PaymentReportingArgument, Header);
                    CalcFields("Amount Including VAT");
                    RemainingAmount := GetRemainingAmount();
                    if RemainingAmount = 0 then
                        RemainingAmountTxt := AlreadyPaidLbl
                    else
                        if RemainingAmount <> "Amount Including VAT" then
                            RemainingAmountTxt := StrSubstNo(PartiallyPaidLbl, Format(RemainingAmount, 0, '<Precision,2><Standard Format,0>'))
                        else
                            RemainingAmountTxt := '';
                    OnAfterGetSalesHeader(Header);
                    TotalSubTotal := 0;
                    TotalInvDiscAmount := 0;
                    TotalAmount := 0;
                    TotalAmountVAT := 0;
                    TotalAmountInclVAT := 0;
                    TotalPaymentDiscOnVAT := 0;
                    if ("Order No." = '') and "Prepayment Invoice" then
                        "Order No." := "Prepayment Order No.";
                end;
                trigger OnPreDataItem()
                begin
                    FirstLineHasBeenOutput := false;
                end;
            }
        }
        requestpage
        {
            SaveValues = true;
            layout
            {
                area(content)
                {
                    group(Options)
                    {
                        Caption = 'Options';
                        field(ShowLotSN; ShowLotSN)
                        {
                            ApplicationArea = All;
                            Caption = 'Show Serial/Lot Number Appendix';
                            ToolTip = 'Enable to print lot/serial numbers and expiration dates for each invoice line.';
                        }
                        field(LogInteraction; LogInteraction)
                        {
                            ApplicationArea = Basic, Suite;
                            Caption = 'Log Interaction';
                            Enabled = LogInteractionEnable;
                            ToolTip = 'Specifies that interactions with the contact are logged.';
                        }
                        field(DisplayAsmInformation; DisplayAssemblyInformation)
                        {
                            ApplicationArea = Assembly;
                            Caption = 'Show Assembly Components';
                            ToolTip = 'Specifies if you want the report to include information about components that were used in linked assembly orders that supplied the item(s) being sold. (Only possible for RDLC report layout.)';
                        }
                        field(DisplayShipmentInformation; DisplayShipmentInformation)
                        {
                            ApplicationArea = Basic, Suite;
                            Caption = 'Show Shipments';
                            ToolTip = 'Specifies that shipments are shown on the document.';
                        }
                        field(DisplayAdditionalFeeNote; DisplayAdditionalFeeNote)
                        {
                            ApplicationArea = Basic, Suite;
                            Caption = 'Show Additional Fee Note';
                            ToolTip = 'Specifies if you want notes about additional fees to be shown on the document.';
                        }
                        field(HideLinesWithZeroQuantityControl; HideLinesWithZeroQuantity)
                        {
                            ApplicationArea = Basic, Suite;
                            ToolTip = 'Specifies if the lines with zero quantity are printed.';
                            Caption = 'Hide lines with zero quantity';
                        }
                    }
                }
            }
            actions
            {
            }
            trigger OnInit()
            begin
                LogInteraction := LogInteractionTemplateExists();
                LogInteractionEnable := LogInteraction;
            end;
        }
       
        labels
        {
        }
        trigger OnInitReport()
        var
            IsHandled: Boolean;
        begin
            GLSetup.Get();
            CompanyInfo.SetAutoCalcFields(Picture);
            CompanyInfo.Get();
            SalesSetup.Get();
            CompanyInfo.VerifyAndSetPaymentInfo();
            if SalesSetup.GetLegalStatement() <> '' then
                LegalStatementLbl := SalesSetup.GetLegalStatement();
            IsHandled := false;
            OnInitReportForGlobalVariable(IsHandled, LegalOfficeTxt, LegalOfficeLbl, CustomGiroTxt, CustomGiroLbl, LegalStatementLbl);
        end;
        trigger OnPostReport()
        begin
            if LogInteraction and not IsReportInPreviewMode() then
                if Header.FindSet() then
                    repeat
                        if Header."Bill-to Contact No." <> '' then
                            SegManagement.LogDocument(
                              4, Header."No.", 0, 0, DATABASE::Contact, Header."Bill-to Contact No.", Header."Salesperson Code",
                              Header."Campaign No.", Header."Posting Description", '')
                        else
                            SegManagement.LogDocument(
                              4, Header."No.", 0, 0, DATABASE::Customer, Header."Bill-to Customer No.", Header."Salesperson Code",
                              Header."Campaign No.", Header."Posting Description", '');
                    until Header.Next() = 0;
        end;
        trigger OnPreReport()
        begin
            if Header.GetFilters = '' then
                Error(NoFilterSetErr);
            CompanyLogoPosition := SalesSetup."Logo Position on Documents";
        end;
        var
            GLSetup: Record "General Ledger Setup";
            DummyCompanyInfo: Record "Company Information";
            Cust: Record Customer;
            RespCenter: Record "Responsibility Center";
            VATClause: Record "VAT Clause";
            SellToContact: Record Contact;
            BillToContact: Record Contact;
            LanguageMgt: Codeunit Language;
            FormatAddr: Codeunit "Format Address";
            FormatDocument: Codeunit "Format Document";
            SegManagement: Codeunit SegManagement;
            AutoFormat: Codeunit "Auto Format";
            WorkDescriptionInstream: InStream;
            JobNo: Code[20];
            JobTaskNo: Code[20];
            WorkDescriptionLine: Text;
            ChecksPayableText: Text;
            SalesPersonText: Text[50];
            RemainingAmountTxt: Text;
            JobNoLbl: Text;
            JobTaskNoLbl: Text;
            TotalAmountExclInclVATTextValue: Text;
            MoreLines: Boolean;
            ShowWorkDescription: Boolean;
            TransHeaderAmount: Decimal;
            LogInteractionEnable: Boolean;
            CompanyLogoPosition: Integer;
            CalculatedExchRate: Decimal;
            PaymentInstructionsTxt: Text;
            ExchangeRateText: Text;
            PrevLineAmount: Decimal;
            SalespersonLbl: Label 'Salesperson';
            CompanyInfoBankAccNoLbl: Label 'Account No.';
            CompanyInfoBankNameLbl: Label 'Bank';
            CompanyInfoGiroNoLbl: Label 'Giro No.';
            CompanyInfoPhoneNoLbl: Label 'Phone No.';
            CopyLbl: Label 'Copy';
            EMailLbl: Label 'Email';
            HomePageLbl: Label 'Home Page';
            InvDiscBaseAmtLbl: Label 'Invoice Discount Base Amount';
            InvDiscountAmtLbl: Label 'Invoice Discount';
            InvNoLbl: Label 'Invoice No.';
            LineAmtAfterInvDiscLbl: Label 'Payment Discount on VAT';
            LocalCurrencyLbl: Label 'Local Currency';
            PageLbl: Label 'Page';
            PaymentMethodDescLbl: Label 'Payment Method';
            PostedShipmentDateLbl: Label 'Shipment Date';
            SalesInvLineDiscLbl: Label 'Discount %';
            SalesInvoiceLbl: Label 'Invoice';
            YourSalesInvoiceLbl: Label 'Your Invoice';
            ShipmentLbl: Label 'Shipment';
            SubtotalLbl: Label 'Subtotal';
            TotalLbl: Label 'Total';
            VATAmtSpecificationLbl: Label 'VAT Amount Specification';
            VATAmtLbl: Label 'VAT Amount';
            VATAmountLCYLbl: Label 'VAT Amount (LCY)';
            VATBaseLbl: Label 'VAT Base';
            VATBaseLCYLbl: Label 'VAT Base (LCY)';
            VATClausesLbl: Label 'VAT Clause';
            VATIdentifierLbl: Label 'VAT Identifier';
            VATPercentageLbl: Label 'VAT %';
            SellToContactPhoneNoLbl: Label 'Sell-to Contact Phone No.';
            SellToContactMobilePhoneNoLbl: Label 'Sell-to Contact Mobile Phone No.';
            SellToContactEmailLbl: Label 'Sell-to Contact E-Mail';
            BillToContactPhoneNoLbl: Label 'Bill-to Contact Phone No.';
            BillToContactMobilePhoneNoLbl: Label 'Bill-to Contact Mobile Phone No.';
            BillToContactEmailLbl: Label 'Bill-to Contact E-Mail';
            ExchangeRateTxt: Label 'Exchange rate: %1/%2', Comment = '%1 and %2 are both amounts.';
            NoFilterSetErr: Label 'You must specify one or more filters to avoid accidentally printing all documents.';
            GreetingLbl: Label 'Hello';
            ClosingLbl: Label 'Sincerely';
            PmtDiscTxt: Label 'If we receive the payment before %1, you are eligible for a %2% payment discount.', Comment = '%1 Discount Due Date %2 = value of Payment Discount % ';
            BodyLbl: Label 'Thank you for your business. Your invoice is attached to this message.';
            AlreadyPaidLbl: Label 'The invoice has been paid.';
            PartiallyPaidLbl: Label 'The invoice has been partially paid. The remaining amount is %1', Comment = '%1=an amount';
            FromLbl: Label 'From';
            BilledToLbl: Label 'Billed to';
            ChecksPayableLbl: Label 'Please make checks payable to %1', Comment = '%1 = company name';
            QuestionsLbl: Label 'Questions?';
            ThanksLbl: Label 'Thank You!';
    #pragma warning disable AA0074
            JobNoLbl2: Label 'Project No.';
            JobTaskNoLbl2: Label 'Project Task No.';
    #pragma warning restore AA0074
            JobTaskDescription: Text[100];
            JobTaskDescLbl: Label 'Project Task Description';
            UnitLbl: Label 'Unit';
            VATClausesText: Text;
            QtyLbl: Label 'Qty', Comment = 'Short form of Quantity';
            PriceLbl: Label 'Price';
            PricePerLbl: Label 'Price per';
            LCYTxt: label ' (LCY)';
            VATClauseText: Text;
            LegalOfficeTxt, LegalOfficeLbl, CustomGiroTxt, CustomGiroLbl, LegalStatementLbl : Text;
        protected var
            CompanyInfo: Record "Company Information";
            CompanyBankAccount: Record "Bank Account";
            PaymentMethod: Record "Payment Method";
            SalespersonPurchaser: Record "Salesperson/Purchaser";
            SalesSetup: Record "Sales & Receivables Setup";
            ShipmentMethod: Record "Shipment Method";
            PaymentTerms: Record "Payment Terms";
            TempLineFeeNoteOnReportHist: Record "Line Fee Note on Report Hist." temporary;
            CompanyAddr: array[8] of Text[100];
            CustAddr: array[8] of Text[100];
            ShipToAddr: array[8] of Text[100];
            FormattedLineAmount: Text;
            FormattedQuantity: Text;
            FormattedUnitPrice: Text;
            FormattedVATPct: Text;
            LineDiscountPctText: Text;
            PmtDiscText: Text;
            TotalExclVATText: Text[50];
            TotalInclVATText: Text[50];
            TotalSubTotal: Decimal;
            VATBaseLCY: Decimal;
            VATAmountLCY: Decimal;
            DisplayAssemblyInformation: Boolean;
            DisplayShipmentInformation: Boolean;
            DisplayAdditionalFeeNote: Boolean;
            FirstLineHasBeenOutput: Boolean;
            ShowShippingAddr: Boolean;
            TotalText: Text[50];
            LogInteraction: Boolean;
            TotalAmount: Decimal;
            TotalAmountInclVAT: Decimal;
            TotalAmountVAT: Decimal;
            TotalInvDiscAmount: Decimal;
            TotalPaymentDiscOnVAT: Decimal;
            RemainingAmount: Decimal;
            TotalAmountExclInclVATValue: Decimal;
            TotalVATBaseLCY: Decimal;
            TotalVATAmountLCY: Decimal;
            TotalVATBaseOnVATAmtLine: Decimal;
            TotalVATAmountOnVATAmtLine: Decimal;
            CurrCode: Text[10];
            CurrSymbol: Text[10];
            PaymentTermsDescLbl: Label 'Payment Terms';
            ShptMethodDescLbl: Label 'Shipment Method';
            ShiptoAddrLbl: Label 'Ship-to Address';
            HideLinesWithZeroQuantity: Boolean;
            //mynie added this
             ShowLotSN: Boolean;
        local procedure LogInteractionTemplateExists(): Boolean
        begin
            exit(SegManagement.FindInteractionTemplateCode(Enum::"Interaction Log Entry Document Type"::"Sales Inv.") <> '');
        end;
        local procedure InitializeShipmentLine()
        var
            SalesShipmentHeader: Record "Sales Shipment Header";
        begin
            if not DisplayShipmentInformation then
                exit;
            if Line.Type = Line.Type::" " then
                exit;
            if Line."Shipment No." <> '' then
                if SalesShipmentHeader.Get(Line."Shipment No.") then
                    exit;
            ShipmentLine.GetLinesForSalesInvoiceLine(Line, Header);
            ShipmentLine.Reset();
            ShipmentLine.SetRange("Line No.", Line."Line No.");
            if not ShipmentLine.IsEmpty() then begin
                ShipmentLine.CalcSums(Quantity);
                if ShipmentLine.Quantity <> Line.Quantity then begin
                    ShipmentLine.DeleteAll();
                    exit;
                end;
            end;
        end;
        local procedure DocumentCaption(): Text[250]
        var
            DocCaption: Text;
        begin
            OnBeforeGetDocumentCaption(Header, DocCaption);
            if DocCaption <> '' then
                exit(DocCaption);
            exit(SalesInvoiceLbl);
        end;
        procedure InitializeRequest(NewLogInteraction: Boolean; DisplayAsmInfo: Boolean)
        begin
            LogInteraction := NewLogInteraction;
            DisplayAssemblyInformation := DisplayAsmInfo;
        end;
        protected procedure IsReportInPreviewMode(): Boolean
        var
            MailManagement: Codeunit "Mail Management";
        begin
            exit(CurrReport.Preview() or MailManagement.IsHandlingGetEmailBody());
        end;
        local procedure GetUOMText(UOMCode: Code[10]): Text[50]
        var
            UnitOfMeasure: Record "Unit of Measure";
            UOMDescription: Text[50];
        begin
            if not UnitOfMeasure.Get(UOMCode) then
                exit(UOMCode);
            UOMDescription := UnitOfMeasure.Description;
            OnAfterGetUOMText(UOMCode, UOMDescription);
            exit(UOMDescription);
        end;
        local procedure CreateReportTotalLines()
        begin
            ReportTotalsLine.DeleteAll();
            if (TotalInvDiscAmount <> 0) or (TotalAmountVAT <> 0) then
                ReportTotalsLine.Add(SubtotalLbl, TotalSubTotal, true, false, false, Header."Currency Code");
            if TotalInvDiscAmount <> 0 then begin
                ReportTotalsLine.Add(InvDiscountAmtLbl, TotalInvDiscAmount, false, false, false, Header."Currency Code");
                if TotalAmountVAT <> 0 then
                    if Header."Prices Including VAT" then
                        ReportTotalsLine.Add(TotalInclVATText, TotalAmountInclVAT, true, false, false, Header."Currency Code")
                    else
                        ReportTotalsLine.Add(TotalExclVATText, TotalAmount, true, false, false, Header."Currency Code");
            end;
            if TotalAmountVAT <> 0 then begin
                ReportTotalsLine.Add(VATAmountLine.VATAmountText(), TotalAmountVAT, false, true, false, Header."Currency Code");
                if TotalVATAmountLCY <> TotalAmountVAT then
                    ReportTotalsLine.Add(VATAmountLine.VATAmountText() + LCYTxt, TotalVATAmountLCY, false, true, false);
            end;
        end;
        local procedure GetLineFeeNoteOnReportHist(SalesInvoiceHeaderNo: Code[20])
        var
            LineFeeNoteOnReportHist: Record "Line Fee Note on Report Hist.";
            CustLedgerEntry: Record "Cust. Ledger Entry";
            Customer: Record Customer;
        begin
            TempLineFeeNoteOnReportHist.DeleteAll();
            CustLedgerEntry.SetRange("Document Type", CustLedgerEntry."Document Type"::Invoice);
            CustLedgerEntry.SetRange("Document No.", SalesInvoiceHeaderNo);
            if not CustLedgerEntry.FindFirst() then
                exit;
            if not Customer.Get(CustLedgerEntry."Customer No.") then
                exit;
            LineFeeNoteOnReportHist.SetRange("Cust. Ledger Entry No", CustLedgerEntry."Entry No.");
            LineFeeNoteOnReportHist.SetRange("Language Code", Customer."Language Code");
            if LineFeeNoteOnReportHist.FindSet() then
                repeat
                    TempLineFeeNoteOnReportHist.Init();
                    TempLineFeeNoteOnReportHist.Copy(LineFeeNoteOnReportHist);
                    TempLineFeeNoteOnReportHist.Insert();
                until LineFeeNoteOnReportHist.Next() = 0
            else begin
                LineFeeNoteOnReportHist.SetRange("Language Code", LanguageMgt.GetUserLanguageCode());
                if LineFeeNoteOnReportHist.FindSet() then
                    repeat
                        TempLineFeeNoteOnReportHist.Init();
                        TempLineFeeNoteOnReportHist.Copy(LineFeeNoteOnReportHist);
                        TempLineFeeNoteOnReportHist.Insert();
                    until LineFeeNoteOnReportHist.Next() = 0;
            end;
        end;
        local procedure FillLeftHeader()
        begin
            LeftHeader.DeleteAll();
            FillNameValueTable(LeftHeader, Header.FieldCaption("External Document No."), Header."External Document No.");
            FillNameValueTable(LeftHeader, Header.FieldCaption("Bill-to Customer No."), Header."Bill-to Customer No.");
            FillNameValueTable(LeftHeader, Header.GetCustomerVATRegistrationNumberLbl(), Header.GetCustomerVATRegistrationNumber());
            FillNameValueTable(LeftHeader, Header.GetCustomerGlobalLocationNumberLbl(), Header.GetCustomerGlobalLocationNumber());
            FillNameValueTable(LeftHeader, InvNoLbl, Header."No.");
            FillNameValueTable(LeftHeader, Header.FieldCaption("Order No."), Header."Order No.");
            FillNameValueTable(LeftHeader, Header.FieldCaption("Document Date"), Format(Header."Document Date", 0, 4));
            FillNameValueTable(LeftHeader, Header.FieldCaption("Due Date"), Format(Header."Due Date", 0, 4));
            FillNameValueTable(LeftHeader, PaymentTermsDescLbl, PaymentTerms.Description);
            FillNameValueTable(LeftHeader, PaymentMethodDescLbl, PaymentMethod.Description);
            FillNameValueTable(LeftHeader, Cust.GetLegalEntityTypeLbl(), Cust.GetLegalEntityType());
            FillNameValueTable(LeftHeader, ShptMethodDescLbl, ShipmentMethod.Description);
            OnAfterFillLeftHeader(LeftHeader, Header);
        end;
        local procedure FillRightHeader()
        var
            IsHandled: Boolean;
        begin
            IsHandled := false;
            OnBeforeFillRightHeader(Header, SalespersonPurchaser, SalesPersonText, RightHeader, IsHandled);
            if not IsHandled then begin
                RightHeader.DeleteAll();
                FillNameValueTable(RightHeader, EMailLbl, CompanyInfo."E-Mail");
                FillNameValueTable(RightHeader, HomePageLbl, CompanyInfo."Home Page");
                FillNameValueTable(RightHeader, CompanyInfoPhoneNoLbl, CompanyInfo."Phone No.");
                FillNameValueTable(RightHeader, CompanyInfo.GetRegistrationNumberLbl(), CompanyInfo.GetRegistrationNumber());
                FillNameValueTable(RightHeader, CompanyInfo.GetVATRegistrationNumberLbl(), CompanyInfo.GetVATRegistrationNumber());
                FillNameValueTable(RightHeader, CompanyInfoBankNameLbl, CompanyBankAccount.Name);
                FillNameValueTable(RightHeader, CompanyInfoGiroNoLbl, CompanyInfo."Giro No.");
                FillNameValueTable(RightHeader, CompanyBankAccount.FieldCaption(IBAN), CompanyBankAccount.IBAN);
                FillNameValueTable(RightHeader, CompanyBankAccount.FieldCaption("SWIFT Code"), CompanyBankAccount."SWIFT Code");
                FillNameValueTable(RightHeader, Header.GetPaymentReferenceLbl(), Header.GetPaymentReference());
                OnAfterFillRightHeader(RightHeader, Header);
            end;
        end;
        local procedure FillNameValueTable(var NameValueBuffer: Record "Name/Value Buffer"; Name: Text; Value: Text)
        var
            KeyIndex: Integer;
        begin
            if Value <> '' then begin
                Clear(NameValueBuffer);
                if NameValueBuffer.FindLast() then
                    KeyIndex := NameValueBuffer.ID + 1;
                NameValueBuffer.Init();
                NameValueBuffer.ID := KeyIndex;
                NameValueBuffer.Name := CopyStr(Name, 1, MaxStrLen(NameValueBuffer.Name));
                NameValueBuffer.Value := CopyStr(Value, 1, MaxStrLen(NameValueBuffer.Value));
                NameValueBuffer.Insert();
            end;
        end;
        local procedure FormatAddressFields(var SalesInvoiceHeader: Record "Sales Invoice Header")
        begin
            FormatAddr.GetCompanyAddr(SalesInvoiceHeader."Responsibility Center", RespCenter, CompanyInfo, CompanyAddr);
            FormatAddr.SalesInvBillTo(CustAddr, SalesInvoiceHeader);
            ShowShippingAddr := FormatAddr.SalesInvShipTo(ShipToAddr, CustAddr, SalesInvoiceHeader);
        end;
        local procedure FormatDocumentFields(SalesInvoiceHeader: Record "Sales Invoice Header")
        begin
            FormatDocument.SetTotalLabels(SalesInvoiceHeader.GetCurrencySymbol(), TotalText, TotalInclVATText, TotalExclVATText);
            FormatDocument.SetSalesPerson(SalespersonPurchaser, SalesInvoiceHeader."Salesperson Code", SalesPersonText);
            FormatDocument.SetPaymentTerms(PaymentTerms, SalesInvoiceHeader."Payment Terms Code", SalesInvoiceHeader."Language Code");
            FormatDocument.SetPaymentMethod(PaymentMethod, SalesInvoiceHeader."Payment Method Code", SalesInvoiceHeader."Language Code");
            FormatDocument.SetShipmentMethod(ShipmentMethod, SalesInvoiceHeader."Shipment Method Code", SalesInvoiceHeader."Language Code");
            OnAfterFormatDocumentFields(SalesInvoiceHeader);
        end;
        local procedure GetJobTaskDescription(JobNo: Code[20]; JobTaskNo: Code[20]): Text[100]
        var
            JobTask: Record "Job Task";
        begin
            JobTask.SetRange("Job No.", JobNo);
            JobTask.SetRange("Job Task No.", JobTaskNo);
            if JobTask.FindFirst() then
                exit(JobTask.Description);
            exit('');
        end;
        [IntegrationEvent(false, false)]
        local procedure OnAfterLineOnPreDataItem(var SalesInvoiceHeader: Record "Sales Invoice Header"; var SalesInvoiceLine: Record "Sales Invoice Line")
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnAfterFillLeftHeader(var LeftHeader: Record "Name/Value Buffer"; SalesInvoiceHeader: Record "Sales Invoice Header")
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnAfterFillRightHeader(var RightHeader: Record "Name/Value Buffer"; SalesInvoiceHeader: Record "Sales Invoice Header")
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnBeforeLineOnAfterGetRecord(var SalesInvoiceHeader: Record "Sales Invoice Header"; var SalesInvoiceLine: Record "Sales Invoice Line")
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnBeforeGetDocumentCaption(SalesInvoiceHeader: Record "Sales Invoice Header"; var DocCaption: Text)
        begin
        end;
        [IntegrationEvent(true, false)]
        local procedure OnAfterGetSalesHeader(SalesInvoiceHeader: Record "Sales Invoice Header")
        begin
        end;
        local procedure ShowVATClause(VATClauseCode: Code[20]): Boolean
        begin
            if VATClauseCode = '' then
                exit(false);
            exit(true);
        end;
        local procedure InsertVATAmountLine(var VATAmountLine2: Record "VAT Amount Line"; SalesInvoiceLine: Record "Sales Invoice Line")
        var
            IsHandled: Boolean;
        begin
            IsHandled := false;
            OnBeforeVATAmountLineInsertLine(VATAmountLine2, SalesInvoiceLine, IsHandled);
            if IsHandled then
                exit;
            VATAmountLine2.Init();
            VATAmountLine2."VAT Identifier" := SalesInvoiceLine."VAT Identifier";
            VATAmountLine2."VAT Calculation Type" := SalesInvoiceLine."VAT Calculation Type";
            VATAmountLine2."Tax Group Code" := SalesInvoiceLine."Tax Group Code";
            VATAmountLine2."VAT %" := SalesInvoiceLine."VAT %";
            VATAmountLine2."VAT Base" := SalesInvoiceLine.Amount;
            VATAmountLine2."Amount Including VAT" := SalesInvoiceLine."Amount Including VAT";
            VATAmountLine2."Line Amount" := SalesInvoiceLine."Line Amount";
            if SalesInvoiceLine."Allow Invoice Disc." then
                VATAmountLine2."Inv. Disc. Base Amount" := SalesInvoiceLine."Line Amount";
            VATAmountLine2."Invoice Discount Amount" := SalesInvoiceLine."Inv. Discount Amount";
            VATAmountLine2."VAT Clause Code" := SalesInvoiceLine."VAT Clause Code";
            VATAmountLine2.InsertLine();
        end;
        local procedure FormatLineValues(CurrLine: Record "Sales Invoice Line")
        var
            IsHandled: Boolean;
        begin
            IsHandled := false;
            OnBeforeFormatLineValues(CurrLine, FormattedQuantity, FormattedUnitPrice, FormattedVATPct, FormattedLineAmount, IsHandled);
            if not IsHandled then
                FormatDocument.SetSalesInvoiceLine(CurrLine, FormattedQuantity, FormattedUnitPrice, FormattedVATPct, FormattedLineAmount);
        end;
        local procedure ShouldInsertVATClauseLine(): Boolean
        var
            TempVATClauseLine: Record "VAT Amount Line" temporary;
        begin
            if VATAmountLine."VAT Amount" <> 0 then
                exit(true);
            TempVATClauseLine.Copy(VATClauseLine, true);
            TempVATClauseLine.SetRange("VAT Identifier", VATAmountLine."VAT Identifier");
            TempVATClauseLine.SetRange("VAT Clause Code", VATAmountLine."VAT Clause Code");
            TempVATClauseLine.SetRange("VAT Amount", VATAmountLine."VAT Amount");
            exit(TempVATClauseLine.IsEmpty());
        end;
        [IntegrationEvent(false, false)]
        local procedure OnBeforeFormatLineValues(SalesInvoiceLine: Record "Sales Invoice Line"; var FormattedQuantity: Text; var FormattedUnitPrice: Text; var FormattedVATPercentage: Text; var FormattedLineAmount: Text; var IsHandled: Boolean)
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnAfterFormatDocumentFields(var SalesInvoiceHeader: Record "Sales Invoice Header")
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnBeforeVATAmountLineInsertLine(var VATAmountLine: Record "VAT Amount Line"; SalesInvoiceLine: Record "Sales Invoice Line"; var IsHandled: Boolean)
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnBeforeFillRightHeader(var SalesInvoiceHeader: Record "Sales Invoice Header"; SalespersonPurchaser: Record "Salesperson/Purchaser"; var SalesPersonText: Text; var RightHeader: Record "Name/Value Buffer"; var IsHandled: Boolean)
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnAfterGetUOMText(UOMCode: Code[10]; var UOMDescription: Text[50])
        begin
        end;
        [IntegrationEvent(false, false)]
        local procedure OnInitReportForGlobalVariable(var IsHandled: Boolean; var LegalOfficeTxt: Text; var LegalOfficeLbl: Text; var CustomGiroTxt: Text; var CustomGiroLbl: Text; var LegalStatementLbl: Text)
        begin
        end;
        [IntegrationEvent(true, false)]
        local procedure OnHeaderOnAfterGetRecordOnAfterUpdateNoPrinted(ReportInPreviewMode: Boolean; var SalesInvoiceHeader: Record "Sales Invoice Header")
        begin
        end;
    }
  • Suggested answer
    Dhiren Nagar Profile Picture
    2,898 Super User 2026 Season 1 on at
    Hi,
     
    Yes, you need to create a report extension for this, or you can create an entirely new report by copying the code of standard report and then do some customization.
     
    The logic is to get Item ledger entry from Shipment No and Shipment Line no.
     
    So from Sales Invoice line -> Find Sales order or Sales Shipment line -> Use that filter on Item ledger entry as Order No. and Order Line No. and print those Lot or Serial No.
     
    Regards,
    Dhiren.

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Introducing the 2026 Season 1 community Super Users

Congratulations to our 2026 Super Stars!

Meet the Microsoft Dynamics 365 Contact Center Champions

We are thrilled to have these Champions in our Community!

Congratulations to the March Top 10 Community Leaders

These are the community rock stars!

Leaderboard > Small and medium business | Business Central, NAV, RMS

#1
OussamaSabbouh Profile Picture

OussamaSabbouh 1,993 Super User 2026 Season 1

#2
YUN ZHU Profile Picture

YUN ZHU 1,116 Super User 2026 Season 1

#3
Khushbu Rajvi. Profile Picture

Khushbu Rajvi. 557 Super User 2026 Season 1

Last 30 days Overall leaderboard

Featured topics

Product updates

Dynamics 365 release plans