Страница 1 из 1

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

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

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

Скорее всего задача просто решается, но только начинаю осваивать АВС и с10.
Заранее спасибо.

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

Добавлено: 29 Март 2017, 19:41
Yufil
А БД какая? Если SQL, то проще:

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

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

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

IF данный покупатель не покупал товар 
    Return Record:Filtered 
END 
Да, после выбора товара надо перерисовать Browse - что-то типа Brw1.ResetQueue(Reset:Queue)

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

Добавлено: 29 Март 2017, 19:43
lex4
Извините, не указал. База TPS средних размеров.

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

Добавлено: 29 Март 2017, 19:46
Дед Пахом
В шаблоне Browse на первой вкладке либо установить поле в Range Limit Field, либо написать фильтр в Record Filter.

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

Добавлено: 29 Март 2017, 19:53
lex4
Дед Пахом,
А как написать фильтр, я же должен последовательно прочитать файл с товаром?

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

Добавлено: 29 Март 2017, 19:54
lex4
Извините - не с товаром, а с продажами. Ведь там "завязываются" товар-покупатель

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

Добавлено: 29 Март 2017, 19:56
Дед Пахом
Когда запись товара выбрана стрелкой или мышью, поля файла заполнены данными. Фильтр примерно такой: CUS:ProductID = PRO:ID. Где CUS:ProductID - код товара в файле покупателей, PRO:ID - код товара в файле товаров.

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

Добавлено: 29 Март 2017, 20:00
Игорь Столяров
lex4 писал(а): База TPS средних размеров.
Если БД не SQL, то придется делать обработку с запросом и показывать ее результат в отдельном окне (или списке).
Один покупатель может несколько раз покупать выбранный товар, и просто отфильтровать список продаж и
исключить из него повторы покупателей простым фильтром не получится (точнее можно, но излишне сложно).

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

Добавлено: 29 Март 2017, 20:16
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

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

Добавлено: 29 Март 2017, 22:13
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, должно быть где-то в конце

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

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

Еще раз спасибо Юрий.