Topic: Cross tab + sql

Помогите пожалуйста!
как положить отчетах в определенную ячейку Cross tab sql запрос типа
var
s:string;                                     
begin
s := SQLExecute('SELECT count(*) FROM osn WHERE (osn.fam=иванов)');
end;
ругается на SQLExecute.
есть очень большая таблица в которой надо подсчет строк из запроса, по полу + возрасту (возраст надо высчитать из даты рожд) + диагнозу и ложить результат в определенную ячейку.
Спасибо!

Re: Cross tab + sql

К сожалению воспрос не очень ясен, пожалуйста опишите подробней.

Dmitry.

3 (edited by pt.82 2016-09-08 14:57:21)

Re: Cross tab + sql

Хотел сделать таблицу в отчете с помощью компонента Cross tab. только что бы каждая ячейка таблицы заполнялась с помощью скрипта в котором был бы запрос в главную таблицу. запрос будет считать с помощью SELECT count(*) только количество строк по WHERE (условие). например в ячейку 1.1 положить количество строк удовлетворяющее условию возраст=35 + мужчина, а например в ячейку 1.2  положить количество строк удовлетворяющее условию возраст 35 + женщина.

ячейка 1.1
procedure Cross1OnBeforePrint(Sender: TfrxComponent);
var
s:string;   
begin
s := SQLExecute('SELECT count(*) FROM osn WHERE (osn.vozrast=35) and (osn.sex=М)'); //ругается на SQLExecute неизвестный идентификатор
//что надо написать чтобы Cross1 вставилось значение переменной s
end;

ячейка 1.2

procedure Cross2OnBeforePrint(Sender: TfrxComponent);
var
a:string;   
begin
a := SQLExecute('SELECT count(*) FROM osn WHERE (osn.vozrast=35) and (osn.sex=Ж)');
end;

делал sql отчет на кнопку, но туда можно засунуть только 1 запрос, подскажите как сделать может какой другой есть способ. в итоге должна получиться большая таблица я чейки котрой будут заполняться запросами функцией count(*)
не ругайте сильно я только учусь

4 (edited by pt.82 2016-09-09 03:55:54)

Re: Cross tab + sql

в FastReports
делаю так ругается на SQLExecute "Undeclared identifier:SQLExecute"

procedure Cross1OnBeforePrint(Sender: TfrxComponent);
var s, a:integer;
begin
s:=SQLExecute('SELECT count(*) FROM osn WHERE (osn.vozrast=35) and (osn.sex=М)');
a:=SQLExecute('SELECT count(*) FROM osn WHERE (osn.vozrast=35) and (osn.sex=Ж)');                 
with Cross1 do
begin
AddValue(['C00-C0099 M'], [2], [s]);
AddValue(['C00-C0099 Ж'], [1], [a]);
end;

делаю так все нормально

procedure Cross1OnBeforePrint(Sender: TfrxComponent);
var s, a:integer;
begin
s:=500;
a:=10;                 
with Cross1 do
begin
AddValue(['C00-C0099 M'], [2], [s]);
AddValue(['C00-C0099 Ж'], [1], [a]);
end;

этот же скрипт в MVD работает

procedure Form1_Edit6_OnClick (Sender: string);
var s,a:integer;
begin
s:=SQLExecute('SELECT count(*) FROM osn WHERE (osn.vozrast=35) and (osn.sex=М)');
a:=SQLExecute('SELECT count(*) FROM osn WHERE (osn.vozrast=35) and (osn.sex=Ж)'); 
Form1.Edit6.Text := inttostr (s);
Form1.Edit7.Text := inttostr (a);
end;

FastReports не знает SQLExecute?
может можно что бы данные запросов передались в шаблон экселя? такого рода запросов в отчете будет примерно 300 на кажд ячейку свой запрос.

Re: Cross tab + sql

pt.82
Приветствую,


Добавил функцию SQLExecute в скрипты отчета, скачайте пожалуйста бета версию 2.8
https://www.dropbox.com/s/k1wd8mqe3qb35 … a.zip?dl=0

Dmitry.

6 (edited by pt.82 2016-09-13 09:49:18)

Re: Cross tab + sql

Дмитрий! Спасибо!
Следом еще вопрос:
В базе поле Age вичисляемое по дате рождения, считает все правильно.
в FastReports делаю так

procedure Cross1OnBeforePrint(Sender: TfrxComponent);
var a10 :integer;
begin
a10:=SQLExecute('SELECT count(*) FROM osn WHERE (osn.id_sex=1)and(osn.id_mkb>=1)and(osn.id_mkb<=500)and(osn.age=30)');
with Cross1 do
begin
AddValue(['C00-C0099 M'], [1], [a10]);
end;
end;
begin
  
end.

получается поле age символьное не считает, выдает ошибка, в AddValue можно запихать только число?
если я убираю osn.age=30 все норм
или может быть можно вычис поле возраст(age) сделать чтоб в базу записывалось не символьное поле, а целое число


вот сейчас понял вычисляемое поле - это поле не записывается в базу? как можно сделать чтобы поле Age при запуске программы или запуске отчета пересчитывалось и значение возраста записывалось в базу, это поле очень нужно, вручную ставить нельзя, возраст у человека изменяемый

или возможно ли сделать на форме кнопку "подсчитать возраст", которая бы высчитывала бы возраст от сегоднешней даты - дата рождения и изменяла бы записи поля age таблицы osn

Post's attachments

Attachment icon Безымянный.jpg 15.25 kb, 244 downloads since 2016-09-13 

Re: Cross tab + sql

pt.82
Как правило лучше не хранить в базе те значения, которые можно вычислить.  В вашем запросе просто замените "osn.age" на запрос, который записан в вычисляемом поле.

Dmitry.

8 (edited by pt.82 2016-09-14 02:04:18)

Re: Cross tab + sql

я так пробывал выдает ошибка синтаксис ерор, пытался всячески писать ругался на date(now), на case

a10:=SQLExecute('SELECT count(*) FROM osn WHERE (osn.id_sex=1)and(osn.id_mkb>=1)and(osn.id_mkb<=500)and((date(now) - dr + (case when strftime(%m-%d, now) < strftime(%m-%d, dr) then -1 else 0 end))=30)');

я понимаю что туплю,  если удаться реализовать такой отчет, руководство вынужденно будет приобрести лицензию на MVD, потомучто функция SQLExecute реализовано в отчетах только с 2.8

Post's attachments

Attachment icon Безымянный.jpg 14.91 kb, 250 downloads since 2016-09-14 

9 (edited by pt.82 2016-09-14 07:25:46)

Re: Cross tab + sql

вроде разобрался, нашел ошибку, пытаюсь сделать огромную таблицу состоящую из 2000 ячеек, надеюсь он не будет зависать при обработке базы из 5 тыс человек.
вопрос знатокам может есть способ другой, сейчас буду делать, по странично на каждую страничку будет своя кнопка или комбобоксом еще не решил. на странице примерно будет 400 ячеек, соответсвенно и в скрипте будет 400 переменных которые будут ложится в ячейки. Вопрос а надо как то память очищать пр закрытии отчета, значение переменных из памяти тоже чистятся?

или вообще может есть способ более простой реализовать такой отчет?

Re: Cross tab + sql

pt.82 wrote:

вроде разобрался, нашел ошибку, пытаюсь сделать огромную таблицу состоящую из 2000 ячеек, надеюсь он не будет зависать при обработке базы из 5 тыс человек.
вопрос знатокам может есть способ другой, сейчас буду делать, по странично на каждую страничку будет своя кнопка или комбобоксом еще не решил. на странице примерно будет 400 ячеек, соответсвенно и в скрипте будет 400 переменных которые будут ложится в ячейки. Вопрос а надо как то память очищать пр закрытии отчета, значение переменных из памяти тоже чистятся?

или вообще может есть способ более простой реализовать такой отчет?

Очищать переменные не нужно.


Скорей всего можно сделать данный отчет и проще, но как правило я могу помочь только с конкретными вопросами.

Dmitry.

Re: Cross tab + sql

Нашел другой способ.
помещать данные запроса прям в таблицу

SQLExecute('insert into repf (mk,sum,v1,v2,v3,v4) values (("C03-C06, C09 М"),(SELECT count(*) FROM osn WHERE ....

затем результат выводить в grid и уже потом в эксель, при 87 записях таблицы будет 87 запросов, перед каждым нажатием "Сформировать отчет" таблица будет чиститься

Спасибо!