04.10.2004, 20:32 | #1 |
Злыдни
|
Не работает Insert_Recordset
Пытаюсь вставить записи из временной таблицы в постоянную с помощью insert_recordset (временная и постоянная таблица созданы мной, полностью идентичны по структуре).
На выполнении Insert_Recordset Аксапта падает. while_select ... myTable.insert() отрабатывает нормально. Вопрос традиционен: кто виноват (риторически) и что делать(практически)? |
|
05.10.2004, 09:40 | #2 |
Участник
|
В свое время я тоже много возлагал надежд на эту операцию. Но, к сожалению, она их не оправдала :-( В определенных ситуациях при запуске операции 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 |
Участник
|
Цитата:
Изначально опубликовано 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 |
----------------
|
Предложение
Господа, если это топик создан для того, чтобы жаловаться на судьбу, то его надо перенести в курилку. А если для решения проблем, то давайте полную информацию о том что и как вы делали.
|
|
05.10.2004, 10:19 | #5 |
Участник
|
"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 |
Участник
|
Yprit , поищите по ключевому слову, про INSERT_RECORDSET на форуме много писал simply (и его реинкарнация simply2double)
|
|
05.10.2004, 14:49 | #7 |
Administrator
|
Цитата:
Изначально опубликовано AlexUnik
Я так понимаю, в некоторых случаях, операция групповой вставки строк INSERT_RECORDSET откатывается к реализации через курсор (record-by-record) и делается это весьма неоптимизированным способом.
__________________
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 |
Злыдни
|
Проблема, видимо, кроется в самой моей таблице, т.к. на других темповых таблицах эта конструкция без проблем отрабатывает. На досуге попробую разобраться детально - сейчас вреени нет, оставил while_select
|
|
05.10.2004, 16:44 | #9 |
Участник
|
2 Maxim Gorbunov
Спасибо, прочитал и не один раз. Если не ошибаюсь, слово YES в таблице указанного абзаца помечает ситуацию, когда метод срабатывает построчно. Маленький вопросик: destination-table обязательно должна быть временной? В моем случае необходимо вставить большой набор записей в строки журнала коммерческих соглашений, но вставка должна производиться из нескольких таблиц - строки прайса в связке со строками журнала коммерческих соглашений. |
|
05.10.2004, 17:08 | #10 |
Участник
|
insert_recordset во временную таблицу записи НЕ ВСТАВЛЯЕТ... доказано эмпирически... возможно этому есть научное объяснение, заложенное в самом механизме работы аксапты со временными таблицами... но факт остается фактом... при попытке вставить аксапта валится....
и еще одна проблнема... которую зачастую забываешь, при использовании insert_recordset: нужно аккуратно повторять филдлист... особенно в случаи вставки записей из объединения таблиц... иначе все то же падение... а в остальном все работает нормально... PS Ко всему прочему наглядно создается впечатление пакетной обработки, которое так греет душу, ибо с детства привита неприязнь к команде fetch ))) хотя опять же... не знаю механизма исполнения данной команды... Аксаптой... |
|
05.10.2004, 17:20 | #11 |
Участник
|
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 |
Участник
|
а сам селект.. если его запустить возвращает записи??? если да... посмотри что он возвращает...
|
|
05.10.2004, 17:49 | #13 |
Участник
|
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 |
Administrator
|
Цитата:
Изначально опубликовано simply2double
insert_recordset во временную таблицу записи НЕ ВСТАВЛЯЕТ... доказано эмпирически... PHP код:
__________________
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 |
Administrator
|
Цитата:
Изначально опубликовано AlexUnik
Маленький вопросик: destination-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 |
Участник
|
Цитата:
Изначально опубликовано Maxim Gorbunov
Неправда. Вот работающий пример: 1. Создал копию custTable 2. Для чистоты эксперимента удалил из нее индексы 3. Попробывал вставлять в нее из обединения таблиц custTable и CustTrans Результат все тот же... когда таблица не временная все встатвляется нормально... когда временная ... все то же падение... может я чего-то не понимаю.. или чего0то не вижу ??? Вот код: PHP код:
|
|
06.10.2004, 10:07 | #17 |
Участник
|
2 Maxim Gorbunov
Спасибо. Получается, что для временных таблиц использовать insert_recordset не имеет большого смысла. |
|
06.10.2004, 10:25 | #18 |
Участник
|
кстати оттрасированные команды сикуэла при исполнении приведенного выше примера для реальной таблицы:
PHP код:
|
|
06.10.2004, 10:31 | #19 |
Злыдни
|
2 simply2double
Вот-вот! У меня сиквельный профайлер последней тоже зафиксировал эту команду, но я-то вставлял в постоянную таблицу... |
|
06.10.2004, 11:27 | #20 |
Участник
|
еще знаешь какой трабл может быть... в таблице может быть перекрыт метод insert... и предпринимая вставку.. ты нарушаешь какие-то условия...
|
|