[ prginfo @ 14.03.2009. 10:51 ] @
Koristim D2007 i FB bazu.

Da li postoji mogucnost da se prilikom pokretanja maske iscita struktura neke tabele iz baze i na osnovu toga da se odredjuju odredjena svojstva objekata.

NPR. Ako je u tabeli polje NOT NULL, da TDBEdit koji je vezan za to polje ima sledece svojstvo DBEdit1.Color:=clRed;

Ako postoji mogucnost, kako to da uradim i da li postoje neke restrikcije.

Hvala.
[ captPicard @ 14.03.2009. 12:15 ] @
Naravno :-)

select r.rdb$field_name,
t.rdb$type_name,
f.rdb$field_length,
r.rdb$null_flag,
f.rdb$validation_source

from rdb$relation_fields r, rdb$types t, rdb$fields f

where r.rdb$relation_name='EMPLOYEE' and
f.rdb$field_name=r.rdb$field_source and
t.rdb$field_name='RDB$FIELD_TYPE' and
f.rdb$field_type=t.rdb$type;

if SQL.FieldByName('RDB$NULL_FLAG').IsNull then
DBEdit1.Color := clRed;
[ prginfo @ 14.03.2009. 12:24 ] @
A u koji deo koda ovo da stavim. Da li da postavim neku komponentu Query ili slicno. Kako da mi ovaj deo radi prilikom iscrtavanje maske (OnShow ili OnCreate npr.)?

Hvala
[ prginfo @ 14.03.2009. 12:29 ] @
I jos nesto. Kako da kazem sledece:

Izaberi sve Edite na nekom panelu, i za sve koji su u bazi NULL stavi color Red, pa onda else color White.

Verovatno nekom petljom

for I:=0 to Panel1.Edit - 1 do
begin
end;

Hvala jos jednom.
[ captPicard @ 15.03.2009. 17:54 ] @
Da, stavi jedan Query na formu i stavi mu taj upit.

A za sve edite u panelu napravi ovako nešto:

iz querya izvuci pomoću onog upita sve nazive polja koja imaju null vrijednost (stavi u where dio uvjet da je null) i onda ovako nekako:

query.First;
while not query.eof do
begin
for i := 0 to ComponentCount - 1 do
begin
if Components*i* is TDBEdit then
begin
if TDBEdit(Components*i*).DataField = FieldByName('Naziv_polja').AsString then
TDBEdit(Components*i*).Color := clRed else
TDBEdit(Components*i*).Color := clWhite;
end;
end;
Next;
end;

Može i "pametnije", ali i ovako će ti biti ok :-)

Nadam se da si skužio, ako ne, viči :-)

p.s. kada sam objavio post, vidim da mi ne prikazuje uglate zagrade, ali mislim da ćeš skužiti di dođu (staviti ću *)... :-)
[ prginfo @ 16.03.2009. 09:19 ] @
Napravi mi break na delu

FieldByName

greska je undeclared identifier.

U SQL-u sam naravno promenio ime baze sa EMPLOYEE na MOJABAZA, kako se i zove baza na kojoj ovo isprobavam.

F1
[ captPicard @ 16.03.2009. 09:36 ] @
Query.FieldByName('POLJE').AsString;

Mislio sam da ćeš znati da treba Query prije :-)
[ prginfo @ 16.03.2009. 09:48 ] @
Izvini, moja greska. Ubacio sam i sada mi kompajlira i pokrece normalno, samo sto se nista ne desava, tj. da bih isprobao, stavio sam sve TDBEdite u sivu boju.
Kada pokrenem program, ostaje mi siva boja.

?
[ captPicard @ 16.03.2009. 11:09 ] @
Napiši ovdje kod.

I tamo di je NExt isto napiši Query.Next
[ prginfo @ 16.03.2009. 11:43 ] @
Hvala jos jednom, ali i dalje se nista ne menja.

Stavio sam:

if TDBEdit (Components).DataField = qBOJAPOLJA.FieldByName('RDB$NULL_FLAG').IsNull then
TDBEdit(Components).Color := clRed else
TDBEdit(Components).Color := clWhite;

Javlja mi Incompatible types 'WideString' and 'Boolean'

Probao sa da dodam i =True iza .IsNull ali i dalje prijavljuje gresku.

?
[ captPicard @ 16.03.2009. 11:53 ] @
Ma krivo si napravio. U select query-a stavi samo select r.rdb$field_name
a u where dio dodaj where r.rdb$null_flag is null

kužiš?

tebaš izvaditi NAZIVE POLJA di je null_flag

i onda u petlju stavi

:= Query.FieldByName('NAZIV_POLJA').AsString


[ prginfo @ 16.03.2009. 12:23 ] @
Ja sam kod queryja u SQL stavio sledece:

Code:

select r.rdb$field_name, 
t.rdb$type_name,
f.rdb$field_length,
r.rdb$null_flag,
f.rdb$validation_source 

from rdb$relation_fields r, rdb$types t, rdb$fields f 

where r.rdb$relation_name='MOJA BAZA' and 
f.rdb$field_name=r.rdb$field_source and 
t.rdb$field_name='RDB$FIELD_TYPE' and 
f.rdb$field_type=t.rdb$type;

a onda OnFormShow sledece:

var
 i:Integer;
 begin
  qBOJAPOLJA.Close;
  qBOJAPOLJA.Prepare;
  qBOJAPOLJA.Open;
  while not qBOJAPOLJA.Eof do
   begin
     for i := 0 to ComponentCount - 1 do
      begin
        if Components[i] is TDBEdit then
         begin
           if TDBEdit (Components[i]).DataField = qBOJAPOLJA.FieldByName('NAZIV_POLJA').IsNull then
           TDBEdit(Components[i]).Color := clRed else
           TDBEdit(Components[i]).Color := clWhite;
         end;
      end;
     qBOJAPOLJA.Next;
   end;


Da li u where deo da dodam i

r.rdb$null_flag=NULL

?

EDIT - savkic: Koristi code tagove za ispisivanje koda, lakše je pratiti.

[Ovu poruku je menjao savkic dana 16.03.2009. u 13:49 GMT+1]
[ captPicard @ 16.03.2009. 12:39 ] @
Skoro pa ti je ok :-)

da, u where dio sql upita dodaj where r.rdb$null_flag IS NULL

i pazi, u petlji promijeni ovo:

qBOJAPOLJA.FieldByName('NAZIV_POLJA').IsNull then

u ovo:

qBOJAPOLJA.FieldByName('NAZIV_POLJA').AsString then

Moraš paziti kako radiš provjere, jer u izrazu

if TDBEdit (Components).DataField = qBOJAPOLJA.FieldByName('NAZIV_POLJA').IsNull then

moraš za .DataField dati naziv polja, a ti mu tu stavljaš .IsNull.

Ispravi to i moralo bi raditi.

Ako ne, javi.
[ rambo @ 16.03.2009. 12:53 ] @
Svo vreme grešiš kod dela koda koji prolazi kroz tvoje komponente na formi.

Zameni deo koda

Code:

if Components is TDBEdit then

sa
Code:

if Components[i] is TDBEdit then

i posle toga svugde gde ti se pominje Components zameni sa Components[ i ].

Inače, metod koji ti je izložio captPicard je jedan od više mogućih i nije baš najsrećnije rešenje. Moja preporuka ti je da iskoristiš ugrađene osobine DataSeta i Field objekata u njemu da bi postigao isti efekat na predviđeni način.

P.S.: Trudi se da programski kod stavljaš pod code tagove (imaš sa leve strane) radi boljeg formatiranja.

[Edit] Uh, sad videh da se ove uglaste zagrade nisu videle zbog toga što ti kod nije bio u code tagovima.
[ captPicard @ 16.03.2009. 13:06 ] @
Znam da je to samo jedno od rješenja, ali rekao sam mu da ima i "pametnijih" :-)

Hvala za savjet, nisam vidio ovo sa lijeve strane :-)
[ prginfo @ 16.03.2009. 14:02 ] @
Problem mi je izgleda sledeci:

select r.rdb$field_name,
t.rdb$type_name,
f.rdb$field_length,
r.rdb$null_flag,
f.rdb$validation_source

from rdb$relation_fields r, rdb$types t, rdb$fields f

where r.rdb$relation_name='MOJA_BAZA' and
f.rdb$field_name=r.rdb$field_source and
t.rdb$field_name='RDB$FIELD_TYPE' and
r.rdb$null_flag is NULL and
f.rdb$field_type=t.rdb$type;

mi ne vraca ni jedan rezultat.

?
[ captPicard @ 16.03.2009. 14:21 ] @
Probaj napraviti ovako:

where r.rdb$relation_name='NAZIV_TABLICE' and

i

r.rdb$null_flag = 1 and
[ prginfo @ 16.03.2009. 14:41 ] @
To sam isprobao sam pre nego sto sam video post i SQL mi vraca rezultate, ali sada imam problem da mi ne vidi koja polja su null (tj. =1), vec mi sva polja oboji u belo.

Da li moram nekako posebno da definisem nazive TDBEdit polja ili je nesto drugo posredi?
[ captPicard @ 16.03.2009. 14:56 ] @
select r.rdb$field_name naziv_polja,
t.rdb$type_name,
f.rdb$field_length,
r.rdb$null_flag,
f.rdb$validation_source

Si promjenio ovo

if TDBEdit (Components).DataField = qBOJAPOLJA.FieldByName('NAZIV_POLJA').IsNull

u

if TDBEdit (Components).DataField = qBOJAPOLJA.FieldByName('naziv_polja').AsString
[ prginfo @ 16.03.2009. 15:01 ] @
Napravio sam izmenu. U SQL editoru mi lepo vraca vrednosti. Problem je da te vrednosti upari sa delo IF NAZIV...
Tako da mi sva polja i dalje boji u belo.

?
[ captPicard @ 16.03.2009. 16:45 ] @
Evo, napravi točno kako sam ti napisao:

Code:

procedure TFTest.Button1Click(Sender: TObject);
var
  i: integer;
begin
  Test.Open;
  with Boja do
  begin
    Close;
    SelectSQL.Text := 'select r.rdb$field_name NAZIV_POLJA, ' +
      't.rdb$type_name, ' +
      'f.rdb$field_length, ' +
      'r.rdb$null_flag, ' +
      'f.rdb$validation_source ' +
      'from rdb$relation_fields r, rdb$types t, rdb$fields f ' +
      'where r.rdb$relation_name=''KUMULATIV'' and ' +
      'f.rdb$field_name=r.rdb$field_source and ' +
      't.rdb$field_name=''RDB$FIELD_TYPE'' and ' +
      'r.rdb$null_flag = 1 and ' +
      'f.rdb$field_type=t.rdb$type ';
    Open;
    First;
  end;
  while not Boja.eof do
  begin
    for i := 0 to ComponentCount - 1 do
    begin
      if Components[i] is TDBEdit then
      begin
        if (Components[i] as TDBEdit).DataField = Trim(Boja.FieldByName('NAZIV_POLJA').AsString) then
          (Components[i] as TDBEdit).Color := clRed;
      end;
    end;
    Boja.Next;
  end;
end;