Фильтр покупателей, которые купили конкретный товар

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
lex4
Новичок
Сообщения: 24
Зарегистрирован: 18 Март 2016, 12:37

Фильтр покупателей, которые купили конкретный товар

Сообщение lex4 »

Добрый день!
Сразу прошу прощения, если такая тема была, но я, к сожалению не нашел.
Задача:
Есть BROWSE c товаром. При выборе конкретного товара должен открываться BROWSE с покупателями (не важно в новом окне или во вкладке TAB), в котором из общей базы отображаются только те покупатели, которые купили этот товар.

Среда С10, шаблоны АВС.

Скорее всего задача просто решается, но только начинаю осваивать АВС и с10.
Заранее спасибо.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Фильтр покупателей, которые купили конкретный товар

Сообщение Yufil »

А БД какая? Если SQL, то проще:

Код: Выделить всё

 View{Prop:SQLFilter} = ' Код покупателя in (select кодпокупателя from покупки where кодтовара=тотсамый) '
Можно ещё найти метод ValidateRecord и там устроить проверку -

Код: Выделить всё

IF данный покупатель не покупал товар 
    Return Record:Filtered 
END 
Да, после выбора товара надо перерисовать Browse - что-то типа Brw1.ResetQueue(Reset:Queue)
lex4
Новичок
Сообщения: 24
Зарегистрирован: 18 Март 2016, 12:37

Фильтр покупателей, которые купили конкретный товар

Сообщение lex4 »

Извините, не указал. База TPS средних размеров.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3135
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Фильтр покупателей, которые купили конкретный товар

Сообщение Дед Пахом »

В шаблоне Browse на первой вкладке либо установить поле в Range Limit Field, либо написать фильтр в Record Filter.
С уважением, ДП
lex4
Новичок
Сообщения: 24
Зарегистрирован: 18 Март 2016, 12:37

Фильтр покупателей, которые купили конкретный товар

Сообщение lex4 »

Дед Пахом,
А как написать фильтр, я же должен последовательно прочитать файл с товаром?
lex4
Новичок
Сообщения: 24
Зарегистрирован: 18 Март 2016, 12:37

Фильтр покупателей, которые купили конкретный товар

Сообщение lex4 »

Извините - не с товаром, а с продажами. Ведь там "завязываются" товар-покупатель
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3135
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Фильтр покупателей, которые купили конкретный товар

Сообщение Дед Пахом »

Когда запись товара выбрана стрелкой или мышью, поля файла заполнены данными. Фильтр примерно такой: CUS:ProductID = PRO:ID. Где CUS:ProductID - код товара в файле покупателей, PRO:ID - код товара в файле товаров.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Фильтр покупателей, которые купили конкретный товар

Сообщение Игорь Столяров »

lex4 писал(а): База TPS средних размеров.
Если БД не SQL, то придется делать обработку с запросом и показывать ее результат в отдельном окне (или списке).
Один покупатель может несколько раз покупать выбранный товар, и просто отфильтровать список продаж и
исключить из него повторы покупателей простым фильтром не получится (точнее можно, но излишне сложно).
За теми кто отстал - не возвращаться. (С) Кодекс
lex4
Новичок
Сообщения: 24
Зарегистрирован: 18 Март 2016, 12:37

Фильтр покупателей, которые купили конкретный товар

Сообщение lex4 »

Решил воспользоваться советом Yufil,
Коллеги, насколько оптимален следующий код в методе ValidateRecord?

Код: Выделить всё

ReturnValue = Record:Filtered 
SAL:ID=PRO:ID ! Продажи группирую по выбранному товару
SET(SAL:IDKey,SAL:IDKey)
LOOP UNTIL(EOF(SALE))
    Access:SALE.Next()
      IF ~(SAL:ID=PRO:ID) THEN BREAK END
      IF (SAL:ContractorID = CON:ContractorID) THEN
          ReturnValue = Record:OK    ! Вывожу     CON:ContractorID и CON:Name
          BREAK
      END
END
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Фильтр покупателей, которые купили конкретный товар

Сообщение Yufil »

Совсем не оптимален. Если есть индекс по товару и покупателю, им и надо пользоваться, а если нет-завести (например, продукт+покупатель+датапродажи), тогда и цикла не надо...
Тогда

Код: Выделить всё

CLEAR(SAL:RECORD) 
SAL:ID = PRO:ID 
SAL:ContractorID = Con:ContractorID 
SET(SAL:PROD_Contractor_Date, SAL:PROD_Contractor_Date) 
IF Access:Sale.Next() OR ~( SAL:ID = PRO:ID AND SAL:ContractorID = Con:ContractorID) 
    Return(Record:Filtered)
END 
А в исходном варианте:
- перед SAL:ID = PRO:ID надо почистить запись CLEAR(Sal:Record), даже если других полей в индексе нету, просто выработать привычку
- EOF не стоит использовать без крайней необходимости, на самом деле Access:Sale.Next() возвращает Level:BenIgn (=0), если удалось прочитать запись, и не равен 0 в противном случае, поэтому так
LOOP WHILE ~Access:SALE.Next() AND Sal:ID=Pro:ID
...
END
- Не вижу Record:Filtered, должно быть где-то в конце
lex4
Новичок
Сообщения: 24
Зарегистрирован: 18 Март 2016, 12:37

Фильтр покупателей, которые купили конкретный товар

Сообщение lex4 »

Yufil, Огромное спасибо за конструктивные замечания.
Yufil писал(а): Не вижу Record:Filtered, должно быть где-то в конце
Эта запись у меня в начале просто в конце не хватало Return ReturnValue.
Один уточняющий вопрос: Вы имели ввиду все-таки INDEX или KEY
Yufil писал(а): продукт+покупатель+датапродажи
?

Еще раз спасибо Юрий.
Ответить