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

Добавлено: 12 Ноябрь 2004, 8:27
Гость
Как правильно организовать фильтрацию. Допустим у меня в Browse отображается список групп студентов. Как сделать , что бы при выборе определенной открывался новое окно Browse со списком студентов этой группы.

P.S. У каждого поля студентов есть поле группы. Находяться они в одном файле.
Написал: Sergey(111)

Добавлено: 15 Ноябрь 2004, 2:36
StillZero
Как я понимаю:
- есть файл групп вида: код группы, наименование группы
- есть файл студентов, в котором есть поле "код группы"
- для быстрой фильтрации необходимо также чтобы файл студентов имел ключ, что то вроде "код группы, фио студента"

Вообще вариантов, несколько:
а) два окна:
-делаем два окна, в одном наименование групп, в другом фио студентов
- в окне групп, в hot fields должно быть добавлено поле "код группы"
- в окне групп есть кнопка вызова второго окна. На кнопке - вызов процедуры второго окна без ее запуска ее в отдельном потоке, т.е. галка InitiateThread отсутствует
- во втором окне должен быть установлен ключ просмотра по "код группы, фио студента"
- в списке таблиц (TableSchematic) в other files добавить файл групп (это необязательно, но будет удобнее просто)
- на закладке default behaviour в поле range limit выбираем "код группы" из файла "студентов", range limit type - SingleValue, range limit value - "код группы" из файла групп

все...с этим вариантом

б) два окна: все похоже на первый вариант, только вторую процедуру делаем с входным параметром "код группы" типа string, т.е. SecondBrowse(STRING inGroupID). Надо это для вызова в отд потоке, т.е. на кнопке уже можно будет ставить галку InitiateThread или, что лучше, написать код на кнопке, типа,
start(SecondBrowse,25000,"код группы"); select(?ListGroup), т.е. после вызова выбрать там list box с группами. Во втором окне все тоже, только первый файл уже не надо в other table и range limit value должно быть равно inGroupID, но напрямую не даст поставить inGroupID в поле, так как она определена в описании процедуры, т.е. нужно будет завести переменную типа loc:GroupID, ее ставить в range limit value, предварительно где нибудь loc:GroupID=inGroupID

в) одно окно, IMHO - лучший вариант
- существует всего одно окно
- в окне два List box-а: в одном группы, в другом студенты
- в группах в hot fields - код группы
- студенты по ключу "код группы, фио"
- на закладке для студентов range limit field - код группы из студентов
range limit type - single value, range limit value - код группы из групп, на кнопке reset fields - код группы из групп.

как работает: бегаешь по List box-у с группами - меняется содеражание List box-а с студентами

Удачи и help в помощь
Написал: PAA(27)

Добавлено: 01 Декабрь 2004, 12:06
Гость
а если немного усложнить задачу:
есть таблица Судозаходы с полем СЗХКод, по которому создан первичный ключ, автономер. Также имеется поле КНСКод для связи 1-много с таблицей Коносаменты, имеющей поле КНСКод - первичный ключ, автономер и СЗХКод.
Мне нужно, чтобы
1. по нажатию кнопки в браузе СЗХ выскакивал брауз КНС с фильтрацией только для выбранной записи СЗХ
2. в таблице СЗХ в поле СУММА автоматом считалась сумма из поля ВЕС в таблице КНС для всех записей, соответствующих данному СЗХКод.

Написал: Declarant(162)

Добавлено: 03 Декабрь 2004, 8:54
Гость
И еще вопрос. А как можно делать фильтрацию по двум или более ключам сразу ?
Написал: Declarant(162)

Добавлено: 03 Декабрь 2004, 9:48
StillZero
1. по нажатию кнопки в браузе СЗХ выскакивал брауз КНС с фильтрацией только для выбранной записи СЗХ
вообщем вам пример http://www.zero.clarionlife.net/Files/study.zip
2. в таблице СЗХ в поле СУММА автоматом считалась сумма из поля ВЕС в таблице КНС для всех записей, соответствующих данному СЗХКод.
а какие проблемы? есть как обычно два варианта:

- считать тотал по дочерним записям пользуясь шаблоном (там закладочка есть Total), считается все в переменную, потом эту переменную заносить в поле родителя - по закрытию окна просмотра дочерей, типо:

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

FILE:UniqueID=известный ID родителя
if NOT Access:FILE.Fetch(FILE:KeyID)
   FILE:TotalSum=loc:TotalSum
   Access:FILE.Update()
end
это в том случае, если записей дочерних немного

- если записей много, то первый вариант будет медленным (медленно открываться будет дочерний browse), тогда надо в динамике, т.е. добавили запись в дочернем файла - добавили сумму в родительском. Удалили - отняли в родительском, изменили - отняли то что раньше было, прибавили то, что сейчас. Этот вариант вообще предпочтительнее.

как можно делать фильтрацию по двум или более ключам сразу

вопрос не понятен
Написал: PAA(27)

Добавлено: 03 Декабрь 2004, 15:21
Гость
как можно делать фильтрацию по двум или более ключам сразу?

вопрос не понятен
Например, мне нужно из всех записей видеть только те, которые были введены с даты ....... по ........ и только для Судна "ИмяСудна". Поля "ДатаЗаписи" и "Судно" в таблице есть.
Написал: Declarant(162)

Добавлено: 03 Декабрь 2004, 15:57
StillZero
в идеале делается ключ "Судно, Дата" записи и по нему просматриваются записи
- если открывается отдельное окно: на закладке Actions выставляем RangeLimitField - Дата, RangeLimitType - RangeOfValues, low и high соответственно loc:DateBegin и loc:DateEnd. Переменные loc:DateBegin и loc:DateEnd можно задавать прямо в процедуре просмотра или передавать в качестве параметров. Также их необходимо добавить в HotFields, а если будете использовать прямо в процедуре, то и в ResetFields(те поля, при изменении которых обновляется брауз). Значение для Судна, можно получить используя ранее описанные способы. Т.е. мы должны знать значение кода судна родителя. Дочернему файлу код судна присваивается "после открытия файлов", например, CHILD:CodeShip=PARENT:CodeShip
- если все происходит в одном окне: на закладке Actions выставляем RangeLimitField - Судно, RangeLimitType - FileRelationShip, как Related file выбираем файл "справочник Судов". В поле record filter пишем: CHILD:Date>=loc:DateBegin and CHILD:Date<=loc:DateEnd. Переменные дат опять таки заносим в HotFileds и в ResetFields. (да в hot fields ставим галку Bind fields, и ставим галку not in view).
В принципе и в первом варианте можно так сделать. Мне просто не нравится писать фильтр руками.

делается все это дело...меньше минуты

удачи...
Написал: PAA(27)

Добавлено: 03 Декабрь 2004, 16:14
Гость
Спасибо огромное, буду эксперементировать. На самом деле параметров для фильтрации у меня больше, но, думаю, там все по аналогии.
Созрел следующий вопрос: а можно, не мудрствуя лукаво, после всех моих извращений с этим бедным браузом, отфильтрованные результаты вывести в рипорт ?

ЗЫ: Уважаемый "ответчик", похоже, я вас своими занудствами уже довел до состояния "junior member" ;)
дотерпите меня, пожалуйста, до следующего повышения
:gigi:
Написал: Declarant(162)

Добавлено: 06 Декабрь 2004, 3:09
StillZero
если параметров для фильтрации много...т.е. типо FILE:MyField1=loc:Param1 and FILE:MyField2=loc:Param2 and ... FILE:MyFieldN=loc:ParamN, т.е. невозможно пред'угадать какой ключ будет нужен, то надо делать несколько по другому. Правда, фильтрация по ключу всегда будет намного быстрее и где можно нужно использовать именно ее.

- вариант 1: есть точка вставки ValidateRecord, в нее после ParentCall можно вставить свое условие и возвращать Record:Filtered в случае если эта запись вас не устраивает, пример:

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

if NOT MyFilterProcedure() then return(Record:Filtered).
...
MyFilterProcedure PROCEDURE
 code
 if (File:MyField1=GLO:Param1 and GLO:Param1<>0) and !
 (File:MyField2=GLO:Param2 and GLO:Param2<>0) 
    return(TRUE)
 else
    return(FALSE)
 end
это дело вставляется и в просмотре и в отчете - соответственно получим одинаковый результат, ... а для начала попробуйте в validate поставить какой нибудь простой код, типо

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

 if FILE:MyField=10 then return(Record:Filtered).
- вариант 2: есть класс ViewManager, этот класс используют и класс Browse и класс отчета. Есть метод SetFilter (заодно посмотрите и SetOrder). Метод SetFilter устанавливает дополнительный фильтр к уже имеющемуся и применяется к активной сортировке (это важно, т.е. если у вас несколько сортировок, то надо не забыть применить SetFilter к каждой). Как работает в Browse (класс брауза можно узнать на закладке Classes в свойствах List box-a, код вешается в любом месте например на кнопке "Применить фильтр"):

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

Brw1.SetFilter('File:MyField1=10','UniqueFilterName') ! установили фильтр
BRW1.ResetSort(TRUE) ! обновили активную сортировку
первым параметром метода идет строка фильтра (т.е. можно сделать GLO:MyFilterStr), вторым параметром уникальный ID фильтра (пишем чего нибудь от себя). соотвественно для связки отчета и брауза будет так:

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

GLO:MyFilterStr='File:MyField1=10'
Brw1.SetFilter(GLO:MyFilterStr,'UniqueFilterName') ! это в браузе
ThisReport.SetFilter(GLO:MyFilterStr,'UniqueFilterName') ! это в отчете
в отчете вставляется код на Init окна, после самой последней точкой вставки

вроде так :)
удачи
Написал: PAA(27)