Wednesday, July 14, 2021

Add a new field in standard report in D365 FO/ SSRS.

  • Create an extension of the SalesInvoiceHeaderFooterTmp table and add the fields.

  • Copy the post-handler event method of processReport() of the DP class.

  • Write the following logic to insert the data into the field:
class SalesInvoiceDPEventHandler
{
    [PostHandlerFor(classStr(SalesInvoiceDP), methodStr(SalesInvoiceDP, processReport))]
    public static void SalesInvoiceDP_Post_processReport(XppPrePostArgs args)
    {
        SalesInvoiceDP                  dpInstance = args.getThis() as SalesInvoiceDP;
        SalesInvoiceHeaderFooterTmp     tmpTable   = dpInstance.getSalesInvoiceHeaderFooterTmp();
        FormLetterRemarks               formLetterRemarks;
        CustPackingSlipJour             custPackingSlipJour;

        ttsbegin;
        while select forUpdate tmpTable
        {
            select firstonly firstfast PackingSlipId from custPackingSlipJour
                where custPackingSlipJour.SalesId == tmpTable.SalesId;

            tmpTable.Email          = CustTable::find(SalesTable::find(tmpTable.SalesId).CustAccount).email();
            tmpTable.DeliveryNote   = custPackingSlipJour.PackingSlipId;
            tmpTable.update();
        }
        ttscommit;
    }

}

---------------------------------OR-----------------------------------------
[ExtensionOf(classstr(SalesInvoiceDP))]
final class SalesInvoiceDP_Extension
{
    protected void populateSalesInvoiceTmp(CustInvoiceJour _custInvoiceJour,
        CustInvoiceTrans _custInvoiceTrans,
        TaxSpec _taxSpec,
        CustPaymSchedLine _custPaymSchedLine,
        CustTrans _prepaymentCustTrans,
        TaxTrans _prepaymentTaxTrans)
    {

        next populateSalesInvoiceTmp(_custInvoiceJour,
                                    _custInvoiceTrans,
                                    _taxSpec,
                                    _custPaymSchedLine,
                                    _prepaymentCustTrans,
                                    _prepaymentTaxTrans);

        salesInvoiceTmp.TrackingId = _custInvoiceTrans.salesLine().TrackingId;
    }

    protected void populateSalesInvoiceHeaderFooterTmp(CustInvoiceJour _custInvoiceJour, CompanyInfo _companyInfo)
    {
        CustPackingSlipJour             custPackingSlipJour;

        next populateSalesInvoiceHeaderFooterTmp(_custInvoiceJour, _companyInfo);

        select firstonly firstfast PackingSlipId from custPackingSlipJour
                where custPackingSlipJour.SalesId == salesInvoiceHeaderFooterTmp.SalesId;

        salesInvoiceHeaderFooterTmp.Email          = CustTable::find(_custInvoiceJour.InvoiceAccount).email();
        salesInvoiceHeaderFooterTmp.DeliveryNote   = custPackingSlipJour.PackingSlipId;
    }
}
  • You can also use the OnInserting event of the table instead of processReport() of DP class.
  •  Find out the SalesInvoicereport in the AOT
    • Right-click the report and click Duplicate in the project.
    • Restore the report data source to get additional fields.

    • Customize the design and add fields as per your requirements.
    • Create another class named SalesInvoiceControllerExt
      which extends the SalesInvoiceController class. Override the main() method. Give the new report and its design name in it.
    • Add the following logic in the SalesInvoiceControllerExt class:
class SalesInvoiceControllerExt extends SalesInvoiceController
{
    public static SalesInvoiceControllerExt construct()
    {
        return new SalesInvoiceControllerExt();
    }

    public static void main(Args _args)
    {
        
        SrsReportRunController formLetterController = SalesInvoiceControllerExt::construct();
        SalesInvoiceControllerExt controller = formLetterController;
        controller.parmArgs(_args);
        controller.parmReportName(ssrsReportStr(SalesInvoiceExt, Report));
        controller.parmShowDialog(false);
        controller.parmDialogCaption("@SYS22766");
        controller.startOperation();        
    }

}
  • Create another class named PrintMgtDocTypeHandlersExt.
  • Add a method in it that subscribes to the event delegate of the PrintMgmtDocType class.
  • Add the following logic in the PrintMgtDocTypeHandlersExt class:
class PrintMgtDocTypeHandlersExt
{
    [SubscribesTo(classstr(PrintMgmtDocType), delegatestr(PrintMgmtDocType, getDefaultReportFormatDelegate))]
    public static void getDefaultReportFormatDelegate(PrintMgmtDocumentType _docType, EventHandlerResult _result)
    {
        switch (_docType)
        {
            case PrintMgmtDocumentType::SalesOrderInvoice:
                _result.result(ssrsReportStr(SalesInvoiceExt, Report));
                break;
        }
    }
}

  • Create an extension of the following menu items which executes the report:
          • SalesInvoiceOriginal
          • SalesInvoiceCopy
  • Change the controller class name in extended menu items.
  • Save, build, synchronize and deploy.

Output:



If the system is called Standard design. Please follow the below steps.
  • AR-> Setup-> Forms ->Form setup -> Genral tab -> print managment(button). 
  • Right click on Customer invoice  and select New.
  • In Report format select our custom design.

Keep daxing!!

No comments:

Post a Comment