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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.10.2012, 15:30   #1  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Копирование табличной переменной
Добрый день! Подскажите в чём может быть дело: Создал дублированием таблицы RContractTable временную таблицу, ,в цикле while select по таблице договоров в зависимости от определенных условий мне нужно заполнять временную таблицу. В итоге она должна представлять собой немного укороченную (в смысле количества записей) таблицу договоров.
Собственно копирование строк пытаюсь сделать так
X++:
while select RContractTable
 if (...)
  {
   buf2buf(RContractTable, TmpRContractTable)
   TmpRContractTable.insert();
  }
Выпадает ошибка на buf2buf - поле с идентификатором (FieldID) 16001 в таблице TmpRContractTable не обнаружено!
В чём проблема??? Наверняка что то из-за дублирования таблицы??
Спасибо!
Старый 11.10.2012, 15:46   #3  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Спасибо! В этой ветке обсуждается что так как я хочу, делать нельзя :-) И нужно описать свои методы. Но мне как раз то и нужно целиком записи копировать, без всяких ухищрений и желательно как можно проще это сделать.
Я еще пробовал через
TmpRContractTable.data(RContractTable);
TmpRContractTable.insert();
но в таком случае выскакивает ошибка: "Невозможно создать запись в "Договоры" ("TmpRContractTable") Запись уже существует.
причем ошибка выскакивает при первом же проходе!

Последний раз редактировалось JuniorAx; 11.10.2012 в 15:53.
Старый 11.10.2012, 15:51   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
buf2buf() не канает, т.к. у тебя 2 разные таблицы, хоть и поля в них одинаковые. Если устроит, то можно из RContractTable сделать временную таблицу методом setTmp(). Второй вариант использовать следующую конструкцию:
X++:
insert_recordset TmpRContractTable (<fields>) select <fields> from RContractTable
    [where <>]
    [join <. >]
__________________
// no comments
Старый 11.10.2012, 15:58   #5  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
А можно вопрос - что вы хотите сделать с полученными данными? Группировок у вас там нет, расчёты по полям можно было бы и без темповой таблицы сделать....
Мне необходимость такой конструкции (если не нужно сделать duplicate записи в таблице) представляется совершенно неочевидной.
__________________
С уважением,
Вячеслав
Старый 11.10.2012, 16:04   #6  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Спасибо!
to dech: Я правильно понимаю что в случае использования второго способа, мне придется все поля вручную перечислять в select'е ??
to pitersky: По этой таблице в дальнейшем будут сделаны группировки для удаления повторяющихся договоров. Но сначала необходимо заполнить таблицу договорами среди которых будем искать повторяющиеся (в зависимости от определенный условий).
Старый 11.10.2012, 16:10   #7  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
Спасибо! В этой ветке обсуждается что так как я хочу, делать нельзя :-) И нужно описать свои методы. Но мне как раз то и нужно целиком записи копировать, без всяких ухищрений и желательно как можно проще это сделать.
Прочтите внимательно сообщение по ссылке, там есть пример, который решает проблему.
За это сообщение автора поблагодарили: JuniorAx (1).
Старый 11.10.2012, 16:37   #8  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
To raz: Спасибо огромное!!! Взял ваш код для buf2buf - отлично всё скопировалось!
Старый 11.10.2012, 16:38   #9  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Может кто подсказать как быстро вычислить сальдо по договору???
Старый 12.10.2012, 08:06   #10  
jasper is offline
jasper
Участник
 
13 / 11 (1) +
Регистрация: 22.10.2004
Адрес: Владивосток
это можно через map сделать
Замечание, если нужна немного более укороченная таблица договоров
то проще и надежнее сделать так

X++:
RContractTable  RContractTable;
RContractTable  TmpRContractTable;
;
TmpRContractTable.setTmp();
while select RContractTable
 if (...)
  {
   buf2buf(RContractTable, TmpRContractTable);
   TmpRContractTable.insert();
  }
__________________
Нет ничего сложного есть простое и неправильное
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 12.10.2012, 08:37   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
Добрый день! Подскажите в чём может быть дело: Создал дублированием таблицы RContractTable временную таблицу, ,в цикле while select по таблице договоров в зависимости от определенных условий мне нужно заполнять временную таблицу. В итоге она должна представлять собой немного укороченную (в смысле количества записей) таблицу договоров.
Расскажите какую задачу вы решаете? Почему пришли именно к такой формулировке?
Вам нужно заполнить временную таблицу именно копиями, а не ссылками на строки? Вы будете потом редактировать скопированные данные? Если достаточно иметь только ссылки на строки, например для реализации сложного фильтра, то есть ещё другие варианты
Например: Выборка произвольных записей одним запросом
Старый 12.10.2012, 09:13   #12  
abv2703 is offline
abv2703
Участник
 
92 / 22 (1) +++
Регистрация: 05.12.2003
Адрес: Санкт-Петербург, улица Бухарестсткая
Ню, можно как-нибудь так

PHP код:
//abv        09.10.2012 копирование данных исходной таблицы в произвольную таблицу.
static void abv_buf2bufCommon  _from,  Common  _to )
{
    
DictTable   dictTableFrom = new DictTable(_from.TableId);
    
fieldId     fieldIdFrom   dictTableFrom.fieldNext(0);
    
DictTable   dictTableTo   = new DictTable(_to.TableId);
    
fieldId     fieldIdTo     dictTableTo.fieldNext(0);
    
DictField   dictFieldFrom,dictFieldTo;
    
Name        nameFrom,nameTo;
    
NoYes       somethingCopied;
    ;

    while( 
fieldIdFrom && !isSysId(fieldIdFrom) )
    {

        
fieldIdTo     dictTableTo.fieldNext(0);

        
dictFieldFrom dictTableFrom.fieldObject(fieldIdFrom);
        
nameFrom      dictTableFrom.fieldName(fieldIdFrom);

        while( 
fieldIdTo && !isSysId(fieldIdTo) )
        {

            
nameTo      dictTableTo.fieldName(fieldIdTo);
            
dictFieldTo dictTableTo.fieldObject(fieldIdTo);

            if( 
nameFrom == nameTo && dictFieldFrom.typeId() == dictFieldTo.typeId() )
            {

                
_to.(fieldIdTo) = _from.(fieldIdFrom);
                
somethingCopied NoYes::Yes;

                break;

            }

            
fieldIdTo  dictTableTo.fieldNext(fieldIdTo);

        }

        
fieldIdFrom     dictTableFrom.fieldNext(fieldIdFrom);

    }
//========================================================================================
    
if( somethingCopied )
    {

        
_to.insert();

    }

}
//============================================================================================================== 
Старый 12.10.2012, 10:30   #13  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Расскажите какую задачу вы решаете? Почему пришли именно к такой формулировке?
так написал же человек, что
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
По этой таблице в дальнейшем будут сделаны группировки для удаления повторяющихся договоров. Но сначала необходимо заполнить таблицу договорами среди которых будем искать повторяющиеся (в зависимости от определенный условий).
хотя я совершенно не понимаю, зачем тут нужна временная таблица. искать дубликаты вполне себе можно и на основной, а удалять так только там и надо
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 12.10.2012, 10:37   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от pitersky Посмотреть сообщение
хотя я совершенно не понимаю, зачем тут нужна временная таблица. искать дубликаты вполне себе можно и на основной, а удалять так только там и надо
Согласен.
Старый 12.10.2012, 13:08   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от jasper Посмотреть сообщение
проще и надежнее сделать так

X++:
...
   buf2buf(RContractTable, TmpRContractTable);
 ..
еще TmpRContractTable.data(RContractTable)
Старый 13.10.2012, 18:54   #16  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Добрый день! Благодарю за помощь всех кто откликнулся!
Задача: Мне необходимо выбрать договоры по которым есть не нулевое сальдо и затем произвести по ним поиск тех что встречаются более одного раза - т.е. дублированные! Я решил поступить так: Пробегаемся по таблице договоров отбираем только те что нам нужны, помещаю те что подходят во временную таблицу и уже в ней делаю поиск дубликатов. Собственно вот и всё! Это решение мне показалось не сложным и достаточно быстрым! Проблему с копированием во временную таблицу, которую я озвучил в начале темы, я решил с помощью кода от сюда: Есть ли в Axapta ф-ия схожая с TRANSFERFIELDS из Nav?
Спасибо raz!
Было бы очень интересно услышать какие ещё способы можно применить к решению этой задачи?? И еще что имел ввиду S.Kuskov когда говорил про таблицу с ссылками на записи? Я ни когда с таким не работал - просветите пожалуйста! :-)
Всем спасибо ещё раз!
Старый 14.10.2012, 15:53   #17  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Обратите внимание на код от jasper - вам совсем нет необходимости дублировать таблицу договоров в АОТ, достаточно временное ее сделать временной и заполнить значениями. Это будет точно то же, и при этом нет проблем с buf2buf(), как у вас.

А вообще люди советуют написать все одним запросом к настоящей таблице договоров, чтобы сразу найти дубликаты, без необходимости заполнения временной таблицы, так как с этим связаны существенные проблемы производительности кода.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AXGoToDeclarationXRef - утилита перехода к объявлению переменной alex55 DAX: Программирование 4 13.06.2010 15:24
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
Самопроизвольная смена компании (DataAreaId) у табличной переменной gl00mie DAX: Программирование 14 10.04.2006 12:18
Перенос переменной в конфигураторе продукции Serg DAX: Функционал 0 09.12.2005 13:43
получение значения переменной окружения leva DAX: Программирование 3 07.10.2005 17:57

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

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

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