2010-04-05 7 views
6

Ich schreibe ein C# -Kommandozeilen-Tool, um Daten von AX abzurufen und um Daten zu AX hinzuzufügen (neue Tabellen erstellen).Erstellen von Tabellen und Abrufen von Abfrageergebnissen mit dem Business Connector für Dynamics AX 2009

Abfragen von Daten aus einer AX-Tabelle sind einfach und hier dokumentiert: http://msdn.microsoft.com/en-us/library/cc197126.aspx

Daten zu einer vorhandenen Tabelle hinzuzufügen ist auch einfach: http://msdn.microsoft.com/en-us/library/aa868997.aspx

Aber ich kann nicht herausfinden, wie zwei Dinge zu tun:

  • erstellen neue AX Tabelle
  • Daten aus einer AX-Abfrage abrufen

Kann jemand bitte etwas Beispielcode teilen oder einige Hinweise geben, wo man beginnt zu suchen. Meine Suchen auf Google und MSDN haben nicht viel ergeben.

HINWEIS: Ich bin kein erfahrener AX- oder ERP-Entwickler.

Antwort

4

Hier ist ein Weg, um eine neue AX-Tabelle von C# (dies wird über ein Verlängerungsmethode) zu erstellen:

:

eine Abfrage in C# läuft

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

Sie herrschen. Genau das, was ich gesucht habe. – namenlos

0

Ich glaube ehrlich gesagt nicht, dass es möglich ist, neue Tabellen mit dem Business Connector zu erstellen. Es muss innerhalb von AX und AOT gemacht werden.

Wie für die Rückgabe gemischte Daten, würde ich wahrscheinlich ein Container-Objekt dafür verwenden. Container können Subcontainer oder Axaptarrecords aufnehmen. Ein AxaptaRecord enthält Daten aus einer definierten Tabelle.

5

Ich habe eine Abfrage in der AOT erstellt und konnte C# verwenden, um die Daten zurückzugeben. Finde den Code unten. Es ist eine Abfrage, die die Verkäufe zurückgibt, mit denen ich Ageing Buckets erstellt habe. Ich hoffe das hilft.

[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

Hier ist ein Beispiel (Hinweis: Dies ist eine sehr einfache Methode, indem Sie eine vorhandene Abfragedefinition verwenden. Sie können auch eine Abfrage von Grund auf mithilfe von QueryBuildDataSource-Objekten usw. erstellen.)


    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(); 
Verwandte Themen