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) а чего со школотой спорить? если она учиться не желает | |
| Интернет-форум Краснодарского края и Краснодара |