Interbase date format

15 отговора 378 прегледа
#1

Interbase date format

Какъв е формата на датата на Interbase server.Опитвам се да построя заявка, която да ми върне записи за които поле от тип Date е в определен интервал.Но заявката ми връща некоректен резултат.
Струва ми се че формата на датата на IB сървъра е различен от формата на TDateTimePicker-a.
ето и самия код:

procedure TInquireForm.Button1Click(Sender: TObject);
var
OldParams: TParams;
begin
with OMDataModule.qryCustomers do
begin
OldParams := Params;
Params.CreateParam(ftDate,'FromDate', ptInput);
Params.CreateParam(ftDate,'ToDate', ptInput);
ParamByName('FromDate').AsDate := dtpFirst.Date;
ParamByName('ToDate').AsDate := dtpSecond.Date;
Close();
SQL.Clear();
SQL.Add('SELECT * FROM Customers, Sales ' +
'WHERE SALES.SALE_DATE BETWEEN :FromDate and :ToDate');
Open();
Params := OldParams;
end;
end;


dtpFirst , dtpSecond са DateTimePicker компоненти

AJ™
Отговор
в отговор на AJ™ #2

Re: Interbase date format

Датата в DateTimePicker не е само дата, а има и час в нея. Преди да я подадеш като параметър на заявката трябва да я trunc-неш:

ParamByName('FromDate').AsDate := trunc(dtpFirst.Date);
ParamByName('ToDate').AsDate := trunc(dtpSecond.Date);

Отговор
в отговор на andrew_nikoloff #3

Re: Interbase date format

Заявката не ми връща никакъв резултат.Грида е празен макар че има записи които отговарят на критерия.Когато поставя заявката в компонентата IBQuery по време на проектиране и и задам датите директно не през параметри ми връща всички записи.Датите ги задавам със следния формат напр. '12.02.2005'.

AJ™
Отговор
в отговор на AJ™ #4

Re: Interbase date format

...ParamByName('FromTime').AsDateTime:=aFromTime;
...ParamByName('ToTime').AsDateTime:=aToTime;

като преди това си сетни параметрите със сигурност правилно.

Отговор
в отговор на AJ™ #5

Re: Interbase date format

Да обърна внимание, че в диалект 1 типа Date се различава от типа Date в диалект 3. За диалект 3 мисля, че няма нужда от трънкване, зъщото там се съхранява само датата, и горещо го препоръчвам, ако ви трябва действително само дата. С него ще си спестите доста гимнастики. И изобщо според мен, диалект 1 трябва да се използва само за обратна съвместимост.

Струва ми се, че при теб е неправилна последователността на инициализиране на параметрите и SQL текста. Мисля, че при промяна на пропертито SQL се изчистват старите параметри и се криътват новите при установен true флаг на ParamCheck.

Отговор
в отговор на NDeu #6

Re: Interbase date format

За параметрите не си прав.Не се изчистват старите и не се създават нови когато се сетне SQL пропъртито.Ако не се зададат новите параметри в Param пропъртито, се извежда съобщение за грешка : 'Unknown parameter ......'

AJ™
Отговор
в отговор на Xoxo #7

Re: Interbase date format

Не връща никакъв резултат.Полето SALE_DATE в таблицата SALES е от тип Date.Дали да не го направя TIMESTAMP.Тогава как трябва да сетна параметрите на заявката?

AJ™

Редактирано от AJ™ на

Отговор
в отговор на AJ™ #8

Re: Interbase date format

Я пусни струкурата на таблицата, както и диалектът , а и версията на Интербейс.

Отговор
в отговор на AJ™ #9

Re: Interbase date format

Не е ли по-добре да пробваш
Напр:

procedure TForm1.Button1Click(Sender: TObject);
var
S:string;
ibqry:TIBQuery;
begin
ibqry:=TIBQuery.Create(self);
try
S:=IntToStr(ibqry.ParamCount);
ibqry.SQL.Text:='select alabala from blabla where a=:Par1 and b=:Par2' ;

ShowMessage(S+#13+IntToStr(ibqry.ParamCount));
finally
ibqry.Free;
end;
end;


Сега помисли и как да го приложиш при твоя случай

Отговор
в отговор на Xoxo #10

Re: Interbase date format


SET SQL DIALECT 3;
SET NAMES WIN1251;

CREATE TABLE SALES (
SALE_ID INTEGER NOT NULL,
CUSTOMER_ID INTEGER NOT NULL,
DOC_ID INTEGER NOT NULL,
DOC_NO INTEGER,
SALE_DATE DATE NOT NULL,
TOTAL_PRICE NUMERIC(15,2) NOT NULL
);

сървъра е IB 7.5

AJ™
Отговор
в отговор на AJ™ #11

Re: Interbase date format

Имаш ли записи в таблицата Customers? Така както си написал заявката, се прави inner join между Sales и Customers, което без допълнително условие за join-а едва ли е правилно.

Параметрите можеш да си set-ваш така:

...
ibqry.SQL.Text:='select alabala from blabla where a=:Par1 and b=:Par2';
ibqry.ParamByName('Par1').AsSomething := ...;
ibqry.ParamByName('Par2').AsSomethingElse := ...;
...
ibqry.Open;
...

Работи без проблем и не се налага да слагаш явно параметрите в Params - като сложиш SQL-а, те се слагат сами, ако е нямало преди това.

Отговор
в отговор на AJ™ #12

нещо не вдявам ...

Здрасти,

някой работи не вдявам:
1. Защо ти е oldParams
2. Защо след като отвориш Queryto му пипаш параметрите

Аз бих действал по следния начин:

with OMDataModule.qryCustomers do
begin
Close();
SQL.Text := 'SELECT * FROM Customers, Sales ' +
'WHERE SALES.SALE_DATE BETWEEN :FromDate and :ToDate';
Params.CreateParam(ftDate,'FromDate', ptInput);
Params.CreateParam(ftDate,'ToDate', ptInput);
ParamByName('FromDate').AsDate := dtpFirst.Date;
ParamByName('ToDate').AsDate := dtpSecond.Date;
Open;
end;


P.S. Сега като се позамислих .... да не би да ползваш Querito за няколко заявки с различни параметри?

Светът е малък нека си помагаме.
Отговор
в отговор на Vermax #13

Re: нещо не вдявам ...

Точно така.Ползвам го за няколко заявки, но не съм сигурен дали този подход е добър.

AJ™
Отговор
в отговор на AJ™ #14

Re: нещо не вдявам ...

В отговор на:

не съм сигурен дали този подход е добър



Имам чувството, че се опитваш "да смениш свещите през ауспуха"
Помисли дали няма да ти е по-лесно "през капака", както вече няколко колеги те посъветваха

Отговор
в отговор на NDeu #15

:)

NDeu,

знаех си аз, че разбираш от коли ...

Светът е малък нека си помагаме.
Отговор
в отговор на NDeu #16

Re: нещо не вдявам ...

Напълно си прав.Взимам си забележка, но така обекта ibqry се разрушава след като върне резултата от заявката и data-aware контролата за която ibqry е DataSet остава без данни.

AJ™

Редактирано от AJ™ на

Отговор