Маркер и Изменение подцепки

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

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

niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Маркер и Изменение подцепки

Сообщение niteo »

Возник вопрос, как лучше в ARD изменить подцепку(выборку) если используется маркер.
Как я понял мне необходимо будет заполнить временную таблицу значениями из маркера, и использовать баундс?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

можно еще попробовать использовать
function SearchMarker (markers : longInt;
item : anyType;
indexNo : longInt
) : boolean;
в условии за (()).
а так проще сделать цикл ".{while" по маркеру - если не нужна сортировка по отобранным записям, иначе лучше времянка - шустрее будет.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение 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 = ^
.}
Клиент после запуска отчета зависает. Грит тока - формирую отчет. и не откликается
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

либо весь отчет в студию либо logstrtofile через каждые 5-10 строк. Возможно у вас view не так составлен.
where ((D /== persons.department and 'С' == persons.isemployee));
я бы перенес в view. Да и при обращении к таблам не ленитесь указывать имя view. А margin зачем? Сначала без него пробуйте.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение 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
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение 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'
.}
Последний раз редактировалось edward_K 12 ноя 2009, 19:21, всего редактировалось 3 раза.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

У меня почему то тут "спотыкается" компилятор:

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

.{while i < cnt
.begin
	if getmarker(DepartmentMarker, i, D) then
end.
.{table 'vBD'
	persons = ^
.} //.{table 'vBD'

.}
Грит: ожидалась, Константа, Функция, поле .....
На строчке
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

if getmarker(DepartmentMarker, i, D) {}
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение 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'
.}
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

ну вы то тоже смотрите :grin:
.begin
if getmarker(DepartmentMarker, i, D) {}
i:=i+1
end.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

если будет зависать вставте перед циклом и в while
logstrtofile('c:\!!!.txt',persons.fio+' '+string(i))
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

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

у нас была практика данные из маркера перекидывать в таблицу пик со своим типом и по ней ставить жесткий баундс на основную таблицу. Отсеивалось автоматом не нужно :)
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

Вообщем выводит отчет, в нем строки:

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

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

То есть как я понимаю, использование баундса, позволяет изменять условие WHERE. Это вроде понятно. а вот дальше по приведенному вашему коду, я пока ничего понять не могу. То есть я вижу только перебор значений маркера....
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение 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'
...
Будет список сотрудников по алфавиту. Если надо с группировкой по подразделениям - это чуть посложнее, но тоже без баундсов.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение 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 Может сможете мне объяснить что там к чему? :-?
Ответить