Project Item Journal D365FO


Project Item Journal D365FO

Dynamics technical consultants often times receive the requirements to create the journal using X++ where we couldn't use data entity for any reason.

So, In this article, I am writing the sample which may help you a lot to create a project Item journal easily.





public void createProjectInventJournal(ProjectJournalContract    _projectJournal)
    {
        InventDim                            inventDim;
        InventJournalName                    InventJournalName;
        InventJournalTable                   inventJournalTable;
        InventJournalTableData               journalTableData = JournalTableData::newTable(inventJournalTable);
        InventTable                          inventTable;
        ProjTable                               projTable;
        AWCFieldServIntegrtionMainAccount     ServiceOffsetAccount=this.findServiceMainAccount(AWCFieldServiceIntegrationType::ProjectItem);
       
         ProjectJournalTransContract  journalTransContract;

        if(_projectJournal.getProjectJournalTransCount()==0)
        {
            return;
        }
       

        journalTransContract = _projectJournal.getProjectJournalTrans(0);

        select projTable
            where projTable.ProjId==journalTransContract.ProjectId;

        select inventTable
            where inventTable.itemId==journalTransContract.ItemId;

        select InventJournalName
            where InventJournalName.JournalType==InventJournalType::project
        && InventJournalName.isFSJournal==NoYes::Yes;

        inventJournalTable.JournalId = journalTableData.nextJournalId();
        inventJournalTable.JournalType=InventJournalType::project;
      
        journalTableData.initFromJournalName(InventJournalName);
     
        inventJournalTable.insert();

        InventJournalTrans          inventJournalTrans;
        InventJournalTransData      journalTransData = journalTableData.journalStatic().newJournalTransData(inventJournalTrans, journalTableData);
        journalTransData.initFromJournalTable();

        inventJournalTrans.TransDate    = today();

       

        inventJournalTrans.ProjId               =journalTransContract.ProjectId;
       inventJournalTrans.ProjCategoryId       = journalTransContract.ProjectCateId;
        inventJournalTrans.initFromProjTable(projTable);

        inventJournalTrans.initFromInventTable(inventTable);
       
        inventJournalTrans.Qty              = journalTransContract.QtyUsed;
        inventJournalTrans.PriceUnit        = journalTransContract.CostPrice;
     
        inventJournalTrans.ProjUnitID       = journalTransContract.Unit;
        inventJournalTrans.Worker           = HcmWorkerLookup::currentWorker();
        inventJournalTrans.LedgerDimension  = LedgerDefaultAccountHelper::getDefaultAccountFromMainAccountRecId(MainAccount::findByMainAccountId(ServiceOffsetAccount.MainAccountId).RecId);
        inventJournalTrans.activityNumberModified();
        inventDim.clear();
        inventDim.InventSiteId  = journalTransContract.Site;
        inventDim.InventLocationId =journalTransContract.Location;
        inventDim.wMSLocationId = journalTransContract.Warehouse;

       
        inventJournalTrans.InventDimId = inventDim::findOrCreate(inventDim).inventDimId;

        //other fields
        journalTransData.create();
    }

Currency Conversion X++ AX7, D365FO and AX-2012


Currency Conversion X++ AX7, D365FO and AX-2012


Convert currency to currency.


Static void main(Args args)
{
    CurrencyExchangeHelper currencyExchangeHelper;
    AmountMst amountMST;
    CurrencyCode toCurrency =  ‘AED’;
    CurrencyCode FromCurrency =  ‘USD’;

    AmountCur amountCur = 5000;



        currencyExchangeHelper = CurrencyExchangeHelper::newExchangeDate(Ledger::current(), systemDateGet());
        amountMST =  currencyExchangeHelper.calculateCurrencyToCurrency(toCurrency, fromCurrency,amountCur,true);

  
info(strFmt(“%1”, amountMST))


}



Convert Transaction currency to company ledger currency.
The method will convert the transaction currency into accounting currency defined in the ledger.

static void Main(Args _args)
{
    CurrencyExchangeHelper currencyExchangeHelper;
    CurrencyCode transCurrency = ‘EUR’;
    AmountCur amountCur = 5500.00;
    AmountMst amountMST;
   
    currencyExchangeHelper = CurrencyExchangeHelper::newExchangeDate(Ledger::current(), systemDateGet());
    amountMST = currencyExchangeHelper.calculateTransactionToAccounting(transCurrency, amountCur ,true);
    info(strFmt(‘%1’,amountMST));
}





Convert Company currency to transaction currency.

The method calculates the transaction currency amount from an accounting currency given.

static void  main(Args _args)
{
    CurrencyExchangeHelper currencyExchangeHelper;
    CurrencyCode transCurrency = ‘AED’;
    AmountCur amountCur;
    AmountMst amountMST = 5500.00;
   
    currencyExchangeHelper = CurrencyExchangeHelper::newExchangeDate(Ledger::primaryLedger(CompanyInfo::findDataArea("DUM").RecId), systemDateGet());
    amountCur = currencyExchangeHelper.calculateAccountingToTransaction(transCurrency, amountMST ,true);
    info(strFmt(‘%1’,amountcur));
}

Project Journal D365FO


Project-Hour Journal D365FO


By using the following code sample, You can create the Project journal easily.



  public void createProjectHourJournal(ProjectJournalContract    _projectJournal) // project hour journal
    {
        ProjJournalTableData    JournalTableData;
        ProjJournalTransData    journalTransData;
        ProjJournalTable        journalTable, journalTableUpdate;
        ProjJournalTrans        journalTrans;
        ProjTable               projTable;
        ProjInvoiceTable        projInvoiceTable;
        NumberSeq               numberSeq;
        ProjJournalCheckPost    jourPost;
        ProjQtyEmpl             qty;
        JournalNumOfLines       numOfLines;
        ProjCategory            projCategory;
        LedgerJournalName       ledgerJournalName;
        ProjectJournalTransContract     projecJournalTrans;
       // ProjLinePropertySetup       projLinePropertySetup;
        ProjJournalName         projJournalName;

        if(_projectJournal!=null)
        {

            select projJournalName
                where projJournalName.isFSJournal==NoYes::Yes;

            projecJournalTrans=_projectJournal.getProjectJournalTrans(0);
           
            ttsBegin;
            journalTableData =          JournalTableData::newTable(journalTable);


            journalTransData =            journalTableData.journalStatic().newJournalTransData(journalTrans,  journalTableData);


            //select projLinePropertySetup
            //    where projLinePropertySetup.ProjCode==TableGroupAll::All
            //    && projLinePropertySetup.ProjRelation==projTable.ProjId;

            projTable           = ProjTable::find(projecJournalTrans.ProjectId);
            // Init        JournalTable
            projCategory=ProjCategory::find(projecJournalTrans.ProjectCateId);
      
            journalTable.JournalId      = journalTableData.nextJournalId();

            journalTable.JournalType    = ProjJournalType::Hour;

            journalTable.ProjId=projecJournalTrans.ProjectId;
            journalTable.ProjQty=projecJournalTrans.QtyUsed;
            journalTable.CategoryId=projecJournalTrans.ProjectCateId;
            journalTable.ProjTransDate=systemDateGet();
            //journalTable.LinePropertyId
            journalTable.initFromProjJournalName(projJournalName);
            journalTable.insert();

          
            journalTableData.initFromJournalName(journalTableData.journalStatic().findJournalName(journalTable.JournalNameId));

            journalTrans.clear();
            journalTransData.initFromJournalTable();
    
            projInvoiceTable    = projTable.projInvoice();
           
          

            journalTrans.setTransDate();
          //  journalTrans.TransDate      = systemDateGet();
            journalTrans.ProjTransDate  = systemDateGet();
            journalTrans.ProjId         = projTable.ProjId;
            journalTrans.Qty            = projecJournalTrans.QtyUsed;
            journalTrans.CategoryId     = projCategory.CategoryId;
         //   journalTrans.LinePropertyId = projLinePropertySetup.LinePropertyId;
            journalTrans.Worker         = HcmWorkerLookup::currentWorker();
            journalTrans.ActivityNumber = projecJournalTrans.ActivityId;
            journalTrans.Txt            = _projectJournal.FreeTxt;

           
           

            if(projInvoiceTable.CurrencyId)
            {
                journalTrans.CurrencyId =            projInvoiceTable.CurrencyId;
            }

            else
            {
                journalTrans.CurrencyId =           Ledger::accountingCurrency(CompanyInfo::current());

            }


            journalTrans.DefaultDimension   = projTable.DefaultDimension;
            journalTrans.TaxGroupId         =           ProjParameters::taxGroupInvoice(projTable.ProjId);

            if  (journalTrans.Worker)
            {
                journalTrans.setHourPrices();
                journalTrans.setPeriodDate();
            }

            numberSeq =            NumberSeq::newGetVoucherFromId(journalTable.VoucherNumberSequenceTable, false);
            journalTrans.Voucher        = numberSeq.voucher();
            journalTransData.create();

            ttsCommit;
       

        }

    }

Compile AX 2012




Using below command you can compile the AX-2012

  1. copy and paste the highlighted cd C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\bin , press enter.
  2. copy and paste the highlighted ,AXBuild.exe xppcompileall /s=06,press enter.

Compnay Currency X++



Company Currency X++



You can find the company Currency using below Code.

CompanyInfo::standardCurrency() 
Ledger::accountingCurrency(CompanyInfo::current()

info(strFmt("%1",CompanyInfo::standardCurrency() ));

info(strFmt("%1",Ledger::accountingCurrency(CompanyInfo::current())));

Ledger Dimension D365FO



Ledger Dimension AX2012 & D365FO



In AX -2012 We use DimensionStorage class and method getDynamicAccount to get the Ledger dimension of the following accounts.

For Instance 
DimensionStorage::getDynamicAccount("ABC",LedgerJournalACType::Ledger);
  1. Ledger
  2. Cust
  3. Vend
  4. Project
  5. FixedAssets
  6. Bank
In D365FO  DimensionStorage is removed and the new class introduces LedgerDynamicAccountHelper to get the Ledger dimension of the following accounts.

For Instance 


LedgerDynamicAccountHelper::getDynamicAccountFromAccountNumber("Project-001",LedgerJournalACType::Project);


WBS key for a project activity X++ code



WBS key for a project activity X++ code 



Using following SQL Query you can retrieve all activities of one project.

select PURPOSE,ACTIVITYNUMBER from smmActivities
where ACTIVITYNUMBER in (
select ActivityNumber from SmmActivityParentLinkTable
join projTable
            on  projTable.Recid=SmmActivityParentLinkTable.refRecId
   and  SmmActivityParentLinkTable.parentType=7


   where projTable.ProjId='PROJ-0000003')



Using following AX Query you can retrieve all activities of one project.

    SmmActivityParentLinkTable  activityParentLinkTable;
        ProjTable                   projTable;
        ProjectActivityNumber           projectActivityNumber;
        smmActivities               smmActivities;
         
            
            
            
         while   select PURPOSE,ACTIVITYNUMBER from smmActivities
           exists join activityParentLinkTable
            where activityParentLinkTable.ActivityNumber==smmActivities.ActivityNumber
           exists join projTable
            where projTable.Recid==activityParentLinkTable.refRecId
            && activityParentLinkTable.parentType==smmActivityParentType::Project
            && projTable.ProjId=="PROJ-0000003"
        {
         //   projectActivityNumber=new ProjectActivityNumber();

           // projectActivityNumber.ActivityNumber=activityParentLinkTable.ActivityNumber;
           info(strFmt("%1 %2",smmActivities.Purpose, smmActivities.ActivityNumber));
     //       _objContract.addProjectActivity(projectActivityNumber);
        }

Compare Records D365FO & AX 2012





How to compare two records buffer field to field. 



public static container compareRecords(Common _record1, Common _record2)
{
    SysDictTable    dictTable = new SysDictTable(_record1.TableId);
    SysDictField    dictField;
    FieldId         fieldId, extFieldId;
    container       ret;
    int             i, j;
    ;

    if (_record1.TableId != _record2.TableId)
        return conNull();

    for (i=1; i<=dictTable.fieldCnt(); ++i)
    {
        fieldId = dictTable.fieldCnt2Id(i);
        dictField = new SysDictField(_record1.tableId, fieldId);

        if (!dictField.isSystem())
        {
            for (j=1; j<= dictField.arraySize(); ++j)
            {
                extFieldId = fieldId2Ext(fieldId, j);

                if (_record1.(extFieldId) != _record2.(extFieldId))
                {
                    ret += [extFieldId, _record1.(extFieldId), _record2.(extFieldId)];
                }
            }
        }
    }

    return ret;
}




For Demo purpose you can use below code in job/runnable class.


static void demoCompareRecords(Args _args)
{
    VendTable vendTable_1 = VendTable::find('ABC'); 
    VendTable vendTable_2 = VendTable::find('XYZ'); 
 
    container   con;
    int         i;
    ;
 
    con = MyClass::compareRecords(vendTable_1 , vendTable_2 );
 
    for (i=1; i<=conLen(con); i+=3)
    {
        info(strFmt("%1, %2 ,%3"
                   ,fieldId2Name(tableNum(VendTable), conPeek(con, i))
                   ,conPeek(con, i+1)
                   ,conPeek(con, i+2)
                   )
             );
    }
}







Virtual Fields Vs Computed Fields

  Virtual Field: A virtual field in D365FO is a field that doesn't have a direct representation in the database. It's a field that y...