2010-04-05 71 views
6

我正在編寫一個C#命令行工具來從AX獲取數據並向AX添加數據(創建新表)。使用Dynamics AX 2009業務連接器創建表和檢索查詢結果

從AX表中讀取數據是容易的,這裏記載:http://msdn.microsoft.com/en-us/library/cc197126.aspx

將數據添加到現有的表也很容易:http://msdn.microsoft.com/en-us/library/aa868997.aspx

但我不知道如何做兩件事情:

  • 創建一個新AX
  • 從AX查詢檢索數據

有人可以分享一些示例代碼或給出一些關於從哪裏開始尋找的指針。我在谷歌和MSDN上的搜索沒有透露太多。

注意:我不是經驗豐富的AX或ERP開發人員。

回答

4

下面是一個方法來創建從C#新AX表(這是通過使用一個擴展方法):


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); 
} 
+0

你統治。正是我在找什麼。 – namenlos 2010-05-20 21:10:12

0

我真的不認爲有可能使用業務連接器創建新表。它必須在AX和AOT內完成。

至於返回混合數據,我可能會使用容器對象。容器可以容納子容器或axaptarecords。 AxaptaRecord包含來自一個定義表的數據。

5

我在AOT中創建了一個查詢,並且能夠使用C#來返回數據。找到下面的代碼。這是一個查詢,它返回我創建Aging Bucket的銷售額。我希望這有幫助。

[DataMethod(), AxSessionPermission(SecurityAction.Assert)] 
public static System.Data.DataTable GetCustBuckets(String AccountNum) 
{ 
    //Report Parameters 
    Dictionary<string, object> d = new Dictionary<string, object>(); 
    d.Add("CustTransOpen.AccountNum",AccountNum); 

    // Create a data table. Add columns for item group and item information. 
    DataTable table = new DataTable(); 
    table = AxQuery.ExecuteQuery("SELECT * FROM epcCustomerAging",d); 


    DataTable tableBucket = new DataTable(); 
    DataRow rowBucket; 

    tableBucket.Columns.Add("Current", typeof(double)); 
    tableBucket.Columns.Add("Bucket31to60", typeof(double)); 
    tableBucket.Columns.Add("Bucket61to90", typeof(double)); 
    tableBucket.Columns.Add("Bucket91to120", typeof(double)); 
    tableBucket.Columns.Add("Over120", typeof(double)); 

    //Variables to hold BUCKETS 
    double dCurrent = 0; 
    double dBucket31to60 = 0; 
    double dBucket61to90 = 0; 
    double dBucket91to120 = 0; 
    double dOver120 = 0; 

    // Iterate through the results. Add the item group to the data table. Call the display method 
    foreach (DataRow TransRow in table.Rows) 
    { 

     DateTime TransDate = Convert.ToDateTime(TransRow["TransDate"].ToString()); 
     double AmountCur = Convert.ToDouble(TransRow["AmountCur"].ToString()); 

     DateTime Today= Microsoft.VisualBasic.DateAndTime.Now; 
     long nDays = Microsoft.VisualBasic.DateAndTime.DateDiff(Microsoft.VisualBasic.DateInterval.Day, TransDate, Today, 0, 0); 

     if (nDays <= 30) 
     {    
      dCurrent += AmountCur; 
     } 
     else if (nDays <= 60) 
     { 
      dBucket31to60 += AmountCur ; 
     } 
     else if (nDays <= 90) 
     { 
      dBucket61to90 += AmountCur; 
     } 
     else if (nDays <= 120) 
     { 
      dBucket91to120 += AmountCur; 
     } 
     else 
     { 
      dOver120 += AmountCur;  
     } 
    } 

    rowBucket = tableBucket.NewRow(); 
    rowBucket["Current"] = dCurrent; 
    rowBucket["Bucket31to60"] = dBucket31to60; 
    rowBucket["Bucket61to90"] = dBucket61to90; 
    rowBucket["Bucket91to120"] = dBucket91to120; 
    rowBucket["Over120"] = dOver120; 

    tableBucket.Rows.Add(rowBucket); 

    return tableBucket; 
} 
2

這裏是運行在C#的查詢的示例:

(注意:通過使用現有的查詢定義,這是一個非常簡單的方法,您也可以使用QueryBuildDataSource對象從頭開始構建查詢......)


    Axapta ax = new Axapta(); 
    ax.Logon("", "", "", ""); 

    //Create a query object based on the customer group query in the AOT 
    AxaptaObject query = ax.CreateAxaptaObject("Query", "CustGroupSRS"); 

    //Create a queryrun object based on the query to fecth records 
    AxaptaObject queryRun = ax.CreateAxaptaObject("QueryRun", query); 

    AxaptaRecord CustGroup = null; 
    ; 
    while (Convert.ToBoolean(queryRun.Call("next"))) 
    { 
     //GetTableId function is defined here: .Net Business Connector Kernel Functions 
     CustGroup = (AxaptaRecord)queryRun.Call("get", ax.GetTableId("CustGroup")); 
     System.Diagnostics.Debug.WriteLine(CustGroup.get_Field("Name").ToString()); 
    } 
    CustGroup.Dispose(); 
    queryRun.Dispose(); 
    query.Dispose(); 

    ax.Logoff(); 
    ax.Dispose();