2010-04-05 20 views
6

Tôi đang viết công cụ dòng lệnh C# để tìm nạp dữ liệu từ AX và thêm dữ liệu (tạo bảng mới) vào AX.Tạo bảng và truy xuất kết quả truy vấn với đầu nối doanh nghiệp Dynamics AX 2009

dữ liệu tìm nạp từ một bảng AX rất dễ dàng và ghi nhận ở đây: http://msdn.microsoft.com/en-us/library/cc197126.aspx

Thêm dữ liệu vào một bảng hiện cũng rất dễ dàng: http://msdn.microsoft.com/en-us/library/aa868997.aspx

Nhưng tôi không thể tìm ra cách để làm hai việc:

  • Tạo mới Bảng AX
  • Lấy dữ liệu từ một truy vấn AX

Ai đó có thể vui lòng chia sẻ một số mã mẫu hoặc cung cấp một số gợi ý về nơi bắt đầu tìm kiếm. Tìm kiếm của tôi trên Google và MSDN đã không tiết lộ nhiều.

LƯU Ý: Tôi không phải là nhà phát triển AX hoặc ERP có kinh nghiệm.

Trả lời

4

Dưới đây là một cách để tạo ra một bảng AX mới từ C# (điều này là sử dụng một phương pháp mở rộng):


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

Bạn cai trị. Chính xác những gì tôi đang tìm kiếm. – namenlos

0

Tôi thành thật không nghĩ rằng có thể tạo bảng mới bằng cách sử dụng trình kết nối doanh nghiệp. Nó phải được thực hiện trong AX và AOT.

Để trả lại dữ liệu hỗn hợp, tôi có thể sử dụng đối tượng vùng chứa cho điều đó. Các thùng chứa có thể chứa các thùng chứa phụ hoặc các thanh axaptarecords. Một AxaptaRecord chứa dữ liệu từ một bảng đã định nghĩa.

5

Tôi đã tạo truy vấn trong AOT và đã có thể sử dụng C# để trả về dữ liệu. Tìm mã bên dưới. Đó là một truy vấn trả về doanh thu mà tôi tạo ra các Aging Bucket với. Tôi hi vọng cái này giúp được.

[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

Dưới đây là một ví dụ về chạy một truy vấn trong C#:

(Lưu ý: đây là một phương pháp rất đơn giản bằng cách sử dụng định nghĩa truy vấn hiện có, bạn cũng có thể tạo truy vấn từ đầu bằng cách sử dụng đối tượng QueryBuildDataSource, v.v.)


    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(); 
Các vấn đề liên quan