Страница 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 писал(а): продукт+покупатель+датапродажи
?
Еще раз спасибо Юрий.