Имя: Пароль:
1C
1C 7.7
v7: Запись через ADO в Excel
0 pavlo
 
03.07.13
15:03
Народ, помогите кто знает.
Суть в том, что все работает если рКод числовой, а вот если нет, пишет о несовпадении типов, что не пытался делать, не хочет менять тип. Если зайти в этот ексель, тип там текстовый :(
РС.Fields(14).Value=Строка(рКодК); тут пишет несоответствие типов :(


   ФЕШ = СоздатьОбъект("ADODB.Connection"); //шаблон
   СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data source="+СокрЛП(ордер)+";Extended Properties=""Excel 8.0;HDR=No;""";
   Попытка
       ФЕШ.Open(СтрокаПодключения); // IMEX=1 tell the driver to always read "intermixed" data column as text READ-ONLY
   Исключение
       Предупреждение("Не смогли подключиться к файлу "+СокрЛП(ордер)+" возможно сеть или файл недоступен!",10);
       СтатусВозврата(0);
       Возврат;
   КонецПопытки;
   Catalog    = CreateObject("ADOX.Catalog");
   Catalog.ActiveConnection=ФЕШ;
   СписокЛистов = СоздатьОбъект("СписокЗначений");
   Для кк=0 по Catalog.Tables.Count-1 Цикл
       ИмяЛиста=СокрЛП(Catalog.Tables(кк).Name);
       Если Найти(ИмяЛиста,"$_")=0 Тогда
           Если СокрЛП(ИмяЛиста)="Прайс$" Тогда
               СписокЛистов.ВставитьЗначение(1,ИмяЛиста);
           Иначе
               СписокЛистов.ДобавитьЗначение(ИмяЛиста);
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   ИмяЛиста = СписокЛистов.ПолучитьЗначение(1);
   РС                    = СоздатьОбъект("ADODB.RecordSet");  
   РС.ActiveConnection = ФЕШ;
   РС.CursorType        = 3;// 'Статический курсор.
   РС.LockType            = 2;// 'Пессимистическая блокировка.
   РС.Source            = "Select * From ["+ИмяЛиста+"]";
   //РС.Fields(14).Type    = 202;
   //РС.Fields(0).Type    = 202;
   РС.Open();
   Сч=0;
   колСтр=РС.RecordCount;
   
   //Сообщить(РС.Supports());
   рКодК=рКодКА;
   Пока РС.EOF()=0 Цикл  
       Сч=Сч+1;
       процент=""+Окр(Сч/колСтр*100,0)+"%";
       Состояние("Обработано: "+процент);
       РКод=РС.Fields(0).Value;
       РТМЦ = ПолучитьПустоеЗначение("Справочник.ТМЦ");
       Если СпрТМЦ.НайтиПоКоду(СокрЛП(РКод))=1 Тогда
           РТМЦ = СпрТМЦ.ТекущийЭлемент();
       КонецЕсли;
       Если Сч=1 Тогда
           //Сообщить(РС.Fields(14).Type);
           //РС.Fields(14).Type = 129;
           РС.Fields(14).Value=Строка(рКодК);
           РС.Update();
       ИначеЕсли Сч=2 Тогда
           //Сообщить(РС.Fields(0).Type);
           РС.Fields(0).Value=рКодК;
           РС.Update();
       КонецЕсли;
       Если (скидки=0) И (сч>3) Тогда
           Прервать;
       КонецЕсли;
КонецЦикла;
1 pavlo
 
04.07.13
06:34
жаль, что никто не сталкивался :(
2 Ёпрст
 
04.07.13
10:24
А где переход к следующей записи ?
3 Ёпрст
 
04.07.13
10:25
не вижу в коде цикла
РС..MoveNext();
4 Serginio1
 
04.07.13
10:28
Что типа такого
Процедура ЗаписатьТзВЭксель(тз,ИмяФайлаЭксель)
   
   // Допустимые типы
   // adDouble = 5 Значение с плавающей точкой двойной точности
   // adDAte = 7 Дата
   // adCurrency = 6 Денежная сумма
   // adBoolean = 11 Булево
   // adVarWChar = 202 Символьная строка Unicode, заканчивающаяся NULL
   // adLongVarWChar = 203 Длинное строковое значение
   
   
   
       
   Файл=Новый Файл(ИмяФайлаЭксель);
   Если файл.Существует() Тогда
       УдалитьФайлы(ИмяФайлаЭксель);
   КонецЕсли;    
   // Собираем строку подключения
   //СтрокаПодключения = "
   //|Provider=Microsoft.Jet.OLEDB.4.0;
   //|Data Source="+ИмяФайлаЭксель+";
   //|Extended Properties=""Excel 8.0;HDR=Yes;"";";
   
   СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = "+ИмяФайлаЭксель;
   СтрокаПодключения = СтрокаПодключения + ";Mode=Share Deny Write; Extended Properties = "+"""Excel 12.0"+";HDR=Yes;IMEX=1"";";
   ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ИмяФайлаЭксель+";Extended Properties=Excel 12.0 Xml;";
   Connection = Новый COMОбъект("ADODB.Connection");
   
   
   //Catalog = Новый COMОбъект("ADOX.Catalog");
   //Catalog.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ИмяФайлаЭксель+";Extended Properties=Excel 12.0 Xml;";
   
   //Table = New COMОбъект("ADOX.Table");
   //    Table.Name = "TestTable";
   //    Catalog.Tables.Append(Table);
   //    Catalog="";
   
   // Создаем соединение
   Connection = Новый COMОбъект("ADODB.Connection");
   Connection.Open(ActiveConnection);
   Command = Новый COMОбъект("ADODB.Command");
   Command.ActiveConnection = Connection;
   Command.CommandType = 1;
   
   СоздатьТаблицуИКоманд(Тз,Connection,Command);
   
   Connection = Новый COMОбъект("ADODB.Connection");
   Connection.Open(СтрокаПодключения);
   Command.ActiveConnection = Connection;
   Command.CommandType = 1;
   
   Параметры= Command.Parameters;    
   ТекстВопросов=" VALUES(";
   ТекстКоманды= "INSERT INTO [Лист1](";
   Для каждого парам из Параметры Цикл
       ТекстКоманды=ТекстКоманды+парам.Name+",";
       ТекстВопросов=ТекстВопросов+"?,"
   КонецЦикла;    
   ТекстКоманды=Лев(ТекстКоманды,стрДлина(ТекстКоманды)-1)+") "+Лев(ТекстВопросов,стрДлина(ТекстВопросов)-1)+")";
   Сообщить(ТекстКоманды);
   Command.CommandText=ТекстКоманды;
   
   //    Command.CommandText="INSERT INTO [Лист1$](Марка,Номер,Количество,Цена,Название)  VALUES('Марка','Номер',1,2.2,'Название')";
   //    Command.Execute();
   //возврат;
   
   Command.prepared=истина;
   
   
   //Command.CommandText=ТекстКоманды;
   Для каждого Выборка из Тз Цикл
       Для каждого парам из Параметры Цикл
           Значение=Выборка[Парам.Name];
           Если Парам.Type=203 Тогда
               Парам.Size=СтрДлина(Значение)+1;
           КонецЕсли;    
           Парам.Value=Значение;
           
       КонецЦикла;    
       
       
       Command.Execute();
   КонецЦикла;
   //
   // Закрываем соединение
   Command = Неопределено;
   Connection.Close();
   Connection = Неопределено;
   
КонецПроцедуры
5 Serginio1
 
04.07.13
10:31
Процедура СоздатьПараметрыИТекст(СтрКолонки,Стр,Cmd)
   Имя=СтрКолонки.Имя;
   ТипЗначения=СтрКолонки.ТипЗначения;
   Если ТипЗначения.СодержитТип(Тип("Строка")) Тогда
       //  Стр=Стр+Имя+" char(255),";
       // Стр=Стр+Имя+" char(255),";
       Стр=Стр+Имя+" NTEXT,";
       Cmd.Parameters.Append(Cmd.CreateParameter(Имя,203,1,255,"1"));
       //  Cmd.Parameters.Append(Cmd.CreateParameter(Имя,203,1,1,""));
   ИначеЕсли ТипЗначения.СодержитТип(Тип("Число")) Тогда
       КвалификаторыЧисла=Типзначения.КвалификаторыЧисла;
       Разрядность=КвалификаторыЧисла.Разрядность;
       РазрядностьДробнойЧасти=КвалификаторыЧисла.РазрядностьДробнойЧасти;
       Стр=Стр+Имя+" Numeric("+Разрядность+","+РазрядностьДробнойЧасти+"),";
       // Парам=Cmd.CreateParameter(Имя,131,1,Разрядность,);
       Парам=Cmd.CreateParameter(Имя,6,1,Разрядность,);
       Парам.NumericScale = РазрядностьДробнойЧасти;
       Парам.Precision = Разрядность-РазрядностьДробнойЧасти-?(РазрядностьДробнойЧасти=0,0,1);
       
       Cmd.Parameters.Append(Парам);
   ИначеЕсли ТипЗначения.СодержитТип(Тип("Дата")) Тогда    
       Стр=Стр+Имя+" DateTime,";
       Cmd.Parameters.Append(Cmd.CreateParameter(Имя,135,1));
   ИначеЕсли ТипЗначения.СодержитТип(Тип("Булево")) Тогда    
       Стр=Стр+Имя+" BOOLEAN,";
       Cmd.Parameters.Append(Cmd.CreateParameter(Имя,11,1));
       
       
   КонецЕсли;    
   
   
КонецПроцедуры

Процедура СоздатьТаблицуИКоманд(Тз,Соединение,Команд)
   Стр="Create TABLE  Лист1 (";
   
   Колонки=Тз.Колонки;
   Для каждого СтрКолонки из колонки Цикл
       СоздатьПараметрыИТекст(СтрКолонки,Стр,Команд)
   КонецЦикла;    
   
   Стр=Лев(Стр,СтрДлина(Стр)-1)+")";
   Сообщить(Стр);
   Соединение.Execute(Стр);    
КонецПроцедуры
6 Ёпрст
 
04.07.13
10:34
(4,5) круто конечно, но ТС нужен всего лишь update ячеек сделать, можно и через UpdateBatch было сделать.
7 Serginio1
 
04.07.13
10:39
(6) Прошу прощения не вчитался. Импульсивное движение.
8 pavlo
 
04.07.13
20:07
(3) внизу цикла есть, просто улетело при вставке, я же говорю работает на ура, если числа писать в эти поля.
9 George Wheels
 
04.07.13
20:48
СокрЛП(Строка(рКодК)).
Excell при преобразовании числа в строку добавляет пробел.
10 George Wheels
 
04.07.13
20:50
(9) Не дочитал. Не о том это.
11 George Wheels
 
04.07.13
20:54
Кстати, если проблема записать в .Value, пиши в .FormulaLocal
12 Ёпрст
 
05.07.13
09:04
(8) через UpdateBatch  не пробовал?
13 pavlo
 
05.07.13
12:26
(8) давно и не взлетело вообще
14 pavlo
 
05.07.13
12:26
(11) а ты не путаешь? там такого метода нет говорит
15 Serginio1
 
05.07.13
12:41
А Edit в начале не нужно вызывать?
16 Jaap Vduul
 
05.07.13
12:45
(15)С DAO, видмо, попутал.
(0)Огласите полный текст сообщения об ошибке, пожалуйста.
17 Serginio1
 
05.07.13
12:54
(16) да а РС.Update(ИмяКолонки,Значение) не проходит?
18 pavlo
 
05.07.13
19:27
(16) err: РС.Fields(14).Value=Строка(рКодК);
: Provider: Несовпадение типов.
(17) а разве есть параметры у этого метода? :)
19 pavlo
 
05.07.13
19:31
(12) да и там по сути падает до update().
(15) нет
20 Serginio1
 
05.07.13
21:46
18   ну  судя по этому  http://www.script-coding.com/ADO.html
Update(Fields, Values)    Сохраняет любые изменения текущей записи объекта Recordset. Параметры (все параметры необязательные):
Fields - имя поля или массив имён полей, в которых следует сохранить изменения.
Values - значение поля или массив значений полей.
Если курсор перемещён с добавленной или изменённой записи, метод вызывается автоматически.