我想知道是否有办法在不调用AX中的X ++代码的情况下使用.NET业务连接器从AOT获取所有表名?
根据MSDN,我们必须提供表名。 [Link]
Axapta ax;
AxaptaRecord axRecord;
using (axRecord = ax.CreateAxaptaRecord(tableName));
{
// Perform actions
}
Axapta Class只有" GetRecordCount"但没有什么可以得到记录名称。
请帮助
答案 0 :(得分:0)
您可以从AX then access that制作一个列表!
或者你可以使用Dictionary类:
static void findTables(Args _args)
{
Dictionary dictionary = new Dictionary();
TableId tableId;
TableName tableName;
for (tableId = dictionary.tableNext(0); tableId; tableId = dictionary.tableNext(tableId))
{
tableName = dictionary.tableName(tableId);
info(strfmt('%1 - %2', tableId, tableName));
}
}
这是X ++代码,但转换为C#是微不足道的。
答案 1 :(得分:0)
与上一个答案所述相反,可以使用.Net Business Connector返回表名列表。
此方法使用AxaptaRecord上的ExecuteStmt方法动态执行X ++代码。
从您的客户端代码
Axapta ax = new Axapta();
using (AxaptaRecord r = ax.CreateAxaptaRecord("SQLDICTIONARY"))
{
r.ExecuteStmt("SELECT NAME, TABID FROM %1 WHERE %1.NAME LIKE 'CUST*' && %1.FIELDID == 0");
while (r.Found)
{
Console.WriteLine((string)r.get_Field("NAME"));
}
}
价:
http://msdn.microsoft.com/en-us/library/aa594213(v=ax.50).aspx
http://www.stoneridgesoftware.com/using-like-in-x/
http://msdn.microsoft.com/EN-US/library/aa848113.aspx
答案 2 :(得分:0)
Axapta ax = new Axapta();
ax.LogonAs(name, domain, null,null,null,null,null);
AxaptaObject dictable = ax.CreateAxaptaObject("Dictionary");
int index = (int)dictable.Call("tableNext", 0);
while(index > 0) {
AxaptaObject table = (AxaptaObject)dictable.Call("tableObject", index);
string tableName = (string)table.Call("name");
int next = (int)dictable.Call("tableNext", index);
if (next <= index)
break;
index = next;
}