К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Запись через ADO в Excel

0 - 03.07.2013 - 14:06
Народ, помогите кто знает.
Суть в том, что все работает если рКод числовой, а вот если нет, пишет о несовпадении типов, что не пытался делать, не хочет менять тип. Если зайти в этот ексель, тип там текстовый :(
РС.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 - 03.07.2013 - 14:34
РС.Cells(НомСтр, 14).NumberFormat="@";
2 - 03.07.2013 - 14:39
Поле агрегатного объекта Cells не обнаружено
Гость
3 - 03.07.2013 - 14:43
РС.Fields(14).NumberFormat="@";
РС.Fields(14).Value=Строка(рКодК);
4 - 03.07.2013 - 14:45
Поле агрегатного объекта не обнаружено (NumberFormat)
Гость
5 - 03.07.2013 - 15:00
А если так:
Код:
РС.Fields(14).Value="'" + (Строка(рКодК);
Гость
6 - 03.07.2013 - 15:02
Попытка
Эксель = СоздатьОбъект("Excel.Application.12"); // 12 - 2007-й офис
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
Возврат;
КонецПопытки;

Книга = Эксель.WorkBooks.Open(ИмяШаблона);
Лист = Книга.WorkSheets(1);

Пока ТЗ.ПолучитьСтроку() = 1 Цикл
НомСтр=НомСтр+1;

Лист.Cells(НомСтр, 1).Value=ТЗ.ВидДохРасх;
Лист.Cells(НомСтр, 2).Value=формат(ТЗ.Выписка.ДатаДок, "Д ДДММГГГГ");
Лист.Cells(НомСтр, 3).Value=ТЗ.Выписка.НомерДок;
Лист.Cells(НомСтр, 4).Value=СОКРЛП(ТЗ.НазначениеПлатежа);
Лист.Cells(НомСтр, 5).Value=СОКРЛП(ТЗ.Контрагент.ПолнНаименование);
Лист.Cells(НомСтр, 6).NumberFormat="@";
Лист.Cells(НомСтр, 6).Value=ВыделитьИНН(ТЗ.Контрагент.ИНН);
Лист.Cells(НомСтр, 7).Value=ТЗ.НомерПП;
Лист.Cells(НомСтр, 8).Value=ТЗ.ДатаПП;
Лист.Cells(НомСтр, 9).Value=формат(ТЗ.Сумма, "Ч15.2,");
КонецЦикла;

Попытка
Книга.SaveAs(ФормИмяФайлаДанных);
Эксель.DisplayAlerts=1;
Сообщить("Файл "+ФормИмяФайлаДанных+" успешно сохранён");
Исключение
Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
Возврат;
КонецПопытки;
Эксель.Quit();
Эксель=0;
Книга = "";
Лист = "";
7 - 03.07.2013 - 16:45
(6) Мне по ОЛЕ ексель запускать не нужно, там сотни файлов обрабатывать, потому и ADO, все было быстро, пока не понадобилось вместо цифры, строку записывать.
8 - 03.07.2013 - 16:45
(5) да разный текст я пробовал толку нет.
Гость
9 - 03.07.2013 - 19:36
любят наши люди иметь системный геморой
но знаний по его приготовлению явно маловато
Гость
10 - 03.07.2013 - 19:42
например, открывать эксель можно один раз, а потом манипулировать файлами не закрывая его

нужные действия, часто повторяемые, можно загружать один раз как макрокоманды и потом вызывать их из 1це. Они работают гораздо быстрее, чем по оле. и делать макросы проще - надо просто понимать и знать эксель
Гость
11 - 04.07.2013 - 02:58
Helen1986 - я тоже против геморроя. Все что из 1С - должно выходить как есть - со всеми запахами, тормозами и тп - штатными методами. А потом запускаетcя Excel - и вот он уже кромсает печатную форму - как надо. При этом ничего не транслируется - все пишется на VBA - самом офисном языке программирования.
12 - 04.07.2013 - 05:27
(9) прежде чем делать философские заключения, пробовать нужно работой, а не про чьи то знания говорить.
У вас их как раз малова-то видимо, никак вы не сможете манипулировать данными по ОЛЕ или использовать ваши макрокоманды не получится впринципе:
Эти файлы нужно потом собирать быстро, архивировать и отправлять по почте автоматом и так 100 клиентам за раз, а во первых не у всех есть ексель, не у всех нужно версии и т.д., также если вы удосужитесь сделать тесты, ADO будет во много раз быстрее ваших заключений и в итоге кто из нас любит гемороем страдать и покупать на каждую машину ексель?
13 - 04.07.2013 - 05:30
(11) Народ, предлагать убогие варианты, а точнее просто делать выводы вас никто не просит здесь, я пришел с конкретным вопросом к знающим людям, а не любителям придти и все обгадить. Мой вариант работает за секунды, пока коды на текстовые не сменились и я в отличии от вас перед выбором этого варианта пробовал и убогий по скорости VBA и запуск екселя, и не только в скорости проблема, но и то, что людям в другом екселе тоже работать нужно в это время, пока вы будете минутами своими скриптами 100 екселей по сути обрабатывать. Да и не у всех есть купленный ексель.
Гость
14 - 04.07.2013 - 08:03
А если так:

Код:
РС.Fields(14).Value=" " + (Строка(рКодК);
Гость
15 - 04.07.2013 - 09:50
(12) жги дальше, суши лужу

если ты не знаешь VBA - молчал бы в тряпочку насчет его тормознутости. Быстрее и 7 и 8 версии 1це - это точно.

(12) "а во первых не у всех есть ексель, не у всех нужно версии и т.д."

нет экселя? нет опен офиса? а как же бухи работают? им все равно для всяких разовых расчетов чтото нужно

не у всех нужной версии? По этой фразе видно, что ты лох в экселях (судя по (2) - откровенный), и ничего не знаешь про всеми понимаемый "транспортный" формат файла экселя. Этот "транспортный" формат решает 100% проблем.

с АДО проблем тоже хватает. И их побольше, чем с ОЛЕ.

формирование индивидуального прайса для покупателей (с индивидуальными скидками и выбранными группами товаров) у нас работает через ОЛЕ и работает быстро. Ежедневная рассылка (регламентная в ночное время) - от 2-3 до 5-7 тыс писем разлетается. Рассылка для каждого клиента с выбранной им периодичностью - каждый день, раз в заданное количество дней, по выбранным дням недели, по приходам и т.д. Вариантов куча
Гость
16 - 04.07.2013 - 10:41
pavlo1c - ADO будет быстрее работать с рекордсетами на тысячи и более строк. Если идет речь о, ну скажем, о генерации 30-ти прайсах на 300 позиций - разницы между способами почти не будет.

А способов, действительно, много (в скобках - мя оценка скорости в км/ч):

- Передача данных по одной ячейке (5)
- Передача массива данных в диапазон ячеек (10)
- Передача набора записей ADO в диапазон ячеек с - помощью способа CopyFromRecordset (90)
- Создание в листе Excel объекта QueryTable содержащего результаты запроса ODBC или OLEDB (50)
- Передача данных в буфер обмена с последующей вставкой содержимого буфера обмена в лист Excel (10)
- Передача данных через в файл CSV/TSV (парсинг таких файлов в Excel реализован очень быстрый) (60)
- Передача данных на лист Excel с помощью ADO (80)
- Передача данных в Excel с помощью DDE (40)
- Если 1С7 и файловая - то транзит с помощью компоненты sqlite1c - и через SQLITEODBC в Excel, через создание view или запросом (100)

Для больших наборов записей - последний способ втащить данные является самым быстрым.

И кстати, яд сдавать не пробовали? Добрее нужно быть к людям, добрее. Ни один из нас в одиночку не может комплексно охватить все. Плюрализм мнений не стоит выдавать за "обгаживание" - ни на кого здесь это все равно не подействует.
Гость
17 - 04.07.2013 - 12:15
(16) если втащить в эксель надо много - пишем ДБФ (1це пишет очень быстро), открываем эксель по ОЛЕ и командой через ОЛЕ вставляем ДБФ в эксель
работает очень быстро
Гость
18 - 04.07.2013 - 12:16
мелочи типа как задать первую строку (если хотим заголовки) и т.д. - смотреть help VBA
Гость
19 - 04.07.2013 - 13:05
Helen1986 - я тестировал этот вариант, да быстро. Но были найдены минусы:
- На ряде XP-машин были проблемы с "олей".
- Сам Excel с большим DBF ворочается медленнее
- Не всегда корректно отображаются дата-время
- В Excel 2007-2010 нет сохранения в DBF (старый - умел), значит надо пересохраняться и бороться с исходниками.

В итоге оказалось быстрее парсить текстовый файл (это TSV-файл, разделитель - табуляция, его 1С сохраняет даже чуть быстрее, чем DBF).
Гость
20 - 04.07.2013 - 13:33
(19) версия 77 - проблемы с олей, если каталог программы просто переписан, т.е. не было нормальной инсталяции

по поводу больших дбф - в данной задаче это некритично. десяток тысяч строк

через текстовый файл с разделителями - тоже быстро, только при выгрузке в текст надо проверять, чтобы в тексте не было табуляции. Иначе лажа будет при загрузке
проблема с табуляцией возникает, когда оператор пользуется ^c ^v
Гость
21 - 04.07.2013 - 13:49
Helen1986 - внутри поля встретить символ табуляции почти нереально. Из-за того, что во всех программах - это все таки переход по элементам диалогов. "табы" могут просочиться при импорте из-других систем или копипасте из Word/Writer, т.к. там этот символ используется часто.

Вот что действительно часто случается - это символ переноса строки и конца абзаца. В целях избежания казусов - 1с-овские данные стоит очищать от всех непечатаемых выражений,, тьфу, символов. В VBA есть для этого мощнейший метод Clean.
Гость
22 - 04.07.2013 - 13:55
да, символы просачиваются именно при копи/пасте
лучше всего удалять их ПриЗаписи - иначе 1це начинает в некоторых местах чудить

несмотря на это, я все равно при сборке строки в текстовый файл проверяю реквизиты на недопустимые символы - фиг его знает, куда юзер начнет заталкивать это файло. А вдруг он решит, что это товар из секс-шопа?
23 - 04.07.2013 - 19:11
(16) меня переубеждать не имеет смысла, все замерено и проверено, реально в 10 раз быстрее ADO.
я уже не говорю о факте не купли екселя на некоторых машинах менеджеров, а также проблемы его зависания в памяти и потом после каждого одного отосланного все стопорится и крики менеджеров. Проверено временем и кучей проблем ;)
24 - 04.07.2013 - 19:13
(15) Ваши знания по мату видны на лицо.
Гость
25 - 04.07.2013 - 22:41
pavlo1c - если переубеждать бесполезно - тогда я сливаюсь... Не моя это война. Уверен, что люди, прочтя сию ветку найдут для себя много полезного, так что в целом - все хорошо!

Кстати - вы отличаетесь от большинства форумчан тем, что очень часто упоминаете отзывы пользователей, так сказать элемент обратной связи. Лично я это очень приветствую. Большинство айтишников слушать и слышать стоны офисного планктона не умеют принципиально. Шумодав detected...
Гость
26 - 05.07.2013 - 09:00
(25) а чего со школотой спорить? если она учиться не желает


К списку вопросов






Copyright ©, Все права защищены