Thursday, January 10, 2013

Ax 2012 inventory movement posting

static void hks_InventMovementJournalPosting(Args _args)
{
    InventJournalTable  inventJournalTable;
    InventJournalTrans  inventJournalTrans;
    InventJournalTableData  inventJournalTableData;
    InventJournalTransData  inventJournalTransData;
    InventTable             inventTable;
    InventDim               inventDim;
    InventJournalCheckPost  inventJournalCheckPost = new InventJournalCheckPost();
    container               ledgerDim;
    ;
    inventJournalTableData = JournalTableData::newTable(inventJournalTable);    
    
    //Init Journal table
    inventJournalTable.clear();
    inventJournalTable.initValue();
    inventJournalTable.JournalId = inventJournalTableData.nextJournalId();
    inventJournalTable.JournalType = InventJournalType::Movement;
    inventJournalTable.JournalNameId = inventJournalTableData.journalStatic().standardJournalNameId(inventJournalTable.JournalType);
    inventJournalTableData.initFromJournalName(inventJournalTableData.journalStatic().findJournalName(inventJournalTable.JournalNameId));
    inventJournalTable.insert();
    
    //Init JournalTrans
    inventJournalTransData = inventJournalTableData.journalStatic().newJournalTransData(inventJournalTrans,inventJournalTableData);
    select firstonly inventTable where inventTable.ItemId == '1000';
    inventJournalTrans.clear();
    inventJournalTrans.initFromInventJournalTable(inventJournalTable);
    inventJournalTrans.TransDate = systemdateget() + 1 div 2;   
    inventJournalTrans.initFromInventTable(inventTable, false, false, false);
    inventJournalTrans.Qty = 10;
    inventJournalTrans.CostAmount = 100;
    
    //Dimensions
    inventDim.InventLocationId = "21";
    inventDim.InventSiteId = InventLocation::find(inventDim.InventLocationId).InventSiteId;
    inventJournalTrans.InventDimId = inventDim::findOrCreate(inventDim).inventDimId;
    
    //set the offset account
    ledgerDim = ["Goodwill",'1110000'];
    inventJournalTrans.LedgerDimension =  AxdDimensionUtil::getLedgerAccountId(ledgerDim);
    
    inventJournalTransData.create();
    
    if (InventJournalCheckPost::newPostJournal(inventJournalTable).validate())
        InventJournalCheckPost::newPostJournal(inventJournalTable).run();
    
    info (inventJournalTable.JournalId);

    
    

}

Ax 2009 Get primary Address

 
//This method tries to get the primary address (Ex: customer address). 
//If not found, tries get the address based on the address Type (Ex: delivery address), 
//else tries to find the first available address.

Private Address address(DirPartyId _partyId, AddressType _addressType)
{
    Address         address;
    DirPartyTable   dirPartyTable;
    DirParty        party;
    ;

    while select  address
        join dirPartyTable
            where dirPartyTable.RecId == address.AddrRecId
            &&    dirPartyTable.TableId == address.AddrTableId
            &&    dirPartyTable.PartyId == _partyId
    {
        party = DirParty::constructFromCommon(dirPartyTable);
        party.initializeAddressInfo(DateTimeUtil::getSystemDateTime());
        if (party)
        {
            if (party.getDirPartyAddress().getAddressRecId()==address.RecId)
                return address;
        }
    }

    if (!address)
    {
        select firstonly address  where address.type == _addressType
            join recId from dirPartyTable
            where dirPartyTable.RecId == address.AddrRecId
            &&    dirPartyTable.TableId == address.AddrTableId
            &&    dirPartyTable.PartyId == _partyId;
    }
    if (!address)
        select firstonly address
            join recId from dirPartyTable
                where dirPartyTable.RecId == address.AddrRecId
                &&    dirPartyTable.TableId == address.AddrTableId
                &&    dirPartyTable.PartyId == _partyId;

    return address;
}

Ax 2009 Set Child Form access based on caller

 
//The following code is a generic code which can be used in scenario when based on certain condition of in main form, the associated forms should be view only.
Example if the item master is approved then the child forms should be only view only (default setting, transaction text etc) else should work as per standard Ax user permissions.

\Classes\SysSetupFormRun
public void init()
{
    this.AA_setCallerFormAccess();
}


void AA_setCallerFormAccess()
{
    FormDataSource formDataSource,formDataSourceChild;
    Object         formObject;
    Object         caller;
    FormRun        callerForm;
    Common         common;
    int            dsCnt;
    ;

    //info(this.args().menuItemName());    
    if (this.args().menuItemName()  != "InventTxt" &&
        this.args().menuItemName()  != "InventPackagingUnit" &&
        this.args().menuItemName()  != "PriceDiscTable_PricePurch" &&
        this.args().menuItemName()  != "PriceDiscTable_LineDiscPurch" &&
        this.args().menuItemName()  != "PriceDiscTable_MultiLineDiscPurch" &&
        this.args().menuItemName()  != "PriceDiscTable_EndDiscPurch" &&
        this.args().menuItemName()  != "SuppItemTable_Purch"
        )
            return;

    formDataSource = this.objectSet();
    if (formDataSource && 
        formDataSource.formRun().args().menuItemType() == MenuItemtype::Display)
    {
        caller = formDataSource.formRun().args().caller();
        if (!caller)
            return;
            
        callerForm = caller;
        if (callerForm.name() != formstr(InventTable))
            return;

        for (dsCnt =  1; dsCnt <= formDataSource.query().dataSourceCount(); dsCnt++)
        {
            formDataSourceChild = 
                         this.objectSet(formDataSource.query().dataSourceNo(dsCnt).name());
            if (formDataSourceChild)
            {
                formDataSourceChild.allowCreate(false);
                formDataSourceChild.allowDelete(false);
                formDataSourceChild.allowEdit(false);
            }
        }
    }
}

Ax 2009 Enable disable field controls

 
The following code can be used to enable all disable field controls in a group control.
Add the field to a container which needs to be enabled are disabled and call the generic function. In the below example, Name is a group control and 2 fields in this control needs to be enabled.

    //[TabPage:General]\[Group:Column1]\[Group:Name]
    Name.enabled(true);
    conItemChildNames = connull();
    conItemChildNames = ["Name_AA_MasterkeyType","Name_M_txtDefault"];
    element.AA_enableDisableFieldControls(Name,conItemChildNames,true);
    conItemChildNames = connull();

void AA_enableDisableFieldControls(FormGroupControl _formGroupControl, 
container _conChildNames, boolean _enableControl = false)
{
    FormGroupControl    formGroupControl;
    Object              fat;
    Object              child;
    Object              bchild;
    int                 controlCount;
    int                 j;
    ;


    formGroupControl = _formGroupControl;
    fat = form.design().control(formGroupControl.id());
    controlCount = fat.controlcount();
    for (j = 1; j <= controlCount; j++)
    {

        bchild  = fat.controlNum(j);
        child = element.design().control(bchild.id());
        if(!conFind(_conChildNames,child.name()))
        {
            child.enabled(_enableControl);
        }
    }
}

Ax 2012 LedgerJournalPosting

 
static void hks_LedgerJournalPosting(Args _args)
{
    LedgerJournalName          ledgerJournalName;
    LedgerJournalTable         ledgerJournalTable;
    LedgerJournalTrans         ledgerJournalTrans;
    NumberSeq                  numberSeq;
    LedgerJournalCheckPost     ledgerJournalCheckPost; 
    container                  ledgerDim;
;


    select ledgerJournalName where ledgerJournalName.JournalType == 
    LedgerJournalType::Daily && ledgerJournalName.JournalName == "GenJrn"; 

    ledgerJournalTable.JournalName = ledgerJournalName.JournalName; 
    ledgerJournalTable.initFromLedgerJournalName();
    ledgerJournalTable.insert(); 

    //NumberSequenceTable::find(ledgerJournalTable.NumberSequenceTable).NumberSequence
    numberSeq = numberSeq::newGetVoucherFromCode(NumberSequenceTable::find           
    (ledgerJournalName.NumberSequenceTable).NumberSequence, 
    NumberSeqScopeFactory::createDefaultScope(),true);

    ledgerJournalTrans.JournalNum = ledgerJournalTable.JournalNum; 
    ledgerJournalTrans.AccountType = LedgerJournalACType::Ledger;
    ledgerDim = ["Goodwill","1110000"];
    ledgerJournalTrans.LedgerDimension = AxdDimensionUtil::getLedgerAccountId(ledgerDim);
    ledgerJournalTrans.CurrencyCode = "USD";
    ledgerJournalTrans.ExchRate = Currency::exchRate(ledgerJournalTrans.CurrencyCode);
    ledgerJournalTrans.AmountCurDebit = 10;
    ledgerJournalTrans.TransDate = today();
    ledgerJournalTrans.Txt = "hks test";
    ledgerDim = ["Petty Cash","110180"];
    ledgerJournalTrans.OffsetLedgerDimension = AxdDimensionUtil::getLedgerAccountId
                                               (ledgerDim);
    ledgerJournalTrans.Voucher = numberSeq.voucher();
    ledgerJournalTrans.insert();
    numberSeq.used();

    info(ledgerJournalTable.JournalNum);

    ledgerJournalCheckPost = LedgerJournalCheckPost::newLedgerJournalTable
                             (ledgerJournalTable,true);
    ledgerJournalCheckPost.run();

} 

Tuesday, August 28, 2012

Ax 2012 TableWithValidTimeStateFieldPropery


 


static void HKS_JobTableWithValidTimeStateField(Args _args)
{
    #AOT
    #properties
    TreeNodeIterator  treeNodeIterator;
    TreeNode             contextNode;
    str                        prop;
    int                        i;

    treeNodeIterator = TreeNode::findNode(#TablesPath).AOTiterator();
    contextNode = treeNodeIterator.next();
    while(contextNode)
    {
        contextNode = treeNodeIterator.next();
        prop =contextNode.AOTgetProperty(#PropertyValidTimeStateFieldType);
        if ( prop == enum2str(ValidTimeStateFieldType::Date) ||
            prop == enum2str(ValidTimeStateFieldType::UtcDateTime) )
        {
            info(contextNode.AOTname());
        }
    }
}








Ax 2012 Ax Util commands


 

run cmd

To clear screen cls

c:\ d:

d: \ cd "D:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities"
OR
In explorer go to D:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities
Click on the folder holding shift and select Open in "command window from here"

To list all the axutil commands:
------------------------------------
d:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities> axutil /?

To export the modal, If modal has space then use " "
-------------------------------------------------------------
d:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities>axutil export /model:hks1 /file:"C:\AxModal_Backup\hks1"

d:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities>axutil export /model:"USR Model" /file:"C:\AxModal_Backup\Usr Model"

To delete a model:
----------------------
d:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities>axutil delete /model:"hks1" /noPrompt

To delete a layer
d:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities>axutil delete /Layer:usr

To import a modal using Config
--------------------------------------
d:\Program Files\Microsoft Dynamics Ax\ManagementUtilitieses>axutil import /file:"C:\Axmodal_backup\hks.modal" /config:"DemoDataAx"

view modal contents based on model id
----------------------------------------------
D:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities>axutil view /model
:"28" /config:"DemoDataAx"
d:\Program Files\Microsoft Dynamics AX\60\ManagementUtilities>axutil delete /model:"test12345" /noPrompt /config:"DemoDataAx"