Interbase date format
15 отговора
378 прегледа
Interbase date format
Какъв е формата на датата на Interbase server.Опитвам се да построя заявка, която да ми върне записи за които поле от тип Date е в определен интервал.Но заявката ми връща некоректен резултат.
Струва ми се че формата на датата на IB сървъра е различен от формата на TDateTimePicker-a.
ето и самия код:
dtpFirst , dtpSecond са DateTimePicker компоненти
AJ™
Струва ми се че формата на датата на 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™
Re: Interbase date format
Датата в DateTimePicker не е само дата, а има и час в нея. Преди да я подадеш като параметър на заявката трябва да я trunc-неш:
ParamByName('FromDate').AsDate := trunc(dtpFirst.Date);
ParamByName('ToDate').AsDate := trunc(dtpSecond.Date);
ParamByName('FromDate').AsDate := trunc(dtpFirst.Date);
ParamByName('ToDate').AsDate := trunc(dtpSecond.Date);
Re: Interbase date format
Заявката не ми връща никакъв резултат.Грида е празен макар че има записи които отговарят на критерия.Когато поставя заявката в компонентата IBQuery по време на проектиране и и задам датите директно не през параметри ми връща всички записи.Датите ги задавам със следния формат напр. '12.02.2005'.
AJ™
AJ™
Re: Interbase date format
...ParamByName('FromTime').AsDateTime:=aFromTime;
...ParamByName('ToTime').AsDateTime:=aToTime;
като преди това си сетни параметрите със сигурност правилно.
...ParamByName('ToTime').AsDateTime:=aToTime;
като преди това си сетни параметрите със сигурност правилно.
Re: Interbase date format
Да обърна внимание, че в диалект 1 типа Date се различава от типа Date в диалект 3. За диалект 3 мисля, че няма нужда от трънкване, зъщото там се съхранява само датата, и горещо го препоръчвам, ако ви трябва действително само дата. С него ще си спестите доста гимнастики. И изобщо според мен, диалект 1 трябва да се използва само за обратна съвместимост.
Струва ми се, че при теб е неправилна последователността на инициализиране на параметрите и SQL текста. Мисля, че при промяна на пропертито SQL се изчистват старите параметри и се криътват новите при установен true флаг на ParamCheck.
Струва ми се, че при теб е неправилна последователността на инициализиране на параметрите и SQL текста. Мисля, че при промяна на пропертито SQL се изчистват старите параметри и се криътват новите при установен true флаг на ParamCheck.
Re: Interbase date format
За параметрите не си прав.Не се изчистват старите и не се създават нови когато се сетне SQL пропъртито.Ако не се зададат новите параметри в Param пропъртито, се извежда съобщение за грешка : 'Unknown parameter ......'
AJ™
AJ™
Re: Interbase date format
Не връща никакъв резултат.Полето SALE_DATE в таблицата SALES е от тип Date.Дали да не го направя TIMESTAMP.Тогава как трябва да сетна параметрите на заявката?
AJ™
AJ™
Редактирано от AJ™ на
Re: Interbase date format
Я пусни струкурата на таблицата, както и диалектът , а и версията на Интербейс.
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;
Сега помисли и как да го приложиш при твоя случай
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™
Re: Interbase date format
Имаш ли записи в таблицата Customers? Така както си написал заявката, се прави inner join между Sales и Customers, което без допълнително условие за join-а едва ли е правилно.
Параметрите можеш да си set-ваш така:
Работи без проблем и не се налага да слагаш явно параметрите в Params - като сложиш SQL-а, те се слагат сами, ако е нямало преди това.
Параметрите можеш да си 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-а, те се слагат сами, ако е нямало преди това.
нещо не вдявам ...
Здрасти,
някой работи не вдявам:
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 за няколко заявки с различни параметри?
Светът е малък нека си помагаме.
някой работи не вдявам:
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 за няколко заявки с различни параметри?
Светът е малък нека си помагаме.
Re: нещо не вдявам ...
Точно така.Ползвам го за няколко заявки, но не съм сигурен дали този подход е добър.
AJ™
AJ™
Re: нещо не вдявам ...
В отговор на:не съм сигурен дали този подход е добър
Имам чувството, че се опитваш "да смениш свещите през ауспуха"
Помисли дали няма да ти е по-лесно "през капака", както вече няколко колеги те посъветваха
Re: нещо не вдявам ...
Напълно си прав.Взимам си забележка, но така обекта ibqry се разрушава след като върне резултата от заявката и data-aware контролата за която ibqry е DataSet остава без данни.
AJ™
AJ™
Редактирано от AJ™ на