imam mysql bazu na linuxu i pravim klijent u Delphi-u. Radim pomocu dbexpress. postavim SQLconection i postavim za svaku tablu TSQLTable(ma ima ih samo 54). i sad moram za svaku tablu da stavljam DataSetProvider i Client. To je 100 komponenti vise. Da ne spominjem da moram da stavim i jos 50 data seta. Ima li nesto sto preskace sve ovo ili stvarno mora da se ovako radi????
program sa 200 komponenti
Zaključano
Zakačeno
Nista te ne sprecava da koristis samo jedan TSQLQuery (i komponente koje su ti potrebne za rad sa njim). U query-u posle samo kazes SELECT * FROM Tabela i imas tabelu... kad god ti treba neka druga ti napises nov sql zahtev.
Potpis
da, ali u tom slucaju cu imati samo jedan dataset i sve ce biti nakaceno na njega, pa kad se promeni sve ce da se promeni, sto nije pozeljno. a kad skinem dataset nestaju podaci, tako da mogu imam podatke samo na jednom mestu, a sta ako mi treba na dva ili nedaj boze 10. ipak imam 50 tabela. trebace mi vise u isto vreme.
i drugo
imam tabelu posao i svaki posao i podposao. svaki posao ima nekoliko podposlova. Koju komponentu da uzmem da mi izlista poslove, pa da ja kliknem na neki i da ona u drugoj istoj takvoj komponenti izlista podposlove. pokusao sam sa DBListBox. i ima da izberem datase i koje polje ocu ali jednostavno ne izbacuje nista. Nemogu da provalim kako se koristi. ako neko zna da koristi ili neko drugo resenje bicu vecno zahvalan
i drugo
imam tabelu posao i svaki posao i podposao. svaki posao ima nekoliko podposlova. Koju komponentu da uzmem da mi izlista poslove, pa da ja kliknem na neki i da ona u drugoj istoj takvoj komponenti izlista podposlove. pokusao sam sa DBListBox. i ima da izberem datase i koje polje ocu ali jednostavno ne izbacuje nista. Nemogu da provalim kako se koristi. ako neko zna da koristi ili neko drugo resenje bicu vecno zahvalan
"konj" wrote:
da, ali u tom slucaju cu imati samo jedan dataset i sve ce biti nakaceno
na njega, pa kad se promeni sve ce da se promeni, sto nije pozeljno. a
kad skinem dataset nestaju podaci, tako da mogu imam podatke samo na
jednom mestu, a sta ako mi treba na dva ili nedaj boze 10. ipak imam 50
tabela. trebace mi vise u isto vreme.
Pa nemas nek odrugo resenje, osim eventualno da koristis TSimpleDataSet
(mislim da se tako zove), on ima u sebi i TProvider i TClientDataSet, pa
ces imati manje komponenti.
Ili da nadjes neke "native" komponente za MySQL.
Ja bi nan tvom mestu ipak bazu prebacio u FireBird, i koristio FIBPlus
koje su fantasticne!
i drugo
imam tabelu posao i svaki posao i podposao. svaki posao ima nekoliko
podposlova. Koju komponentu da uzmem da mi izlista poslove, pa da ja
kliknem na neki i da ona u drugoj istoj takvoj komponenti izlista
podposlove. pokusao sam sa DBListBox. i ima da izberem datase i koje
polje ocu ali jednostavno ne izbacuje nista. Nemogu da provalim kako se
koristi. ako neko zna da koristi ili neko drugo resenje bicu vecno zahvalan
Napravis proceduru koja puni TComboBox sa rezultatima nekog querija, i
onda na onClick odnekud izvuces sifru za Combo.ItemIndex i sa tom sifrom
(PK) pokrenes drugi upit...
Ja sam napravio varijantu da PK cuva u Items.Object, pa to izgleda ovako:
type
TSifra = class
// clasa koja se kaci za stavku u cboxu
sifra : array[1..3] of string; // moze da ima 3 sifre
end;
procedure PopuniCombo(ACBox: TObject; ASql: string; q1: TpFIBQuery;
AFDesc, AFSif: string;
Asif2: string=&quot;&quot;; ASif3: string=&quot;&quot;; SveNaziv: string=&quot;<SVE>&quot;;
DoOnChange: boolean=true);
var sif :TSifra;
ACB: TComboBox;
// ako je SveNaziv=&quot;&quot; tada nema opcija SVI
begin
ACB:= TComboBox(ACBox); // tumacim prosledjeni objekat kao ComboBox
q1.close;
q1.SQL.Clear;
q1.SQL.Append(ASql);
q1.ExecQuery;
ACB.Clear; //sl_SifsTalas.Clear;
sif:=TSifra.Create; sif.sifra[1]:=&quot;%&quot;; sif.sifra[2]:=&quot;%&quot;;
sif.sifra[3]:=&quot;%&quot;;
if SveNaziv<>&quot;&quot; then
ACB.AddItem(SveNaziv, sif);
while not q1.Eof do
begin
sif:=TSifra.Create;
sif.sifra[1]:=q1.fieldbyname(AFSif).AsString;
if Asif2<>&quot;&quot; then
sif.sifra[2]:=q1.fieldbyname(Asif2).AsString
else
sif.sifra[2]:=&quot;&quot;;
if Asif3<>&quot;&quot; then
sif.sifra[3]:=q1.fieldbyname(Asif3).AsString
else
sif.sifra[3]:=&quot;&quot;;
ACB.AddItem(q1.fieldbyname(AFDesc).AsString, sif);
q1.Next;
end;
if ACB.Items.Count>0 then
begin
ACB.ItemIndex:=0;
if assigned(ACB.OnChange) and (DoOnChange) then
ACB.OnChange(ACB);
end;
//
q1.Close;
end;
procedure DopuniCombo(ACBox: TObject; AFDesc, AFSif: string; Asif2:
string=&quot;&quot;; ASif3: string=&quot;&quot;);
var sif :TSifra;
ACB : TComboBox;
begin
// ova procedura dodaje "rucno" satvku sa sifrom u ComboBox
ACB:= TComboBox(ACBox);
sif:=TSifra.Create;
sif.sifra[1]:=AFSif;
sif.sifra[2]:=ASif2;
sif.sifra[3]:=ASif3;
ACB.AddItem(AFDesc, sif);
end;
procedure BrisiComboObjekte(ACB: TObject);
var i: Integer;
begin
// oslobadjam objekte iz cboxa pri izlasku iz forme
for i:=0 to TComboBox(ACB).Items.Count-1 do
if assigned(TComboBox(ACB).Items.Objects) then
TComboBox(ACB).Items.Objects.Free;
end;
function GetSifru (ACB: TObject; rb: integer=1): string;
begin
// vraca sifru iz objekta, koristis u CB.OnClick...
if rb>3 then exit; if rb<1 then exit;
result:=
TSifra(TComboBox(ACB).Items.Objects[TComboBox(ACB).ItemIndex]).sifra[rb];
end;
Nadam se da ces se snaci.
Pozdrav
Citat:
da, ali u tom slucaju cu imati samo jedan dataset i sve ce biti nakaceno
na njega, pa kad se promeni sve ce da se promeni, sto nije pozeljno. a
kad skinem dataset nestaju podaci, tako da mogu imam podatke samo na
jednom mestu, a sta ako mi treba na dva ili nedaj boze 10. ipak imam 50
tabela. trebace mi vise u isto vreme.
Pa nemas nek odrugo resenje, osim eventualno da koristis TSimpleDataSet
(mislim da se tako zove), on ima u sebi i TProvider i TClientDataSet, pa
ces imati manje komponenti.
Ili da nadjes neke "native" komponente za MySQL.
Ja bi nan tvom mestu ipak bazu prebacio u FireBird, i koristio FIBPlus
koje su fantasticne!
Citat:
i drugo
imam tabelu posao i svaki posao i podposao. svaki posao ima nekoliko
podposlova. Koju komponentu da uzmem da mi izlista poslove, pa da ja
kliknem na neki i da ona u drugoj istoj takvoj komponenti izlista
podposlove. pokusao sam sa DBListBox. i ima da izberem datase i koje
polje ocu ali jednostavno ne izbacuje nista. Nemogu da provalim kako se
koristi. ako neko zna da koristi ili neko drugo resenje bicu vecno zahvalan
Napravis proceduru koja puni TComboBox sa rezultatima nekog querija, i
onda na onClick odnekud izvuces sifru za Combo.ItemIndex i sa tom sifrom
(PK) pokrenes drugi upit...
Ja sam napravio varijantu da PK cuva u Items.Object, pa to izgleda ovako:
type
TSifra = class
// clasa koja se kaci za stavku u cboxu
sifra : array[1..3] of string; // moze da ima 3 sifre
end;
procedure PopuniCombo(ACBox: TObject; ASql: string; q1: TpFIBQuery;
AFDesc, AFSif: string;
Asif2: string=&quot;&quot;; ASif3: string=&quot;&quot;; SveNaziv: string=&quot;<SVE>&quot;;
DoOnChange: boolean=true);
var sif :TSifra;
ACB: TComboBox;
// ako je SveNaziv=&quot;&quot; tada nema opcija SVI
begin
ACB:= TComboBox(ACBox); // tumacim prosledjeni objekat kao ComboBox
q1.close;
q1.SQL.Clear;
q1.SQL.Append(ASql);
q1.ExecQuery;
ACB.Clear; //sl_SifsTalas.Clear;
sif:=TSifra.Create; sif.sifra[1]:=&quot;%&quot;; sif.sifra[2]:=&quot;%&quot;;
sif.sifra[3]:=&quot;%&quot;;
if SveNaziv<>&quot;&quot; then
ACB.AddItem(SveNaziv, sif);
while not q1.Eof do
begin
sif:=TSifra.Create;
sif.sifra[1]:=q1.fieldbyname(AFSif).AsString;
if Asif2<>&quot;&quot; then
sif.sifra[2]:=q1.fieldbyname(Asif2).AsString
else
sif.sifra[2]:=&quot;&quot;;
if Asif3<>&quot;&quot; then
sif.sifra[3]:=q1.fieldbyname(Asif3).AsString
else
sif.sifra[3]:=&quot;&quot;;
ACB.AddItem(q1.fieldbyname(AFDesc).AsString, sif);
q1.Next;
end;
if ACB.Items.Count>0 then
begin
ACB.ItemIndex:=0;
if assigned(ACB.OnChange) and (DoOnChange) then
ACB.OnChange(ACB);
end;
//
q1.Close;
end;
procedure DopuniCombo(ACBox: TObject; AFDesc, AFSif: string; Asif2:
string=&quot;&quot;; ASif3: string=&quot;&quot;);
var sif :TSifra;
ACB : TComboBox;
begin
// ova procedura dodaje "rucno" satvku sa sifrom u ComboBox
ACB:= TComboBox(ACBox);
sif:=TSifra.Create;
sif.sifra[1]:=AFSif;
sif.sifra[2]:=ASif2;
sif.sifra[3]:=ASif3;
ACB.AddItem(AFDesc, sif);
end;
procedure BrisiComboObjekte(ACB: TObject);
var i: Integer;
begin
// oslobadjam objekte iz cboxa pri izlasku iz forme
for i:=0 to TComboBox(ACB).Items.Count-1 do
if assigned(TComboBox(ACB).Items.Objects) then
TComboBox(ACB).Items.Objects.Free;
end;
function GetSifru (ACB: TObject; rb: integer=1): string;
begin
// vraca sifru iz objekta, koristis u CB.OnClick...
if rb>3 then exit; if rb<1 then exit;
result:=
TSifra(TComboBox(ACB).Items.Objects[TComboBox(ACB).ItemIndex]).sifra[rb];
end;
Nadam se da ces se snaci.
Pozdrav
Citat:
"konj" wrote:
i drugo
imam tabelu posao i svaki posao i podposao. svaki posao ima nekoliko podposlova. Koju komponentu da uzmem da mi izlista poslove, pa da ja kliknem na neki i da ona u drugoj istoj takvoj komponenti izlista podposlove. pokusao sam sa DBListBox. i ima da izberem datase i koje polje ocu ali jednostavno ne izbacuje nista. Nemogu da provalim kako se koristi. ako neko zna da koristi ili neko drugo resenje bicu vecno zahvalan
Prethodni odgovor koj sam poslao nije dobro formatiran, pa cu probati ponovo da posaljem. Sorry sto se ponavljam!
Pa evo:
type
TSifra = class
// clasa koja se kaci za stavku u cboxu
sifra : array[1..3] of string; // moze da ima 3 sifre
end;
procedure PopuniCombo(ACBox: TObject; ASql: string; q1: TpFIBQuery; AFDesc, AFSif: string;
Asif2: string=''; ASif3: string=''; SveNaziv: string='SVE'; DoOnChange: boolean=true);
var sif :TSifra;
ACB: TComboBox;
// ako je SveNaziv='' tada nema opcija SVI
begin
ACB:= TComboBox(ACBox); // tumacim prosledjeni objekat kao ComboBox
q1.close;
q1.SQL.Clear;
q1.SQL.Append(ASql);
q1.ExecQuery;
ACB.Clear;
sif:=TSifra.Create; sif.sifra[1]:='%'; sif.sifra[2]:='%'; sif.sifra[3]:='%';
if SveNaziv'' then
ACB.AddItem(SveNaziv, sif);
while not q1.Eof do
begin
sif:=TSifra.Create;
sif.sifra[1]:=q1.fieldbyname(AFSif).AsString;
if Asif2'' then
sif.sifra[2]:=q1.fieldbyname(Asif2).AsString
else
sif.sifra[2]:='';
if Asif3'' then
sif.sifra[3]:=q1.fieldbyname(Asif3).AsString
else
sif.sifra[3]:='';
ACB.AddItem(q1.fieldbyname(AFDesc).AsString, sif);
q1.Next;
end;
if ACB.Items.Count0 then
begin
ACB.ItemIndex:=0;
if assigned(ACB.OnChange) and (DoOnChange) then
ACB.OnChange(ACB);
end;
//
q1.Close;
end;
procedure DopuniCombo(ACBox: TObject; AFDesc, AFSif: string; Asif2: string=''; ASif3: string='');
var sif :TSifra;
ACB : TComboBox;
begin
ACB:= TComboBox(ACBox);
sif:=TSifra.Create;
sif.sifra[1]:=AFSif;
sif.sifra[2]:=ASif2;
sif.sifra[3]:=ASif3;
ACB.AddItem(AFDesc, sif);
end;
procedure BrisiComboObjekte(ACB: TObject);
var i: Integer;
begin
// oslobadjam objekte iz cboxa
for i:=0 to TComboBox(ACB).Items.Count-1 do
if assigned(TComboBox(ACB).Items.Objects) then
TComboBox(ACB).Items.Objects.Free;
end;
function GetSifru (ACB: TObject; rb: integer=1): string;
begin
// vraca sifru iz objekta
if rb3 then exit; if rb1 then exit;
result:= TSifra(TComboBox(ACB).Items.Objects[TComboBox(ACB).ItemIndex]).sifra[rb];
end;
Citat:
i drugo
imam tabelu posao i svaki posao i podposao. svaki posao ima nekoliko podposlova. Koju komponentu da uzmem da mi izlista poslove, pa da ja kliknem na neki i da ona u drugoj istoj takvoj komponenti izlista podposlove. pokusao sam sa DBListBox. i ima da izberem datase i koje polje ocu ali jednostavno ne izbacuje nista. Nemogu da provalim kako se koristi. ako neko zna da koristi ili neko drugo resenje bicu vecno zahvalan
Pa evo:
type
TSifra = class
// clasa koja se kaci za stavku u cboxu
sifra : array[1..3] of string; // moze da ima 3 sifre
end;
procedure PopuniCombo(ACBox: TObject; ASql: string; q1: TpFIBQuery; AFDesc, AFSif: string;
Asif2: string=''; ASif3: string=''; SveNaziv: string='SVE'; DoOnChange: boolean=true);
var sif :TSifra;
ACB: TComboBox;
// ako je SveNaziv='' tada nema opcija SVI
begin
ACB:= TComboBox(ACBox); // tumacim prosledjeni objekat kao ComboBox
q1.close;
q1.SQL.Clear;
q1.SQL.Append(ASql);
q1.ExecQuery;
ACB.Clear;
sif:=TSifra.Create; sif.sifra[1]:='%'; sif.sifra[2]:='%'; sif.sifra[3]:='%';
if SveNaziv'' then
ACB.AddItem(SveNaziv, sif);
while not q1.Eof do
begin
sif:=TSifra.Create;
sif.sifra[1]:=q1.fieldbyname(AFSif).AsString;
if Asif2'' then
sif.sifra[2]:=q1.fieldbyname(Asif2).AsString
else
sif.sifra[2]:='';
if Asif3'' then
sif.sifra[3]:=q1.fieldbyname(Asif3).AsString
else
sif.sifra[3]:='';
ACB.AddItem(q1.fieldbyname(AFDesc).AsString, sif);
q1.Next;
end;
if ACB.Items.Count0 then
begin
ACB.ItemIndex:=0;
if assigned(ACB.OnChange) and (DoOnChange) then
ACB.OnChange(ACB);
end;
//
q1.Close;
end;
procedure DopuniCombo(ACBox: TObject; AFDesc, AFSif: string; Asif2: string=''; ASif3: string='');
var sif :TSifra;
ACB : TComboBox;
begin
ACB:= TComboBox(ACBox);
sif:=TSifra.Create;
sif.sifra[1]:=AFSif;
sif.sifra[2]:=ASif2;
sif.sifra[3]:=ASif3;
ACB.AddItem(AFDesc, sif);
end;
procedure BrisiComboObjekte(ACB: TObject);
var i: Integer;
begin
// oslobadjam objekte iz cboxa
for i:=0 to TComboBox(ACB).Items.Count-1 do
if assigned(TComboBox(ACB).Items.Objects) then
TComboBox(ACB).Items.Objects.Free;
end;
function GetSifru (ACB: TObject; rb: integer=1): string;
begin
// vraca sifru iz objekta
if rb3 then exit; if rb1 then exit;
result:= TSifra(TComboBox(ACB).Items.Objects[TComboBox(ACB).ItemIndex]).sifra[rb];
end;