[GELÖST] Rückgabe Records und Tabellenbuffern von AX nach C#

22. Februar 2012 13:28

Hallo und moin,

ich beschäftige mich derzeit mit dem .NET BusinessConnector unter C# (VS2010) in Verbindung mit AX 2012
Ich weiss, ist (angeblich) veraltet - aber zur Zeit bei mir gesetzt.

Funktionieren tun einfache Tabellenabfragen aus C# heraus wie diese:

Code:
public static List<Mandant> GetMandantList()
        {
            Axapta          ax;
            AxaptaRecord    axRecord;
            List<Mandant>   mandantList     = new List<Mandant>();
            string          selectStatement = string.Empty;

            using (ax = new Axapta())
            {
                try
                {
                    ax.Logon(null, null, null, null);
                    axRecord          = ax.CreateAxaptaRecord("DirPartyTable");
                    selectStatement   = "select crossCompany Name, NameAlias, RecId from %1 order by Name";

                    axRecord.ExecuteStmt(selectStatement);
                    while (axRecord.Found)
                    {
                        mandantList.Add(new Mandant((string)axRecord.get_Field("Name"),
                                                     axRecord.get_Field("RecId").ToString(),
                                                     (string)axRecord.get_Field("NameAlias")));
                        axRecord.Next();
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
            return mandantList;
        }


Was leider nicht funktioniert ist eine Abfrage mit einem selectStatement wie diesem:

Code:
selectStatement = "select Name, NameAlias, RecId from %1 join custTable where custTable.dataAreaId  == " + _dataAreaId + " && %1.RecId == custTable.Party";


Das führt dann während der Laufzeit zu der Fehlermeldung dass es nicht kompiliert werden kann.
Wobei die _dataAreaId einen gültigen Wert darstellt. Habe das in AX mittels eines Job getestet.


Die Verwendung von diesem selectStatement

Code:
selectStatement = string.Format("select Name, NameAlias, RecId from %1 join {0} " +
                                                    "where {1}.dataAreaId == {2} " +
                                                    "&& %1.RecId == {3}.Party", axCustTable, axCustTable, _dataAreaId, axCustTable);


führt bei mir immer zu einer recht langen Fehlermeldung, mit der ich nichts anfangen kann.
Wobei axCustTable analog axRecord deklariert ist - halt nur mit dem entsprechenden String "CustTable".

Nun habe ich mir in C# einen AxaptaBuffer deklariert und versuche diesem den Tabellenbuffer dieser Abfrage in AX zu zuweisen:

Code:
public static DirPartyTable GetCustomerByParty(DataAreaId _dataAreaId)
{
    CustTable       custTable;
    DirPartyTable   dirPartyTable;

    select Name, NameAlias, RecId from dirPartyTable
      join    custTable
      where   custTable.dataAreaId  == _dataAreaId
         &&   dirPartyTable.RecId   == custTable.Party;

    return dirPartyTable;
}


Ein Cast in Form von
Code:
myAxaptaBuffer = (AxaptaBuffer)ax.CallStaticClassMethod("VSC_HelperClass", "GetCustomerByParty", _dataAreaId);

liefert mir nur die Fehlermeldung dass ein Umwandeln in den Type AxaptaBuffer nicht möglich wäre.


Nun meine Frage(en):

1. Wie kann ich in C# ein selectStatement deklarieren und ausführen, welches ein join enthält und die Ergebnismenge dann
in C# durchlaufen?

2. Wie kann/muss ich in C# einen einen AxaptaBuffer, Tabellenbuffer etc. anlegen um diesem einen Tabellenbuffer,
der die Ergebnismenge einer Abfrage enthält, von AX nach C# zu übergeben? Und wie könnte ich diesen Buffer dann in C# durchlaufen?

Der Aufruf der Methoden soll jeweils aus C# erfolgen.


Tjo... der Verzweiflung nahe :)

greetz
Joey

Re: [GELÖST] Rückgabe Records und Tabellenbuffern von AX nac

23. Februar 2012 10:22

Ja... moin,
nen wunderguten sogar.

Das Problem hat mir ja keine Ruhe gelassen. Habe nun auch eine Lösung gefunden.

Hier die static method in AX:

Code:
public static server Microsoft.Dynamics.Framework.BusinessConnector.Adapter.IAxRecord GetCustomerByParty(DataAreaId _dataAreaId)
{
    CustTable       custTable;
    DirPartyTable   dirPartyTable;

    select crossCompany Name, NameAlias, RecId from dirPartyTable
      join  custTable
     where  custTable.dataAreaId  == _dataAreaId
        &&  dirPartyTable.RecId   == custTable.Party;
    return dirPartyTable;
}


Und hier der Aufruf aus C# heraus:

Code:
public static List<Mandant> GetCustomerList(string _dataAreaId)
        {
            Axapta ax;
            AxaptaRecord axRecord;
            List<Mandant> customerList = new List<Mandant>();

            using (ax = new Axapta())
            {
                int counter = 0;
                try
                {
                    ax.Logon(null, null, null, null);

                    axRecord = (AxaptaRecord)ax.CallStaticClassMethod("VSC_HelperClass", "GetCustomerByParty", _dataAreaId);

                    while (axRecord.Found)
                    {
                        customerList.Add(new Mandant((string)axRecord.get_Field("Name"),
                                                     axRecord.get_Field("RecId").ToString(),
                                                     (string)axRecord.get_Field("NameAlias")));
                        axRecord.Next();
                        counter++;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            return customerList;
        }



Der Rückgabewert muss wohl speziell deklariert werden.
Arbeitet so auf jeden Fall und die Ergebnismenge stimmt, soweit ich das nachprüfen konnte, auch.


greetz
Joey