Search code examples
c#dynamics-ax-2009axapta

Creating Tables and Retrieving Query results with Dynamics AX 2009 business connector


I'm writing a C# command line tool to fetch data from AX and to add data (create new tables) to AX.

Fetching data from an AX table is easy and documented here: http://msdn.microsoft.com/en-us/library/cc197126.aspx

Adding data to an existing table is also easy: http://msdn.microsoft.com/en-us/library/aa868997.aspx

But I cannot figure out how to do two things:

  • Create a new AX Table
  • Retrieve data from an AX Query

Can someone please share some sample code or give some pointers on where to start looking. My searches on Google and MSDN have not revealed much.

NOTE: I am not an experienced AX or ERP developer.


Solution

  • Here is a way to create a new AX table from C# (this is using an extension method):

    
    public static bool CreateAXTable(this Axapta ax)
    {
        string TableName = "MyCustomTable"; 
        string size = "255"; //You could load this from a setting
        bool val = false;
        if (!ax.TableExists(TableName))
        {
            AxaptaObject TablesNode = (AxaptaObject)ax.CallStaticClassMethod("TreeNode", "findNode", @"\Data Dictionary\Tables");
            AxaptaObject node;
            AxaptaObject fields;
            AxaptaObject fieldNode;
    
            TablesNode.Call("AOTadd", TableName); 
            node = (AxaptaObject)ax.CallStaticClassMethod("TreeNode", "findNode", "\\Data dictionary\\Tables\\" + TableName);        
            fields = (AxaptaObject)ax.CallStaticClassMethod("TreeNode", "findNode", "\\Data dictionary\\Tables\\" + TableName + "\\Fields");
    
            fields.Call("addString", "String1"); //add a string field
            fieldNode = (AxaptaObject)fields.Call("AOTfindChild", "String1"); //grab a reference to the field
            fieldNode.Call("AOTsetProperty", "StringSize", size);
            fieldNode.Call("AOTsave");
    
            fields.Call("addString", "String2"); //add a string field
            fieldNode = (AxaptaObject)fields.Call("AOTfindChild", "String2"); //grab a reference to the field
            fieldNode.Call("AOTsetProperty", "StringSize", size);
            fieldNode.Call("AOTsave");
    
            fields.Call("addString", "String3"); //add a string field
            fieldNode = (AxaptaObject)fields.Call("AOTfindChild", "String3"); //grab a reference to the field
            fieldNode.Call("AOTsetProperty", "StringSize", size);
            fieldNode.Call("AOTsave");
    
            fields.Call("addString", "String4"); //add a string field
            fieldNode = (AxaptaObject)fields.Call("AOTfindChild", "String4"); //grab a reference to the field
            fieldNode.Call("AOTsetProperty", "StringSize", size);
            fieldNode.Call("AOTsave");
    
            fields.Call("addReal", "Real1");
            fields.Call("addReal", "Real2");
            fields.Call("addReal", "Real3");
            fields.Call("addReal", "Real4");
    
            fields.Call("addDate", "Date1");
            fields.Call("addDate", "Date2");
            fields.Call("addDate", "Date3");
            fields.Call("addDate", "Date4");
    
            fields.Call("AOTsave");
            node.Call("AOTsave");
    
            AxaptaObject appl = ax.GetObject("appl");
            appl.Call("dbSynchronize", Convert.ToInt32(node.Call("applObjectId")), false);
    
            val = true;
        }
        else //Table already exists
        {
            val = true;
        }
        return val;
    }
    
    
    public static bool TableExists(this Axapta ax, string tableName)
    {
        return ((int)ax.CallStaticClassMethod("Global", "tableName2Id", tableName) > 0);
    }