23.07.2007, 17:04 | #1 |
Участник
|
Строки временной таблицы с разными DataAreaId
Добрый день!
Хочу во временную таблицу запихать строки из разных компаний. Например: X++: static void Job27(Args _args) { CustTrans custTrans; custTrans tmpcustTrans; ; tmpcustTrans.setTmp(); custTrans.company("S11"); select custTrans; tmpcustTrans.company("S11"); tmpcustTrans.data(custTrans); tmpcustTrans.insert(); while select tmpcustTrans { info(tmpcustTrans.dataAreaId); } custTrans = null; custTrans.company("S10"); select custTrans; tmpcustTrans.company("S10"); tmpcustTrans.data(custTrans); tmpcustTrans.insert(); while select tmpcustTrans { info(tmpcustTrans.dataAreaId); } } S11 S10 S10 Т.е. в итоге во временной таблице в поле dataAreaId стоит S10, Но я же записыват туда запись с компанией S11. Почему получилось так, что компания в записях изменилась? |
|
23.07.2007, 17:10 | #2 |
Программатор
|
Потомучто Вы инициализировали таблицу в одной компании, и данные в нее будут записываться в разрезе данной компании. Да и поле DataAreaId низя менять вроде как ни руками ни программно... А вообще а дебагере хорошовидно что как куда вставляется. ИМХО луче использовать changeCompany для игры с компаниями...
Последний раз редактировалось Sada; 23.07.2007 в 17:13. |
|
23.07.2007, 17:12 | #3 |
Участник
|
а что понимается под инициализацией таблицы?
|
|
23.07.2007, 17:18 | #4 |
Участник
|
Цитата:
Сообщение от Sada
Потомучто Вы инициализировали таблицу в одной компании, и данные в нее будут записываться в разрезе данной компании. Да и поле DataAreaId низя менять вроде как ни руками ни программно... А вообще а дебагере хорошовидно что как куда вставляется. ИМХО луче использовать changeCompany для игры с компаниями...
|
|
23.07.2007, 17:24 | #5 |
Участник
|
А зачем вам этот код компании?
Данные вставляются верно. Проверьте, к примеру, выведя другое поле на экран. Получите записи из нескольких компаний. А то, в какой компании они были изначально, имхо, не так важно X++: static void Job30(Args _args) { CustTrans custTrans; custTrans tmpcustTrans; ; tmpcustTrans.setTmp(); changecompany('S11') { custTrans = null; select firstonly custTrans; buf2buf(custTrans, tmpcustTrans); tmpcustTrans.doInsert(); } while select tmpcustTrans { info(tmpcustTrans.AccountNum); } changecompany('S10') { custTrans = null; select firstonly custTrans; buf2buf(custTrans, tmpcustTrans); tmpcustTrans.doInsert(); } while select tmpcustTrans { info(tmpcustTrans.AccountNum); } } |
|
23.07.2007, 17:29 | #6 |
Участник
|
Цитата:
Я подозреваю, что для этих целей придется заводить отдельное поле во временной(результирующей) таблице. Быть может есть возможность, всетаки, обойтись без добавления доп. поля? |
|
23.07.2007, 17:33 | #7 |
Участник
|
Цитата:
Вам придется сначала: 1. либо разобраться с витруальными компаниями 2. либо полностью закрыть для себя возможность работать с вирутальными компаниями в будущем. И уж совершенно однозначно вы перекрываете себе возможность работать с общими для всех компаний таблицами. Будьте осторожны с dataareaid. Команда cangecompany("aaa") не всегда приводит к тому, что в данной таблице dataareaid будет равна aaa. Читайте про виртуальные компании. |
|
23.07.2007, 17:33 | #8 |
Программатор
|
Да заведите поле и не мучьтеся...
|
|
23.07.2007, 17:36 | #9 |
Участник
|
Цитата:
Стоит ли ей пользоваться? X++: static void Job30(Args _args) { CustTrans custTrans; custTrans tmpcustTrans; ; tmpcustTrans.setTmp(); changecompany('S11') { custTrans = null; select firstonly custTrans; buf2buf(custTrans, tmpcustTrans); tmpcustTrans.overwriteSystemfields(true); tmpcustTrans.(fieldNum(CustTrans, DataAreaId)) = curExt(); tmpcustTrans.doInsert(); } while select tmpcustTrans { info(tmpcustTrans.dataareaid); } changecompany('S10') { custTrans = null; select firstonly custTrans; buf2buf(custTrans, tmpcustTrans); tmpcustTrans.overwriteSystemfields(true); tmpcustTrans.(fieldNum(CustTrans, DataAreaId)) = curExt(); tmpcustTrans.doInsert(); } while select tmpcustTrans { info(tmpcustTrans.dataareaid); } } |
|
23.07.2007, 17:46 | #10 |
Участник
|
|
|
23.07.2007, 17:50 | #11 |
Участник
|
Цитата:
Да, думаю стоит добавить просто поле для этих целей. |
|
23.07.2007, 18:30 | #12 |
Member
|
Цитата:
Сообщение от PavelSR
...
при выборке данных получаются некорректные данные. ... Помните в Винни Пухе: "Это неправильные пчелы, и они делают неправильный мед". Так и вы сейчас точно так же говорите. Поддерживаю вариант с добавлением поля для компании.
__________________
С уважением, glibs® |
|
23.07.2007, 19:06 | #13 |
MCT
|
Можно еще и прямой запрос попробовать
Хотя для этого придется все равно создавать таблицу с полем, так что от поля не уйти Последний раз редактировалось MikeR; 23.07.2007 в 19:13. Причина: так будет вернее |
|
23.07.2007, 19:14 | #14 |
Участник
|
Э.
Прямой запрос к временной таблице? Это как?
__________________
Axapta v.3.0 sp5 kr2 |
|
23.07.2007, 19:28 | #15 |
Member
|
Наверное, создать в TempDb временную таблицу, заполнить ее курсором или запросом, а потом считать. Если речь идет о прямом подключении к MS SQL Server, а не о каком-то другом прямом запросе. Ну и что-то аналогичное можно сделать на Oracle, наверное.
__________________
С уважением, glibs® |
|
24.07.2007, 10:09 | #16 |
MCT
|
Цитата:
Прямой запрос к временной таблице?
Это как? Цитата:
Наверное, создать в TempDb временную таблицу
Последний раз редактировалось MikeR; 24.07.2007 в 10:10. Причина: цитата |
|
26.03.2008, 10:32 | #17 |
Участник
|
Коллеги, подскажите, пожалуйста, как положить записи во временную таблицу действительно с разными DataAreaId, т.е. по компаниям? А то при наполнении временной таблицы записями из разных компаний возможны конфликты уникального индекса.
P.S. Доп.поле заранее создать (и включить в индекс) не могу, т.к. таблица заранее неизвестна и создается из DictTable.makeRecord(). Последний раз редактировалось Yugene; 26.03.2008 в 10:35. |
|