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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.07.2009, 18:05   #1  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Заполнение CustTable программно.
Всем добрый день.

Такой вопрос: пробовал ли кто-либо заполнять таблицу CustTable из кода (допустим с while)? Проблема в том, что первую строку я могу записать, если следом идет вторая, то получаю следующую ошибку:

Cannot create a record in Customers (CustTable). Customer account: 13698002, BbK SrD West.
The record already exists.

Этого recorda в таблице нет!!!

Заранее спасибо.
Старый 06.07.2009, 18:08   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Ой!

Мы не инициализируем значения переменной!

Читайте. очень много тем. И как программно, и как из Excelя. На маззи ру даже статья была, кажется, Вадима Г.

С Ув,
Г.
Старый 06.07.2009, 18:17   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
а можно пример кода как вы это делаете?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 06.07.2009, 18:18   #4  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от George Nordic Посмотреть сообщение

Мы не инициализируем значения переменной!
Да нет, вроде все инициализируем. Сами посудите:



X++:
static void CCADOConnect1(Args _args)
{
   CCADOConnection      dbcon;
   CCADOCommand         cmd;
   CCADORecordset       rs;
   CCADOFields          f;

   str cs;
   COM comrs;
   CustTable            custTable;
   ;
    cs = "trusted_connection=yes;server=ADM; database=Interface; driver={SQL Server}";
    dbcon = new CCADOConnection();
    dbcon.open(cs);

    cmd = new ccadocommand();
    cmd.activeConnection(dbcon);
    cmd.commandText('select * from CustTable order by AccountNum');
    rs = cmd.execute();

    comrs = rs.recordSet();
    while (!rs.EOF())
    {
        f=rs.fields();       

        ttsbegin;
        custTable.initValue();
        custTable.AccountNum        = f.itemIdx(0).value();
        custTable.CustGroup         = f.itemIdx(1).value();
        custTable.Name              = f.itemIdx(2).value() + ' ' + f.itemIdx(3).value();
        custTable.Street            = f.itemIdx(4).value();
        custTable.City              = f.itemIdx(5).value();
        custTable.ZipCode           = f.itemIdx(6).value();
        custTable.CountryRegionId   = f.itemIdx(7).value();        
        custTable.PartyType = DirPartyType::Organization;        
        custTable.Currency          = 'EUR';
        custTable.LanguageId        = 'EN';

        if(custTable.validateWrite())
        custTable.insert();
        else ttsabort;
        ttscommit;

        comrs.moveNext();
    }
    rs.close();
    dbcon.close();
}
Старый 06.07.2009, 18:21   #5  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
comrs.moveNext();
но
while (!rs.EOF())

ЗЫ.
Надо что то типа такого:
X++:
while (!rs.EOF())
{
    ...
    rs.moveNext();
}

Последний раз редактировалось raz; 06.07.2009 в 18:24.
Старый 06.07.2009, 18:21   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Попробуйте добавить custTable.clear() перед custTable.initValue()

И не используйте транзакции так, как вы это делаете.
Где-то недавно была тема, что они не работают, если откатывать в цикле (правда там начиналась транзакция до цикла).

Лучше бросать exception
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 06.07.2009, 18:24   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Попробуйте добавить custTable.clear() перед custTable.initValue()
Или даже лучше
X++:
custTable := Null;
А то в некоторых случаях бывают побочные эффекты нежелательные...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 06.07.2009, 18:28   #8  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Попробуйте добавить custTable.clear() перед custTable.initValue()

И не используйте транзакции так, как вы это делаете.
Где-то недавно была тема, что они не работают, если откатывать в цикле (правда там начиналась транзакция до цикла).

Лучше бросать exception
Спасибо. Заработало! А трансакции я использовал для Test-Job. В приложении сделаю с try catch.
Старый 06.07.2009, 23:26   #9  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
2 Dima_Dima
ИМХО, дело не в отсутствии custTable.clear(), т.к. запись идет в одни и те же поля, а в том, что f=rs.fields() возвращает одни и те же значения, т.е. рекордсет не перебирается.

Специально сваял джоб, для которого сделал CopyOfCustTable, как копию CustTable, удалил с неё все методы, кроме initValue(). Джоб прекрасно отработал без custTable.clear().
Если я прав и рекордсет не перебирается, то custTable.clear() не поможет.

X++:
static void Job1(Args _args)
{
   CustTable            custTable;             
   CopyOfCustTable      CopyOfCustTable;
   ;
    while select custTable
    {
        ttsbegin;
        CopyOfCustTable.initValue();
        CopyOfCustTable.AccountNum        = custTable.AccountNum;
        CopyOfCustTable.CustGroup         = custTable.CustGroup;
        CopyOfCustTable.Name              = custTable.Name;
        CopyOfCustTable.Street            = custTable.Street;
        CopyOfCustTable.City              = custTable.City;
        CopyOfCustTable.ZipCode           = custTable.ZipCode;
        CopyOfCustTable.Currency          = 'EUR';
        CopyOfCustTable.LanguageId        = 'EN';

        if(CopyOfCustTable.validateWrite())
            CopyOfCustTable.insert();
        else ttsabort;

        ttscommit;
    }
}
Просто хочется понять где ошибка, может я ошибаюсь, может что поменялось в аксапте.
У меня Ax3, а у Вас?

ЗЫ. Я в таких конструкциях всегда использую clear().
Старый 07.07.2009, 11:13   #10  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от raz Посмотреть сообщение
2 Dima_Dima

Просто хочется понять где ошибка, может я ошибаюсь, может что поменялось в аксапте.
У меня Ax3, а у Вас?
ЗЫ. Я в таких конструкциях всегда использую clear().
У меня АХ 2009,

с custTable.clear(); или custTable = null; всё работает отлично. Даже GlobalAddressBook заполняется корректно....
Старый 07.07.2009, 11:16   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от raz Посмотреть сообщение
comrs.moveNext();
но
while (!rs.EOF())
X++:
comrs = rs.recordSet();
вроде как работает у автора и так...
__________________
Zhirenkov Vitaly
Старый 20.07.2009, 08:26   #12  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Если смущает com recordset, можно просто добавить метод в класс CCADORecordSet
(непонятно, кстати, по какой причине исключенный в dax2009)

X++:
void moveNext()
{
         recordSet.moveNext();
}

Последний раз редактировалось player; 20.07.2009 в 08:28.
Теги
movenext, создание записи, шаблон

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
PartyId в CustTable, VendTable nano3 DAX: Программирование 5 05.02.2010 07:15
Фильтрация CustTable по связанной таблице Hyper DAX: Программирование 6 21.11.2007 12:38
Динамическое заполнение Grid-а itfs DAX: Программирование 1 08.06.2006 15:52
Как программно открыть project? MaratRZ DAX: База знаний и проекты 2 04.08.2005 09:56
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02

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

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

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