2010-04-05 14 views
6

Estoy escribiendo una herramienta de línea de comandos C# para recuperar datos de AX y agregar datos (crear nuevas tablas) a AX.Creación de tablas y recuperación de resultados de consulta con Dynamics AX 2009 Business Connector

datos de Captación de una tabla AX es fácil y documentados aquí: http://msdn.microsoft.com/en-us/library/cc197126.aspx

Adición de datos a una tabla existente también es fácil: http://msdn.microsoft.com/en-us/library/aa868997.aspx

Pero no puedo encontrar la manera de hacer dos cosas:

  • crear una nueva tabla AX
  • recuperar datos de una consulta AX

¿Puede alguien compartir algún código de muestra o dar algunos consejos sobre dónde empezar a buscar? Mis búsquedas en Google y MSDN no han revelado mucho.

NOTA: No soy un desarrollador experimentado de AX o ERP.

Respuesta

4

Aquí es una manera de crear una nueva tabla AX desde C# (esto es usar un método de extensión):


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

Usted regla. Exactamente lo que estaba buscando. – namenlos

0

Honestamente, no creo que sea posible crear nuevas tablas con el conector comercial. Tiene que hacerse dentro de AX y AOT.

En cuanto a la devolución de datos mezclados, probablemente usaría un objeto contenedor para eso. Los contenedores pueden contener subcontenedores, o axaptarecords. Un AxaptaRecord contiene datos de una tabla definida.

5

He creado una consulta en el AOT y pude utilizar C# para devolver los datos. Encuentra el código a continuación. Es una consulta que devuelve las ventas con las que creo Aging Buckets. Espero que esto ayude.

[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

Aquí es un ejemplo de ejecución de una consulta en C#:

(Nota: este es un método muy simplista al usar una definición de consulta existente, también puede crear una consulta desde cero utilizando los objetos QueryBuildDataSource, etc.)


    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(); 
Cuestiones relacionadas