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

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

Добавлено: 04 июл 2007, 11:56
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
Но как-то криво (да и не работает :))
Подскажите принцип, кто знает.

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

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

Выход - использовать несколько баундсов

Добавлено: 04 июл 2007, 13:25
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);
}

Добавлено: 04 июл 2007, 13:30
Алексей
Цель вывести записи в браузер или использовать только внутри интерфейса при подсчёте циферек?

Если в барузер не надо, бежите по всей таблице и проверяете попадает ли та или иная запись под ваше ограничение, если да берёте ее, если нет пропускаете.

Добавлено: 04 июл 2007, 13:35
Nikos
Если в барузер не надо, бежите по всей таблице и проверяете попадает ли та или иная запись под ваше ограничение, если да берёте ее, если нет пропускаете.
Вот так я и делал до этого последнего времени, а тут понадобилось в интерфейс.

Добавлено: 04 июл 2007, 13:40
Nikos
Может, действительно, так вообще не делается, и я зря мучаюсь?

Добавлено: 04 июл 2007, 13:40
Алексей
Временная таблица может быть выходом :)
Т.е. наполняете данными временную таблицу и её же показываете в интерфейсе.

Добавлено: 04 июл 2007, 13:46
Nikos
Спасибо. Наверное, в таком случае буду выводить отчет. (Просто я надеялся, что есть какой-то универсальный способ для таких ограничений)

Добавлено: 04 июл 2007, 16:50
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

Добавлено: 04 июл 2007, 16:51
Den
только надежнее pick-и под элиасами объявить

Добавлено: 05 июл 2007, 08:20
Nikos
Такой вариант не пройдет, так как есть приходы без МОЛов, встречаются и без складов. И если фильтр не установлен, то должны отображаться все.

Добавлено: 05 июл 2007, 09:56
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);
}
}
}


Примерно так...

Добавлено: 05 июл 2007, 10:59
Nikos
Так работает! Большое спасибо.
А addbounds и pushbounds - это одно и тоже?

Добавлено: 05 июл 2007, 11:32
edward_K
add добавляет, push заменяет ограниечние на соотв.таблицу.
перед add по хорошему надо либо снять все боундсы либо проверять не наложен ли он уже.

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