10.06.2013, 20:53 | #1 |
Участник
|
Query UNION Ax2009 - идентификация строки
Объединяю в query с типом union две таблицы, к примеру PurchTable, SalesTable.
Нужен какой-то признак, для определения к какой из таблиц относится строка. Добавлять столбец с tableid в таблицу не хочется. Какие есть варианты решения?
__________________
Ax2009 Последний раз редактировалось uchenik; 10.06.2013 в 20:59. |
|
11.06.2013, 01:13 | #2 |
Участник
|
Вряд ли это возможно.
По сути, когда выполняется такой запрос, уже не существует PurchTable и SalesTable, есть только одна таблица - OrderTable, в которой есть пару идентичных/схожих полей. Соответственно, если нужно знать, из какой таблицы пришла запись, нужно это иметь в поле этой новой таблицы, выбирая туда данные. В SQL это можно было бы сделать через выборку константы, в АХ это не поддерживается, поэтому скорее всего нужно именнодобавлять в запрос еще одно идентифицируещее поле. Но вообще - возможно стоит задуматься, а может это два отдельных запроса, если вас с результатами надо разные вещи делать в зависимости от таблицы? |
|
11.06.2013, 03:21 | #3 |
Administrator
|
Где-то нарыл пример (сейчас не могу найти ссылку). Здесь код таблицы определяется по номеру датасорса, который содержится в поле unionAllBranchId. Важный момент - если у вас конструкция не UNOIN ALL - то определить источник записи невозможно, т.к. без ALL БД отсекает дублирующиеся записи и т.о. выводимая запись имеет неизвестный источник данных.
X++: static void union(Args _args) { Query query; QueryBuildDataSource qbdsCustTable; QueryBuildDataSource qbdsVendTable; QueryRun queryRun; CustVendTable custVendTable; TableName tableName; ; query = new Query(); query.queryType(QueryType::Union); query.allowCrossCompany(true); query.addCompanyRange('ceu'); query.addCompanyRange('cee'); qbdsCustTable = query.addDataSource(tableNum(CustTable)); qbdsCustTable.unionType(UnionType::UnionAll); // Include duplicate records qbdsCustTable.fields().dynamic(false); qbdsCustTable.fields().clearFieldList(); qbdsCustTable.fields().addField(fieldNum(CustTable, AccountNum)); qbdsCustTable.fields().addField(fieldNum(CustTable, Name)); qbdsCustTable.fields().addField(fieldNum(CustTable, DataAreaId)); qbdsVendTable = query.addDataSource(tableNum(Vendtable)); qbdsVendTable.unionType(UnionType::UnionAll); // Include duplicate records qbdsVendTable.fields().dynamic(false); qbdsVendTable.fields().clearFieldList(); qbdsVendTable.fields().addField(fieldNum(VendTable, AccountNum)); qbdsVendTable.fields().addField(fieldNum(VendTable, Name)); qbdsVendTable.fields().addField(fieldNum(VendTable, DataAreaId)); queryRun = new QueryRun(query); if (!queryRun.prompt()) { return; } while (queryRun.next()) { custVendTable = queryRun.getNo(1); tableName = tableid2name(queryRun.getNo(custVendTable.unionAllBranchId).TableId); info (strFmt("%1 %2 (%3, %4)", custVendTable.AccountNum, custVendTable.Name, tableName, custVendTable.dataAreaId)); } }
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Logger (3), uchenik (1), Товарищ ♂uatr (1). |
11.06.2013, 03:32 | #4 |
Боец
|
|
|
|
За это сообщение автора поблагодарили: uchenik (1). |
11.06.2013, 07:42 | #5 |
Участник
|
Спасибо, так действительно лучше!
Порадовало расположение свойства UnionType. Запросы-то разные, но отобразить нужно в одной таблице, а вот переходить к основной таблицы по полю SalesPurchId нужно на правильную форму
__________________
Ax2009 |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|