Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako dinamicki kreirati polja

[es] :: Pascal / Delphi / Kylix :: Kako dinamicki kreirati polja

Strane: 1 2

[ Pregleda: 3893 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
*.dynamic.sbb.rs.



+2 Profil

icon Kako dinamicki kreirati polja18.11.2008. u 13:49 - pre 187 meseci
Koristim firebird bazu i zbog raznih manipulacija sa poljima potrebno mi je da se ona dinamicki kreiraju u RunTime modu!KAKO?
Don't worry be happy
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
79.101.228.*



+62 Profil

icon Re: Kako dinamicki kreirati polja18.11.2008. u 15:04 - pre 187 meseci
Ako mislis na polja u tabeli u firebird bazi, u runtime-u bogami NIKAKO (bar ne iz iste aplikacije).

Moguce je kreirati nove field-ove pomocu skripta. Ali je neophodan preduslov da budes JEDINI nakacen na bazu u trenutku izvrsenja skripta. Mislim da je nemoguce iz jedne iste aplikacije izvrsiti skript i odmah (bez restarta) citati/pisati po tim novokreiranim poljima. Mozda gresim.

A sam skript dobijes recimo iz IBExpert-a: dodajes nove field-ove ili sta vec hoces rucno, pa zatim pogledas u DDL tab FieldsEditor-a sta je IBExpert slozio/napisao. To ti je upravo SQL materijal za script. U svakom slucaju, jako pipava materija i tesko je naterati da 100% pouzdano radi.

Rajko
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja18.11.2008. u 16:31 - pre 187 meseci
> Koristim firebird bazu i zbog raznih manipulacija sa poljima potrebno mi je da se ona dinamicki kreiraju u RunTime modu!KAKO?

Da li želiš da dodaš polja u bazu ili u svoje dataset komponente? Ako je u bazu možeš koristiti CREATE/ALTER TABLE, preporučljivo je da budeš jedini povezan u tom trenutku na bazu i da se pre dodavanja podataka u izmenjenu tabelu rekonektuješ na bazu. Ako polja ili podaci koji ti trebaju nisu stalni onda možeš koristiti i privremene tabele.

 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.98.*



+2 Profil

icon Re: Kako dinamicki kreirati polja18.11.2008. u 20:31 - pre 187 meseci
@rajko
@savkic
Hvala na nesebicnoj pomoci!

Da pojasnim polja treba da se kreiraju na ClientDataSet-u !
Nesto slicno sam nasao,ali je za BDE

Code:

var
  Field: TField;
  i: Integer;
begin
  Table1.Active:=False;
  for i:=0 to Table1.FieldDefs.Count-1 do
    Field:=Table1.FieldDefs[i].CreateField(Table1);

  Field:=TStringField.Create(Table1);
  with Field do
  begin
    FieldName:='New Field';
    Calculated:=True;
    DataSet:=Table1;
  end;
  Table1.Active:=True;
end;

E sad nije mi tu najjasnije,u pr se kreira jedno polje,ali ja treba da kreiram sva definisana polja za dati dataset....kako da im dodelim imena da budu ista kao imena FieldDef?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja19.11.2008. u 09:51 - pre 187 meseci
> E sad nije mi tu najjasnije,u pr se kreira jedno polje,

U primeru se kreiraju sva polja definisana u FieldsDef i jedno dodatno string polje.

> ali ja treba da kreiram sva definisana polja za dati dataset....kako da im dodelim imena da budu ista kao imena FieldDef?

DataSet bi trebalo sam da napravi polja na osnovu definicije u FieldsDef, a ako hoćeš sam onda koristi kod iz primera koji si poslao.

 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
77.46.246.*



+2 Profil

icon Re: Kako dinamicki kreirati polja19.11.2008. u 10:48 - pre 187 meseci
Nije mi jasan sledeci deo koda
Code:

  for i:=0 to Table1.FieldDefs.Count-1 do
    Field:=Table1.FieldDefs[i].CreateField(Table1);

Koliko ja kapiram,ovim se prave sve polja koja su definisana....
Kako ta,novo napravljena polja da vezem za svojstvo DataSet.Filds, jer mi javlja gresku da ja svojtvo tipa read only?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja19.11.2008. u 11:20 - pre 187 meseci
> Koliko ja kapiram,ovim se prave sve polja koja su definisana....
> Kako ta,novo napravljena polja da vezem za svojstvo DataSet.Filds, jer mi javlja gresku da ja svojtvo tipa read only?

Nisam siguran da te pratim, CreateField će napraviti novo polje i povezati ga sa datasetom, tvoja dalja akcija tu nije potrebna.
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.48.*



+2 Profil

icon Re: Kako dinamicki kreirati polja19.11.2008. u 17:42 - pre 187 meseci
Ovim kodom bi trebalo da se dodaju polja u simplledaataset,ali nece!!!
Nezmam gde gresim nemma sintaksnih,ali tu neizbezne semanticke grreske?
POMOC!
HELP!!!!!!!!!!
Code:

procedure TfrmPrikazDrzava.frmObjekat1acPregledExecute(Sender: TObject);
var
  sql:String;BR:Integer;
begin
        sql := 'select * from T_Drzave';
  TD.TransactionID := 2;
  td.IsolationLevel := xilREADCOMMITTED;
  with frmObjekat1.SimpleDataSet1 do
      begin 
           DataSet.CommandText := sql;
      end;
  dmMain.SQLConn.StartTransaction(TD);
  frmObjekat1.SimpleDataSet1.Open;
  PraviPolja;
  dmMain.SQLConn.Commit(TD);
end;

procedure TfrmPrikazDrzava.PraviPolja;
var
   Fld:TFieldDefs;
begin
   with frmObjekat1.SimpleDataSet1 do
   begin
      Close;
      Fld := frmObjekat1.SimpleDataSet1.FieldDefs;
   with Fld do
      begin
         Clear;
         Add('ime',ftString,25,false);
         with AddFieldDef do
            begin
               Name := 'MOJE POLJE';
               DataType := ftString;
               Required := True;
               Visible := True;
               DisplayName := Name
            end;
            with AddFieldDef do
            begin
               Name:='phNo';
               DataType:=ftInteger;
               Required:=True;
            end;

            with AddFieldDef do
            begin
               Name:='Email';
               DataType:=ftString;
               Size:=255;
            end;
      end;
   Open;
   end;


Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja19.11.2008. u 23:43 - pre 187 meseci
Prvo, u ovom kodu samo dodaješ definicije u FieldDefs, ali ne pozivaš CreteField koja bi napravila TField polja. Drugo, šta uopšte želiš da postigneš dodavanjem u FieldDefs pa onda pravljenjem regularnih polja, napravi odmah regularna polja. Treće, mislim da bi pomoglo da kažeš šta je zapravo ono što ti pokušavaš da uradiš, vrlo je moguće da se to može postići na druge, bolje načine.
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.50.*



+2 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 00:45 - pre 187 meseci
>>Treće, mislim da bi pomoglo da kažeš šta je zapravo ono što ti pokušavaš da uradiš, vrlo je moguće da se to može postići na druge, bolje načine.

Ovako imam jedan Frame na kom se nalaze dbgrid,datasource,simpledataset...frejm se koristi za primenu na vise formi...postoje polja koja treba da se sakriju od korisnika,kao npr id...isl
Kada u dizajntejmu prebacim frejm na formu,nije moguce dodati polja na simpledataset,pukne greku da se nemogu vrsiti dodavanja nad instancoom...ali polja moraju da budu napravljena,pa sam ja mislio ovim kodom da ih napravim,jer sve sto sam na netu nasao radi po principu AddFieldDef,a kapiram da negde ih treba kreirati...cak me buni sto mi kod
Code:
FieldDefs.Clear;

ne brise listu definisanih polja...
NAdam se da sam malo pojasnio zbrkanu situaciju
NISAM PAMETAN!!!
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 10:10 - pre 187 meseci
> Kada u dizajntejmu prebacim frejm na formu,nije moguce dodati polja na simpledataset,pukne greku da se nemogu vrsiti dodavanja nad instancoom...

Polja u ClientDatasetu se mogu dodavati i za vreme dizajniranja forme, ako tebi ne uspeva onda ne poštuješ proceduru, prođi kroz help.

> ali polja moraju da budu napravljena,pa sam ja mislio ovim kodom da ih napravim,

Da li su ta polja na neki način vezana sa bazom podataka odnosno da li uopšte koristiš neku bazu podataka?

> jer sve sto sam na netu nasao radi po principu AddFieldDef,a kapiram da negde ih treba kreirati...cak me buni sto mi kod
> FieldDefs.Clear;

FieldsDef <> Fields, ako hoćeš da isprazniš polja onda ti treba Fields.Clear;

> NAdam se da sam malo pojasnio zbrkanu situaciju

Sam si poslao kod (i to dva načina) koji radi u prvoj poruci da li si ga uopšte probao? Evo još jednom:

Code:

  Field:=TStringField.Create(Table1);
  with Field do
  begin
    FieldName:='New Field';
    Calculated:=True;
    DataSet:=Table1;
  end;


Ako već praviš polja onda to možeš raditi direktno u datasetu, ne moraš ići preko posrednika FieldDefs. Ali ako ipak hoćeš može i to, opet napraviš polja u FieldDefs i pozoveš CreateField ili (primer iz helpa):

Code:

  with ClientDataSet1 do
  begin
    with FieldDefs.AddFieldDef do 
    begin
      DataType := ftInteger;
      Name := 'Field1';
    end;
    with FieldDefs.AddFieldDef do
    begin
      DataType := ftString;
      Size := 10;
      Name := 'Field2';
    end;
    with IndexDefs.AddIndexDef do
    begin
      Fields := 'Field1';
      Name := 'IntIndex';

    end;
    CreateDataSet;
  end;

 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
79.101.72.*



+2 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 11:04 - pre 187 meseci
Ok je resio sam problem!!!!!!!
HVALA!!!!
Evo koda koji mi je trebao
Code:

rocedure TfrmObjUpit.CreateFieldObject (FieldDef: TFieldDef);
var
 Dummy : TComponent;

 IntField : TIntegerField;
 StringField : TStringField;
// DateTimeField : TDateTimeField;
 DateTimeField : TSQLTimeStampField;
 FloatField : TFloatField;
 MemoField : TMemoField;


begin
   Dummy := cdsObjUpit.FindComponent('field' + FieldDef.Name) ;
   if Dummy <> nil then
      Dummy.Free;

   case FieldDef.DataType of
     ftInteger, ftSmallint, ftWord, ftAutoInc,
     ftLargeint : begin
                     IntField := TIntegerField.Create(cdsObjUpit);
                     IntField.Name := 'field' + FieldDef.Name;
                     IntField.DisplayLabel := FieldDef.DisplayName;
                     IntField.FieldName := FieldDef.Name;
                     IntField.DataSet := cdsObjUpit;
                  end;
     ftString, ftWideString, ftFixedChar :
                  begin
                     StringField := TStringField.Create(cdsObjUpit);
                     StringField.Name := 'field' + FieldDef.Name;
                     StringField.DisplayLabel := FieldDef.DisplayName;
                     StringField.FieldName := FieldDef.Name;
                     StringField.Size := FieldDef.Size;
                     StringField.DataSet := cdsObjUpit;
                  end;
     ftDate, ftTime, ftDateTime, ftTimeStamp :
                  begin
                     DateTimeField := TSQLTimeStampField.Create(cdsObjUpit);
                     DateTimeField.Name := 'field' + FieldDef.Name;
                     DateTimeField.DisplayLabel := FieldDef.DisplayName;
                     DateTimeField.DisplayWidth := 15;
                     DateTimeField.DisplayFormat := dmObjectDef.DisplayFormat(FNazivKlase, FieldDef.Name);
                     DateTimeField.FieldName := FieldDef.Name;
                     DateTimeField.DataSet := cdsObjUpit;
                  end;
     ftFloat, ftCurrency, ftBCD, ftFMTBcd :
                  begin
                     FloatField := TFloatField.Create(cdsObjUpit);
                     FloatField.Name := 'field' + FieldDef.Name;
                     FloatField.DisplayLabel := FieldDef.DisplayName;
                     FloatField.FieldName := FieldDef.Name;
                     FloatField.DataSet := cdsObjUpit;
                  end;
     else
         begin
            MemoField := TMemoField.Create(cdsObjUpit);
            MemoField.Name := 'field' + FieldDef.Name;
            MemoField.FieldName := FieldDef.Name;
            MemoField.DataSet := cdsObjUpit;
            MemoField.Visible := false;

            Dummy := cdsObjUpit.FindComponent('_field' + FieldDef.Name) ;
            if Dummy <> nil then
            Dummy.Free;


            StringField := TStringField.Create(cdsObjUpit);
            StringField.Name := '_field' + FieldDef.Name;
            StringField.DisplayLabel := FieldDef.DisplayName;
            StringField.FieldName := '_' + FieldDef.Name;
            StringField.FieldKind := fkCalculated;
            StringField.Size := 20;
            StringField.DataSet := cdsObjUpit;
         end;
     end;

E da ne otvaram drugu temu mogu ovde da postavim pitanja?
1.Kako biizgledala for petlja za string kojom bi se znak _ menjao sa razmakom, velika slova posle 1.slova malim,i ako naidje na reci tip sifra da zameni recju šifra drzava država?
2.Kakva je razlika medju application.terminate i halt?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 12:34 - pre 187 meseci
> .Kako biizgledala for petlja za string kojom bi se znak _ menjao sa razmakom, i ako naidje na
> reci tip sifra da zameni recju šifra drzava država?

Koristi StringReplace.

> velika slova posle 1.slova malim,

Pretvori sve u mala slova pa prvo slovo pretvori u veliko.

> 2.Kakva je razlika medju application.terminate i halt?

Piše u helpu, Halt nasilno prekida program dok Application.Terminate to radi regularnim putem (šalje odgovarajuće poruke).
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
79.101.72.*



+2 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 12:46 - pre 187 meseci
a kako da pretvorim sve u mala slova?
Don't worry be happy
 
Odgovor na temu

Deep|Blue
Srce Srbije

Član broj: 631
Poruke: 1431
195.178.63.*

ICQ: 101830817


+314 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 12:52 - pre 187 meseci
LowerCase()
"Hmmm", rekao je, "...suprostavlja se nadrealizmu prikrivene metafore..." Razmišljao je tome na trenutak, a onda je zatvorio beležnicu s mrkim osmehom.
"I smrt je za njih suviše dobra"
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
79.101.72.*



+2 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 14:32 - pre 187 meseci
E da jos mallko iskoristim ovu temu
KAko moze da se u sql upitu tipa 'select * from tabela' ogranisi broj rekorda koji ce biti pozvani?
Npr.Da prvo idu prvih N rekorda,zatim drugih N rekorda...N je neki bzvz broj 100,500,2000
ako je n 10
da 1.put prikaze 1-10
2.put 11-20
Postoje dugmad koja ce da ucecavaju sa 10 na 11,sa 20 na 21...
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja20.11.2008. u 17:49 - pre 187 meseci
> KAko moze da se u sql upitu tipa 'select * from tabela' ogranisi broj rekorda koji ce biti pozvani?

Sintaksa zavisi od baze, recimo za FB je SELECT FIRST ...

> Npr.Da prvo idu prvih N rekorda,zatim drugih N rekorda...N je neki bzvz broj 100,500,2000 ako je n 10 da 1.put prikaze 1-10
> 2.put 11-20
> Postoje dugmad koja ce da ucecavaju sa 10 na 11,sa 20 na 21...

Ako se oslanjaš na bazu da vrati samo određeni broj slogova, onda se za svaki novi poziv posebno izvršava, što za velike podatke može stvoriti usporenje. Druga varijanta ti je da to sam radiš pomoću dva dataseta, prvi je vezan za bazu a drugi za kontrole, iz prvog prebaciš u drugi koliko ti treba podataka i tako redom kako se klikće.
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
77.46.244.*



+2 Profil

icon Re: Kako dinamicki kreirati polja21.11.2008. u 14:20 - pre 187 meseci
Mislim da se nismo razumeli nasao sam na netu
nesto otprilike
'select *from '+ tabela+' rows'+ od+' to'+ do

Nesto me jos interesuje
Napracio sam jedno stirngpolje kome treba vrednost da bude kao vrednost broja rekorda...nije generator ni id vec polje koje samo odredjuje broj rekorda ( REKORDA 1 rekorda )
Treba mi neka fukcija kojom bi se uvecavala vrednost tog broja
probao sam ovako
Code:

      for i :=0 to RecordCount-1 do
         FieldByName('RDB').AsString := IntToStr(I);


ali mi ignorise petlju!!!
Treba da kad se unese rekord vrednost polja se poveca za 1,a kad se izbrise smanji za 1,a kad se otvara dataset sa postojecim rekordima da im se vrednost dodoeli automatski...
POMOC!!!
Don't worry be happy
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.98.*



+2 Profil

icon Re: Kako dinamicki kreirati polja22.11.2008. u 11:47 - pre 187 meseci
Opet ja sa mojim ptanjima...nadam se da ko pita treba da dobije odgovor
Pitanje:
Kako treba da izgleda sql upit koji bi kao rezultat imao spisak svih tabbela odredjene baze?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako dinamicki kreirati polja22.11.2008. u 12:09 - pre 187 meseci
> Napracio sam jedno stirngpolje kome treba vrednost da bude kao vrednost broja rekorda...nije generator ni id vec polje koje samo
> odredjuje broj rekorda ( REKORDA 1 rekorda )

Želiš da jedno polje čuva redni broj sloga?

> for i :=0 to RecordCount-1 do
> FieldByName('RDB').AsString := IntToStr(I);

Koliko vidim dati kod menja vrednost RDB polja na jednom istom slogu. Ako želiš da svaki slog dobije svoju vrednost onda je najboljed da koristiš
Code:

DataSet.First;
while not DataSet.Eof do
begin
  DataSet.FieldByName('RDB').AsInteger := DataSet.RecNo;
  DataSet.Next;
end;


> Kako treba da izgleda sql upit koji bi kao rezultat imao spisak svih tabbela odredjene baze?

Zavisi od RDBMSa, to što ti tražiš se naziva metadata pa možeš potražiti na netu kako se to radi za konkretnu bazu.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Kako dinamicki kreirati polja

Strane: 1 2

[ Pregleda: 3893 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.