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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.10.2004, 20:32   #1  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Не работает Insert_Recordset
Пытаюсь вставить записи из временной таблицы в постоянную с помощью insert_recordset (временная и постоянная таблица созданы мной, полностью идентичны по структуре).

На выполнении Insert_Recordset Аксапта падает.

while_select ... myTable.insert() отрабатывает нормально.

Вопрос традиционен: кто виноват (риторически) и что делать(практически)?
Старый 05.10.2004, 09:40   #2  
AlexUnik is offline
AlexUnik
Участник
 
199 / 22 (1) +++
Регистрация: 01.06.2004
Адрес: Королёв
В свое время я тоже много возлагал надежд на эту операцию. Но, к сожалению, она их не оправдала :-( В определенных ситуациях при запуске операции Insert_Recordset я наблюдал, как Axapta поочередно закрывала все свои окна, а потом закрывалась сама. В хелпе есть замечательное объяснение данному явлению: "INSERT_RECORDSET is a recordset-based operators, which performs operations on multiple records at a time. However, it can fall back to record-by-record operations in a number of situations."
В итоге я решил ограничиться использованием while_select, а для его ускорения настроил индексы. Так, во всяком случае, надежнее.
Старый 05.10.2004, 09:47   #3  
Rokhay is offline
Rokhay
Участник
 
154 / 15 (1) ++
Регистрация: 02.10.2003
Адрес: Ебург
Цитата:
Изначально опубликовано AlexUnik
В хелпе есть замечательное объяснение данному явлению: "INSERT_RECORDSET is a recordset-based operators, which performs operations on multiple records at a time. However, it can fall back to record-by-record operations in a number of situations."
Чойто мне совершенно не понятно что тут объясняет подобное поведение.
Старый 05.10.2004, 10:01   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Предложение
Господа, если это топик создан для того, чтобы жаловаться на судьбу, то его надо перенести в курилку. А если для решения проблем, то давайте полную информацию о том что и как вы делали.
Старый 05.10.2004, 10:19   #5  
AlexUnik is offline
AlexUnik
Участник
 
199 / 22 (1) +++
Регистрация: 01.06.2004
Адрес: Королёв
"However, it can fall back to record-by-record operations in a number of situations."
Я так понимаю, в некоторых случаях, операция групповой вставки строк INSERT_RECORDSET откатывается к реализации через курсор (record-by-record) и делается это весьма неоптимизированным способом.
Старый 05.10.2004, 10:21   #6  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Yprit , поищите по ключевому слову, про INSERT_RECORDSET на форуме много писал simply (и его реинкарнация simply2double)
Старый 05.10.2004, 14:49   #7  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано AlexUnik
Я так понимаю, в некоторых случаях, операция групповой вставки строк INSERT_RECORDSET откатывается к реализации через курсор (record-by-record) и делается это весьма неоптимизированным способом.
Ну, если уж на то пошло, Вы тогда и следующий абзац в HELP прочтите. Там как раз написано, чем это вызвано и как с этим бороться.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 05.10.2004, 15:10   #8  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Проблема, видимо, кроется в самой моей таблице, т.к. на других темповых таблицах эта конструкция без проблем отрабатывает. На досуге попробую разобраться детально - сейчас вреени нет, оставил while_select
Старый 05.10.2004, 16:44   #9  
AlexUnik is offline
AlexUnik
Участник
 
199 / 22 (1) +++
Регистрация: 01.06.2004
Адрес: Королёв
2 Maxim Gorbunov
Спасибо, прочитал и не один раз. Если не ошибаюсь, слово YES в таблице указанного абзаца помечает ситуацию, когда метод срабатывает построчно.
Маленький вопросик: destination-table обязательно должна быть временной?
В моем случае необходимо вставить большой набор записей в строки журнала коммерческих соглашений, но вставка должна производиться из нескольких таблиц - строки прайса в связке со строками журнала коммерческих соглашений.
Старый 05.10.2004, 17:08   #10  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
insert_recordset во временную таблицу записи НЕ ВСТАВЛЯЕТ... доказано эмпирически... возможно этому есть научное объяснение, заложенное в самом механизме работы аксапты со временными таблицами... но факт остается фактом... при попытке вставить аксапта валится....

и еще одна проблнема... которую зачастую забываешь, при использовании insert_recordset: нужно аккуратно повторять филдлист... особенно в случаи вставки записей из объединения таблиц... иначе все то же падение... а в остальном все работает нормально...

PS Ко всему прочему наглядно создается впечатление пакетной обработки, которое так греет душу, ибо с детства привита неприязнь к команде fetch ))) хотя опять же... не знаю механизма исполнения данной команды... Аксаптой...
Старый 05.10.2004, 17:20   #11  
AlexUnik is offline
AlexUnik
Участник
 
199 / 22 (1) +++
Регистрация: 01.06.2004
Адрес: Королёв
2 simply2double

Спасибо за подтверждение моих подозрений :-)
Я по-разному пробовал уговорить работать insert_recordset , но у меня не получилось. Быть может, я еще что-то не предусмотрел?
Ниже кусок из неработающего кода:
{
PriceDiscAdmTrans PDA;
PriceDiscAdmTrans PDAI;
PriceDiscTable PDT;

ttsbegin;
insert_recordset PDAI(JournalNum, ItemName, PriceDiscTableRef, ItemCode, AccountCode, ItemRelation, AccountRelation, Amount, Currency, SearchAgain, relation, UnitId, Module, InventDimId, fromDate, toDate)
select JournalNum, ItemName from PDA where PDA.JournalNum==JournalNum
join RecId, ItemCode, AccountCode, ItemRelation, AccountRelation, Amount, Currency, SearchAgain, relation, UnitId, Module, InventDimId, fromDate, ToDate from PDT
where PDA.ItemRelation==PDT.ItemRelation && PDA.AccountRelation==PDT.AccountRelation && PDA.Module==PDT.Module && PDA.Relation==PDT.Relation && PDA.UnitId==PDT.UnitId && PDA.Currency==PDT.Currency && PDT.ToDate==STR2DATE('',123);
ttscommit;
}
Старый 05.10.2004, 17:43   #12  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
а сам селект.. если его запустить возвращает записи??? если да... посмотри что он возвращает...
Старый 05.10.2004, 17:49   #13  
AlexUnik is offline
AlexUnik
Участник
 
199 / 22 (1) +++
Регистрация: 01.06.2004
Адрес: Королёв
2 simply2double
Вот так селект работает отлично, но, к с ожалению, через while:
ttsbegin;
while select JournalNum, ItemName from PDA where PDA.JournalNum==JournalNum
join RecId, ItemCode, AccountCode, ItemRelation, AccountRelation,
Amount, Currency, SearchAgain, relation, UnitId, Module, InventDimId, fromDate from PDT index PriceDiscAdmIdx
where PDA.Module==PDT.Module && PDA.Relation==PDT.Relation
&& PDA.AccountRelation==PDT.AccountRelation && PDA.ItemRelation==PDT.ItemRelation
&& PDA.UnitId==PDT.UnitId && PDA.Currency==PDT.Currency
&& PDT.ToDate==STR2DATE('',123)
{
PDAI.PriceDiscTableRef = PDT.RecId;
PDAI.ItemCode = PDT.ItemCode;
PDAI.AccountCode = PDT.AccountCode;
PDAI.ItemRelation = PDT.ItemRelation;
PDAI.AccountRelation = PDT.AccountRelation;
PDAI.Amount = PDT.Amount;
PDAI.QuantityAmount = PDT.QuantityAmount;
PDAI.Currency = PDT.Currency;
PDAI.SearchAgain = PDT.SearchAgain;
PDAI.relation = PDT.relation;
PDAI.UnitId = PDT.UnitId;
PDAI.Module = PDT.Module;
PDAI.InventDimId = PDT.InventDimId;
PDAI.FromDate = PDT.fromDate;
PDAI.ToDate = FROMDATE-1;
PDAI.JournalNum = PDA.JournalNum;
PDAI.ItemName = PDA.ItemName;
PDAI.doInsert();
}
ttscommit;
Старый 05.10.2004, 19:56   #14  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано simply2double
insert_recordset во временную таблицу записи НЕ ВСТАВЛЯЕТ... доказано эмпирически...
Неправда. Вот работающий пример:
PHP код:
CustTable   custTable;
CustTable   custTableDB;
;
if (
custTable.setTmp()) {
    
insert_recordset custTable (AccountNumName)
        
select AccountNumName from custTableDB
            where custTableDB
.Name like "О*";

    while 
select custTable {
        
info(strfmt("%1, %2"custTable.AccountNumcustTable.Name));
    }

__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 05.10.2004, 19:59   #15  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано AlexUnik
Маленький вопросик: destination-table обязательно должна быть временной?
Не понял вопроса. Если destanation table является временной (частный случай Non-SQL table), тогда все групповые операции выполняются как построчные и бороться с этим никак нельзя, что, на самом деле, вполне логично.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 06.10.2004, 10:04   #16  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано Maxim Gorbunov


Неправда. Вот работающий пример:
не поленился проверил... в таком виде действительно работает... но я пошел немного дальше:

1. Создал копию custTable
2. Для чистоты эксперимента удалил из нее индексы
3. Попробывал вставлять в нее из обединения таблиц custTable и CustTrans

Результат все тот же... когда таблица не временная все встатвляется нормально...
когда временная ... все то же падение... может я чего-то не понимаю.. или чего0то не вижу ??? Вот код:


PHP код:
    CustTable_copy   custTable;
    
CustTable             custTableDB;
    
CustTrans             CustTrans;

    ;

    if (
custTable.setTmp()) {
    
insert_recordset custTable (AccountNumName)
        
select AccountNum from CustTrans
        join Name from custTableDB
            where custTableDB
.Name like "О*" &&
            
CustTrans.AccountNum == custTableDB.AccountNum;

    while 
select custTable {
        
info(strfmt("%1, %2"custTable.AccountNumcustTable.Name));
    }
    } 
Старый 06.10.2004, 10:07   #17  
AlexUnik is offline
AlexUnik
Участник
 
199 / 22 (1) +++
Регистрация: 01.06.2004
Адрес: Королёв
2 Maxim Gorbunov
Спасибо. Получается, что для временных таблиц использовать insert_recordset не имеет большого смысла.
Старый 06.10.2004, 10:25   #18  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
кстати оттрасированные команды сикуэла при исполнении приведенного выше примера для реальной таблицы:

PHP код:
SQL:BatchCompleted    SELECT A.ACCOUNTNUM AS f1,B.NAME AS f2,'sin' AS DATAAREAID,IDENTITY(int,1,1) AS RECID INTO #axapta_tmp_sin53  FROM CUSTTRANS A,CUSTTABLE B WHERE (A.DATAAREAID='sin') AND ((B.DATAAREAID='sin') AND ((B.NAME LIKE 'С%' ESCAPE '\' ) AND (A.ACCOUNTNUM=B.ACCOUNTNUM))) OPTION(FAST 7)    

SQL:BatchCompleted    INSERT INTO CUSTTABLE_COPY (ACCOUNTNUM,NAME,DATAAREAID,RECID)SELECT F1,F2,DATAAREAID,RECID+630285 FROM #axapta_tmp_sin53    

SQL:BatchCompleted    DROP TABLE #axapta_tmp_sin53 
при трассировки вставки в tmp таблицу... последним трассировщик отмечает попытку создания аксаптой сурсора для феча... и связь с аксаптой рвется.. вследствии падения последней...
Старый 06.10.2004, 10:31   #19  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
2 simply2double
Вот-вот! У меня сиквельный профайлер последней тоже зафиксировал эту команду, но я-то вставлял в постоянную таблицу...
Старый 06.10.2004, 11:27   #20  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
еще знаешь какой трабл может быть... в таблице может быть перекрыт метод insert... и предпринимая вставку.. ты нарушаешь какие-то условия...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
почему на работает common.(fieldId)[idx] maze DAX: Программирование 3 31.08.2007 06:48
JOIN программно на форме не работает rohlenko DAX: Программирование 2 31.03.2005 15:41
Не работает Debugger Antidot DAX: Программирование 0 20.12.2004 13:53
CRM ABC, SWOT анализ Как это работает и работает ли вообще. ShadowFromXZone DAX: Функционал 16 02.03.2004 18:09
Не работает selectForUpdate() Andronov DAX: Программирование 6 18.08.2003 17:24

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

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

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