1 (edited by ivan 2019-03-23 09:40:03)

Topic: Помогите с отчетом пожалуйста

На форме frmMain имеется button5 которая выдает отчет за период от DTP1 до DTP2. Надо еще в этом отчете внедрить name из таблицы oper. Отчет должен выглядеть как на рисунке 2. Помогите с реализацией пожалуйста.

Post's attachments

Attachment icon Project.zip 54.27 kb, 58 downloads since 2019-03-23 

Re: Помогите с отчетом пожалуйста

Решил задачу сам. Как мне поставить порядковый номер в отчете?. Проект прилагается.

Post's attachments

Attachment icon Project.zip 21.02 kb, 60 downloads since 2019-03-23 

Re: Помогите с отчетом пожалуйста

Номер напротив фамилии? к сожалению я не смог найти способ, как это сделать.

Dmitry.

Re: Помогите с отчетом пожалуйста

1. Да с номером напротив каждой фамилии.
2. При выводе отчета идет наслоение данных. Как сделать отчет показанный на рисунке. Проект с рисунком прилагается.

Спасибо заранее.

Post's attachments

Attachment icon Project.zip 107.99 kb, 57 downloads since 2019-03-27 

Re: Помогите с отчетом пожалуйста

ivan wrote:

1. Да с номером напротив каждой фамилии.
2. При выводе отчета идет наслоение данных. Как сделать отчет показанный на рисунке. Проект с рисунком прилагается.

Спасибо заранее.

2. Необходимо добавить на страницу PageHeader, также gif рисунки не поддерживаются, сделал png. Исправленный проект:

Post's attachments

Attachment icon Project_fixed.zip 125.19 kb, 71 downloads since 2019-03-27 

Dmitry.

Re: Помогите с отчетом пожалуйста

Спасибо большое. Как же быть с порядковым номером напротив фамилий? Можно ли реализовать это как то по другому?

Re: Помогите с отчетом пожалуйста

Нашел способ, с помощью такого SQL запроса

select 
       (SELECT COUNT(*)
        FROM patient AS t2
        WHERE t2.fio <= patient.fio) || '. ' || patient.fio as "FIO",
                                     
       patient.date,
       main.kol,    
       oper.name as opername,
       tovar.name as tovarname,
       strftime('%d.%m.%Y', {DTP1}) as DTP1,
       strftime('%d.%m.%Y', {DTP2}) as DTP2
       
from   patient,          
       main,
       oper,     
       tovar
      
                    
where  oper.id = patient.id_oper
  and  tovar.id = main.id_tovar
  and  patient.id = main.id_patient
  and
 (CASE WHEN {DTP1} IS NOT NULL THEN date(patient.date) >= date({DTP1}) ELSE 1=1 END)
  and
 (CASE WHEN {DTP2} IS NOT NULL THEN date(patient.date) <= date({DTP2}) ELSE 1=1 END)
;    

 



Доработанный проект:

Post's attachments

Attachment icon Project_fixed2.zip 125.15 kb, 75 downloads since 2019-03-28 

Dmitry.

Re: Помогите с отчетом пожалуйста

Огромное спасибо! Есть одна загвоздка. В отчете порядковый номер идет вместе с фамилией в одной ячейке. Я немного хотел изменить ваш скрипт и сделал типа так:
select
       (SELECT COUNT(*)
        FROM patient AS t2
        WHERE t2.fio <= patient.fio) || '. ' || as "Number",
        patient.fio,

       patient.date,
       main.kol,   
       oper.name as opername,
       tovar.name as tovarname,
       strftime('%d.%m.%Y', {DTP1}) as DTP1,
       strftime('%d.%m.%Y', {DTP2}) as DTP2
       
но при нажатии на отчет выдает ошибку Error Message: near "as": syntax error.

Далее я изменил скрипт на это и она заработала, но порядковый номер идет без точки после номера. То есть я хотел чтобы номер был в одной колонке с точкой, а фамилия в другой колонке :
select
       (SELECT COUNT(*)
        FROM patient AS t2
        WHERE t2.fio <= patient.fio) as "Number",
        patient.fio,

       patient.date,
       main.kol,   
       oper.name as opername,
       tovar.name as tovarname,
       strftime('%d.%m.%Y', {DTP1}) as DTP1,
       strftime('%d.%m.%Y', {DTP2}) as DTP2
       
Можно ли сделать чтобы и точка была после номера?

Re: Помогите с отчетом пожалуйста

Попробуйте так

SELECT 
       (SELECT COUNT(*)
        FROM patient AS t2
        WHERE t2.fio <= patient.fio) || '.' as "Number",
                                     
       patient.fio,                 
       patient.date,
       main.kol,                   
       oper.name as opername,
       tovar.name as tovarname,
       strftime('%d.%m.%Y', {DTP1}) as DTP1,
       strftime('%d.%m.%Y', {DTP2}) as DTP2
       
from   patient,          
       main,
       oper,     
       tovar
      
                    
where  oper.id = patient.id_oper
  and  tovar.id = main.id_tovar
  and  patient.id = main.id_patient
  and
 (CASE WHEN {DTP1} IS NOT NULL THEN date(patient.date) >= date({DTP1}) ELSE 1=1 END)
  and
 (CASE WHEN {DTP2} IS NOT NULL THEN date(patient.date) <= date({DTP2}) ELSE 1=1 END);    
Dmitry.

10 (edited by ivan 2019-03-29 13:22:45)

Re: Помогите с отчетом пожалуйста

Огромное спасибо! Помогло. Кстати если в базе имеется два одинаковых фамилий то номер сразу удваивается. Например должно быть так:
1. Иванов А.
2. Федоров У.
3. Петров И.
4. Петров И.
а выглядит так:
1. Иванов А.
3. Петров И.
4. Федоров У.
Как быть?

Re: Помогите с отчетом пожалуйста

Попробуйте так

select 
       (SELECT COUNT(*)
        FROM patient AS t2
        WHERE t2.id <= patient.id) || '.' as "Number",
                                     
       patient.fio,                 
       patient.date,
       main.kol,                   
       oper.name as opername,
       tovar.name as tovarname,
       strftime('%d.%m.%Y', {DTP1}) as DTP1,
       strftime('%d.%m.%Y', {DTP2}) as DTP2
       
from   patient,          
       main,
       oper,     
       tovar
      
                    
where  oper.id = patient.id_oper
  and  tovar.id = main.id_tovar
  and  patient.id = main.id_patient
  and
 (CASE WHEN {DTP1} IS NOT NULL THEN date(patient.date) >= date({DTP1}) ELSE 1=1 END)
  and
 (CASE WHEN {DTP2} IS NOT NULL THEN date(patient.date) <= date({DTP2}) ELSE 1=1 END); 
Dmitry.

Re: Помогите с отчетом пожалуйста

Спасибо работает.
Если не выбрать даты DTP1 и DTP2 то номера идут по порядку, так как идет счет всей базы. Но если выбрать даты то счет не изменяется. На примере покажу.
Если не выбрать даты:
1. Иванов А.       20.03.19
2. Федоров У.    22.03.19
3. Петров И.       25.03.19
4. Петров И.       30.03.19
5. Куганов П.      30.03.19
это нормально, но если выбрать DTP1 = 23.03.19 и DTP2 = 31.03.19 выглядит так:
3. Петров И.       25.03.19
4. Петров И.       30.03.19
5. Куганов П.      30.03.19
а должно быть:
1. Петров И.       25.03.19
2. Петров И.       30.03.19
3. Куганов П.      30.03.19
Как исправить скрипт? Помогите пожалуйста.

Re: Помогите с отчетом пожалуйста

Попробуйте такой SQL запрос

select 
       (SELECT COUNT(*)
        FROM patient AS t2
        WHERE t2.id <= patient.id AND 
             (CASE WHEN {DTP1} IS NOT NULL THEN date(t2.date) >= date({DTP1}) ELSE 1=1 END)
              and                                       
             (CASE WHEN {DTP2} IS NOT NULL THEN date(t2.date) <= date({DTP2}) ELSE 1=1 END)                
        ) || '.' as "Number",
                                     
       patient.fio,                                   
       patient.date,
       main.kol,                                                       
       oper.name as opername,
       tovar.name as tovarname,
       strftime('%d.%m.%Y', {DTP1}) as DTP1,
       strftime('%d.%m.%Y', {DTP2}) as DTP2
       
from   patient,          
       main,
       oper,     
       tovar
                                                                
                    
where  oper.id = patient.id_oper
  and  tovar.id = main.id_tovar
  and  patient.id = main.id_patient
  and
 (CASE WHEN {DTP1} IS NOT NULL THEN date(patient.date) >= date({DTP1}) ELSE 1=1 END)
  and
 (CASE WHEN {DTP2} IS NOT NULL THEN date(patient.date) <= date({DTP2}) ELSE 1=1 END);   
Dmitry.

Re: Помогите с отчетом пожалуйста

Спасибо большое, теперь работает.