Wednesday, May 16, 2018

Geting Deleted NumberSequences

Override the form datasource delete method write .logic in that method it will also workfor table delete method also.

public void delete()
{
 NumberSequenceTable numSeqTable;
 ProjOnAccTransId    ProjOnAccTransId;

  ProjOnAccTransId   = ProjOnAccTrans.TransId;
 numSeqTable        = NumberSequenceTable::find(projparameters::numRefProjTransIdBase().NumberSequenceId);

 super();

if (numSeqTable.Continuous)
    {
        numSeqTable = NumberSequenceTable::find(projparameters::numRefProjTransIdBase().NumberSequenceId);
        NumberSeq::release(numSeqTable.NumberSequence, ProjOnAccTransId);
    }
    else
    {
        if (NumberSeq::numInsertFormat(numSeqTable.NextRec - 1, numSeqTable.Format) == ProjOnAccTransId)
        {
            ttsbegin;
            numSeqTable = NumberSequenceTable::find(projparameters::numRefProjTransIdBase().NumberSequenceId, true);
            numSeqTable.NextRec--;
            numSeqTable.doUpdate();
            ttscommit;
        }
    }
}

Unsaved Record also regenerated by overriding the form method close and call the datasource  delete method

public void close()
{
    if( ProjOnAccTrans.TransId && !ProjOnAccTrans.recid)
     ProjOnAccTrans_ds.delete();
    super();
}

Saturday, May 12, 2018

To get the number sequence based on the date selection financial year.

 For that requirement in project parameters fom created new field

added field in numbersequencereference  tables and make relation with numbersequence table for that table



Code:

    TransDate               fiscalStartdate;
    FiscalCalendarPeriod    fiscalCalendarPeriod;
    RecId                   calendarRecId;
    RefRecId                oldNumberSeq;
    NumberSequenceTable     numberSequenceTable;
    numberSeqFormHandler    numberSeqFormHandler;

calendarRecId = Ledger::fiscalCalendar(CompanyInfo::current());
    fiscalCalendarPeriod = FiscalCalendars::findPeriodByPeriodCodeDate(calendarRecId, today(),                                                FiscalPeriodType::Operating);
    fiscalStartdate = fiscalCalendarPeriod.StartDate;

    if (ProjectOnAccount_TransDate.dateValue() <= fiscalStartDate )
    {
    numberSeqFormHandler = numberSeqFormHandler::newForm(projparameters::numRefProjTransIdBase().NumberSequenceId,element,ProjOnAccTrans_DS,fieldNum(ProjOnAccTrans,TransId));
        numberSeqFormHandler.formMethodDataSourceCreate();
    }
    else if (ProjectOnAccount_TransDate.dateValue() >= fiscalStartDate )
    {
        numberSeqFormHandler = numberSeqFormHandler::newForm(projparameters::numRefProjTransIdBase().NewNumberSequenceId,element,ProjOnAccTrans_DS,fieldNum(ProjOnAccTrans,TransId));
        numberSeqFormHandler.formMethodDataSourceCreate();
    }



Wednesday, May 9, 2018

CIL generation: Object reference not set to an instance of an object.

"CIL generation: Object reference not set to an instance of an object." Err:351

Run full CIL generation using the following steps.

1. Stop the AOS
2. Delete the contents of the bin\XppIL [C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\bin\XppIL] folder on the AOS server (with backup in place) [not the folders, just the files which are outside the folders - 2003 files in total]
3. Restart the AOS
4. Open AX
5. In AOT, Navigate to Build -> Generate Full CIL
After doing these, if you still get any errors, 
1. Navigate to the individual objects in AOT which are throwing the errors
2. Compile them one after the other.
3. Full Compile Again [Build -> Generate Full CIL]

reference :https://community.dynamics.com/ax/b/dynamicsaxinsideout/archive/2015/11/10/error-in-cil-generation-quot-cil-generation-object-reference-not-set-to-an-instance-of-an-object-quot

Monday, May 7, 2018

Table methods

public void modifiedField(FieldId _fieldId)
{
    super(_fieldId);

    switch (_fieldId)
    {
        case fieldNum(CICInternalRequisitionTable,Product):
           this.ProductName =InventTable::find(this.product).itemName();
           this.Description = InventTable::find(this.product).itemDescriptionOrName();
        break;

    }

    if (fieldNum(CICInternalRequisitionTable,unitcost) || fieldNum(CICInternalRequisitionTable,QuantityIssued))
       this.TotalCost = this.UnitCost * this.QuantityIssued;
}


public boolean validateDelete()
{
    boolean                         ret;

    ret = super();

    if (this.FinalStatus != CICInternalRequisitionWorkflowStatus::Draft)
    {
        ret = checkFailed(strFmt("@CIC387",this.FinalStatus));
    }

    return ret;
}


public boolean validateField(FieldId _fieldIdToCheck)
{
    boolean ret;

    ret = super(_fieldIdToCheck);

    if (this.QuantityIssued > this.QtyOrderd)
    {
        ret = checkFailed("@CIC181");
    }

    return ret;
}

public boolean canSubmitToWorkflow(str _workflowType = '')
{
    boolean ret = false;

    if (this.FinalStatus == CICInternalRequisitionWorkflowStatus::draft || this.FinalStatus == CICInternalRequisitionWorkflowStatus::NotSubmitted)
    {
        ret = true;
    }

    return ret;
}

Find & Exist Method

public static CICInternalRequisitionTable find(CICRequisitionId   _requisitionId,
                      boolean       _forUpdate = false)
{
    CICInternalRequisitionTable  internalRequisitionTable;

    if (_requisitionId)
    {
        if (_forUpdate)
        {
            internalRequisitionTable.selectForUpdate(_forUpdate);
        }

        select firstonly internalRequisitionTable
            index hint RequisitionIdIdx
            where internalRequisitionTable.requisitionid == _requisitionId;
    }
    return internalRequisitionTable;
}


public static boolean exist(CICRequisitionId   _requisitionId)
{
    return _requisitionId && (select firstonly RecId from CICInternalRequisitionTable
                                index hint RequisitionIdIdx
                                where CICInternalRequisitionTable.RequisitionId == _requisitionId).RecId != 0;
}

Lookup for Product varients

public void lookup()
{
    Query                  query ;
    QueryBuildDataSource   qbdsInventdim,qbdsInventDimCombination;
    QueryBuildRange        qbr;
    SysTableLookup         sysTableLookup;


    sysTableLookup  = sysTableLookup::newParameters(tableNum(InventDim),this);
    sysTableLookup.addLookupfield(fieldNum(InventDim,InventSizeId));

    query           = new Query();
    qbdsInventdim    = query.addDataSource(tableNum(InventDim));
    qbdsInventDimCombination = qbdsInventdim.addDataSource(tableNum(InventDimCombination));
    qbdsInventDimCombination.addLink(fieldNum(inventDim,InventDimId),fieldnum(InventDimCombination,InventDimId));
    qbr = qbdsInventDimCombination.addRange(fieldNum(inventDim,InventDimId));
    qbr.value(CICInternalRequisitionTable_Product.valueStr());


    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}

Lookup for custom financial dimensions

public void lookup()
{
    SysTableLookup                      sysTableLookup;
    Query                               query;
    QueryBuildDataSource                qbdsDimensionFinancialTag;
    QueryBuildRange                     qbrFinancialTagCategory;

    #define.MyCustomFinancialDimension('ProfitCenter') //name of custom dimension

    query = new Query();
    qbdsDimensionFinancialTag = query.addDataSource(tableNum(DimensionFinancialTag));
    qbrFinancialTagCategory = qbdsDimensionFinancialTag.addRange(fieldNum(DimensionFinancialTag, FinancialTagCategory));
    qbrFinancialTagCategory.value(strFmt('%1', DimensionAttribute::findByName(#MyCustomFinancialDimension, false).financialTagCategory()));

    sysTableLookup = sysTableLookup::newParameters(tableNum(DimensionFinancialTag), this);
    sysTableLookup.addLookupfield(fieldNum(DimensionFinancialTag, Value), true);
    sysTableLookup.addLookupfield(fieldNum(DimensionFinancialTag, Description));
    sysTableLookup.addSelectionField(fieldNum(DimensionFinancialTag, FinancialTagCategory));
    sysTableLookup.parmQuery(query);

    sysTableLookup.performFormLookup();

}

Lookup for financial dimension "Department"

public void lookup()
{
    Query                   query  = new Query();
    QueryBuildDataSource    qbds;
    SysTableLookup          sysTableLookup;


    sysTableLookup = sysTableLookup::newParameters(tableNum(OMOperatingUnit),this);
    sysTableLookup.addLookupfield(fieldNum(OMOperatingUnit,OMOperatingUnitNumber));
    sysTableLookup.addLookupfield(fieldNum(OMOperatingUnit,Name));
    sysTableLookup.addLookupfield(fieldNum(OMOperatingUnit,OMOperatingUnitType));
    sysTableLookup.addSelectionField(fieldNum(OMOperatingUnit,Name));

    qbds = query.addDataSource(tableNum(OMOperatingUnit));
    qbds.addSortField(fieldNum(OMOperatingUnit,OMOperatingUnitNumber));
    qbds.addRange(fieldNum(OMOperatingUnit,OMOperatingUnitType)).value(enum2str(OMOperatingUnitType::OMDepartment));

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}

TFS Work space configuration

Refer below link:  https://d365byjp.blogspot.com/2018/10/steps-to-configure-tfsvsts-workspace-in.html