Страницы: 1
RSS
Проблема с добавлением в Dictionary, помогите найти ошибку и советом :)
 
Коллеги, наверное, это ночь с пятницы на субботу, но никак не могу отловить ошибку.
Есть лист с выгрузкой из базы. На листе 4 столбца: товар, дата, показатель, значение показателя.
сочетание "товар, дата, показатель" - уникальное. В исходной таблице строк over9000. Количество показателей может варьироваться (2,3,4)

Проблема в том, что мне нужно дополнить этот список значениями = 0 для тех дат из заданного периода, которые в списке отсутствуют.
Т.е., в таблице, к примеру, есть самая ранняя строка товар1 - 09.01.14 - кол-во - 8, но строк за период с 01.01.14 по 08.01.14 нет - их нужно добавить. Или есть данные за 10-е и 15-е, но за 11, 12, 13 и 14-е - отсутствуют.

При написании макроса ушел в какие-то жуткие дебри, и он мне почему-то выдает больше строк, чем должно быть - строки дублируются
Памагите, голову сломал, что не так (проблема видна в окне отладки)
Может быть, есть более простой и очевидный способ, который я в упор не вижу?
код тут
F1 творит чудеса
 
проблемка с типом дата у Вас
быстрое лекарство - привёл всё к одному типу:
Код
                If Not .exists(G_List(i) & "|" & CLng(Periods(t)) & "|" & F_List(f)) Then
                    .Item(G_List(i) & "|" & CLng(Periods(t)) & "|" & F_List(f)) = 0

а вообще Вам нужно разобраться - чем заполнять массив Periods
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Скрытый текст
Изменено: RAN - 26.07.2014 09:01:42
 
Код
If .exists(arr1(j, 1) & "|" & arr1(j, 2)) Then
           arr1(j, 4) = .Item(arr1(j, 1) & "|" & arr1(j, 2))(1)   '???
           arr1(j + 1, 4) = .Item(arr1(j, 1) & "|" & arr1(j, 2))(2)   '???
насколько понимаю - if .exist (2 ключа) then
- только, ребята подскажите please КАК набрать с клавиатуры этот символ "I" - (разделитель 2х ключей) - это просто англ буква L в кавычках?  :/  

и ЧТО означают цифры в скобках? ... не даёт мне тема словарей спокойно жить - пока не смогу прочитать код ...
всё что понимаю - (если правильно) - arr1(j, 4) = .Item(arr1(j, 1) & "|" & arr1(j, 2)) -  само понятие ЗНАЧЕНИЕ(КЛЮЧ и КЛЮЧ)... а цифра (1) в конце - загадка
Изменено: JeyCi - 26.07.2014 09:52:23
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
символ  "|" (именно вертикальная черточка, а не буква l ) есть разделитель так как в повседневной жизни Вы его не встретите.
Вы, конечно, можете использовать другой символ как разделитель при условии что он не попадаеться в массиве который обрабатывается
 
JeyCi, не правильно  :)
arr1(j, 1) & "|" & arr1(j, 2) - это ключ
Item(arr1(j, 1) & "|" & arr1(j, 2)) - это значение (массив из двух элементов), но не подумайте, что этих arr1(j, 1) & "|" & arr1(j, 2). Просто совпало, что и ключь, и значение содержат по 2 элемента.
Item(arr1(j, 1) & "|" & arr1(j, 2))(1) - первый элемент массива, (2) - второй.
 
В данном случае даже если и попадётся - не страшно, делить ведь по нему не будете.
Главное чтоб таких символов не было всюду много на стыке этих ключей - т.к. разделитель всего лишь нужен как предосторожность на случай сравнения таких пар как
123 456
и
12 3456
 
Цитата
Vitallic пишет: символ"|" (именно вертикальная черточка, а не буква l ) .. так как в повседневной жизни Вы его не встретите.
ой ребята, озадачили... всем Доброе утро... сейчас пойду понимать всё, что вы написали... только меня всё этот один вопрос давно смущает - ГДЕ эту чёрточку (разделитель) взять на клавиатуре ??... я её, действительно, всё не могу встретить в повседневной жизни ...
Изменено: JeyCi - 26.07.2014 10:33:48
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Правее твёрдого знака))
 
:)  
 
Цитата
Юрий М пишет: Правее твёрдого знака))
Юрий, ну ещё же утро  :)   - зачем такие сложные ответы... хотя всё равно спасибо... она у меня оказалась НИЖЕ твёрдого знака (|), да ещё и перейти надо было на англ раскладку... да ещё и на клавиатуре нарисована как пунктир ... вобщем на одной кнопке со слэшем \ ... правее буквы Э ... господа, вы, наверно, на ноутбук смотрели :) ... а я на обыкновенную клавиатуру
Изменено: JeyCi - 26.07.2014 11:03:49
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Ну у меня НА САМОМ деле правее "Ъ"))) А правее "Э" у меня Enter. Клавиатуры могут немного отличаться)
 
и у меня на ноутбуке тоже правее Ъ
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
да не суть... возьмите любой разделитель, какой нравится, хоть пробел
пробел на клавиатуре найдете? :)
Живи и дай жить..
 
Цитата
ikki пишет: проблемка с типом дата у Вас
елки-палки... Спасибо огромное. Эта тварь мне всю ночь снилась  :)  
RAN, тоже большое спасибо. Код элегантнее гораздо. пока еще не въехал в него до конца, но, насколько я понимаю, step 2 - это для двух конкретных показателей, исходя из того, что на каждый товар по 2 строки на 1 дату. Увы, количество показателей может меняться (например, добавится "Остаток" или "Продажи" или х.з. что). Еще не знаю, возможна ли ситуация, когда по товар1+дата есть, например, 2 строки, а на товар2+дата - 1 или 3. Так что, наверное, от ключа из 3 элементов не уйти.
F1 творит чудеса
 
Для переменного количества показателей код поправить легко, а для случая
Цитата
Максим Зеленский пишет: возможна ли ситуация, когда по товар1+дата есть, например, 2 строки, а на товар2+дата - 1 или 3
задача в принципе не решаема, так как непонятно, что, куда, и по каким условиям добавлять.
 
Я думаю можно сделать так
Создаём два словаря - один для яблок-липесинов, во втором собираем значения по существующим ключам.
И количество строк на дату не важно - можно собирать сумму, ну или например коллекцию значений.
Перебор исходных данных - заполняем словари. Заодно опеределяем даты от-до.
Далее цикл по найденным "липесинам" и вложенный по диапазону дат (ну или наоборот) - собираем ключ, извлекаем собранное в словаре. Если в словаре данных нет - пишем 0.
 
все недостающие строки. т.е. на каждую дату все имеющиеся в таблице показатели.
хотя я бы предпочел более качественные исходные данные, конечно
F1 творит чудеса
 
Ну так составляете словарь всех показателей - и при переборе дат перебираете этот словарь (или словари), собираете ключ, по ключу ищите данные в словаре всех данных. Если там нет - пишите 0.
 
да, я именно так и делаю. то был ответ для RAN

всем спасибо!
F1 творит чудеса
 
Максим, простите за маленький off в вашей теме, но хочется ответить Слэну
Цитата
Слэн пишет: да не суть... возьмите любой разделитель, какой нравится, хоть пробел
пробел на клавиатуре найдете?
найдём !... :)
Изменено: JeyCi - 27.07.2014 21:15:38
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх