Страница 1 из 2
Маркер и Изменение подцепки
Добавлено: 12 ноя 2009, 16:10
niteo
Возник вопрос, как лучше в ARD изменить подцепку(выборку) если используется маркер.
Как я понял мне необходимо будет заполнить временную таблицу значениями из маркера, и использовать баундс?
Добавлено: 12 ноя 2009, 16:32
edward_K
можно еще попробовать использовать
function SearchMarker (markers : longInt;
item : anyType;
indexNo : longInt
) : boolean;
в условии за (()).
а так проще сделать цикл ".{while" по маркеру - если не нужна сортировка по отобранным записям, иначе лучше времянка - шустрее будет.
Добавлено: 12 ноя 2009, 16:37
niteo
вот пробую делать так:
Код: Выделить всё
.{ margin while i < cnt
.begin
if getmarker(DepartmentMarker, i, D) then
getfirst persons where ((D /== persons.department and 'С' == persons.isemployee));
i := i + 1;
str := persons.fio;
end.
persons = ^
.}
Клиент после запуска отчета зависает. Грит тока - формирую отчет. и не откликается
Добавлено: 12 ноя 2009, 16:44
edward_K
либо весь отчет в студию либо logstrtofile через каждые 5-10 строк. Возможно у вас view не так составлен.
where ((D /== persons.department and 'С' == persons.isemployee));
я бы перенес в view. Да и при обращении к таблам не ленитесь указывать имя view. А margin зачем? Сначала без него пробуйте.
Добавлено: 12 ноя 2009, 17:08
niteo
Вот такой код получился
Код: Выделить всё
.form 'ODKrepSP'
.nameinlist 'Отчет СП'
.ard
.var
Cnt, i: longint;
D : comp;
DepartmentMarker: longint;
str : string;
.endvar
.create view vBD
SELECT
persons.fio,
persons.tabnmb,
catalogs.name
FROM
persons,
catalogs
WHERE
((
'С' == persons.ISEMPLOYEE and
catalogs.nrec /== persons.department
))
ORDER BY catalogs.nrec;
.begin
DepartmentMarker := InitMarker('CatalogsMarker', 8, 200, 100); //CatalogsMarker
Cnt := GetMarkerCount(DepartmentMarker);
if Cnt > 0 then
{
// Resetbounds(tnCatalogs);
for (i := 0; i < Cnt; i := i + 1)
{
if getmarker(DepartmentMarker, i, D) then
getfirst catalogs where ((D == catalogs.nrec));
}
// Setbounds(tnCatalogs);
}
i := 0;
end.
.fields
str
.endfields
.{ margin while i < cnt
.begin
if getmarker(DepartmentMarker, i, D) then
getfirst persons where ((D /== persons.department and 'С' == persons.isemployee));
i := i + 1;
str := persons.fio;
end.
persons = ^
.}
.endform
Добавлено: 12 ноя 2009, 17:17
edward_K
1. ORDER BY catalogs.nrec уберите
2. margin - тоже нафиг
3. result.log заполнился?
4.
Код: Выделить всё
.create view vBD
SELECT
persons.fio,
persons.tabnmb,
catalogs.name
FROM
persons,
catalogs
WHERE
((
'С' == persons.ISEMPLOYEE and
persons.department == catalogs.nrec
))
bounds byfiltr == persons.ISEMPLOYEE and
D== persons.department
;
до while
вместо while
Код: Выделить всё
.{?internal;cnt>0;
.fiedls
vBD.persons.fio
.endfields
.{ while i < cnt
.begin
if getmarker(DepartmentMarker, i, D) then {}
i:=i+1;
end.
.{table 'vBD'
.begin
logstrtofile('c:\!!!.txt',persons.fio+' '+string(i))
end.
persons = ^
.} //.{table 'vBD'
.}
.}//.{?internal;cnt>0;
.{?internal;cnt=0;
.fiedls
vBD.persons.fio
.endfields
.{table 'vBD'
persons = ^
.} //.{table 'vBD'
.}
Добавлено: 12 ноя 2009, 18:41
niteo
У меня почему то тут "спотыкается" компилятор:
Код: Выделить всё
.{while i < cnt
.begin
if getmarker(DepartmentMarker, i, D) then
end.
.{table 'vBD'
persons = ^
.} //.{table 'vBD'
.}
Грит: ожидалась, Константа, Функция, поле .....
На строчке
Добавлено: 12 ноя 2009, 18:46
edward_K
if getmarker(DepartmentMarker, i, D) {}
Добавлено: 12 ноя 2009, 18:52
niteo
Наверное что то не так.... Завис снова при выполнении.
не могли бы "разжевать" вот этот кусочек кода:
Код: Выделить всё
.{?internal; cnt > 0;
.fiedls
vBD.persons.fio
.endfields
.{while i < cnt
.begin
if getmarker(DepartmentMarker, i, D) {}
end.
.{table 'vBD'
persons = ^
.} //.{table 'vBD'
.}
.}//.{?internal;cnt>0;
.{?internal;cnt=0;
.fiedls
vBD.persons.fio
.endfields
.{table 'vBD'
persons = ^
.} //.{table 'vBD'
.}
Добавлено: 12 ноя 2009, 18:57
edward_K
ну вы то тоже смотрите
.begin
if getmarker(DepartmentMarker, i, D) {}
i:=i+1
end.
Добавлено: 12 ноя 2009, 18:59
edward_K
если будет зависать вставте перед циклом и в while
logstrtofile('c:\!!!.txt',persons.fio+' '+string(i))
Добавлено: 13 ноя 2009, 06:30
Алексей
у нас была практика данные из маркера перекидывать в таблицу пик со своим типом и по ней ставить жесткий баундс на основную таблицу. Отсеивалось автоматом не нужно

Добавлено: 13 ноя 2009, 14:04
niteo
Вообщем выводит отчет, в нем строки:
и так до конца отчета. отчет большой.
Если не трудно, объясните как происходит механизм изменения подцепки в приведенном вами выше примере???
То есть как я понимаю, использование баундса, позволяет изменять условие WHERE. Это вроде понятно. а вот дальше по приведенному вашему коду, я пока ничего понять не могу. То есть я вижу только перебор значений маркера....
Добавлено: 13 ноя 2009, 15:12
KATZ
niteo
Вам изначально что нужно-то? Если список всех сотрудников из выбранных подразделений - это проще сделать безо всяких баундсов, как-то так:
Код: Выделить всё
...
.create view vBD
as select Persons.FIO, Persons.Department
from Persons
where (('С'==Persons.IsEmployee))
order by Persons.FIO;
...
.{table 'vBD'
.{?Internal;SearchMarker(DepartmentMarker,vBD.Persons.Department,i)
.fields
vBD.Persons.FIO
.endfields
ФИО = ^
.} // Internal
.} // table 'vBD'
...
Будет список сотрудников по алфавиту. Если надо с группировкой по подразделениям - это чуть посложнее, но тоже без баундсов.
Добавлено: 13 ноя 2009, 15:45
niteo
Красивая конструкция
Код: Выделить всё
{?Internal;SearchMarker(DepartmentMarker,vBD.Persons.Department,i)
Я даже и не подумал что так просто можно решить сию проблему.
А вот так с сортировкой по подразделениям:
Код: Выделить всё
.create view vBD
SELECT
persons.fio, persons.department
FROM
persons, catalogs
WHERE
((
'С'==Persons.IsEmployee and
persons.department == catalogs.nrec
))
ORDER BY Persons.Department;
Но все равно хотелось бы разобраться в примере который предложил
edward_K Может сможете мне объяснить что там к чему?
