AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.02.2008, 18:11   #1  
vvk is offline
vvk
Злыдни
Злыдни
 
27 / 11 (1) +
Регистрация: 11.11.2003
Адрес: Москва
Вопрос по 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  
Alexis is offline
Alexis
Участник
 
30 / 11 (1) +
Регистрация: 08.12.2003
Адрес: РБ, Минск
если бы еще привели декларации переменных...
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед)
Старый 05.02.2008, 18:28   #3  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Покажи SQL который генерит акзапта.. можно включитьв профиле.
Старый 05.02.2008, 18:28   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
а он сам запрос к БД не пишет, который некорректный? Если не пишет, попробуйте включить Мониторинг Запросов SQL
Старый 05.02.2008, 18:32   #5  
Alexis is offline
Alexis
Участник
 
30 / 11 (1) +
Регистрация: 08.12.2003
Адрес: РБ, Минск
запроса в виде "insert into select" вполне может и не быть... если таблицы, например, временные... или на таблице перекрыт insert()...
но если есть что привести еще - пишите!
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед)
Старый 05.02.2008, 18:35   #6  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
insert_recordset во временную таблицу (если в вашем примере TotalsTmp - временная) - это сильно. Я вот попробовал - у меня Аксапта упала.
Старый 05.02.2008, 18:36   #7  
Alexis is offline
Alexis
Участник
 
30 / 11 (1) +
Регистрация: 08.12.2003
Адрес: РБ, Минск
у меня работает... уже не один год
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед)
Старый 05.02.2008, 18:37   #8  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Цитата:
Сообщение от Alexis Посмотреть сообщение
у меня работает... уже не один год
insert_recordset во временную таблицу?
Старый 05.02.2008, 18:53   #9  
Alexis is offline
Alexis
Участник
 
30 / 11 (1) +
Регистрация: 08.12.2003
Адрес: РБ, Минск
делаю, курсор от постоянной таблицы, затем выполняю setTMP(), вливаю в него нужные мне данные командой insert_recordset обрабатываю...
счас бы уже так не делал. но не переделывать же работающее!
в общем это реально. и тоже 3.0 SP3 правда ролап был первый... счас уже третий.
может у него не установлен ролап
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед)
Старый 05.02.2008, 19:00   #10  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Вообщем, у меня так:

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();
    }

}
Почему я считаю, что insert_recordset не уместен для временной таблицы? Т.к. он все равно не даст выигрыша (преимущество insert_recordset в том, что он может исполняться на сервере БД), в случае временной таблице - она все равно либо на АОСе либо на клиенте.

P.S. DAX4.0 SP2WE
Старый 05.02.2008, 19:11   #11  
vvk is offline
vvk
Злыдни
Злыдни
 
27 / 11 (1) +
Регистрация: 11.11.2003
Адрес: Москва
Обе таблички свои, не временные, типы данных полей совпадают полностью.

Трассировка:
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  
Alexis is offline
Alexis
Участник
 
30 / 11 (1) +
Регистрация: 08.12.2003
Адрес: РБ, Минск
Проверил на 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  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
vvk

Если таблица одна и таже и не временная, у меня ваш код отработал без ошибок.

Сейчас попробую, если табилцы разные:

AOC упал. Вот так. Сейчас еще проверю, может сам чего накосячил.
Старый 05.02.2008, 19:28   #14  
Alexis is offline
Alexis
Участник
 
30 / 11 (1) +
Регистрация: 08.12.2003
Адрес: РБ, Минск
Цитата:
Сообщение от 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 просто нет. Но чудес-то не бывает!
Если помониторить глубже, то SQL выглядит так:
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  
vvk is offline
vvk
Злыдни
Злыдни
 
27 / 11 (1) +
Регистрация: 11.11.2003
Адрес: Москва
То, что не создано поля - это я увидел, вопрос именно ПОЧЕМУ и что в коде не так, что вызывает такое?
Старый 05.02.2008, 19:41   #16  
Alexis is offline
Alexis
Участник
 
30 / 11 (1) +
Регистрация: 08.12.2003
Адрес: РБ, Минск
бывает случается такое, что код XPP верен со всех сторон... а код внутрях Ax как-то в общем, не очень как говорится, если идти на принцип, то можно отправить запрос в саппорт... а проще - переписать конструкцию на сходную, например while select - insert.
или как я говорил избавится от group и sum а потом суммировать вторую таблицу.
__________________
Дайте мне точку опоры, и я переверну земной шар (Архимед)
Старый 05.02.2008, 19:46   #17  
vvk is offline
vvk
Злыдни
Злыдни
 
27 / 11 (1) +
Регистрация: 11.11.2003
Адрес: Москва
М-да... жаль. Оч хотелось уйти от while select... ну запишем это в ФИШКИ Ax
Старый 06.02.2008, 13:52   #18  
NNB is offline
NNB
Участник
 
103 / 12 (1) ++
Регистрация: 31.08.2006
Тоже нарывался
Когда то было такое: вставка при наличии группировки не работал
Старый 07.02.2008, 15:59   #19  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от petr Посмотреть сообщение
insert_recordset во временную таблицу (если в вашем примере TotalsTmp - временная) - это сильно. Я вот попробовал - у меня Аксапта упала.
У меня тоже падала.
Старый 13.02.2008, 10:34   #20  
vvk is offline
vvk
Злыдни
Злыдни
 
27 / 11 (1) +
Регистрация: 11.11.2003
Адрес: Москва
Нет, не временные. Стараюсь без крайней необходимости не использовать их. Научен горьким опытом исправления приложения, где частенько использовался join временных и боевых таблиц.
Теги
insert_recordset, recordset, ax3.0, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вопрос по модулю Расчеты с персоналом. Выплата заработной платы. Keks DAX: Функционал 7 28.12.2009 10:31
Вопрос по созданию отчета asd1274 DAX: Программирование 6 05.12.2008 21:44
Вопрос по Проектам PSA DAX: Функционал 35 19.01.2007 22:26
Еще вопрос про покрытие по аналитикам в Сводном планировании rt2 DAX: Функционал 3 24.03.2006 18:56
расчеты с персоналом. НДФЛ. вопрос чайника shumelka DAX: Функционал 2 25.03.2004 11:36

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:51.