Страница 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

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

if cnt>0
 vBD.pushbounds(vBD.tbbyfiltr)
вместо 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
ну вы то тоже смотрите :grin:
.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
Вообщем выводит отчет, в нем строки:

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

persons = 
persons = 
persons = 
persons = 
и так до конца отчета. отчет большой.
Если не трудно, объясните как происходит механизм изменения подцепки в приведенном вами выше примере???

То есть как я понимаю, использование баундса, позволяет изменять условие 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;
:grin:

Но все равно хотелось бы разобраться в примере который предложил edward_K Может сможете мне объяснить что там к чему? :-?