Использование фильтра с множественным выбором

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Использование фильтра с множественным выбором

Сообщение Nikos »

Добрый день.
У меня задача - разработать интерфейс с текущем наличием спецодежды (хотя это в принципе не важно). Проблема заключается в том, что должна быть возможность устанавливать фильтры с множественным выбором, например по подразделениям и по МОЛам. Получить эти фильтры проблемы нет (я использую 'L_MOL::GETSOMEMOL' и 'Z_KATPODR::GETSOMEPODR'), а вот как наложить эти ограничения на логическую таблицу не знаю. Делаю следующие ограничения:
bounds byMOL as
mbpin.cmol /== katmol.nrec and
Pick.crec == katmol.nrec and
8 == Pick.wlist
bounds bySklad as
mbpin.cpodr /== katpodr.nrec and
Pick.crec == katpodr.nrec and
11 == Pick.wlist
Но как-то криво (да и не работает :))
Подскажите принцип, кто знает.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

До 8-й версии в баундсах сцеплять более 2-х таблиц нельзя было.
Т.е. только
table1.nrec==table2.crec

а так
table1.nrec==table2.crec
table2.nrec==table3.crec
уже бы не работало толком.

Выход - использовать несколько баундсов
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Разбил на несколько баундсов. Что-то так у меня вообще не фильтрует. Приведу основной код, может, в другом месте неправильно делаю:
as select *
from mbpin, katmbp, katpodr, katmol, grpodr
where
((
1 == mbpin.status
and mbpin.cmbp == katmbp.nrec
and mbpin.cpodr == katpodr.nrec
and mbpin.cmol == katmol.nrec
and katpodr.cgrpodr == grpodr.nrec
))
bounds byMOL1 as
mbpin.cmol /== katmol.nrec
bounds byMOL2 as
Pick.crec == katmol.nrec and
8 == Pick.wlist
bounds bySklad1 as
mbpin.cpodr /== katpodr.nrec
bounds bySklad2 as
Pick.crec == katpodr.nrec and
11 == Pick.wlist
order by mbpin.status, mbpin.cpodr, mbpin.cmol;

далее накладываю ограничения:
#MOL:
{
RunInterface('L_MOL::GETSOMEMOL');
if tsOk = GetFirst Pick where ((8 == pick.wlist))
{
PushBounds(tbbyMOL1);
PushBounds(tbbyMOL2);
}
else
{
PopBounds(tbbyMOL1);
PopBounds(tbbyMOL2);
}
RescanPanel(#mbpin);
}
#Sklad:
{
RunInterface('Z_KATPODR::GETSOMEPODR');
if tsOk = GetFirst Pick where ((11 == pick.wlist))
{
PushBounds(tbbySklad1);
PushBounds(tbbySklad2);
}
else
{
PopBounds(tbbySklad1);
PopBounds(tbbySklad2);
}
RescanPanel(#mbpin);
}
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Цель вывести записи в браузер или использовать только внутри интерфейса при подсчёте циферек?

Если в барузер не надо, бежите по всей таблице и проверяете попадает ли та или иная запись под ваше ограничение, если да берёте ее, если нет пропускаете.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Если в барузер не надо, бежите по всей таблице и проверяете попадает ли та или иная запись под ваше ограничение, если да берёте ее, если нет пропускаете.
Вот так я и делал до этого последнего времени, а тут понадобилось в интерфейс.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Может, действительно, так вообще не делается, и я зря мучаюсь?
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Временная таблица может быть выходом :)
Т.е. наполняете данными временную таблицу и её же показываете в интерфейсе.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Спасибо. Наверное, в таком случае буду выводить отчет. (Просто я надеялся, что есть какой-то универсальный способ для таких ограничений)
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

А если вот так :

where
((
1 == mbpin.status
and mbpin.cmbp == katmbp.nrec
and mbpin.cpodr /== katpodr.nrec
and mbpin.cmol /== katmol.nrec
and katpodr.cgrpodr == grpodr.nrec
))
bounds byMOL1 as
katmol.nrec/==Pick.crec
8 == Pick.wlist
bounds bySklad1 as
katpodr.nrec /== Pick.crec and
11 == Pick.wlist
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

только надежнее pick-и под элиасами объявить
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Такой вариант не пройдет, так как есть приходы без МОЛов, встречаются и без складов. И если фильтр не установлен, то должны отображаться все.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

where
((
1 == mbpin.status
and mbpin.cmbp == katmbp.nrec
))
bounds mol
and mbpin.cmol == katmol.nrec
bounds mol1
and mbpin.cmol/== katmol.nrec
bounds byMOL1 as
katmol.nrec/==Pick.crec
8 == Pick.wlist

bounds pod
mbpin.cpodr == katpodr.nrec
bounds pod1
mbpin.cpodr /== katpodr.nrec
bounds bySklad1 as
katpodr.nrec /== Pick.crec and
11 == Pick.wlist

!and katpodr.cgrpodr == grpodr.nrec (пока без этого условия проверим)

CmInit :{
addbounds(tbmol);
addbounds(tbpod);
}
CmPick :{
#MOL:
{
if RunInterface('L_MOL::GETSOMEMOL')<>cmcancel
{
subbounds(tbmol);
addbounds(tbmol1);
addbounds(tbbymol);
}
}
#podr:
{
if RunInterface('Z_KATPODR::GETSOMEPODR')<>CmCancel
{
subbounds(tbpod);
addbounds(tbpod1);
addbounds(tbbysklad1);
}
}
}


Примерно так...
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Так работает! Большое спасибо.
А addbounds и pushbounds - это одно и тоже?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

add добавляет, push заменяет ограниечние на соотв.таблицу.
перед add по хорошему надо либо снять все боундсы либо проверять не наложен ли он уже.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Т.е. если я пишу Push, то все другие ограничения на эту таблицу снимаются? А при использования popbounds что происходит? (subbounds, видимо, снимает конкретное ограничение)
Ответить