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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.09.2006, 15:59   #1  
AxPr-r is offline
AxPr-r
Участник
Axapta Retail User
 
44 / 11 (1) +
Регистрация: 13.03.2006
Копирование строк таблицы с помощью DictTable
прочитал:
манипуляции с таблицами
Можно ли имея только название(имя) таблицы добавить в неё запись?

т.к. мне необходимо копировать строки таблиц, возникла идея использовать один метод класса для дублирования записей любых таблиц:
Код:
static common copy(int      _tablenum,
                              int      _countField, // количество полей
                              recid    _recid)
{
    DictTable   dt    = new DictTable(_tablenum);
    int         i,insertMethodNum;
    FieldId     fieldId;
    Common      record, newrecord;
    ;
    if(dt.fieldCnt()<_countField)
        throw error('');
    record = dt.makerecord();
    select firstonly record where record.recid == _recid;
    newrecord = dt.makeRecord();
    for(i=1;i<=_countField;i++)
    {
      fieldId = dt.fieldCnt2Id(i);
      newrecord.(fieldId) = record.(fieldId);
    }
    return newrecord;
}
далее, если необходимо,
я изменяю значения нескольких полей, которые должны быть отличными от оригинала и вставляю строку...
Код:
    myTable.Data(RecordCopy::Copy(tablenum(myTable),20,recId));
    myTable.TransDate = systemdateget();
   ...
    myTable.Insert();
вопросы следующие:
на сколько корректен код метода?
каким образом, если возможно, использовать orig(),
что то типа record.orig().(fieldId), для получения значения до изменения?
Старый 28.09.2006, 16:33   #2  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
В global есть метод buf2Buf - можно его приспособить
За это сообщение автора поблагодарили: mazzy (5).
Старый 28.09.2006, 16:41   #3  
AxPr-r is offline
AxPr-r
Участник
Axapta Retail User
 
44 / 11 (1) +
Регистрация: 13.03.2006
хочется попробовать использовать dicttable еще и для получения id полей, которые были изменены в виде, например, контейнера (с помощью orig())...
buf2Buf в этом случае не катит

чтобы не писать проверку
if( myTable.Field1 != myTable.Orig().Field1)
...
if(myTable.Field20 != myTable.Orig().Field20)
Старый 28.09.2006, 16:46   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Вы забыли про системные поля - их не надо копировать.

Использовать Record.orig() для выявления изменений можно. Хотя факт изменения можно регистрировать в какой либо другой структуре (контейнер, Map) и использовать уже эти данные
__________________
Axapta v.3.0 sp5 kr2
Старый 28.09.2006, 17:12   #5  
AxPr-r is offline
AxPr-r
Участник
Axapta Retail User
 
44 / 11 (1) +
Регистрация: 13.03.2006
Цитата:
Сообщение от AndyD Посмотреть сообщение
Вы забыли про системные поля - их не надо копировать.

Использовать Record.orig() для выявления изменений можно. Хотя факт изменения можно регистрировать в какой либо другой структуре (контейнер, Map) и использовать уже эти данные
нет не забыл, для этого передается параметр - количество полей, значения которых нужно копировать.Насколько я понял - системные поля находятся "в конце списка" т.е. перебор в цикле до системных полей не доходит или я чегото недопонял.
Сам факт о том что какое либо поле изменено не спасает, мне необходимо id или наименования полей, которые были изменены возвращаемые методом, я не нашел как это можно сделать через dicttable, это сократило бы код на несколько порядков и еще - один единственный метод для любой таблицы.

Последний раз редактировалось AxPr-r; 28.09.2006 в 17:21.
Старый 28.09.2006, 18:48   #6  
AxPr-r is offline
AxPr-r
Участник
Axapta Retail User
 
44 / 11 (1) +
Регистрация: 13.03.2006
Разобрался, оказалось что все просто

если кому интересно вот метод update на таблице
PHP код:
public void update()
{
    
MyTable  MyTableOrig;
    ;
    
MyTableOrig this.orig();
    
super();
    
MyClass::checkModification(tablenum(MyTable),MyTableOrig,15,this.RecId);

в методе checkModification,
PHP код:
 .....
      
fieldId dt.fieldCnt2Id(i);
      if(
_recordOrig.(fieldId) != record.(fieldId))
.... 
Спасибо всем!
Старый 29.09.2006, 08:23   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от AxPr-r Посмотреть сообщение
чтобы не писать проверку
if( myTable.Field1 != myTable.Orig().Field1)
...
if(myTable.Field20 != myTable.Orig().Field20)
А эту проверку писать не надо. Аксапта сама эту проверку делает. Можете проверить - сделайте курсору update() без изменения какого-л поля. Или измените поле и установите старое значение. Системные поля даты/времени не изменятся и запрос к базе не будет послан.

И еще. В Вашем коде системные поля не изменятся по-любому.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Hans (1).
Старый 29.09.2006, 14:35   #8  
BVN is offline
BVN
Участник
 
88 / 13 (1) ++
Регистрация: 07.04.2005
Адрес: г. Королёв МО
ну как вариант можно рассмотреть и такое копирование, по названию полей и их одинаковых типов...
PHP код:
void  dddd(   Common  _from,    Common  _to)
{
    
DictTable   dictTable = new DictTable(_from.tableId);
    
DictTable   dictT = new DictTable(_to.tableId);
    
fieldId     fieldId   dictTable.fieldNext(0);
    
DictField   dictField,dictF;
    
int i;
    
int id;
    
boolean flag;
    ;

    
ttsbegin;
        
flag =false;
        for (
1<= dictTable.fieldCnt(); i++)
        {

             
dictField     = new dictField(_from.TableId,dictTable.fieldCnt2Id(i));
             
fieldId         dictTable.fieldCnt2Id(i);
                if(!
dictField.isSystem())
                {
                    if(
dictField.name(dictTable.fieldCnt2Id(i)))
                    {
                    
dictF = new dictField(_to.TableId,fieldName2Id(_to.TableId,dictField.name(dictTable.fieldCnt2Id(i))));
                    
id =fieldName2Id(_to.TableId,dictField.name(dictTable.fieldCnt2Id(i)));
                        if(
id && dictField.baseType()==dictF.baseType())
                        {
                        
_to.(Id)   = _from.(fieldId);
                        
flag true;
                        }
                }
        }

}
    if(
flag)
    {
    
_to.insert();
  
ttscommit;
    }
    else
  
ttsabort;

За это сообщение автора поблагодарили: Poleax (1), Hans (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
БАГ: копирование строк накладных в новый заказ Антон Солдатов DAX: Функционал 2 03.12.2004 09:02
Таблицы для PO, SO строк OliaM DAX: Программирование 10 13.11.2004 18:14
Копирование строк в одинаковых таблицах Ivan Mischenko DAX: Программирование 9 15.01.2004 18:08

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

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

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