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

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

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

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