我想知道是否有一种方法可以通过使用 .NET 业务连接器从 AOT 获取所有表名,而无需在 AX 中调用 X++ 代码?
根据 MSDN,我们必须提供表名。[链接]
Axapta ax;
AxaptaRecord axRecord;
using (axRecord = ax.CreateAxaptaRecord(tableName));
{
// Perform actions
}
Axapta 类只有“GetRecordCount”,但没有获取记录名称。
请帮助
我想知道是否有一种方法可以通过使用 .NET 业务连接器从 AOT 获取所有表名,而无需在 AX 中调用 X++ 代码?
根据 MSDN,我们必须提供表名。[链接]
Axapta ax;
AxaptaRecord axRecord;
using (axRecord = ax.CreateAxaptaRecord(tableName));
{
// Perform actions
}
Axapta 类只有“GetRecordCount”,但没有获取记录名称。
请帮助
与前面的答案相反,可以使用 .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
您可以从 AX 列出一个列表,然后访问它!
或者你可以使用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# 是微不足道的。
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;
}