Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

UPDATE листа Excel через ADODB

UPDATE листа Excel через ADODB
Я
   i_rodionov
 
11.09.16 - 18:58
Подскажите, после запроса UPDATE с предложением WHERE, можно ли узнать, изменилось ли что нибудь на листе Эксель (в случае, если ни одна строка не совпала с ключом, то ничего не должно проапдейтиться)?
 
 
   Torquader
 
2 - 11.09.16 - 19:20
Если Execute что-то возвращает, то там должно быть количество изменённых строк. Если не получается, то кто мешает просто сначала сделать SELECT.
   i_rodionov
 
3 - 11.09.16 - 19:24
(2) В отладчике не нашел свойства, где есть количество измененных строк. SELECT с последующим сравнением не хотел делать. Это прайс с 15000 строк
   i_rodionov
 
4 - 11.09.16 - 19:30
Задача состоит в том, что поставщик дает файл Эксель со своим прайсом. Мой заказчик делает Заказы этому поставщику. Поставщик требует, чтобы файл был неизмененным, а напротив штрихкодов было заказываемое количество товара. Я хочу выгрузить из 1С эти количества, потому что в 1С все товары штрихкодированы.
Проблемы две: 1) в Экселе штрихкоды в общем формате, запросы ADO их плохо понимают 2) найти, что не было записано в файл, чтобы манагеры разобрались в ручную
   i_rodionov
 
5 - 11.09.16 - 19:32
Херовый, но надежный способ, сделать RecordSet и читать оттуда штрихкоды, потом, при совпадении, записывать количества. Но будет работать дофига времени
   Torquader
 
6 - 11.09.16 - 19:49
Если в Excel штрих-коды записаны числом, то наружу Excel возвращает его как Double со всеми вытекающими округлениями.
   i_rodionov
 
7 - 11.09.16 - 19:54
(6) Советуешь SELECT с номерами строк экселя, а потом апдейтить мою колонку количества WHERE номер строки?
   i_rodionov
 
8 - 11.09.16 - 19:55
(6) они записаны общим форматом
   i_rodionov
 
9 - 11.09.16 - 19:58
(6) CStr(F"+Строка(НомерКолонкиШтрихКод)+") Возвращает штрихкод всегда строкой
   Кащей Бессмертный
 
10 - 11.09.16 - 20:16
(8) Они должны быть записаны текстом, хотя, точность Double у нас 17 символов, а количество цифр в штрих-коде - всего-то 13.
Поэтому, даже Double сожрёт нормально.

Просто, если кто-то боится, что что-то не так записалось, то он сначала пишет, а потом читает и проверяет, а не фигня ли получилась.

Кстати, 15000 строк прекрасно перелазят в двумерный массив SafeArray, конечно, если Excel на компьютере есть.

(9) Явно здесь "самое главное" оставили "на закуску".
 
 Рекламное место пустует
   i_rodionov
 
11 - 11.09.16 - 20:18
(10) Экселя нет. Есть редистрибютабл драйвер от майкрософт. Могу только им пользоваться, поэтому ADO
   Кащей Бессмертный
 
12 - 11.09.16 - 20:22
(11) Можно, конечно, попробовать Open Office и его макросы - там просто гарантия будет, что всё проверено.
В процессе выборки, Jet-driver определяет тип значения в столбце анализируя только первые 8 строк.
   i_rodionov
 
13 - 11.09.16 - 20:22
У меня осталась только одна идея, но она херовая.
1. SELECT штрихкодов Cstr() и номеров строк Экселя в ТаблицаЗначений
2. Запрос в 1С по табл части Заказа поставщику JOIN Штрихкоды
3. Перебор запроса по штрихкоду и НайтиСтроки в таблице п.1
4. Апдейт WHERE номер строки
   Кащей Бессмертный
 
14 - 11.09.16 - 20:24
(13) Там можно не только номер строки, но и явно ячейку указывать, которая обновляется - только тогда для каждой записи у вас будет отдельный Update, а это будет не быстро.
   i_rodionov
 
15 - 11.09.16 - 20:25
(14) Вот потому и хотел обойтись без номера строки,а по ключу, как значение в колонке эксель
   Кащей Бессмертный
 
16 - 11.09.16 - 20:28
(15) Просто, если кто-то разместит два одинаковых штрих-кода в разных строках - результат будет не очень - а номер строки - он всегда один.
   i_rodionov
 
17 - 11.09.16 - 20:29
Есть еще более глупая идея. RecordSet, перебор до EOF. Апдейтить те Value в нужной колонке, где ключ найдется в предварительной выборке запросом по таб части Заказа поставщику INNER JOIN Штрихкоды. Тогда я не вижу, что нашло, что нет
   i_rodionov
 
18 - 11.09.16 - 20:29
(16) я могу сгруппировать по штрихкоду, это не проблема
   Кащей Бессмертный
 
19 - 11.09.16 - 20:31
В программировании всегда есть место творчеству - поэтому - попробуй различные варианты и сравни их по скорости, тот, который окажется быстрее - и выбери.
Хотя, может быть, тебе какая реализация просто больше понравится.
   NorthWind
 
20 - 11.09.16 - 20:32
(3) в метод Execute передается указатель на переменную RecordsAffected, в которую и записывается, сколько строк было изменено.
https://msdn.microsoft.com/en-us/library/ms675023(v=vs.85).aspx
   NorthWind
 
21 - 11.09.16 - 20:34
не знаю насчет Excel, но с MDB работало точно, пробовал
   i_rodionov
 
22 - 11.09.16 - 20:35
(20) O! спасибо, буду зондировать эту хреновину!
   Кащей Бессмертный
 
23 - 11.09.16 - 20:35
(20) Просто, современные языки программирования не умеют что-то передавать по указателю - что 1С, что JavaScript не разрешают изменять переменные - а всё ADO для Visual Basic писалось, где это не является запретным.
   i_rodionov
 
24 - 11.09.16 - 20:36
(19) Мне нравится реализация просто апдейт по ключу, с возвращением, обновилось или нет. Но не знаю, как сделать
   NorthWind
 
25 - 11.09.16 - 20:37
(23) по указателю это я некошерно сказал, правильнее "по ссылке". 1С это умеет, все должно получиться
   Кащей Бессмертный
 
26 - 11.09.16 - 20:40
(25) Ну, или, если не умеет, то прослойка на VbScript всегда это сможет.
   i_rodionov
 
27 - 11.09.16 - 20:42
(26) В большенстве случаев в 1С можно создать указатель в контексте COM объекта
   i_rodionov
 
28 - 11.09.16 - 20:43
+(26) NewObject
   Кащей Бессмертный
 
29 - 11.09.16 - 20:46
(28) Перед вами безграничные возможности по испытанию системы работы 1С с COM-объектами.
   i_rodionov
 
30 - 11.09.16 - 20:49
(29) Уже безгранично испытывал :)) И не только КОМ )
   Кащей Бессмертный
 
31 - 11.09.16 - 20:52
(30) Тогда ты можешь сказать, что познал DAO.
   i_rodionov
 
32 - 11.09.16 - 20:52
(31) И дзен!
   Кащей Бессмертный
 
33 - 11.09.16 - 20:53
(32) А вопросы всё равно остались - обидно - да ?
 
 
   i_rodionov
 
34 - 11.09.16 - 20:58
(33) Мы не ищем легких путей. Реализую один из херовых способов, вот и все


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует