timestamp oracle to delphi

0

Witam mam nastepujacy problem z pobieraniem daty z oracle 10g do aplikacji pisanej w Delphi 7 :

Może najpierw pokażę skrypt perspektywy z której datę chcę pobrać:

create or replace view view_loty as
select 
l.id_lotu, <font color="blue">l.data_odl, l.data_przyl,</font> p.miejsce_odlotu, p.miejsce_ladowania, f.imie  
from
loty l ,trasy p, flota f 
where
l.id_maszyny=f.id_maszyny and l.id_trasy=p.id_trasy and data_odl >(select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual)

aha , tabela w której "są trzymane" te daty zostala utworzona nastepujacym kodem:

CREATE TABLE Loty
(
id_lotu		NUMBER(10) PRIMARY KEY,
data_odl	timestamp(0),
data_przyl	timestamp(0),
id_trasy	NUMBER(10) REFERENCES Trasy(id_trasy),
id_maszyny     	NUMBER(10) REFERENCES Flota(id_maszyny)
);

proszę zwrócić uwagę na fragment
data_odl timestamp(0),
data_przyl timestamp(0),

To teraz przejdę do DELPHI , kod procedury pobierającej dane z tej perspektywy wygląda następująco:

procedure TForm1.Button11Click(Sender: TObject);
var
    lista:TListItem;
begin
    ListView3.Items.Clear;
    SQLQuery4.Active:=False;
    SQLQuery4.SQL.Clear;
    SQLQuery4.SQL.Add('SELECT id_lotu,data_odl,DATA_PRZYL,MIEJSCE_ODLOTU,MIEJSCE_LADOWANIA,IMIE   FROM view_LOTYY');
    SQLQuery4.Active:=True;
    while not SQLQuery4.Eof do     DATA_PRZYL
    begin
       lista:=ListView3.Items.Add;
       lista.Caption:=IntToStr(SQLQuery4.FieldValues['id_lotu']);
       lista.SubItems.Add(SQLQuery4.FieldValues['data_odl']);
       lista.SubItems.Add(SQLQuery4.FieldValues['data_przyl']);
       lista.SubItems.Add(SQLQuery4.FieldValues['MIEJSCE_ODLOTU']);
       lista.SubItems.Add(SQLQuery4.FieldValues['MIEJSCE_LADOWANIA']);
       lista.SubItems.Add(SQLQuery4.FieldValues['IMIE']);
       SQLQuery4.Next;
    end;
    SQLQuery4.Close;
end;

No więc dane nie wyświetlają się .... Sprawdzałem po kolei , perspektywa dziala w iSQLPlusie,
W delphi wszystkie pozostale kolumny sie wyswietlaja , ale gdy doloze te linijki z datami, to data sie nie wyswietla, moze trzeba to jakos przekonwertowac... próbowalem poprzez DateToStr, TimeToStr i nic

proszę o pomoc , jak te dane pobrać, co zmienić?

0
Query1.SQL.Text = "alter session set NLS_DATE_FORMAT = 'yyyy-mm-dd hh24:mi:ss'";
Query1.ExecSQL();

wtedy mozna modyfikować :

Field.AsString := FormatDateTime("yyyy-mm-dd hh:nn: ss", Now());
0

zamiast
SQLQuery4.FieldValues['data_odl']);

dawaj coś takiego

SQLQuery4.FieldByName('data_odl').AsString;

dostaniesz date w postaci stringa

0

dziekuje za pomoc , mam kolejne pytanie.

w bazie jest tabela Flota

CREATE TABLE Flota
(
id_maszyny      NUMBER(10) PRIMARY KEY,
imie          VARCHAR2(100) NOT NULL,
miejsca_economy	NUMBER(4) NOT NULL,
miejsca_biznes	NUMBER(4) NOT NULL,
miejsca_first	NUMBER(4) NOT NULL,
ladownosc	NUMBER(10)
);

przypisywanie klucza przy insercie odbywa sie poprzez sekwencje(autonumerowanie).

SQLQuery2.SQL.Add('INSERT INTO FLOTA VALUES (sek_Flota.NEXTVAL,'+model+','+miejsca_economy+','+miejsca_biznes+','+miejsca_first+','+ladownosc+')');

w interfejsie uzytkownik uzywa pola combobox by przypisac samolot do lotu, do wprowadzenia danych do combobox uzylem pętli

procedure TForm1.FormCreate(Sender: TObject);
var rozmiar:integer;
    i:integer;
begin
    SQLQuery3.Active:=False;
    SQLQuery3.SQL.Clear;
    SQLQuery3.SQL.Add('SELECT * FROM Flota');
    SQLQuery3.Active:=True;
    rozmiar:=1;
    while not SQLQuery3.Eof do
    begin
       setlength(flota,rozmiar);
       flota[rozmiar-1].id:=SQLQuery3.FieldByName('ID_MASZYNY').AsInteger;
       flota[rozmiar-1].nazwa:=SQLquery3.FieldByName('IMIE').AsString;
       rozmiar:=rozmiar+1;
       SQLQuery3.Next;
    end;
    SQLQuery3.Active:=False;
    ComboBox1.Items.Clear;
    for i:=0 to length(flota)-1 do
       ComboBox1.Items.Add(flota[i].nazwa);
    ComboBox1.ItemIndex:=0;
end;

wszystko dziala, ale tylko w momencie gdy id_maszyny przyjmuja kolejne wartosci (1,2,3,4,5,6)
gdy przyjmuja wartosci gdzie roznica jest wieksza niz 1 (1,2,3,4,8,9,10) to te id_maszyny(8,9,10) sa blednie przyznawane; zaś nazwy maszyn wyswietlaja sie prawidlowo.

planuje zmienic tego inserta tak, zeby po prostu pobierał wartosc klucza dla wybranego samolotu, chyba że macie pomyśl na modyfikacje pętli?

0

jeśli w bazie jes wszystko ok to może tak sproboj:

procedure TForm1.FormCreate(Sender: TObject);
var rozmiar:integer;
    i:integer;
begin
SQLQuery3.SQL.Clear;
SQLQuery3.SQL.Add('SELECT * FROM Flota');
rozmiar:=1;
ComboBox1.Items.Clear;
SQLQuery3.Open;
SQLQuery3.First;
while not SQLQuery3.Eof do begin
setlength(flota,rozmiar);
flota[rozmiar-1].id:=SQLQuery3.FieldByName('ID_MASZYNY').AsInteger;
flota[rozmiar-1].nazwa:=SQLquery3.FieldByName('IMIE').AsString;
ComboBox1.Items.Add(SQLquery3.FieldByName('IMIE').AsString);
rozmiar:=rozmiar+1;
SQLQuery3.Next;
end;
SQLQuery3.Close;
ComboBox1.ItemIndex := 0;    
end;
0

hmmm interesujace, dziekuje :)

w miedzy czasie zrobilem tak :

przypisalem tekstowa wartosc combobox do zmiennej globalnej stary_imie:string;

zmodyfikowalem inserta;

SQLQuery1.SQL.Add('INSERT INTO Loty VALUES (sek_Loty.NEXTVAL, '+data_odl+','+data_lad+','+trasa+',(select id_maszyny from flota where imie='+stary_imie+'))');

i śmiga :)

duzo latwiej jest mi wymyslec rozwiazanie w SQL ktory znam dobrze, niz w Delphi , które dopiero poznaję

1 użytkowników online, w tym zalogowanych: 0, gości: 1