05.02.2008, 18:11 | #1 |
Злыдни
|
Вопрос по insert_recordset
Доброе время суток всем!
Подскажите пож в чем неправ в запросе, зациклился Ax3.0 sp3 + Oracle 9.2.0.7 insert_recordset TotalsTmp (ItemId,Qty,InventLocationId) select ItemId, sum(Qty), InventLocationId from TotalsTrans group by ItemId, InventLocationId where TotalsTrans.SalesDate >= 01\01\2008 && TotalsTrans.SalesDate <= systemDateGet(); Падает по ошибке БД - некорректный запрос. В чем кривизна - голову сломал. |
|
05.02.2008, 18:18 | #2 |
Участник
|
если бы еще привели декларации переменных...
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед) |
|
05.02.2008, 18:28 | #3 |
Участник
|
Покажи SQL который генерит акзапта.. можно включитьв профиле.
|
|
05.02.2008, 18:28 | #4 |
Участник
|
а он сам запрос к БД не пишет, который некорректный? Если не пишет, попробуйте включить Мониторинг Запросов SQL
|
|
05.02.2008, 18:32 | #5 |
Участник
|
запроса в виде "insert into select" вполне может и не быть... если таблицы, например, временные... или на таблице перекрыт insert()...
но если есть что привести еще - пишите!
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед) |
|
05.02.2008, 18:35 | #6 |
Участник
|
insert_recordset во временную таблицу (если в вашем примере TotalsTmp - временная) - это сильно. Я вот попробовал - у меня Аксапта упала.
|
|
05.02.2008, 18:36 | #7 |
Участник
|
у меня работает... уже не один год
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед) |
|
05.02.2008, 18:37 | #8 |
Участник
|
|
|
05.02.2008, 18:53 | #9 |
Участник
|
делаю, курсор от постоянной таблицы, затем выполняю setTMP(), вливаю в него нужные мне данные командой insert_recordset обрабатываю...
счас бы уже так не делал. но не переделывать же работающее! в общем это реально. и тоже 3.0 SP3 правда ролап был первый... счас уже третий. может у него не установлен ролап
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед) |
|
05.02.2008, 19:00 | #10 |
Участник
|
Вообщем, у меня так:
X++: static void Job7(Args _args) { TotalsTrans TotalsTrans; TotalsTrans TotalsTmp; ; TotalsTmp.setTmp(); insert_recordset TotalsTmp (ItemId,Qty,InventLocationId) select ItemId, sum(Qty), InventLocationId from TotalsTrans group by ItemId, InventLocationId where TotalsTrans.SalesDate >= 01\01\2008 && TotalsTrans.SalesDate <= systemDateGet(); } Если убрать insert_recordset, то работает: X++: static void Job8(Args _args) { TotalsTrans TotalsTrans; TotalsTrans TotalsTmp; ; TotalsTmp.setTmp(); //insert_recordset TotalsTmp (ItemId,Qty,InventLocationId) while select ItemId, sum(Qty), InventLocationId from TotalsTrans group by ItemId, InventLocationId where TotalsTrans.SalesDate >= 01\01\2008 && TotalsTrans.SalesDate <= systemDateGet() { TotalsTmp.ItemId = TotalsTrans.ItemId; TotalsTmp.InventLocationId = TotalsTrans.InventLocationId; TotalsTmp.Qty = TotalsTrans.Qty; TotalsTmp.insert(); } } P.S. DAX4.0 SP2WE |
|
05.02.2008, 19:11 | #11 |
Злыдни
|
Обе таблички свои, не временные, типы данных полей совпадают полностью.
Трассировка: INSERT INTO DKL_TOTALSTMP (ITEMID,QTY,RECID)SELECT F1,F2,47928911+ROWNUM FROM axapta_tmp_dat20707 ORA-00904: "F2": invalid identifier Причем тут RECID - вообще не понимаю. Интересно и другое: insert_recordset TotalsTmp (ItemId,Qty) select ItemId, sum(Qty) from TotalsTrans group by ItemId where TotalsTrans.SalesDate >= 01\01\2008 && TotalsTrans.SalesDate <= systemDateGet(); ошибки не вызывает, только вставляет Qty в поле ItemId, а самого ItemId просто нет. Но чудес-то не бывает! |
|
05.02.2008, 19:13 | #12 |
Участник
|
Проверил на 3.0 SP3 Rollup3
падает! ТАКОЙ код падает. спасибо за джоб, лень было самому писать НО если убрать группировку (соответственно и групповую функцию) - работает. У меня в коде идет обычный select. Вариант решения: если оставлять себе такую технологию работы - то надо избавится от группировки, например, группировать потом, уже временную таблицу. Но как правильно заметил Petr, такое решение убивает всю суть команда для быстрой вставки данных, а таблица временная Единственное оправдание - меньше писать кода X++: insert_recordset TotalsTmp (ItemId,Qty,InventLocationId) select ItemId, Qty, InventLocationId from TotalsTrans group by ItemId, InventLocationId where TotalsTrans.SalesDate >= 01\01\2008 && TotalsTrans.SalesDate <= systemDateGet(); select count(RecId) from TotalsTmp; print TotalsTmp.RecId; pause;
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед) |
|
05.02.2008, 19:26 | #13 |
Участник
|
vvk
Если таблица одна и таже и не временная, у меня ваш код отработал без ошибок. Сейчас попробую, если табилцы разные: AOC упал. Вот так. Сейчас еще проверю, может сам чего накосячил. |
|
05.02.2008, 19:28 | #14 |
Участник
|
Цитата:
Сообщение от vvk
Обе таблички свои, не временные, типы данных полей совпадают полностью.
Трассировка: INSERT INTO DKL_TOTALSTMP (ITEMID,QTY,RECID)SELECT F1,F2,47928911+ROWNUM FROM axapta_tmp_dat20707 ORA-00904: "F2": invalid identifier Причем тут RECID - вообще не понимаю. Интересно и другое: insert_recordset TotalsTmp (ItemId,Qty) select ItemId, sum(Qty) from TotalsTrans group by ItemId where TotalsTrans.SalesDate >= 01\01\2008 && TotalsTrans.SalesDate <= systemDateGet(); ошибки не вызывает, только вставляет Qty в поле ItemId, а самого ItemId просто нет. Но чудес-то не бывает! CREATE TABLE axapta_tmp_mil511419 AS SELECT SUM(A.QTY) AS f1,'mil' AS DATAAREAID,0 AS RECVERSION,0 AS RECID FROM TOTALSTRANS A WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER('mil')) AND ((SALESDATE>=TO_DATE('2008-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) AND (SALESDATE<=TO_DATE('2008-02-05 00:00:00','YYYY-MM-DD HH24:MI:SS')))) GROUP BY SUBSTR(NLS_LOWER(A.ITEMID),1,10),SUBSTR(NLS_LOWER(A.INVENTLOCATIONID),1,10) ORDER BY SUBSTR(NLS_LOWER(A.ITEMID),1,10),SUBSTR(NLS_LOWER(A.INVENTLOCATIONID),1,10) а затем уже идет INSERT INTO TOTALSTRANSTMP (ITEMID,QTY,DATAAREAID,RECVERSION,RECID)SELECT F1,F2,DATAAREAID,RECVERSION,366563892+ROWNUM FROM axapta_tmp_mil511419 в первом же SQL видно, что Axapta не создала поля F2, которое использует позже в запросе. Почему? - пока не знаю. Но падает теперь понятно почему
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед) |
|
05.02.2008, 19:37 | #15 |
Злыдни
|
То, что не создано поля - это я увидел, вопрос именно ПОЧЕМУ и что в коде не так, что вызывает такое?
|
|
05.02.2008, 19:41 | #16 |
Участник
|
бывает случается такое, что код XPP верен со всех сторон... а код внутрях Ax как-то в общем, не очень как говорится, если идти на принцип, то можно отправить запрос в саппорт... а проще - переписать конструкцию на сходную, например while select - insert.
или как я говорил избавится от group и sum а потом суммировать вторую таблицу.
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед) |
|
05.02.2008, 19:46 | #17 |
Злыдни
|
М-да... жаль. Оч хотелось уйти от while select... ну запишем это в ФИШКИ Ax
|
|
06.02.2008, 13:52 | #18 |
Участник
|
Тоже нарывался
Когда то было такое: вставка при наличии группировки не работал
|
|
07.02.2008, 15:59 | #19 |
Участник
|
|
|
13.02.2008, 10:34 | #20 |
Злыдни
|
Нет, не временные. Стараюсь без крайней необходимости не использовать их. Научен горьким опытом исправления приложения, где частенько использовался join временных и боевых таблиц.
|
|