Followers

8 October 2020

Insert the field from Sales Table to WMSPickingRoute table in D365

 Insert the field from Sales Table to WMSPickingRoute table in D365 :

    Req : I have custom field (IsSalesRequierd) in sales table, so same field I need to develop in             WMSPickingRoute table also. This only when reference type as sales in picking route .

    Note : Only Insert 

    Sol :

    1) go to the WMSPickingRoute table > Events> On Inserting>right click> Copy event handler option

    2) Create class


    class WMSPickingRouteTable_EventHandler

    {

    [DataEventHandler(tableStr(WMSPickingRoute), DataEventType::Inserting)]

    public static void WMSPickingRoute_onInserting(Common sender, DataEventArgs e)

    {

        WMSPickingRoute         wMSPickingRoute = sender as WMSPickingRoute;

        SalesTable              salesTable;

        if(wMSPickingRoute.transType == InventTransType::Sales)

        {

            select firstonly IsSalesRequierdfrom salesTable

                where salesTable.SalesId == wMSPickingRoute.transRefId;


            wMSPickingRoute.IsSalesRequierd= salesTable.IsSalesRequierd;

           

        }


    }


}


    

6 October 2020

How to update the fields in form with parameter through menu item button in D365

Req : Update the field in Table(InventdimCombination )Form "EcoResProductVariantPerCompany". 

develop an RFA Flag(Custom field) button on the Released Product Variants screen under the Product variants option. When the button is clicked a new window will open which will allow the user to select RFA Flag toggle. 

The user should be able to select a single or multiple product variants on screen and update the RFA status to Yes (Active) or No (Inactive).

Product Information Management à Released Products à Product à Product Master à Released Product Variants 





Sol : Created Menu item button (Modify RFA enabled) and Class. attached the class to menu item. 

        

Select the item number and click the button will open the dialog with parameter , so user will select the value (Yes /No), then click OK , will update the parameter value in form.


        class RFAEnabledDialog extends RunBaseBatch

{

    DialogField fieldAccount;

    NoYesId     rfaenabled;

   

    public Object Dialog()

    {

        Dialog dialog;

        ;

        dialog = super();

        dialog.caption( 'Modify RFA Enabled');

        fieldAccount = dialog.addField(enumstr(NoYesId),'RFA Enabled');

        return dialog;

    }


    public boolean getFromDialog()

    {

        rfaenabled = fieldAccount.value();

        return super();

    }


    public void run(InventDimcombination inventdimcombination =null)

    {

        ttsbegin;

        if(inventdimcombination)

        {

            inventDimCombination.selectForUpdate(true);

            inventDimCombination.RFAEnabled = rfaenabled;

            inventDimCombination.update();

        }

        ttscommit;

    }


    public static void main(Args _args)

    {

        RFAEnabledDialog       rFAEnabledDialog = new RFAEnabledDialog();

        InventDimCombination      inventDimCombination;

        FormDataSource            fds_ds;

        Formrun                   formRun;


        if (rFAEnabledDialog.prompt())

        {

            formRun = _args.caller();

            fds_ds = formRun.dataSource();

            MultiSelectionHelper helper = MultiSelectionHelper::construct();

            helper.parmDatasource(fds_ds);

            inventDimCombination = helper.getFirst();

            while (inventDimCombination.RecId != 0)

            {

                rFAEnabledDialog.run(inventDimCombination);

                inventDimCombination = helper.getNext();

            }

           

        }

    }


}

O/P :




20 February 2020

Delete the sales order with no sales line using batch in ax X++

Scenarion : parameter as minutes and parameter is not taking in batch job so created field in sale parameters and updating in parameter table.

ex : 12.30 and giving parametr 30 minutes i.e 12 before sale sorder should be deleted.



class DeleteSalesOrdersWithNoSaleslinesBatch extends RunBaseBatch
{
    Minutes     minutes;
    DialogField fieldAccount;

    #DEFINE.CurrentVersion(1)
    #DEFINE.Version1(1)

    boolean canGoBatchJournal()
    {
        return true;
    }

    protected void new()
    {
        super();
    }

    public Object dialog()
    {
        Minutes                 numOfMinutes = SalesParameters::find().MinutesAfterCreate;
        Dialog dialog = super();
        fieldAccount = dialog.addField(extendedTypeStr(Minutes), 'Minutes');
        fieldAccount.value(numOfMinutes);
        return dialog;
    }

    public boolean getFromDialog()
    {
        minutes = fieldAccount.value();

        if (minutes != 0)
        {
            ttsbegin;
            SalesParameters parameters = SalesParameters::find(true);
            parameters.MinutesAfterCreate =  minutes;
            parameters.update();
            ttscommit;
        }
        return super();
    }

    public container pack()
    {
        //Serializes the current instance of the RunBase class.
        return [#CurrentVersion];
    }

    public boolean runsImpersonated()
    {
        return true;
    }

    public boolean unpack(container packedClass)
    {
        //Deserializes the packedClass parameter value to an instance of the RunBase class.
        boolean         isSuccessful;
        Version         version = RunBase::getVersion(packedClass);
        ;

        switch (version)
        {
            case #CurrentVersion:
            {
                [version] = packedClass;
                isSuccessful = true;
                break;
            }
         
        default :
            return false;
        }

        return isSuccessful;
    }

    server static DeleteSalesOrdersWithNoSaleslinesBatch construct()
    {
        return new DeleteSalesOrdersWithNoSaleslinesBatch();
    }

    client server static ClassDescription description()
    {
        return "Deletesalesorderwithnosaleslines";
    }

    public void deleteSalesOrdersWithNoSalesline()
    {
        SalesTable              salesTable;
        SalesLine               salesLine;
        int                     ordercount =0;
        Minutes                 numOfMinutes = SalesParameters::find().MinutesAfterCreate;
        DateTimeAccepted        dateTime = DateTimeUtil::addMinutes(DateTimeUtil::getSystemDateTime(),-numOfMinutes);
     
        ttsbegin;
        while select forupdate salesTable
            where salesTable.CreatedDateTime <= dateTime
            && salestable.SalesType == SalesType::Sales
                   notexists join salesLine
                     where salesLine.SalesId == salesTable.SalesId
        {
            if(salesTable)
            {
                ordercount++;
                salesTable.delete();
                info(strFmt("@USV:Salesoderdeleted", salesTable.SalesId));
            }
        }
        ttscommit;

        if(ordercount == 0)
        {
            info(strfmt("@USV:Nosalesordersavailablefordeletion"));
        }
       
    }

    void run()
    {
        #OCCRetryCount
        ;
        try
        { 
            if(USVParameters::autoforceModsEnabled())
            {
               this.deleteSalesOrdersWithNoSalesline();
            }
            else
            {
                info("@USV:AutoForceModenotenabled");
            }

           
        }
        catch (Exception::Deadlock)
        {
            retry;
        }
        catch (Exception::UpdateConflict)
        {
            if (appl.ttsLevel() == 0)
            {
                if (xSession::currentRetryCount() >= #RetryNum)
                {
                    throw Exception::UpdateConflictNotRecovered;
                }
                else
                {
                    retry;
                }
            }
            else
            {
                throw Exception::UpdateConflict;
            }
        }
    }

    public static void main(Args args)
    {
        DeleteSalesOrdersWithNoSaleslinesBatch deleteSalesOrderbatch = DeleteSalesOrdersWithNoSaleslinesBatch::construct();

        if (deleteSalesOrderbatch.prompt())
        {
            deleteSalesOrderbatch.run();
        }
    }

}

17 February 2020

Delete the sales orders with no sales lines in X++

Delete the sales orders with no sales lines in X++ :

ttsbegin;
        while select forupdate salesTable
            where  salestable.SalesType == SalesType::Sales
                   notexists join salesLine
                     where salesLine.SalesId == salesTable.SalesId
        if(salesTable)
        {
            salesTable.delete();
            info(strFmt("Sales order - %1 deleted", salesTable.SalesId));
        }
        else
        {
            info(strfmt("No sales orders available for deletion"));
        }
        ttscommit;




16 January 2020

Ph number want like TELEPHONE (262) 444-8888 in ax


Ph number want like TELEPHONE (262) 444-8888 in ax :



        WarrantyClaimFormPartHeaderTmp.DealerDaytimePhone             = "("+ SubStr(WarrantyClaimTable.DealerDaytimePhone,1,3)+ ") "+SubStr(WarrantyClaimTable.DealerDaytimePhone,4,3)+ "-"+SubStr(WarrantyClaimTable.DealerDaytimePhone,7,4);

Find the physical date for item with site/warehouse combination through batch job in d365

Find the physical date for item  with site/warehouse combination through batch job in d365 :



class FirstReceiptDateItemWarehouseBatch  extends RunBaseBatch
{
    #DEFINE.CurrentVersion(1)
    #DEFINE.Version1(1)

    boolean canGoBatchJournal()
    {
        //true if the class is shown in the list of Journal types; otherwise, false.
        return true;
    }

    protected void new()
    {
        super();
    }

    public container pack()
    {
        //Serializes the current instance of the RunBase class.
        return [#CurrentVersion];
    }

    void run()
    {
        #OCCRetryCount
        ;
        try
        {
            this.insertFirstReceiptDate();
        }
        catch (Exception::Deadlock)
        {
            retry;
        }
        catch (Exception::UpdateConflict)
        {
            if (appl.ttsLevel() == 0)
            {
                if (xSession::currentRetryCount() >= #RetryNum)
                {
                    throw Exception::UpdateConflictNotRecovered;
                }
                else
                {
                    retry;
                }
            }
            else
            {
                throw Exception::UpdateConflict;
            }
        }
    }

    public boolean runsImpersonated()
    {
        return true;
    }

    public boolean unpack(container packedClass)
    {
        //Deserializes the packedClass parameter value to an instance of the RunBase class.
        boolean         isSuccessful;
        Version         version = RunBase::getVersion(packedClass);
        ;

        switch (version)
        {
            case #CurrentVersion:
            {
                [version] = packedClass;
                isSuccessful = true;
                break;
            }
         
        default :
            return false;
        }

        return isSuccessful;
    }

    server static FirstReceiptDateItemWarehouseBatch construct()
    {
        return new FirstReceiptDateItemWarehouseBatch();
    }

    client server static ClassDescription description()
    {
        return "ProductFirstReceiptDate";
    }

    public static void main(Args args)
    {
        FirstReceiptDateItemWarehouseBatch firstReceiptBatch = FirstReceiptDateItemWarehouseBatch::construct();

        if (firstReceiptBatch.prompt())
        {
            firstReceiptBatch.runOperation();
        }
    }


    public void insertFirstReceiptDate()
    {
        ItemSiteLocationTmp      usvItemSiteLocationTmp;
        ProductFirstReceiptDate  usvProductFirstReceiptDate;
        InventTable                 inventTable;
        InventLocation              inventLocation;

        InventTrans                 inventTrans;
        InventTransOrigin           inventTransOrigin;
        InventDim                   inventDim;
        FirstReceiptDate         usvFirstReceiptDate;
        Counter                     cntProcessed;
        Counter                     cntInserted;

        setprefix(USVFirstReceiptDateItemWarehouseBatch::description());

       

        insert_recordset ItemSiteLocationTmp (ItemId, InventSiteId, InventLocationId)
        select ItemId from inventTrans                       // process only if Item transactions
            group by inventTrans.ItemId, inventDim.InventSiteId, inventDim.inventLocationId
                where inventTrans.StatusReceipt                 == StatusReceipt::Purchased
                &&    inventTrans.DatePhysical                  != dateNull()  // must have date
            join InventSiteId, InventLocationId from inventDim  // process only if transactions in Site/Warehouse
                where inventDim.inventDimId                     == inventTrans.inventDimId
                &&    inventDim.InventSiteId                    != ''
                &&    inventDim.inventLocationId                != ''
            exists join inventTransOrigin                    // process only if these types exist
                where inventTransOrigin.RecId                   == inventTrans.InventTransOrigin
                &&   (inventTransOrigin.ReferenceCategory       == InventTransType::TransferOrderReceive
                   || inventTransOrigin.ReferenceCategory       == InventTransType::InventTransaction
                   || inventTransOrigin.ReferenceCategory       == InventTransType::InventCounting
                   || inventTransOrigin.ReferenceCategory       == InventTransType::WHSWork
                   || inventTransOrigin.ReferenceCategory       == InventTransType::Purch);

        ttscommit;

        info(strfmt("@SYS76766", "@SYS74037", ItemSiteLocationTmp.RowCount()));

        // process combinations (eliminating certain combinations)
        while select ItemSiteLocationTmp
            exists join inventTable
                where inventTable.ItemId                        == usvItemSiteLocationTmp.ItemId
                &&    inventTable.ItemType                      == ItemType::Item   // Items only
            exists join inventLocation
                where inventLocation.InventLocationType         == InventLocationType::Standard  // Default warehouses only
                &&    inventLocation.InventSiteId               == usvItemSiteLocationTmp.InventSiteId
                &&    inventLocation.InventLocationId           == ItemSiteLocationTmp.InventLocationId
            notexists join usvProductFirstReceiptDate        // process only if no FirstReceipt record
                where ProductFirstReceiptDate.ItemId         == ItemSiteLocationTmp.ItemId
                &&    ProductFirstReceiptDate.SiteId         == ItemSiteLocationTmp.InventSiteId
                &&    ProductFirstReceiptDate.WarehouseId    == ItemSiteLocationTmp.InventLocationId
        {
            cntprocessed++;
            usvFirstReceiptDate = dateNull();

            // find earliest DatePhysical for Item/Site/Warehouse
            while select DatePhysical from inventTrans
                order by DatePhysical asc
                    where inventTrans.ItemId                    == usvItemSiteLocationTmp.ItemId
                    &&    inventTrans.StatusReceipt             == StatusReceipt::Purchased
                    &&    inventTrans.DatePhysical             != dateNull()  // must have date

                join ReferenceCategory, ReferenceId, RecId from inventTransOrigin  //  process only if these types exist
                    where inventTransOrigin.RecId               == inventTrans.InventTransOrigin
                    &&   (inventTransOrigin.ReferenceCategory   == InventTransType::TransferOrderReceive
                       || inventTransOrigin.ReferenceCategory   == InventTransType::InventTransaction
                       || inventTransOrigin.ReferenceCategory   == InventTransType::InventCounting
                       || inventTransOrigin.ReferenceCategory   == InventTransType::WHSWork
                       || inventTransOrigin.ReferenceCategory   == InventTransType::Purch)

                join RecId from inventDim                    // process only if transactions in Site/Warehouse
                    where inventDim.inventDimId                 == inventTrans.inventDimId
                    &&    inventDim.InventSiteId                == ItemSiteLocationTmp.InventSiteId
                    &&    inventDim.inventLocationId            == ItemSiteLocationTmp.InventLocationId
            {
                if (FirstReceiptDate != dateNull())
                {
                    break;
                }

                if (inventTransOrigin.ReferenceCategory  == InventTransType::WHSWork)
                {
                    WHSWorkTable    whsWorkTable;
                    select firstonly RecId from whsWorkTable
                        where whsWorkTable.WorkId           == inventTransOrigin.ReferenceId
                        &&    whsWorkTable.WorkStatus       == WHSWorkStatus::Closed
                        &&   (whsWorkTable.WorkTransType    == WHSWorkTransType::Purch
                           || whsWorkTable.WorkTransType    == WHSWorkTransType::TransferReceipt);

                    if (whsWorkTable.RecId)
                    {
                        usvFirstReceiptDate = inventTrans.DatePhysical;
                    }
                }
                else
                {
                    usvFirstReceiptDate = inventTrans.DatePhysical;
                }
            }

            if (FirstReceiptDate != dateNull())
            {
                ProductFirstReceiptDate  ProductFirstReceiptDateInsert;

                ProductFirstReceiptDateInsert.ItemId             = ItemSiteLocationTmp.ItemId;
                ProductFirstReceiptDateInsert.SiteId             = ItemSiteLocationTmp.InventSiteId;
                ProductFirstReceiptDateInsert.WarehouseId        = ItemSiteLocationTmp.InventLocationId;
                ProductFirstReceiptDateInsert.FirstReceiptDate   = FirstReceiptDate;
                ProductFirstReceiptDateInsert.insert();
                cntInserted++;
            }
        }

        info(strfmt("@SYS76766", "@SYS103900", cntProcessed));
        info(strfmt("@SYS76766", "@SYS77068", cntInserted));
    }

}

15 August 2019

Barcode in ax

Code for barcode in ax :


 public BarCodeString getBarcode(str _barCodeText)
    {
         

        BarCodeString   barCodeString;
        Barcode         barcode;
        barcode = Barcode::construct(BarcodeType::Code128);

        barcode.string(true, _barCodeText);
        barcode.encode();
        barCodeString = barcode.barcodeStr();
     
        return barCodeString;
       
    }