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

обработка запроса в цикле

Добавлено: 04 апр 2006, 14:14
Nathaly
Подскажите пожалуйста где ошибка в отчёте

Есть следующий отчет:

.create view Tar
var group: integer
as SELECT
tarstav.datizm,
klsisopl.nasisopl,
tarstav.codtar,
tarstav.naitar,
tarstav.razr,
tarstav.tarif
FROM tarstav, klsisopl
WHERE
((klsisopl.sisopl == tarstav.sisopl)) AND
Tar.group= tarstav.codtar;
...

.begin j:=0 end.
.{while j<3
.begin
j:=j+1
Tar.group:=j
i:=Tar.GetFirst
end.
.{?INTERNAL; i=0
.{table 'Tar'
вывод данных из представления Tar, например
Tar.group и Tar.tarstav.codtar
.}
.}
.}

То есть в цикле меняется условие фильтрации для представления Tar

Результат работы этого отчёта
Tar.group Tar.tarstav.codtar
1 1
2 1
3 1

Как видно условие фильтрации не применяется и всегда выводятся одни и те же данные (в примере Tar.tarstav.codtar всегда 1, хотя Tar.group изменяется)
Не могу понять что неправильно, кто знает подскажите

Re: обработка запроса в цикле

Добавлено: 05 апр 2006, 08:39
Max_Fin
Логическая таблица не верна

либо она должна выглядеть так, судя по вашему коду

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

.create view Tar
var group: integer
as SELECT
 tarstav.datizm,
 klsisopl.nasisopl,
 tarstav.codtar,
 tarstav.naitar,
 tarstav.razr,
 tarstav.tarif
FROM tarstav, klsisopl
WHERE
((
  group == tarstav.codtar (noindex) and
  tarstav.sisopl == klsisopl.sisopl
));
либо

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

.create view Tar
var group: integer
as SELECT
 tarstav.datizm,
 klsisopl.nasisopl,
 tarstav.codtar,
 tarstav.naitar,
 tarstav.razr,
 tarstav.tarif
FROM tarstav, klsisopl
WHERE
((
  klsisopl.sisopl ==tarstav.sisopl and
  group == tarstav.codtar
));
но в этом случае где цикл по класификатору?

Добавлено: 05 апр 2006, 11:52
Nathaly
Большое спасибо, всё заработало

Добавлено: 05 апр 2006, 12:44
Nathaly
для приведённого примера рабочий запрос выглядит следующим образом

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

.create view Tar
var group: integer
as SELECT
 tarstav.datizm,
 klsisopl.nasisopl,
 tarstav.codtar,
 integer(substr(string(tarstav.codtar),1,length(string(tarstav.codtar))-2)) (FIELDNAME=GroupTar),
 tarstav.naitar,
 tarstav.razr,
 tarstav.tarif
FROM tarstav, klsisopl
WHERE        ((klsisopl.sisopl == tarstav.sisopl AND  ...));
вместо ... надо написать что-то типа Tar.group==GroupTar, но так писать нельзя
вопрос: как это правитьно записать?

раньше было group=tarstav.codtar, а теперь надо чтобы group было равно tarstav.codtar, но без последних двух цифр (это записано как integer(substr(string(tarstav.codtar),1,length(string(tarstav.codtar))-2)) (FIELDNAME=GroupTar) )
но если написать

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

((klsisopl.sisopl == tarstav.sisopl and
  (integer(substr(string(tarstav.codtar),1,length(string(tarstav.codtar))-2))==group)
));
то компилятор обругает нехорошими словами

Добавлено: 05 апр 2006, 14:37
Max_Fin
убрать подцепку на группу
и выполнять проверку непосредственно в цикле через интернал
что-то вроде этого

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

.{table 'Tar' 
.{?INTERNAL; (integer(substr(string(tarstav.codtar),1,length(string(tarstav.codtar))-2))=group)
вывод данных из представления Tar, например 
Tar.group и Tar.tarstav.codtar 
.}
.}

Добавлено: 05 апр 2006, 14:37
Max_Fin
убрать подцепку на группу
и выполнять проверку непосредственно в цикле через интернал
что-то вроде этого

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

.{table 'Tar' 
.{?INTERNAL; (integer(substr(string(tarstav.codtar),1,length(string(tarstav.codtar))-2))=group)
вывод данных из представления Tar, например 
Tar.group и Tar.tarstav.codtar 
.}
.}