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