Thursday, 25 May 2017

Post the Purchase Journal in ax 2009

class       PurchJournalChangeType
extends     RunBaseBatch
{
    PurchaseType        purchaseType;
    QueryRun            journal;
    Query               query;

    DialogField         fieldContinue;
    PurchTable          purchTable;


    #define.CurrentVersion(1)
    #LOCALMACRO.ParmList
        PurchaseType
    #ENDMACRO
}


public boolean canGoBatchJournal()
{
    return true;
}

Object dialog()
{
    FormRun formRun = classfactory.createQueryForm(this);
    ;

    formRun.init();
    return formRun;
}

void new(PurchaseType  _purchaseType)
{
    QueryBuildDataSource    queryData;
    QueryBuildRange         queryRange;
    ;

    super();

    this.getLast();

    purchaseType = _purchaseType;

    query = new Query();

    query.addDataSource(tablenum(PurchTable));
    queryData   = query.dataSourceTable(tablenum(PurchTable));
    queryRange  = queryData.addRange(fieldnum(PurchTable, PurchaseType));
    queryRange.value(queryValue(PurchaseType::Journal));
    queryRange.status(1);  // locked

    queryData.addRange(fieldnum(PurchTable, PurchId));
    queryData.addRange(fieldnum(PurchTable, CreatedDateTime));

    journal = new QueryRun(query);
}

container pack()
{
    return [#CurrentVersion,#ParmList,journal.pack()];
}

public QueryRun queryRun()
{
    return journal;
}

void  run()
{
    #OCCRetryCount
    ;
    journal.query().dataSourceTable(tablenum(PurchTable)).update(true);
    journal.query().dataSourceTable(tablenum(PurchTable)).concurrencyModel(ConcurrencyModel::Optimistic);

    while (journal.next())
    {
        purchTable = journal.get(tablenum(PurchTable));

        setprefix(#PreFixField(PurchTable, PurchId));
        try
        {
            ttsbegin;

            purchTable.PurchaseType = purchaseType;

            if (!purchTable.validateWrite())
            {
                throw Exception::Error;
            }

            purchTable.write();
            ttscommit;
        }

        catch (Exception::Deadlock)
        {
            purchTable = PurchTable::find(purchTable.PurchId, true, ConcurrencyModel::Optimistic);
            retry;
        }

        catch (Exception::UpdateConflict)
        {
            if (appl.ttsLevel() == 0)
            {
                if (xSession::currentRetryCount() >= #RetryNum)
                {
                    throw Exception::UpdateConflictNotRecovered;
                }
                else
                {
                    purchTable = PurchTable::find(purchTable.PurchId, true, ConcurrencyModel::Optimistic);
                    retry;
                }
            }
            else
            {
                throw Exception::UpdateConflict;
            }
        }

        catch (Exception::Error)
        {
            checkFailed("@SYS25904");
        }
    }
}

public boolean runsImpersonated()
{
    return true;
}

boolean unpack(container packedClass)
{
    Integer         _version      = conpeek(packedClass,1);
    container       _packedQuery;

    switch (_version)
    {
        case #CurrentVersion:
            [_version,#ParmList,_packedQuery] = packedClass;
            if (_packedQuery)
                journal = new QueryRun(_packedQuery);
            break;

        default:
            return false;
    }

    return true;
}

static PurchJournalChangeType  construct(PurchaseType  purchaseType)
{
    return new PurchJournalChangeType(purchaseType);
}

static ClassDescription description()
{
    return "@SYS6146";
}

static void  main(Args  args)
{
    PurchJournalChangeType  purchJournalChangeType;
    ;

    if (!args)
        throw error("@SYS25407");

    purchJournalChangeType = PurchJournalChangeType::construct(args.parmEnum());

    if (purchJournalChangeType.prompt())
        purchJournalChangeType.run();
}



Wednesday, 17 May 2017

LoadStandardCost through X++ in ax 2009

static void FS_Load_Standard_Cost_DB(Args _args)
{

//scapistrant-20100903
//Mods 2010-12-29 per DBucher

    inventitempricesim          inventitempricesim;

    FileName                    fileName;
    SysExcelApplication         excelApp;

    boolean                         rowFound = true;
    boolean                         TrueFalse = true;

    counter                         readCounter   = 0;
    counter                         ErrCounter    = 0;
    counter                         InsertCounter = 0;
    counter                         updateCounter = 0;

    Itemid                          fsName;

    int                             lineNum = 4;
    int                             lineNumEnd = 999999;

    Dialog                          dialog;
    DialogField                     dialogFieldFileName;
    DialogField                     dialogFieldStartLineNum;
    DialogField                     dialogFieldEndLineNum;
    DialogField                     dialogFieldInventDimId;


    SysOperationProgress            progress = new SysOperationProgress();
    #AviFiles

;

    progress.setAnimation(#AviUpdate);
    progress.setCaption("Load Standard Cost into InventItemPriceSim");

     dialog              = new Dialog('Load Standard Price into InventItemPriceSim table');
    dialogFieldFileName = dialog.addField(typeId(FileNameOpen), 'File name', 'Filename containing input data');
    dialogFieldFileName.lookupButton(2);
    dialogFieldStartLineNum = dialog.addField(typeid(Integer),"Starting Liine Number","start loading records at line number specified");
    dialogFieldStartLineNum.value(lineNum);
    dialogFieldEndLineNum = dialog.addField(typeid(Integer),"Ending Liine Number","stop loading records at line number specified");
    dialogFieldEndLineNum.value(lineNumEnd);
    dialogFieldInventDimId = dialog.addField(typeid(inventDimId),"Enter InventDimId relating to InventDimTable filtered by Site ID for AE");


    if (dialog.run())
    {
        fileName = dialogFieldFileName.value();
        if(!fileName)
        {
            info(strfmt('No file name specified'));
            return;
        }

        if (dialogFieldStartLineNum.value() > 0)
        {
            lineNum = dialogFieldStartLineNum.value();
        }

        if (dialogFieldEndLineNum.value() > 0)
        {
            lineNumEnd = dialogFieldEndLineNum.value();
        }


        ExcelApp = SysExcelApplication::construct();
        ExcelApp.workbooks().open(filename);
        try
        {
          while (rowFound && ExcelApp.activeSheet().cells().range(strfmt('A%1',lineNum)).item(lineNum))
          {
            readCounter++;


            if (lineNum > lineNumEnd)
            {
                rowfound = false;
                continue;
            }

            if (ExcelApp.activeSheet().cells().item(lineNum, 1).value().variantType() == ComVariantType::VT_EMPTY &&
                ExcelApp.activeSheet().cells().item(lineNum, 2).value().variantType() == ComVariantType::VT_EMPTY)
            {
                 rowfound = false;
                 continue;
            }

            //load data
            ttsbegin;
            //values provided by Jeffery

            //inventItemPriceSim.ItemId = ExcelApp.activeSheet().cells().item(lineNum, 1).value().bstr();
            if (ExcelApp.activeSheet().cells().item(lineNum, 1).value().varianttype() == comVariantType::VT_R8)
                {
                    inventItemPriceSim.ItemId    = num2str(ExcelApp.activeSheet().cells().item(lineNum, 1).value().double(),0,0,2,0);//item ID-verify both
                }
                else
                {
                    inventItemPriceSim.ItemId    = ExcelApp.activeSheet().cells().item(lineNum, 1).value().bstr(); //item ID-verify both
                }
            info(ExcelApp.activeSheet().cells().item(lineNum, 1).value().bstr());
            info(num2str(ExcelApp.activeSheet().cells().item(lineNum, 1).value().double(),0,0,2,0));
            inventItemPriceSim.VersionId = "Std-2011fe";  //verify from accounting
            inventItemPriceSim.FromDate = str2date("01-31-2011",213);  // verify with acconting
            inventItemPriceSim.PriceType = CostingVersionPriceType::Cost;  // never change
            inventItemPriceSim.Price =  ExcelApp.activeSheet().cells().item(lineNum, 3).value().double();  //unit price
            inventItemPriceSim.PriceUnit = 1;  // always a 1
            inventItemPriceSim.UnitID = ExcelApp.activeSheet().cells().item(lineNum, 2).value().bstr();  //unit of measure
            inventItemPriceSim.InventDimId =  dialogFieldInventDimId.value();  //never changes
            inventItemPriceSim.insert();
            ttscommit;
            InsertCounter ++;
            lineNum ++;

          }
        }

        catch
        {
            excelapp.workbooks().close();
            excelapp.quit();
            info(strfmt('Error occured at rcd %1 for Item: %2', lineNum, fsName));
        }

    info("Records Read " + int2str(readCounter));
    info("Records Inserted " + int2str(insertCounter));

    }
    return;
}

Friday, 17 February 2017

Get started developing in AX 7



This blog will show how you can start making a customization in AX 7 by showing you the steps needed to make a simple script
Before starting customizing AX it is recommended to create your own Model
  • The first step is to log into Visual Studio as an Adminstrator
Dev1
Once within Visual Studio, go to the AX7 menu and select Model Management and ‘Create model’. A model is not exactly the same as a layer, but it might be a useful analogy to think of it as being similar to a layer in the sense, it is a way to isolate and manage your customizations
Dev2
Create the model in the form that appears and fill out the fields as appropriate

Dev3
Click ‘Next’ and select ‘Existing package’ and choose ‘Application Suite’

Dev4
Press ‘Next’ – accept the default values suggested and press ‘Finish’


Dev5
In the ‘Save’ screen that appears, select the project DynamicsAX7 and give it a name of your choice and press ‘OK’
Dev6
Notice in the Solution Explorer to the right in the screen a new Project has been created in your newly created Model

Dev7
On the Solution Explorer go to the project and rightclick and select ‘Properties’
Dev8
In here note that the project is in the new Model just created and that the customizations will be saved in the ‘USR’ layer
Dev9
Also, it’s a good idea to specify which company you wish to execute the code in, here ‘DEMF’
Press OK
 Now to add ‘Runnable Class(Job) to the Project do the following. On the project rightclick and select ‘Add’ and then select ‘New Item’
Dev10

In the screen shat appears select ‘Code’ and then ‘Runable Class(Job)’
Dev11
And press ‘Add’
Note that now in the Solution explorer that the Runable Class has been added
Dev12
Doubleclick on the ‘Runable class’ and enter the code editor window and give your job a meaningful name and write your code like you would do any X++ job as known in previous versions
dev12B
Save the project(Ctrl + S) and to compile the job, select ‘Build’ and ‘Build Solution’ from the toolbar
Dev13b

Wait until the output window reports that the build has completed
Dev14


Now in order to run the job, you need to set it as a ‘Startup Object’
Go to the Solution Explorer and on the Job, righclick and select ‘set as Startup Object’
Dev15
Now to execute the job, select ‘Debug’ in the toolbar and then ‘Start without Debugging’
Dev16
And note the output in the browser
DevFinalOutput

https://blogs.msdn.microsoft.com/axsupport/2016/03/23/get-started-developing-in-ax-7/
And that’s it. Happy AX7 developing !

http://www.slideshare.net/BohdanBilous/ax7-ide-part-i

http://www.slideshare.net/BohdanBilous/ax7-ide-part-i

Microsoft Dynamics® AX 7 Development Basics

Before we talk AX7 Development, we need to have look at few terminologies, which are as under

Element: Element is any Object residing in AOT. E.g. any Base Enumeration, any EDT, any Table, any Form, which you see in AOT Tree, is an element itself.

Model: A Model is a group of elements. A model is collection of elements that represent a distributable software solution.

Packages: A package is deployable unit, which may have multiple Models.

Project: Projects are the logical containers for everything that's needed to build your application. A project can be associated with only one model.

After we know basic terminologies, which will be used very frequently, let’s start with ways of developments AX7 provides.

With arrival of AX7, now we can do development in AX, with two methodologies.

  1. OverLayring
    If you have been developer of previous versions of AX such as AX2012 or AX2009, you don’t need explanation of this way of development. Name of this methodology ‘OverLayring’ is self-explanatory.
    In Microsoft Dynamics AX, a layer system is used to manage elements. The USR layer is the top layer and the SYS layer is the bottom layer, and each layer has a corresponding patch layer above it.
    OverLayring means if you do change/customize any element in upper layer, it will override its definition, in lower layer.
    This is what we were doing till AX2012 to customize AX. It basically allows customization of metadata and source code in higher layer. For example, you can add a new field in CustTrans Table in the user layer or in ISV Layer.
  2. Extension
    It refers to concept of extending existing elements, without overriding those into other layers. That means, elements will not be customized, instead elements will be extended. This approach reduces upgrade cost and conflicts. By creating extension elements, all of the customizations and code are stored in a separate assembly. It only contains the code that was added or changed in the extension file. Since this code resides in a separate assembly, it improves performance and the ability to upgrade and test.

Tuesday, 31 January 2017

Item Default Site order setting through X++ code in ax 2009

Before that we need one Excel work book in that first column need to fill the Item numbers.
then use this job.

static void Item_Default_Site(Args _args)
{
        SysExcelApplication             application;
        SysExcelWorkbooks               workbooks;
        SysExcelWorkbook                workbook;
        SysExcelWorksheets              worksheets;
        SysExcelWorksheet               worksheet;
        SysExcelCells                   cells;
        COMVariantType                  type;
        System.DateTime                 ShlefDate;
        FilenameOpen                    filename;
        dialogField                     dialogFilename;
        Dialog                          dialog;
        //Table Declarations Starts
        DlvMode                        dlvMode;
        str ItemNum;
        InventTable             inventTable;
        InventItemInventSetup   inventItemInventSetup;
        InventItemPurchSetup    inventItemPurchSetup;
        InventItemSalesSetup    inventItemSalesSetup;
        InventDim               inventDim;

        //Table Declartions Ends
        int                             row;
        #Excel
        // convert into str from excel cell value
    str COMVariant2Str(COMVariant _cv, int _decimals = 0, int _characters = 0, int _separator1 = 0, int _separator2 = 0)
        {
        switch (_cv.variantType())
        {
        case (COMVariantType::VT_BSTR):
        return _cv.bStr();
        case (COMVariantType::VT_R4):
        return num2str(_cv.float(),_characters,_decimals,_separator1,_separator2);
        case (COMVariantType::VT_R8):
        return num2str(_cv.double(),_characters,_decimals,_separator1,_separator2);
        case (COMVariantType::VT_DECIMAL):
        return num2str(_cv.decimal(),_characters,_decimals,_separator1,_separator2);
        case (COMVariantType::VT_DATE):
        return date2str(_cv.date(),123,2,1,2,1,4);
        case (COMVariantType::VT_EMPTY):
        return "";
        default:
        throw error(strfmt("@SYS26908", _cv.variantType()));
        }
        return "";
        }
        ;
        dialog              =   new Dialog("Excel Upoad");
        dialogFilename      =   dialog.addField(typeId(FilenameOpen));
       // dialog.filenameLookupFilter(["@SYS28576″,#XLSX,"@SYS28576",#XLS]);
        dialog.filenameLookupTitle("Upload from Excel");
        dialog.caption("Excel Upload");
        dialogFilename.value(filename);
        if(!dialog.run())
        return;
        filename            =   dialogFilename.value();
        application         =   SysExcelApplication::construct();
        workbooks           =   application.workbooks();
        try
        {
        workbooks.open(filename);
        }
        catch (Exception::Error)
        {
        throw error("File cannot be opened.");
        }
        workbook            =   workbooks.item(1);
        worksheets          =   workbook.worksheets();
        worksheet           =   worksheets.itemFromNum(1);
        cells               =   worksheet.cells();
        try
        {
        ttsbegin;
        do
        {
        row++;
        itemNum =(COMVariant2Str(cells.item(row,1).value()));
        #define.itemId(itemNum)
       // inventTable.ItemId = COMVariant2Str(cells.item(row,1).value());
          inventTable = InventTable::find(#itemId);
     #define.siteId('XXX')
       if(row > 1)
        {
        //Insert into InventSize Table
         if(inventTable.ItemId)
          {
             ttsBegin;

        inventDim.initValue();
        inventDim.InventSiteId = #siteId;
        inventDim = InventDim::findOrCreate(inventDim);

        //InventItemSalesSetup
        inventItemSalesSetup.clear();
        inventItemSalesSetup.initValue();
        inventItemSalesSetup.ItemId = inventTable.ItemId;
        inventItemSalesSetup.InventDimId = InventDim::inventDimIdBlank();
        inventItemSalesSetup.InventDimIdDefault = inventDim.inventDimId;
        inventItemSalesSetup.insert();

        //InventItemInventSetup
        inventItemInventSetup.clear();
        inventItemInventSetup.initValue();
        inventItemInventSetup.ItemId = inventTable.ItemId;
        inventItemInventSetup.InventDimId = InventDim::inventDimIdBlank();
        inventItemInventSetup.InventDimIdDefault = inventDim.inventDimId;
        inventItemInventSetup.insert();

        //InventItemPurchSetup
        inventItemPurchSetup.clear();
        inventItemPurchSetup.initValue();
        inventItemPurchSetup.ItemId = inventTable.ItemId;
        inventItemPurchSetup.InventDimId = InventDim::inventDimIdBlank();
        inventItemPurchSetup.InventDimIdDefault = inventDim.inventDimId;
//        inventItemPurchSetup.inventSiteId()
        inventItemPurchSetup.insert();
        ttscommit;
        }

         info(strfmt(" uploaded successfully"));
        }
        type = cells.item(row+1, 1).value().variantType();
        }while (type != COMVariantType::VT_EMPTY);
        application.quit();
        ttscommit;
        }
        catch
        {
        Error("Upload Failed");
}
}