Firebird / Lazarus SQL View с выбором iif? - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу выбрать строки из таблицы с вычисляемым полем, определенным запросом выбора.

Например, мой выбор может быть:

Select FirstName, 
       LastName, 
       iif(Cast('Now' as date)-BirthDate<18, 'Minor', 'Major') as StatAge 
from TableUsers;

В Lazarus я хочуфильтр на StatAge.

Я попробовал свой запрос непосредственно в моей базе данных с помощью инструмента.

Я могу фильтровать с помощью Where в моем запросе так:

Select * 
from (
  Select FirstName, 
         LastName, 
         iif(Cast('Now' as date)-BirthDate<18, 'Minor', 'Major') as StatAge 
  from TableUsers
) 
Where StatAge = 'Minor';

Но это не работает на Lazarus с TSQLQuery.Filter Я могу фильтровать по другим полям и никаких проблем.Моя проблема только с этим вычисляемым полем.

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

Мой SQL-код для создания представления приведен ниже, а ошибка

"Неудачные метаданныеобновление не может отформатировать сообщение 8: 132 - файл сообщения C: \ WINDOWS \ SYSTEM32 \ firebird.msg не найден.

Я никогда не видел этого в прошлом:

CREATE VIEW "TSTT_SELECT" ("ID_SENT", "Eng", "Char", "ID_STT", "Order", "Stat", "StartSAE", "RetSAE", "ArrSAE", "StartSHE", "RetSAE") 
AS 
Select "EMAIL_SENT"."ID", "EMAIL_SENT"."COMMANDE_TABLE", "EMAIL_SENT"."CHAR", "TSTT"."ID", "TSTT"."ORDER", iif("TSTT"."RETOUR_PREV" Is Not Null AND ("TSTT"."RETOUR_PREV">cast('Now' as date)), 'En retard', iif("TSTT"."Depart_SAE" Is Null, 'A expedier', iif("TSTT"."Depart_SAE" Is Not Null And "TSTT"."Arrivee_SHE" Is Not Null And "TSTT"."Depart_SHE" is null,'Chez le STT',iif("TSTT"."Depart_SHE" Is Not Null, 'Au depart STT', iif("TSTT"."Arrivee_SAE" Is Not Null, 'Récéptionné', ''))))) as "Statut", "TSTT"."Depart_SAE", "TSTT"."RETOUR_PREV", "TSTT"."Arrivee_SHE", "TSTT"."Depart_SHE", "TSTT"."Arrivee_SAE" 
from "EMAIL_SENT" 
   Left join "TSTT" on "EMAIL_SENT"."ID" = "TSTT"."ID_EMAIL";

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Предполагая, что ваше поле BirthDate имеет тип Date, если вы используете утилиту, такую ​​как FlameRobin, для выполнения сначала SQL, который вы цитируете в своем q, а затем следующего SQL, вы увидите, что там есть ошибка вваш SQL.Ошибка в том, что ваш iff возвращает число дней , а не лет , так что возвращаемое значение iff неверно.Я не очень знаком с Firebird SQL, поэтому в моей версии это «исправили», умножив 18 на 365, что, конечно, игнорирует високосные годы.

Select FirstName,
       LastName,
       Birthdate,
       iif(Cast('Now' as date)-BirthDate<18 * 365, 'Minor', 'Major') as StatAge ,
       Cast('Now' as date)-BirthDate
from TableUsers;

Затем я настроил минимальный проект Lazarus, описанный нижеи работает нормально, включая правильную фильтрацию по выражению edFilter.Text.

Код:

  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    edFilter: TEdit;
    SQLConnector1: TSQLConnector;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
  end;

  [...]

  procedure TForm1.Button1Click(Sender: TObject);
  begin
    if not SQLQuery1.Filtered then
      SQLQuery1.Filter := edFilter.Text
    else
      SQLQuery1.Filter := '';
    SQLQuery1.Filtered := not SQLQuery1.Filtered;
  end;

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    edFilter.Text := 'STATAGE = ''Minor''';
    SQLQuery1.Sql.Text :=
    'Select '#13#10
    + '  FirstName, '#13#10
    + '  LastName, '#13#10
    + '  Birthdate, '#13#10
    + '  iif(Cast(''Now'' as date)-BirthDate<18 * 365, ''Minor'', ''Major'') as StatAge , '#13#10
    + '  Cast(''Now'' as date)-BirthDate '#13#10
    + 'from TableUsers2;';

    SqlQuery1.Open;
  end;
0 голосов
/ 15 февраля 2019

Итак, я решил свою проблему с компонентом IBX4Lazarus.Это специальный компонент для Interbase / firebird.

Я использовал его в прошлом, потому что Firebird не был интегрирован в Lazarus.Теперь мы можем подключиться к базе данных Firebird со стандартным компонентом Lazarus, но мы видим, что есть некоторые проблемы ... Поэтому я собираюсь работать только с компонентами IBX для лучшей оптимизации.

Моя проблема в том,решается с помощью IBX4Lazarus: www.mwasoftware.co.uk

...