Wednesday, May 25, 2016

X++ Code To Create Periodic Journal and also create and post new General journal entry for that created periodic journal in ax 2012

X++ Code To Create Periodic Journal and also create and post new General journal entry for that created periodic journal in ax 2012

static void CON_PeriodicJournal(Args _args)
{
    LedgerJournalTrans          ledgerJournalTrans,LedgerJournaltrans1;
    LedgerJournalTable          ledgerJournalTable;
    ledgerJournalname           ledgerJournalname;
    NumberSeq                   numberSeq;
    NumberSequenceTable         numSeqTable;
    container                   cont1,cont2,ledgerDimension,offSetAcctPattern;
    DimensionDynamicAccount     ledgerDim, offsetledgerDim;
    ledgerJournalCheckPost      ledgerJournalCheckPost;
    int                         cnt;
    DimensionDefault            DimensionDefault;
    LedgerJournalPeriodicCopy   LedgerJournalPeriodicCopy;
    CopyMove                    CopyMove;
    LedgerJournalId             periodicLedgerJournalId,genjourLedgerJournalId;
    LedgerJournalACType         periodicACType,periodicOffSetACType;
    DimensionDynamicAccount     periodicAccount,periodicoffsetAccount ;
    AmountCurCredit             credit;

     // find ledgerjournalname record
    select firstonly   ledgerjournalname where LedgerJournalName.JournalName =='PerJrn';

    //create ledger journal table
    ledgerjournaltable.journalname      = ledgerjournalname.journalname ;
    ledgerjournaltable.initfromledgerjournalname();
    ledgerjournaltable.name             = " May Periodic Journal";
    ledgerJournalTable.insert();   // Creating periodic journal header

//Creating periodic journal Lines

    //ledgerJournalTable = LedgerJournalTable::find("00553");
      try
        {
            ttsbegin;
            ledgerJournalTrans.clear();
            ledgerJournalTrans.initValue();
            ledgerJournalTrans.JournalNum   = ledgerJournalTable.JournalNum;
            ledgerJournalTrans.TransDate    = today();
            ledgerJournalName = ledgerJournalName::find(ledgerJournalTable.JournalName);
            periodicLedgerJournalId = ledgerJournalTrans.JournalNum ;
            select firstOnly numSeqTable
                where numSeqTable.RecId  == ledgerJournalName.NumberSequenceTable;
            if (numSeqTable)
            {
                numberseq = numberseq::newGetVoucherFromCode(numSeqTable.NumberSequence);
                ledgerJournalTrans.voucher = numberseq.voucher();
            }

            //ledgerJournalTrans.Voucher              = voucher;
            ledgerJournalTrans.AccountType          = LedgerJournalACType::Vend;
            ledgerJournalTrans.OffsetAccountType = LedgerJournalACType::Ledger;
            // Main account dimensions

            periodicACType = ledgerJournalTrans.AccountType;
            periodicOffSetACType = ledgerJournalTrans.OffsetAccountType;


            cont1=conNull();
            cont2=conNull();
            ledgerDimension =conNull();
            cont2 += ['BusinessUnit','082','Department','023'];
            cnt =2;
            if(ledgerJournalTrans.AccountType  == LedgerJournalACType::Ledger)
            {
                cont1+=['MainAccount','112100',2];
                cont1+=cont2;
                ledgerDim=AxdDimensionUtil::getLedgerAccountId(cont1);

                if(ledgerDim==0)
                {
                        offSetAcctPattern = ['112100','112100'];
                        ledgerDim = AxdDimensionUtil::getLedgerAccountId(offSetAcctPattern);
                }

                ledgerJournalTrans.LedgerDimension  = ledgerDim;
            }
            else //Except Ledger i.e Customer,Vendor,etc
            {
                // here it is Vendor we used
                ledgerDim = DimensionStorage::getDynamicAccount( '000021',ledgerJournalTrans.AccountType);
                ledgerJournalTrans.LedgerDimension  = ledgerDim;
                ledgerDimension +=cnt;
                ledgerDimension +=cont2;
                DimensionDefault = AxdDimensionUtil::getDimensionAttributeValueSetId(ledgerDimension);
                ledgerJournalTrans.DefaultDimension = DimensionDefault;
            }

            periodicAccount = ledgerDim;
            cont1=conNull();
            cont2=conNull();
            ledgerDimension =conNull();
            cont2 += ['BusinessUnit','082','Department','023'];
            cnt =2;
            if(ledgerJournalTrans.OffsetAccountType  == LedgerJournalACType::Ledger)
            {
                cont1+=['MainAccount','112140',2];
                cont1+=cont2;
                offsetledgerDim=AxdDimensionUtil::getLedgerAccountId(cont1);

                if(ledgerDim==0)
                {
                        offSetAcctPattern = ['112140','112140'];
                        offsetledgerDim = AxdDimensionUtil::getLedgerAccountId(offSetAcctPattern);
                }

                ledgerJournalTrans.OffsetLedgerDimension  = offsetledgerDim;
            }
            else
            {
                offsetledgerDim = DimensionStorage::getDynamicAccount( '000021',ledgerJournalTrans.AccountType);
                ledgerJournalTrans.OffsetLedgerDimension = offsetledgerDim;
                ledgerDimension +=cnt;
                ledgerDimension +=cont2;
                DimensionDefault = AxdDimensionUtil::getDimensionAttributeValueSetId(ledgerDimension);
                ledgerJournalTrans.OffsetDefaultDimension = DimensionDefault;
            }

            periodicoffsetAccount = offsetledgerDim;

            ledgerJournalTrans.CurrencyCode          = "USD";
            ledgerJournalTrans.AmountCurCredit       = 6000;
            ledgerJournalTrans.FreqCode              = PeriodUnit::Month;
            ledgerJournalTrans.FreqValue             = 1;

            credit = ledgerJournalTrans.AmountCurCredit;
            if (ledgerJournalTrans.validateWrite())
            {
                ledgerJournalTrans.insert();
            }

            ttscommit;

        }
        catch(Exception::Error)
        {
            info(strFmt('Catched an error in row: %1',ledgerJournalTrans.OffsetDefaultDimension));
        }
        info(strFmt('Periodic journal inserted %1',ledgerJournalTable.JournalNum));

// Up to here Periodic Journal is created Succesfully as below image


Periodic journal lines
Last date is updated here because it is posted from general journal entry




//Creating General journal for above Periodic journal

    ledgerJournalTable.clear();
    //General Ledger create
    select firstonly   ledgerjournalname where LedgerJournalName.JournalName =='GenJrn';

    //create ledger journal table
    ledgerjournaltable.journalname      = ledgerjournalname.journalname ;
    ledgerjournaltable.initfromledgerjournalname();
    ledgerjournaltable.name             = " General Journal";
    genjourLedgerJournalId= ledgerjournaltable.JournalNum;

    ledgerJournalTable.insert();
    info(strFmt("General journal is %1",ledgerjournaltable.JournalNum));




    // here finding the above created Periodic journal
       ledgerJournalTrans = ledgerJournalTrans::find(periodicLedgerJournalId,ledgerJournalTrans.Voucher,true);
       ttsBegin;
       ledgerJournalTrans1.initValue();
       ledgerJournalTrans1.data(ledgerJournalTrans);
// inserting periodic journal values to general journal lines
       ledgerJournalTrans1.JournalNum=ledgerjournaltable.JournalNum;
        //ledgerJournalTrans1.initValue();
        select firstOnly numSeqTable
                where numSeqTable.RecId  == ledgerJournalName.NumberSequenceTable;
            if (numSeqTable)
            {
                numberseq = numberseq::newGetVoucherFromCode(numSeqTable.NumberSequence);
                ledgerJournalTrans1.voucher = numberseq.voucher();
            }

        if(!ledgerJournalTrans1.validateWrite())
        {
           throw error("ERRor");
        }
        else
        {
            ledgerJournalTrans1.insert();
        }
       ttsCommit;


        //Post Journal
        ledgerJournalCheckPost              = ledgerJournalCheckPost::newLedgerJournalTable(ledgerJournaltable,Noyes::Yes);
        LedgerJournalCheckPost.run();

        //Lastdate updated
        ttsBegin;
        ledgerJournalTrans.LastTransferred=today();
        ledgerJournalTrans.update();
        ttsCommit;

}




Info        Message (01:04:41 pm) Periodic journal inserted 00735
Info        Message (01:04:41 pm) General journal is 00736

Info        Message (01:04:41 pm) Number of vouchers posted to the journal: 1

Wednesday, May 18, 2016

X++ code for Creating new Main account as existed main account details in ax 2012(using data method & buf2Buf method)

Using Data method(data()):


static void CreatenewMainaccountwithsamevaluesofanothermainaccount(Args _args)
{
    MainAccount mainaccount1,mainaccount2;
    ;

    mainaccount1=MainAccount::findByMainAccountId('110110'); //existed main account
    ttsBegin;
    mainaccount2.data(mainaccount1);
    mainaccount2.MainAccountId='9866958';  //new main account
   
    if(!mainaccount2.validateWrite())
    {
        throw error("Valid account number shoulb be specified");
    }
    mainaccount2.Insert();
    ttsCommit;
   
}




buf2Buf method example:

static void MainAccountCopy(Args _args)
{   
    MainAccount mainAccount1;   
    MainAccount mainAccount2;
    mainAccount1 = MainAccount::findByMainAccountId('110110');
    ttsBegin;
    buf2Buf(mainAccount1,mainAccount2);
    mainAccount2.MainAccountId = '110111';
    if (!mainAccount2.validateWrite())   
    {       
        throw Exception::Error;   
    }
    mainAccount2.insert();
    ttsCommit;



How to Apply Discount on Return Order For Particular Sales Order while changing return qty in ax 2012



Scenario : Discount for Return order for Selected SalesOrder in ax 2012 r3

Hi guys recently I got requirement on “Discount for Return order for Selected SalesOrder “

Actually as per Functionality while doing Return Order for Selected SalesOrder(i.e if Original SalesOrder is having some discpercent),here in return order line if you change qty the Original "DiscPercent" of that selected SalesOrder will not effect here So to effect " Discount for Return order" i had written following code 

Note: This Code Will Effect only if you change qty on Return Order line for selected SalesOrder 
Now go to Returntable Form >> SalesLine DataSource>>ExpectedRetQty Field>>Modified()


void  modified()
{
    SalesLine salesline1;
   // Find Original Salesorder's InventTransId by using InventTransIdReturn
   
    salesline1 = SalesLine::findInventTransId(SalesLine.InventTransIdReturn); 
    super();
    interCompanyIsPriceDiscSearchNeeded = salesLine.RecId;

    if (mcrCallCenterEnabled)
   {
        element.mcrSetLineControls();
        }
//here original Salesorder linepercent will get by above finding Inventransid by using that we can do percent calculation as below
// here Salesline1 is the Original SalesOrder Recid
    if (salesline1.LinePercent)

        {
        salesline.LineAmount = (salesline.SalesPrice -(salesline.SalesPrice*(salesline1.LinePercent/100)))*salesline.ExpectedRetQty;
salesline.LinePercent=  salesline1.LinePercent;
        }
    else
        {
        if (salesline1.LineDisc)
        {
        salesline.LineAmount = (salesline.SalesPrice - salesline1.LineDisc) * salesline.ExpectedRetQty;
        salesline.LineDisc      =  salesline1.LineDisc;

        }
        else
        {
        salesline.LineAmount = salesline.SalesPrice * salesline.ExpectedRetQty;
        }
  }

}

How Standard code calculated Netamount for both SalesOrder and Purchase Order in ax 2012

GoTO >>Class PriceDisc


Goto >>Method>>
client server static AmountCur  price2Amount(PriceCur         price,
                                             PriceUnit        priceUnit,
                                             DiscAmount       discAmount,
                                             Qty              qtyNow,
                                             Qty              qty,
                                             MarkupAmount     markup,
                                             DiscPct          discPercent,
                                             CurrencyCode     currencyCode,
                                             Amount           amount,
                                             boolean          forceAmountCalculation = false)
{
    Amount returnAmount;
    // <GEEPL>
    #ISOCountryRegionCodes
    // </GEEPL>
    ;

    if (!price && !discAmount && !discPercent && !markup && !forceAmountCalculation)
    {
        if (qtyNow == qty)
            return amount;
        else
            price = PriceDisc::amount2Price(amount,
                                            discPercent,
                                            markup,
                                            qty,
                                            discAmount,
                                            priceUnit,
                                            currencyCode,
                                            price);
    }

    if (price  || discAmount || discPercent || markup || forceAmountCalculation)
    {
        if (!priceUnit)
            priceUnit = 1;

        // <GEEPL>
        if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoPL]) &&
            SalesParameters::find().LineDiscCalculation_PL == PlLineDiscCalcType::PcsPrice &&
            (discAmount || markup || discPercent))
        {
            returnAmount = (qtyNow / priceUnit) * Currency::amount((price - discAmount + markup) * (100 - discPercent) / 100, currencyCode);
        }
        else
        {
        // </GEEPL>
            returnAmount = (qtyNow * ((price - discAmount) / priceUnit) + (qtyNow >= 0 ? markup : -markup) ) * (100 - discPercent) / 100;
        // <GEEPL>
        }

        // </GEEPL>
        returnAmount = Currency::amount(returnAmount, currencyCode);
    }
    else
    {
        returnAmount = amount;
    }

    return returnAmount;
}


Friday, May 6, 2016

X++ code for Modify dialog fields in ax 2012

class SK_ModifyDialogField extends RunBasebatch
{

    CustAccount CustId;

    DialogField dialogCustId;

    DialogField dialoglName;

    Dialog dialog;


}
protected Object dialog()
{

    ;

    dialog = super();

    dialogCustId = dialog.addFieldValue(extendedTypeStr(CustAccount),"Customer", "Customer");

    dialoglName = dialog.addFieldValue(extendedTypeStr(Name),"Name", "Name");

    return dialog;

}
public void dialogPostRun(DialogRunbase tmpdialog)
{

    super(tmpdialog);

    tmpdialog.dialogForm().formRun().controlMethodOverload(true);

    tmpdialog.dialogForm().formRun().controlMethodOverloadObject(this);

}




Above image shows dialog field personalization

public boolean fld1_1_modified()
{

    FormStringControl control = dialog.formRun().controlCallingMethod();

    boolean isFieldModified;

    ;

    isFieldModified = control.modified();

    if(isFieldModified)

    {

    dialoglName.value(custTable::find(control.text()).Name());

    }

    return isFieldModified;

}
static void main(Args args)
{

    SK_ModifyDialogField SK_ModifyDialogField = new SK_ModifyDialogField();

    ;

    if (SK_ModifyDialogField.prompt())

    SK_ModifyDialogField.run();

}


Export a copy of the standard user acceptance testing (UAT) database

 Reference link: Export a copy of the standard user acceptance testing (UAT) database - Finance & Operations | Dynamics 365 | Microsoft ...