14.11.2006, 11:50 | #1 |
Участник
|
Query из 7 таблиц
Добрый день.
Я написала метод для заполнения tmpтаблицы, но у меня почему-то не вытаскиваются данные из таблиц. Получается что когда подцеляю 5 каких-либо все данные есть, подцепляю еще 2, данные не вытаскиваются.... Причем они меняются, то из одной таблицы нет данных, то из других. Я как большой новичек разобраться в чем дело не могу. Приму замечания даже по-поводу правильности синтаксиса. Так как подсказать мне даже в этом некому. У меня 2 варианта, либо я неправильно делаю, либо действительно больше 5 таблиц в query использовать нельзя. Вот мой код: static server ERP_tmpMythOLAPPurch CreateTmpTable (TransDate StartDate, TransDate EndDate, wfStructStr _ItemKey, wfStructStr _ItemGroupKey, wfStructStr _LocationKey, wfStructStr _ProjectKey, wfStructStr _SbytNaprKey, wfStructStr _AccountKey) { InventTrans _inventTrans; InventTable _inventTable; VendInvoiceTrans _vendInvoiceTrans; PurchTable _purchTable; VendPackingSlipTrans _vendPackingSlipTrans; VendTable _vendTable; InventDim _inventDim; Query QTmpTable; QueryRun QRunTmpTable; QueryBuildDataSource qInventTrans; QueryBuildDataSource qInventTable; QueryBuildDataSource qPurchTable; QueryBuildDataSource qVendTable; QueryBuildDataSource qVendPackingSlipTrans; QueryBuildDataSource qVendInvoiceTrans; QueryBuildDataSource qInventDim; QueryBuildRange _FinProjectRange; QueryBuildRange _FinSbytNaprRange; QueryBuildRange _AccountIDRange; QueryBuildRange _ItemIDRange; QueryBuildRange _ItemGroupIDRange; QueryBuildRange _LocationIDRange; ERP_tmpMythOLAPPurch _tmpMythOLAPPurch; ; // Собираем все необходимые данные для нашего отчета QTmpTable = new Query(); qInventTrans=QTmpTable.addDataSource(TableNum(InventTrans), "InventTrans"); qInventTrans.orderMode(OrderMode::GroupBy); qInventTrans.addSortField(FieldNum(InventTrans, TransRefID)); qInventTrans.addSortField(FieldNum(InventTrans, InventTransID)); qInventTrans.addSortField(FieldNum(InventTrans, Direction)); qInventTrans.addSortField(FieldNum(InventTrans, DateExpected)); qInventTrans.addSortField(FieldNum(InventTrans, DatePhysical)); qInventTrans.addSortField(FieldNum(InventTrans, DateFinancial)); qInventTrans.addSortField(FieldNum(InventTrans, ItemID)); qInventTrans.addSortField(FieldNum(InventTrans, CurrencyCode)); qInventTrans.addSelectionField(FieldNum(InventTrans, TransRefID)); qInventTrans.addSelectionField(FieldNum(InventTrans, InventTransID)); qInventTrans.addSelectionField(FieldNum(InventTrans, Direction)); qInventTrans.addSelectionField(FieldNum(InventTrans, DateExpected)); qInventTrans.addSelectionField(FieldNum(InventTrans, DatePhysical)); qInventTrans.addSelectionField(FieldNum(InventTrans, DateFinancial)); qInventTrans.addSelectionField(FieldNum(InventTrans, ItemID)); qInventTrans.addSelectionField(FieldNum(InventTrans, CurrencyCode)); qInventTrans.addSelectionField(FieldNum(InventTrans, Qty), SelectionField::Sum); qInventTrans.addSelectionField(FieldNum(InventTrans, CostAmountPosted), SelectionField::Sum); qInventTrans.addSelectionField(FieldNum(InventTrans, CostAmountAdjustment), SelectionField::Sum); qInventTrans.addRange(FieldNum(InventTrans,TransType)).value(QueryValue(InventTransType::Purch)); qInventTrans.addRange(FieldNum(InventTrans,DateFinancial)).value(Date2StrUsr(StartDate)+ ".." + Date2StrUsr(EndDate)); if (_ItemKey.empty()==False) qInventTrans.addRange(FieldNum(InventTrans, ItemId)).value(_ItemKey.get()); qInventTable=qInventTrans.addDataSource(TableNum(InventTable), "InventTable"); qInventTable.orderMode(OrderMode::GroupBy); qInventTable.addSortField(FieldNum(InventTable, ItemName)); qInventTable.addSortField(FieldNum(InventTable, NameAlias)); qInventTable.addSortField(FieldNum(InventTable, ItemGroupId)); qInventTable.addSelectionField(FieldNum(InventTable, ItemName)); qInventTable.addSelectionField(FieldNum(InventTable, NameAlias)); qInventTable.addSelectionField(FieldNum(InventTable, ItemGroupId)); qInventTable.joinMode(JoinMode::InnerJoin); qInventTable.fetchMode(0); qInventTable.addLink(FieldNum(InventTrans, ItemID), FieldNum(InventTable, ItemID)); if (_ItemGroupKey.empty()==False) qInventTable.addRange(FieldNum(InventTable, ItemGroupId)).value(_ItemGroupKey.get()); qVendInvoiceTrans=qInventTrans.addDataSource(TableNum(VendInvoiceTrans), "VendInvoiceTrans"); qVendInvoiceTrans.orderMode(OrderMode::GroupBy); qVendInvoiceTrans.addSortField(FieldNum(VendInvoiceTrans, InvoiceID)); qVendInvoiceTrans.addSortField(FieldNum(VendInvoiceTrans, RecID)); qVendInvoiceTrans.addSortField(FieldNum(VendInvoiceTrans, LineAmount)); qVendInvoiceTrans.addSortField(FieldNum(VendInvoiceTrans, TaxAmount)); qVendInvoiceTrans.addSortField(FieldNum(VendInvoiceTrans, Dimension)); qVendInvoiceTrans.addSelectionField(FieldNum(VendInvoiceTrans, InvoiceID)); qVendInvoiceTrans.addSelectionField(FieldNum(VendInvoiceTrans, RecID)); qVendInvoiceTrans.addSelectionField(FieldNum(VendInvoiceTrans, LineAmount)); qVendInvoiceTrans.addSelectionField(FieldNum(VendInvoiceTrans, TaxAmount)); qVendInvoiceTrans.addSelectionField(FieldNum(VendInvoiceTrans, Dimension)); qVendInvoiceTrans.joinMode(JoinMode::InnerJoin); qVendInvoiceTrans.fetchMode(0); qVendInvoiceTrans.addLink(FieldNum(InventTrans, InventTransID), FieldNum(VendInvoiceTrans, InventTransID)); if (_SbytNaprKey.empty()==False) qVendInvoiceTrans.addRange(FieldId2Ext(FieldNum(VendInvoiceTrans, Dimension),2)).value(_SbytNaprKey.get()); if (_ProjectKey.empty()==False) qVendInvoiceTrans.addRange(FieldId2Ext(FieldNum(VendInvoiceTrans, Dimension),3)).value(_ProjectKey.get()); qPurchTable=qInventTrans.addDataSource(TableNum(PurchTable), "PurchTable"); qPurchTable.orderMode(OrderMode::GroupBy); qPurchTable.addSortField(FieldNum(PurchTable, OrderAccount)); qPurchTable.addSelectionField(FieldNum(PurchTable, OrderAccount)); qPurchTable.addSelectionField(FieldNum(PurchTable, ERP_Description)); qPurchTable.joinMode(JoinMode::InnerJoin); qPurchTable.fetchMode(0); qPurchTable.addLink(FieldNum( InventTrans, TransRefID), FieldNum(PurchTable, PurchID)); if (_AccountKey.empty()==False) qPurchTable.addRange(FieldNum(PurchTable, OrderAccount)).value(_AccountKey.get()); qVendPackingSlipTrans=qInventTrans.addDataSource(TableNum(VendPackingSlipTrans), "VendPackingSlipTrans"); qVendPackingSlipTrans.orderMode(OrderMode::GroupBy); qVendPackingSlipTrans.addSortField(FieldNum(VendPackingSlipTrans, ReturnActionID)); qVendPackingSlipTrans.addSortField(FieldNum(VendPackingSlipTrans, Name)); qVendPackingSlipTrans.addSortField(FieldNum(VendPackingSlipTrans, PurchUnit)); qVendPackingSlipTrans.addSelectionField(FieldNum(VendPackingSlipTrans, ReturnActionId)); qVendPackingSlipTrans.addSelectionField(FieldNum(VendPackingSlipTrans, Name)); qVendPackingSlipTrans.addSelectionField(FieldNum(VendPackingSlipTrans, PurchUnit)); qVendPackingSlipTrans.joinMode(JoinMode::InnerJoin); qVendPackingSlipTrans.fetchMode(0); qVendPackingSlipTrans.addLink(FieldNum(InventTrans, InventTransID), FieldNum(VendPackingSlipTrans, InventTransID)); qVendTable=qPurchTable.addDataSource(TableNum(VendTable), "VendTable"); qVendTable.orderMode(OrderMode::GroupBy); qVendTable.addSortField(FieldNum(VendTable, NameAlias)); qVendTable.addSelectionField(FieldNum(VendTable, NameAlias)); qVendTable.joinMode(JoinMode::InnerJoin); qVendTable.fetchMode(0); qVendTable.addLink(FieldNum(PurchTable, OrderAccount), FieldNum(VendTable, AccountNum)); qInventDim=qVendInvoiceTrans.addDataSource(TableNum(InventDim), "InventDim"); qInventDim.orderMode(OrderMode::GroupBy); qInventDim.addSortField(FieldNum(InventDim, InventLocationID)); qInventDim.addSortField(FieldNum(InventDim, ERP_Project)); qInventDim.addSortField(FieldNum(InventDim, ERP_JrPerson)); qInventDim.addSortField(FieldNum(InventDim, InventBatchId)); qInventDim.addSelectionField(FieldNum(InventDim, InventLocationID)); qInventDim.addSelectionField(FieldNum(InventDim, ERP_Project)); qInventDim.addSelectionField(FieldNum(InventDim, ERP_JrPerson)); qInventDim.addSelectionField(FieldNum(InventDim, InventBatchId)); qInventDim.joinMode(JoinMode::InnerJoin); qInventDim.fetchMode(0); qInventDim.addLink(FieldNum(VendInvoiceTrans, InventDimID), FieldNum(InventDim, InventDimID)); if (_LocationKey.empty()==False) qInventDim.addRange(FieldNum(InventDim, InventLocationId)).value(_LocationKey.get()); QRunTmpTable=new QueryRun(QTmpTable) ; while (QRunTmpTable.next()) { _inventTrans =QRunTmpTable.get(TableNum(InventTrans)); _inventTable =QRunTmpTable.get(TableNum(InventTable)); _vendInvoiceTrans =QRunTmpTable.get(TableNum(VendInvoiceTrans)); _purchTable =QRunTmpTable.get(TableNum(PurchTable)); _vendPackingSlipTrans =QRunTmpTable.get(TableNum(VendPackingSlipTrans)); _vendTable =QRunTmpTable.get(TableNum(VendTable)); _inventDim =QRunTmpTable.get(TableNum(InventDim)); _tmpMythOLAPPurch.clear(); _tmpMythOLAPPurch.DateExpected=_inventTrans.DateExpected; _tmpMythOLAPPurch.DateFinancial=_inventTrans.DateFinancial; _tmpMythOLAPPurch.DatePhysical=_inventTrans.DatePhysical; _tmpMythOLAPPurch.Dimension=_vendInvoiceTrans.Dimension; _tmpMythOLAPPurch.Direction=_inventTrans.Direction; _tmpMythOLAPPurch.TotalAmount=_vendInvoiceTrans.LineAmount+_vendInvoiceTrans.TaxAmount; _tmpMythOLAPPurch.RecId1=_vendInvoiceTrans.RecId; _tmpMythOLAPPurch.CostAmountAdjustment=_inventTrans.CostAmountAdjustment; _tmpMythOLAPPurch.CostAmountPosted=_inventTrans.CostAmountPosted; _tmpMythOLAPPurch.CurrencyCode=_inventTrans.currencyCode; _tmpMythOLAPPurch.InvoiceId=_vendInvoiceTrans.InvoiceId; _tmpMythOLAPPurch.ItemId=_inventTrans.ItemId; _tmpMythOLAPPurch.Qty =_inventTrans.Qty; _tmpMythOLAPPurch.TransRefId=_inventTrans.TransRefId; _tmpMythOLAPPurch.ItemGroupId=_inventTable.ItemGroupId; _tmpMythOLAPPurch.ItemName=_inventTable.itemName; _tmpMythOLAPPurch.NameAlias=_inventTable.NameAlias; _tmpMythOLAPPurch.ERP_JrPerson=_inventDim.ERP_JrPerson; _tmpMythOLAPPurch.ERP_Project=_inventDim.ERP_Project; _tmpMythOLAPPurch.inventBatchId=_inventDim.inventBatchId; _tmpMythOLAPPurch.InventLocationId=_inventDim.InventLocationId; _tmpMythOLAPPurch.ERP_Description=_purchTable.ERP_Description; _tmpMythOLAPPurch.OrderAccount=_purchTable.OrderAccount; _tmpMythOLAPPurch.ReturnActionId=_vendPackingSlipTrans.ReturnActionId; _tmpMythOLAPPurch.Name=_vendPackingSlipTrans.Name; _tmpMythOLAPPurch.PurchUnit=_vendPackingSlipTrans.PurchUnit; _tmpMythOLAPPurch.VendNameAlias=_vendTable.NameAlias; _tmpMythOLAPPurch.InventTransId=_inventTrans.InventTransId; _tmpMythOLAPPurch.write(); } return _tmpMythOLAPPurch; } |
|
14.11.2006, 12:05 | #2 |
Злыдни
|
Странно, почему связка для извлечения аналитики производится по VendInvoiceTrans, а не по изначальному InventTrans?
|
|
14.11.2006, 12:10 | #3 |
Участник
|
Попробуйте создать похожее квери в AOT.
Далее создать какой-нибудь джобик для тестировани. Query q = new Query(querystr("Название квери из АОТА")); QueryRun qr = new QueryRun(q); while (qr.next) { inventTrans = qr.get(tablenum(InventTrans)); info(inventTrans.itemId); } И еще совет. Вместо ....AddLink().. Используйте ...relations(true) |
|
14.11.2006, 12:17 | #4 |
----------------
|
7 магическое число
так что ищите пути уменьшения количества таблиц |
|
14.11.2006, 12:43 | #5 |
Участник
|
Создайте из первых 5-ти таблиц veiw, и используйте его как базу при создании основного запроса. Хотя, если у вас несколько компаний, отнеситесь к этому предложению осторожно, как бы не создать доп. эффектов.
С уважением, itfs. |
|
14.11.2006, 12:59 | #6 |
Участник
|
to Warm
Разъясните на счет магичности числа 7 Принципиально нельзя создать квери из семи и более таблиц? Я просто пока такого еще не пробывал. Но видимо придется проэксперементировать. |
|
14.11.2006, 15:31 | #7 |
Участник
|
НА всякий случай - если мало-ли решением будут вьюхи - учитие что при работе с виртуальными компаниями их использовать нельзя.
|
|
14.11.2006, 16:46 | #8 |
Участник
|
В том то и дело, у меня раньше была вьюшка, но компаний несколько, так что этот вариант отпал. :-(
|
|
14.11.2006, 16:52 | #9 |
Участник
|
Ну есть еще вариант - не очкрасивый - ограничиться пятью, а остальные подгребать подзапросами..
|
|
14.11.2006, 22:50 | #10 |
Роман Долгополов (RDOL)
|
может в этом дело
Запрос в МБС " При разборе сложных запросов Query и преобразования их в SQL команды парсер запросов выдает неправильные результаты, обрезая некоторые DataSource из результирующей команды Например имеет запрос со структорой (полный xpo запроса в приложенном файле) InventTable |_ InventTableModule1 - |_ Unit1 |_ InventTableModule2 - |_ Unit2 Все связи по innerJoin или existsJoin (значения не имеет) В результате на сервер БД посылается запрос SELECT A.ITEMGROUPID,A.ITEMID,A.ITEMNAME,A.ITEMTYPE,A.PURCHMODEL,A.HEIGHT,A.WIDTH,A.SALESMODEL, A.COSTGROUPID,A.REQGROUPID,A.PRIMARYVENDORID,A.NETWEIGHT,A.DEPTH,A.UNITVOLUME,A.BOMUNITID,A.DENSITY, A.DEL_SCRAPTYPEID,A.DIMENSION,A.DIMENSION2_,A.DIMENSION3_,A.DIMENSION4_,A.DIMENSION5_,A.COSTMODEL, A.USEALTITEMID,A.ALTITEMID,A.INTRACODE,A.BOMMANUALCONSUMP,A.BOMMANUALRECEIPT, A.STOPEXPLODE,A.DEL_COVPERINVENTLOCATION,A.PHANTOM,A.INTRAUNIT,A.BOMLEVEL,A.BATCHNUMGROUPID, A.AUTOREPORTFINISHED,A.ORIGCOUNTRYID,A.STATISTICSFACTOR,A.ALTCONFIGID,A.STANDARDCONFIGID, A.DEL_CONFIGACTIVE,A.PRODPOOLID,A.PROPERTYID,A.ABCTIEUP,A.ABCREVENUE,A.ABCVALUE,A.ABCCONTRIBUTIONMARGIN, A.COMMISSIONGROUPID,A.DEL_BARCODE,A.DEL_BARCODETYPE,A.CONFIGURABLE,A.SALESPERCENTMARKUP, A.SALESCONTRIBUTIONRATIO,A.SALESPRICEMODELBASIC,A.MINAVERAGESETTLE,A.NAMEALIAS,A.PRODGROUPID, A.PROJCATEGORYID,A.GROSSDEPTH,A.GROSSWIDTH,A.GROSSHEIGHT,A.STANDARDPALLETQUANTITY,A.QTYPERLAYER, A.SORTCODE,A.CONFIGSIMILAR,A.SERIALNUMGROUPID,A.DIMGROUPID,A.MODELGROUPID,A.ITEMBUYERGROUPID, A.TAXPACKAGINGQTY,A.DEL_TEMPLATE,A.WMSPALLETTYPEID,A.ORIGSTATEID,A.STOPEXPLODEPRICE,A.WMSPICKINGQTYTIME, A.TARAWEIGHT,A.PACKAGINGGROUPID,A.SCRAPVAR,A.SCRAPCONST,A.ITEMDIMCOMBINATIONAUTOCREATE, A.ITEMDIMCOSTPRICE,A.ITEMIDCOMPANY,A.PBAITEMCONFIGURABLE,A.PBAINVENTITEMGROUPID, A.GROSSWEIGHT_RU,A.PACKING_RU,A.ASSETGROUPID_RU,A.ASSETID_RU,A.RECID, B.ITEMID,B.MODULETYPE,B.UNITID,B.PRICE,B.PRICEUNIT,B.MARKUP,B.LINEDISC,B.MULTILINEDISC,B.ENDDISC, B.QUANTITY,B.LOWESTQTY,B.HIGHESTQTY,B.TAXITEMGROUPID,B.BLOCKED,B.DELIVERYTIME,B.INVENTLOCATIONID, B.MANDATORYINVENTLOCATION,B.STANDARDQTY,B.MARKUPGROUPID,B.PRICEDATE,B.PRICEQTY,B.ALLOCATEMARKUP, B.OVERDELIVERYPCT,B.UNDERDELIVERYPCT,B.SUPPITEMGROUPID,B.CALENDARDAYS,B.INTERCOMPANYBLOCKED, B.PRICESECCUR_RU,B.MARKUPSECCUR_RU,B.RECID,C.UNITID,C.TXT,C.UNITDECIMALS,C.UNITSYSTEM,C.CODEOKEI_RU,C.RECID FROM INVENTTABLE A(NOLOCK) ,INVENTTABLEMODULE B(NOLOCK) ,UNIT C(NOLOCK) WHERE (A.DATAAREAID=?) AND ((B.DATAAREAID=?) AND ((B.MODULETYPE=?) AND (A.ITEMID=B.ITEMID))) AND ((C.DATAAREAID=?) AND (B.UNITID=C.UNITID)) ORDER BY A.DATAAREAID,A.ITEMID OPTION(FAST 9) из которого вырезаны InventTableModule_2 и Unit_2 Исправление ошибки особенно важно, так как запросы создаются не только разработчиками, но и непосредственно пользователями (например, при построении фильтра на форме). -------------------------------------------------------------------------- 2/22/2005 9:01:00 AM PST -- Sergey Gerasimov Добрый день, Роман, Ваш запрос 'Ошибка парсера заросов при разборе сложных запросов' принят в обработку. С уважением Сенргей Герасимов. -------------------------------------------------------------------------- 3/9/2005 3:26:00 AM PST -- Sergey Gerasimov " ... далее следует переписка длиною в год Последний раз редактировалось db; 14.11.2006 в 22:55. |
|
14.11.2006, 23:16 | #11 |
----------------
|
создать квери с 7ю таблицами можно, но работать он не будет
(буду рад ошибиться, но практические случаи мне не известны) ошибка парсера, похожая на какие-то внутренние ограничения на длину текста результирующего запроса |
|
15.11.2006, 09:27 | #12 |
Участник
|
А известно когда решат проблемму? Чем закончилась переписка?
Я заметил следующее: у нас есть таблица t1 к ней мы можем подцеплять хоть 10 таблиц но на первом уровне вложения, то есть соединять непосредственно с t1. Но как только мы добавим еще один уровень вложения (соединяем с таблицой которая уже подцеплена к t1) то все датасурсы которые ниже у таблицы t1 ("ниже" имеется вииду если представить джойны в виде дерева) остаются пустыми. |
|
15.11.2006, 09:54 | #13 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от Daiver
А известно когда решат проблемму? Чем закончилась переписка?
Я заметил следующее: у нас есть таблица t1 к ней мы можем подцеплять хоть 10 таблиц но на первом уровне вложения, то есть соединять непосредственно с t1. Но как только мы добавим еще один уровень вложения (соединяем с таблицой которая уже подцеплена к t1) то все датасурсы которые ниже у таблицы t1 ("ниже" имеется вииду если представить джойны в виде дерева) остаются пустыми. ну а по срокам "8124246 Ошибка парсера заросов при разборе сложных запрос - Обозначено как кандидат для 4.0;" |
|
15.11.2006, 11:55 | #14 |
Участник
|
сообщение от Daiver
Цитата:
..... есть таблица t1 к ней мы можем подцеплять хоть 10 таблиц ......
Цитата:
....создать квери с 7ю таблицами можно, но работать он не будет...
Вчера специально проверял. То, что датасурсы в запрос не попадают, это факт. Но вот седьмой датасурс приводит Аксапту в полное замешательство. Последний раз редактировалось Zan; 15.11.2006 в 11:57. |
|
12.03.2007, 17:48 | #15 |
Участник
|
Натолкнулся на такую же проблему. Если в query есть несколько разветвлений глубже второго уровня, то таблицы дальше (ниже в АОТ) первого разветвления не выбираются. Т.е. если я к одной табличке попривязываю не только 7, но даже 10 подчиненных, то все будет Ок. А вот как только одна из подчиненных получит свою подчиненную - дальше нее таблицы перестанут выбираться.
На Ax 4.0 те же яйца. |
|
12.03.2007, 19:03 | #16 |
Moderator
|
Позвольте немножко "поштурмовать мозги" (ногами просьба не пинать - релаксирую-фантазирую).
А если как вариант попробовать такой путь преодоления?: - нужные данные из 7-10 таблиц экспортнуть в файл Excel соответственно на 7-10 листов (xls-файл придется сохранить), - потом связать эти листы в ADO запросом на нормальном SQL (пример запроса к одному листу здесь), - результат этого запроса импортнуть обратно в Аксапту (класс импорта - в теме по той же ссылке), - по окончании процесса xls-файл уничтожаем. Т.е. получается нечто, похожее на использование 7-10 "временных таблиц", создаваемых "на лету". Ну, или вывести 10 таблиц, например, двумя Query по 5 таблиц на 2 листа Excel. Потом связать эти 2 листа в ADO и также импортнуть обратно. |
|
13.03.2007, 05:05 | #17 |
сибиряк
|
Я в шоке
Стоит уже делать ставки в каком десятилетии исправят.
__________________
С уважением, Вячеслав. |
|
13.03.2007, 11:59 | #18 |
Участник
|
А почему "золотые партнеры" бездействуют? Неужели нельзя поставить эту ошибку в очередь на исправление?
|
|
13.03.2007, 12:32 | #19 |
Участник
|
|
|
13.03.2007, 12:56 | #20 |
Участник
|
|
|