06.07.2009, 18:05 | #1 |
Участник
|
Заполнение 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 |
Модератор
|
Ой!
Мы не инициализируем значения переменной! Читайте. очень много тем. И как программно, и как из Excelя. На маззи ру даже статья была, кажется, Вадима Г. С Ув, Г. |
|
06.07.2009, 18:17 | #3 |
Ищущий знания...
|
а можно пример кода как вы это делаете?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
06.07.2009, 18:18 | #4 |
Участник
|
Да нет, вроде все инициализируем. Сами посудите:
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 |
NavAx
|
comrs.moveNext();
но while (!rs.EOF()) ЗЫ. Надо что то типа такого: X++: while (!rs.EOF())
{
...
rs.moveNext();
} Последний раз редактировалось raz; 06.07.2009 в 18:24. |
|
06.07.2009, 18:21 | #6 |
Участник
|
Попробуйте добавить custTable.clear() перед custTable.initValue()
И не используйте транзакции так, как вы это делаете. Где-то недавно была тема, что они не работают, если откатывать в цикле (правда там начиналась транзакция до цикла). Лучше бросать exception |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
06.07.2009, 18:24 | #7 |
MCITP
|
Или даже лучше
X++: custTable := Null;
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
06.07.2009, 18:28 | #8 |
Участник
|
Спасибо. Заработало! А трансакции я использовал для Test-Job. В приложении сделаю с try catch.
|
|
06.07.2009, 23:26 | #9 |
NavAx
|
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 |
Участник
|
Цитата:
с custTable.clear(); или custTable = null; всё работает отлично. Даже GlobalAddressBook заполняется корректно.... |
|
07.07.2009, 11:16 | #11 |
MCITP
|
X++: comrs = rs.recordSet();
__________________
Zhirenkov Vitaly |
|
20.07.2009, 08:26 | #12 |
Участник
|
Если смущает com recordset, можно просто добавить метод в класс CCADORecordSet
(непонятно, кстати, по какой причине исключенный в dax2009) X++: void moveNext()
{
recordSet.moveNext();
} Последний раз редактировалось player; 20.07.2009 в 08:28. |
|