|
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 - значение поля или массив значений полей. Если курсор перемещён с добавленной или изменённой записи, метод вызывается автоматически. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |