|  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. | 
|  |