Maska wyświetlania danych z bazy w dbgridzie

0

Mam za zadanie stworzenie programu na zajecia. Zawiesilem sie. Podczas dodawania do bazy (firebird) jedna z kolumn jest typu small integer wiec po pobraniu informacji z RadioGroup (indeks) zapisuje go do bazy. Problem jest taki, że przy wyswietlaniu informacji w dbgridzie w tej kolumnie ma wyswietlac sie string odpowiadajacy itemom z radiogroupa.

Na przykładzie - zasilenie tej kolumny w bazie:

SQL_WLAD_D.SQL.Text:='insert into WLADAJACY (NAZWA, TYP_WLADANIA) values (:nazwa4, :typ)';
SQL_WLAD_D.ParamByName('nazwa4').AsString:=Edit5.text;
SQL_WLAD_D.ParamByName('typ').AsInteger:=RadioGroup1.ItemIndex;

Kolejnym indeksom odpowiada 0 - wlasciciel, 1 - wspolwlasciciel, 2 -uzytkownik wieczysty i w takiej postac Stringa ma sie wyswietlic w dbgridzie...

Odpada stworzenie dodatkowej kolumny w bazie - bedzie to traktowane jako powielanie danych.

Napisalem cos takiego:

i:integer;
begin
   for i:=0 to 2 do
   if SQL_WLAD.FieldByName('Typ_Wladania').AsInteger = i then
   SQL_WLAD.FieldByName('Typ').AsString := RadioGroup1.Items[i];
end;

ale nie wiem co z tym kodem zrobic zeby moj dbgrid zobaczyl 'Typ' jako kolumne do wyboru... <--w ten sposob sie bawilem gdy mialem np kolumny dlugosc, szerokosc a wyswietlalem w dgbridzie pole - korzystalem z SQLQuery zdarzenie OnCalcFields i wszystko tralało... a z tym nie wiem co zrobic.

prosze o pomoc

dodanie znaczników <code class="delphi"> - @furious programming

1

zastosuj w zapytaniu klauzulę 'CASE'

select typ,
        case 
           when typ=1 then 'tekst1'
           when typ=2 then 'tekst2' 
           when typ=3 then 'tekst3'
           else 'tekst4'
        end as opis
from tabela 
0

Dziękuje bardzo za pomoc - napisałem to tak:

select ID_W, NAZWA, CASE upper(TYP_WLADANIA)
WHEN 0 THEN 'wlasnosc'
WHEN 1 THEN 'wspolwlasnosc'
WHEN 2 THEN 'uzytkowanie wieczyste'
END AS FORMA_WLADANIA
from WLADAJACY

Nie do końca to jednak działa jak chciałem. Musze zassać do programu ID_W - jest mi niezbedne w niektorych działaniach, ale nie chce by wyswietlalo sie w dbgridzie - dlatego definiowalem dbgrida przez atrybut columns. Niestety w atrybucie kolumn prog nie widzi czegos takiego jak 'FORMA_WLADNIA'. Probowalem bez czesc

AS FORMA_WLADANIA

sqlquery realizuje poprawnie zapytania i naspisuje kolumne TYP_WLADANIA - niestety w dbgridzie wyswietla sie tylko NAZWA a kolumna z TYPEM jest pusta...

zamiana znaczników <code class="delphi"> na <code class="sql"> - @furious programming

0
CASE upper(TYP_WLADANIA)

'TYP_WLADANIA' to char czy int ??

0

TYP_WLADANIA - int

0

to w jakim celu robisz upper(int) ??
fakt że to i tak pewnie zadziała , ale jest zupełnie bez sensu

0

może w polu 'typ_wladania' nie ma żadnej wartości ze zbioru (0,1,2)
spróbuj tak:

select ID_W, NAZWA, CASE TYP_WLADANIA
WHEN 0 THEN 'wlasnosc'
WHEN 1 THEN 'wspolwlasnosc'
WHEN 2 THEN 'uzytkowanie wieczyste'
else 'typ_wladania poza zbiorem  (0,1,2)' 
END AS FORMA_WLADANIA
from WLADAJACY
0

Skorzystalem z gotowego kawałka kodu i nie zwróciłem uwagi na te UPPER...

No niestety - w bazie sa tylko wartości 0,1,2 - bo sa tylko takie indexy radiobuttonow...

0

pokaż więcej kodu

0

Tak wyglada cale zadanie:

http://ti.geomatyka.eu/aj/sdipo/zajecia.pdf

chodzi o zakladke wladajacy...

dodawanie do bazy:

procedure TForm1.Button4Click(Sender: TObject);
begin
    SQL_WLAD_D.SQL.Text:='insert into WLADAJACY (NAZWA, TYP_WLADANIA) values (:nazwa4, :typ)';
    SQL_WLAD_D.ParamByName('nazwa4').AsString:=Edit5.text;
    SQL_WLAD_D.ParamByName('typ').AsInteger:=RadioGroup1.ItemIndex;
    SQL_WLAD_D.ExecSQL;
    SQL_WLAD_D.Close;
    form1.SQLTransaction8.commit;
end;  

wyciaganie z bazy do dbgrida -> tu mamy powyzsze SQLQuery i podpiete pod DBGrida DataSource

jak widac w pdfie - program jest pisany w lazarusie...

0

masz problem z odczytem więc pokaz kod czytający a nie zapisujący
w jaki sposób budujesz kolumny w dbgridzie ?

0

Component dbGrid -> Columns -> Add (dodaje tyle kolumn ile potrzebuje - czyli 2) -> teraz atrybut dodanej kolumny FieldName (tu wybieram z listy rozwijalnej - na liscie nazwy kolumn takie jak w bazie danych czyli ID_W, NAZWA, TYP_WLADANIA) do pierwszej kolumny daje NAZWA do drugiej TYP_WLADANIA

0

na początek usuń z grida wszystkie kolumny , po wykonaniu zapytania utworzą się automatycznie

0

Dodałem z ręki kolumne FORMA_DZIAŁANIA i działa...

Dziękuje za pomoc - myśle że temat zamknięty

0

Albo jeszcze jedno pytanie - pasuje do tematu...

W zakladce obreb dodaje do bazy rekordy zawierajace ID_O i NAZWE i wyswietlam tylko NAZWE... Jednak w tabeli PUNKT w bazie obreb jest typu int. Wiec dodajac punkt dodaje do bazy zamieas nazwy obrebu - jego id. Ale wyswietlajac TABELE Punkt w dbGridzie nie chcialbym miec w kolumnie OBREB uwidocznionego id obrebu ale wlasnie jego nazwę (tak jak zadanie przewiduje)....

moja zapytanie w tej chwili to proste

select * from PUNKT

;
tworze columns - NR, X, Y, OBREB.

nie wiem jak ulozyc zapytanie bo program musi pobrac Nr, X, Y z tabeli PUNKT a nazwe obrebu z tabeli OBREB (na podstawie wartosci ID_0 ktora jest zarowno w tabeli PUNKT jak i OBREB). SQL nie jest moja najmocniejsza strona...

1

poczytaj o złączeniach tabel . tu masz na szybko podpowiedź

select nr,x,y,nazwa from PUNKT,OBREB where PUNKT.id_0=OBREB.id_0
1
mk_z_s napisał(a):

Dodałem z ręki kolumne FORMA_DZIAŁANIA i działa...

Dziękuje za pomoc - myśle że temat zamknięty

Może i zamknięty, ale rozwiązanie dyskusyjne...
Dlaczego nie obsłużysz zdarzenia OnGetText właściwego pola DataSetu?
Zadziała tak jak chcesz - czyli na kliencie.
Nie trzeba niczego zmieniać w SelectSQL, wszystkie CASE nie są konieczne.

0

Dlaczego? Dlatego...ze nie wiem jak. Po to prosilem o pomoc - dostalem wskazowke, wykorzystalem i dziala.

Poprosze o wiecej wskazowek to postaram sie zrobic to w inny sposob ...

Nie korzystalem w moim zadania z DataSetu --> wszystko robie poslugujac sie SQLQuery+SQLTransaction+DataSource - tam nie znalazlem metody ongettext

0

idąc za podpowiedzią @wloochacza ....
tego raczej nie znajdziesz w inspektorze obiektów , można to zrobić z poziomu kodu np tak :

procedure TForm1.gettext(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  if Sender.AsInteger = 1 then
    Text := 'mój tekst '
  else
    Text := Sender.AsString;
end;
self.sqlquery1.Fields[0].OnGetText := gettext; 

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