Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
VBA. подскажите алгоритм: необходимо вернуть в основную таблицу закодированный результат из второй таблицы
 
Доброго дня!

Есть 2 таблички, обновляются подключением.
1 табличка основная, содержит уникальный id и информацию по клиенту.
2 табличка содержит информацию по товарам в заказах. Причем каждый товар заказа лежит в отдельной строке.
формата:
заказ1 яблоко 6
заказ1 груша 2
заказ2 апельсин 9
заказ2 яблоко 5
заказ2 груша 4
итд

макрос vba раскидывает заказы по реестрам по определенным условиям, заполняет данными клиента.

Нужен алгоритм, который закодирует инфо по товарам в текстовую строку вида " яблоко6 груша2", которую можно будет пихнуть в реестр.
Планируется использовать сокращения названий, чтоб строка не была длинной. В принципе, легко решается через справочник и впр.
На выходе ожидается:
заказ1 "Я6 Г2"
заказ2 "А9 Я5 Г4"
И все используемые переменные суммируются в итог " Я11 Г6 А9" всего 26

Пробовал гонять циклами посчитать количества, получается очень долго (больше полминуты  :D ). обрабатывается 300-400 заказов и товаров под 1000 строк.
Тут бы что то типа SQL обращения к таблице с товарами чтоб получать массив конкретного заказа, и его уже обрабатывать.
Но, к сожалению, ни с масcивами ни с SQL в vba работать не умею, пришел к вам на поклон.
Может есть и более интересные или простые решения, буду рад любым идеям!

Приложу файлик с табличками
 
Zabubu, название темы ни о чём. Предложите новое - модераторы поменяют.
 
Так может целиком в название все что есть в описании темы?
"VBA. подскажите алгоритм, необходимо вернуть в основную таблицу закодированный результат из второй таблицы"
Не знаю как коротко сформулировать не объясняя всю задачу
Изменено: Zabubu - 21 Сен 2018 00:28:06
 
Zabubu, Понятно что вы хотите получить, но не понятно из чего и куда это положить. Вот это
Цитата
Zabubu написал:
обрабатывается 300-400 заказов и товаров под 1000 строк.
для обработки - семечки и надо сильно постараться, чтоб перебор , пусть даже в 400к цикле занял минуту.
Изменено: БМВ - 21 Сен 2018 10:12:43
 
Цитата
БМВ написал:
надо сильно постараться
Не так уж и сильно. Недавно делал обработку данных с 50 тыс. строк, так более 10 мин. крутилось. Тогда сначала загнал всё с листа в массив, сделал все проходы/сортировки/поиски уже в массиве и готовый массив вернул на лист - около пяти секунд.
Не стреляйте в тапера - он играет как может.
 
Не хотел бы я попасть к вам в список. А вообще, да, непонятно чего куда надо.
Никаких врагов, зато и никаких друзей.
 
Off
Ts.Soft, Убрал "сильно" :-)  
Цитата
Ts.Soft написал:
Недавно делал обработку данных с 50 тыс. строк, так более 10 мин. крутилось
а не сохранилось ли того кода? Просто взглянуть.
 
Цитата
БМВ написал:
Понятно что вы хотите получить, но не понятно из чего и куда это положить. Вот это
таблиза заказы. второй заказ - строка
666403523.04.2018   22:11адрес2имя2Почта РоссииRU
по ID во второй таблице имеем:
666403522665шарниры3шн
666403522674пружины1пр
нужно вот это как то переварить и вернуть
"Шарниры3 пружины1"

куда? для начала пусть обратно в заказы(в идеале в формируемый реестр)
666403523.04.2018   22:11адрес2имя2Почта РоссииRU"Шарниры3   пружины1"
главное получить этот String,  дальше уже дело техники его в нужном месте цикла формирования реестра разместить
Изменено: Zabubu - 21 Сен 2018 16:06:51
 
Zabubu, ну как минимум можно еще на этапе запроса сдойнить , да и сокращения сразу прописать, но раз нет то
Вот так подойдет? Только это не VBA. Пардон на эту неделю у меня лимит макросов исчерпан.
Единственно отсортировать товар по ID заказа надо я или не обратил внимание и сразу сортирнул или
Ан нет
SELECT vtiger_inventoryproductrel_0.id AS 'id заказа', vtiger_inventoryproductrel_0.productid AS 'id оффера', vtiger_products_0.productname
….
ORDER BY vtiger_inventoryproductrel_0.productid asc
нужно
ORDER BY [COLOR=#00A650]vtiger_inventoryproductrel_0.id asc

P.S. "яд в подарок" - это и правда шедевр, помню было ЧП на прошлой работе, гранатомет в посылке пришел.
Изменено: БМВ - 21 Сен 2018 16:36:49
 
Цитата
БМВ написал:
Вот так подойдет?
тогда придется как то найти последнюю запись в отсортированных товарах, чтоб вернуть ее в первую таблиц заказов
760252478324оксиды2окок2
760252422670наждачка9нок2 н9
760252422684масло2мсок2   н9 мс2
760252423275яд2яок2 н9 мс2 я2
760252423276яд в подарок4япок2   н9 мс2 я2 яп4
 
Так все сделано ж

Подумал. Можно и без сортировки. Немного посложнее будет.. вечером накалякаю.
Изменено: БМВ - 21 Сен 2018 17:14:44
 
Спасибо! дальше буду развивать
 
Без требований к сортировке - _1
Без требований к сортировке и  всего две формулы  - _2
Изменено: БМВ - 22 Сен 2018 18:29:15
 
Цитата
БМВ написал:
всего две формулы
Класс!!

тут вот еще мысль какая родилась, на примере " яд в подарок":

По факту товар один и тот же что "яд" что "яд в подарок". Если сокращение будет одно и тоже для обоих названий, допустим "я", можно чтоб они считались вместе?
не "я6 я2" а сразу "я8" ?
 
только пришлось вернуть доп. столбец один.
Да и выше ошибка было, Заменил файлы.
Изменено: БМВ - 22 Сен 2018 19:06:25
 
БМВ, так и не уловил в чём соль создания столбца Column1 на листе "Заказы"?
 
Андрей VG,  Андрей, приветствую. Фактически это перевод длинного названия в короткое. Если одному длинному соответствует несколько длинных, как в истории с ядом, то с доп. столбцом в разы проще и искать дубли  и считать итоговую сумму. , хотя я уже придумал как это обойти, но не монстроподобно будет, но массивно и разве что для показательного выступления годится.  

Хотя вот пока писал, подумал, что можно попробовать в текстовой строке заменить. Ща сФормулируем :-)
Изменено: БМВ - 22 Сен 2018 19:13:23
 
Михаил, спасибо за пояснение, надеюсь то что забубенил на Power Query (чем не SQL?) то, что нужно :)
 
Ну и я сформулировал :-)
=IF(IFERROR(--LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(IFERROR(LOOKUP(2;1/($A$1:A1=[@[id заказа]]);$E$1:E1);"");" " &VLOOKUP([@[название оффера]];сп[#All];2;0);" "&VLOOKUP([@[название оффера]];сп[#All];2;0)&REPT(" ";99));99;256));" ";REPT(" ";99));99););
SUBSTITUTE(IFERROR(LOOKUP(2;1/($A$1:A1=[@[id заказа]]);$E$1:E1);"");VLOOKUP([@[название оффера]];сп[#All];2;0)&--LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(IFERROR(LOOKUP(2;1/($A$1:A1=[@[id заказа]]);$E$1:E1);"");" " &VLOOKUP([@[название оффера]];сп[#All];2;0);" "&VLOOKUP([@[название оффера]];сп[#All];2;0)&REPT(" ";99));99;256));" ";REPT(" ";99));99);
VLOOKUP([@[название оффера]];сп[#All];2;0)&[@количество]+LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(IFERROR(LOOKUP(2;1/($A$1:A1=[@[id заказа]]);$E$1:E1);"");" " &VLOOKUP([@[название оффера]];сп[#All];2;0);" "&VLOOKUP([@[название оффера]];сп[#All];2;0)&REPT(" ";99));99;256));" ";REPT(" ";99));99));IFERROR(LOOKUP(2;1/($A$1:A1=[@[id заказа]]);$E$1:E1);"")&" " &VLOOKUP([@[название оффера]];сп[#All];2;0)&[@количество]
)
 
Цитата
БМВ написал:
Ну и я сформулировал :-)
Супер!!! Быстро без мороки, формулой. И если я правильно понял формулу, в начало можно добавить еще один IFERROR, на случай когда в системе появится новый товар, которого небыло в справочнике сокращений и начнет отдавать Н/Д. типа "Обновите справочник" :)  гулять так по полной :D
Цитата
Андрей VG написал:
то, что нужно
Очень интересно, первый раз такое решение в руки попалось. и сразу вопрос:
можно ли (точнее как) итоговое количество в отдельный столбец?

Если с вариантом уважаемого Михаила это просто сделать, разделив формулу
=ПРОСМОТР(2;1/([@[id заказа]]=тв[id заказа]);тв[Column2]) & " всего " & СУММЕСЛИ(тв[id заказа];[@[id заказа]];тв[количество])

на
=ПРОСМОТР(2;1/([@[id заказа]]=тв[id заказа]);тв[Column2])
и
=СУММЕСЛИ(тв[id заказа];[@[id заказа]];тв[количество])
по столбцам. То с вашим вариантом мне это сделать сложновато. Понимаю что вот это оно Text.From(List.Sum(result[count])) но синтаксисом не владею)

Предвидя будущие перспективы, сразу думаю как считать общее количество единиц не только по заказу, но и по итоговому реестру в целом.
 
Цитата
Zabubu написал:
можно ли
Можно, чуть переделав запрос ;)
 
Ребят, спасибо огромное!! Это то что нужно
 
Zabubu, На сомом деле, меня интересует, как по скорости будет работать формульный вариант. За PQ не волнуюсь., а вот за формулы немного переживаю, хотя и удалось не делать многочисленны поисков, но коротенько не вышло.
Если попрятать повторяющиеся части формулы в имена, то будет кратенько и возможно более понятно и читаемо.
 
Я в ближайшие дни повешу на реальные выгрузки, и для эксперимента попробую выгрузить не за один день а за месяц))  100 000 заказов покажут разницу между формулой и PQ
 
эээээ
Цитата
Zabubu написал:
100 000 заказов покажут разницу между формулой и PQ
и
Цитата
Zabubu написал:
300-400 заказов и товаров под 1000 строк
Мне показалось или разница примерно в 99600 заказов, и у каждого от одного до N продуктов.
 
Цитата
БМВ написал:
эээээ
Я ж говорю, для эксперимента. Я цифру большую от балды написал, могу выгрузить больше .
Страницы: 1
Читают тему (гостей: 1)
Наверх