IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Delphi - FireBird - Instanciation d'objets à partir d'une BDD


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Delphi - FireBird - Instanciation d'objets à partir d'une BDD
    Bonjour à tous, avant d'expliquer mon problème, je précise que je suis complétement débutant ^^

    En gros je travaille sur une application DELPHI qui est actuellement rattachée à une BDD PARADOX.

    J'ai créé une nouvelle BDD ( la même que celle en PARADOX ) mais sous
    FireBird ( embedded ).. La base marche niquel.
    En gros je dois adapter le code DELPHI ( sachant que j'en ai jamais fait :/ ),
    pour le rendre compatible avec la nouvelle BDD. Le truc c'est que je ne sais pas du tout comment faire..

    Mon problème principal est que je dois remplir les attributs des objets de l'appli DELPHI, avec ceux qu'il y a en BDD.
    Je ne pense pas être très clair..

    Pour chaque table de la BDD, j'ai une classe donc les attributs correspondent aux champs de mes tables FB.

    Je veux instancier mes objets autant de fois que j'ai d'objets dans les tables correspondantes, en leur fournissant comme attributs la valeur des champs de mes tables..

    Voici par exemple a quoi ressemble le code DELPHI :



    CMarche = Class {Classe des marches}
    Private
    Public
    NumMarche : SmallInt;
    Nom : array[0..NBLMAX-1] of String;
    AdR1 : Integer; //Mot lecture
    AdR2 : Integer; //Bit lecture
    IndAdRAr : Integer; //Indice si tableau
    TypeMarche : Integer; //0 : Normal; 1 : Format changeover; 2 : Jog; 3 : Auto
    Icone : String;
    end;

    CLMarche = Class {Classe gestion liste marche}
    Private
    Public
    ListMarche : TList;
    CurrentMarche : SmallInt;
    SelectedMarche : SmallInt;
    NbAdrMot : SmallInt;
    Busy : Boolean;
    Modif : Boolean;

    Constructor CreateEmpty;
    Constructor Create;
    destructor Destroy; override;
    procedure Traduit;
    procedure Save; //Sauve sur disque (BDD)
    function Repair : Integer; //Vérifie les intégrités
    function Indice(Num: Integer) : Integer;
    end;


    Var LMarche : CLMarche;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Constructor CLMarche.Create;                   
    {---------------------------------------------------}
    var MyTable1, MyTable2 : TTable;
       MyMarche : CMarche;
       j: Integer;
    Begin
       inherited Create;
       Busy := True;
       ListMarche:=TList.Create;
       MyTable1 := TTable.Create(nil);
       Mytable2 := TTable.Create(nil);
       Try
          MyTable1.DatabaseName := ChemDat;
          MyTable1.TableName := 'Marche.db';
          MyTable1.Open;
          MyTable1.First;
          MyTable2.DatabaseName := ChemDat;
          MyTable2.TableName := 'Marche_T.db';
          MyTable2.Open;
          while not (MyTable1.Eof) do
             begin
                Application.ProcessMessages;
                MyMarche := CMarche.Create;
                MyMarche.NumMarche := MyTable1.FieldByName('NumMarche').AsInteger;
                MyMarche.IndAdRAr := MyTable1.FieldByName('IndAdRAr').AsInteger;
                MyMarche.AdR1 := MyTable1.FieldByName('AdR1').AsInteger;
                MyMarche.AdR2 := MyTable1.FieldByName('AdR2').AsInteger;
                MyMarche.TypeMarche := MyTable1.FieldByName('TypeMarche').AsInteger;
                if not (MyMarche.TypeMarche in [0..3]) then MyMarche.TypeMarche := 0;
                MyMarche.Icone := MyTable1.FieldByName('Icone').AsString;
                for j := 0 to NBLMAX-1 do
                   if MyTable2.FindKey([MyMarche.NumMarche,NumLangue[j]]) then
                         MyMarche.Nom[j] := MyTable2.FieldByName('Nom').AsString
                   else
                         MyMarche.Nom[j] := '??';
                ListMarche.Add(MyMarche);
                MyTable1.Next;
             end;
          MyTable1.Close;
          MyTable2.Close;
       finally
          MyTable1.Free;
          MyTable2.Free;
       end;
       Modif := false;
       Busy := False;
    end;
    J'ai honnêtement pas mal chercher sur le net, mais sans trouver grand chose..
    Le projet qui m'est demandé est en fait plus compliquer que ca, mais je pense que ce que je vous ai dit suffira..

    En gros je voudrais savoir a quoi ressemble le code DELPHI précédent pour une BDD FIREBIRD..
    Sachant que "Marche_T.db" et "Marche.db" sont deux tables de la BDD PARADOX. Pour Firebird, je voudrai utiliser une requete toute simple genre :
    "Select * from Marche_T" et parcourir les lignes en renseignant mon objet.


    J'imagine qu'il y aura du SQL, que l'on ouvre pas les tables comme en PARADOX, et qu'on ne parcourt pas les enregistrements de la même facon..

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    si tu utilises le BDE (déconseillé) c'est exactement pareil ou presque (tableName=nomtableFB)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          MyTable1.DatabaseName := ChemDat;
          MyTable1.TableName := 'Marche';
          MyTable1.Open;
          MyTable1.First;
          MyTable2.DatabaseName := ChemDat;
          MyTable2.TableName := 'Marche_T';
          MyTable2.Open;
    par contre pour d'autres style de composants (UIB,FIBplus,DBExpress .... )
    effectivement ça va changer (la partie connexion) tout va dependre du choix des composants
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par SergioMaster
    si tu utilises le BDE (déconseillé) c'est exactement pareil ou presque (tableName=nomtableFB)
    MyTable1.DatabaseName := ChemDat;
    MyTable1.TableName := 'Marche';
    MyTable1.Open;
    MyTable1.First;
    MyTable2.DatabaseName := ChemDat;
    MyTable2.TableName := 'Marche_T';
    MyTable2.Open;

    par contre pour d'autres style de composants (UIB,FIBplus,DBExpress .... )
    effectivement ça va changer (la partie connexion) tout va dependre du choix des composants

    J'ai déja utilisé UIB dans mes initiations à DELPHI, je me débrouille pas trop mal avec..
    La partie Connection ne me posera pas de problème je pense, ca doit être un truc du genre :

    JvUIBDataBase1.Connected := False;
    JvUIBDataBase1.Params.Clear;
    JvUIBDataBase1.DATABASENAME:='Chemin.FDB';
    JvUIBDataBase1.Params.Add('user_name=SYSDBA');
    JvUIBDataBase1.Params.Add('password=masterkey');
    JvUIBDataBase1.Params.Add('lc_ctype=ISO8859_1');
    JvUIBDataBase1.SQLDialect:=3;
    Mais comment cela se passe t il pour cette partie :

    while not (MyTable1.Eof) do
    begin
    Application.ProcessMessages;
    MyMarche := CMarche.Create;
    MyMarche.NumMarche := MyTable1.FieldByName('NumMarche').AsInteger;
    MyMarche.IndAdRAr := MyTable1.FieldByName('IndAdRAr').AsInteger;
    MyMarche.AdR1 := MyTable1.FieldByName('AdR1').AsInteger;
    MyMarche.AdR2 := MyTable1.FieldByName('AdR2').AsInteger;
    MyMarche.TypeMarche := MyTable1.FieldByName('TypeMarche').AsInteger;
    if not (MyMarche.TypeMarche in [0..3]) then MyMarche.TypeMarche := 0;
    MyMarche.Icone := MyTable1.FieldByName('Icone').AsString;
    for j := 0 to NBLMAX-1 do
    if MyTable2.FindKey([MyMarche.NumMarche,NumLangue[j]]) then
    MyMarche.Nom[j] := MyTable2.FieldByName('Nom').AsString
    else
    MyMarche.Nom[j] := '??';
    ListMarche.Add(MyMarche);
    MyTable1.Next;
    end;

    Je souhaiterai avoir un petit aperçu du code avec un composant UIB

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    perso j'utilise plutôt FIBPlus mais je pense que le principe est le même
    remplace les TTable par un TUIBDataset? (equivalent de TpfibDataset)
    les findkey par des locate

    avec peut-etre un select de table2 avec paramètre(s) (elle me semble etre une table detail de table1)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    C'était surtout l'aspect syntaxe qui m'interessait..
    Pour test j'ai fait un truc tout con, je le mets, ca aidera peut être d'autres
    débutants comme moi :p

    Bon j'ai fait un truc un peu similaire pour voir comment ca marchait, la je place les attributs de mes tables ds un mémo :



    Avec IBX :

    /////////////////////////////////////////////////////////
    procedure TForm_delph_IB_FRB.Button2Click(Sender: TObject);
    begin
    DataModule_debutant.IBDataSet1.SelectSQL.Clear;
    DataModule_debutant.IBDataSet1.SelectSQL.Add('Select * from client');
    DataModule_debutant.IBDataSet1.Open;
    DataModule_debutant.IBDataSet1.First;
    Memo1.Clear;
    while not DataModule_debutant.IBDataSet1.Eof do
    begin
    Memo1.Lines.Add(DataModule_debutant.IBDataSet1.FieldByName('Cli_Nom').AsString);
    DataModule_debutant.IBDataSet1.Next;
    end;
    DataModule_debutant.IBDataSet1.Close;

    end;
    /////////////////////////////////////////////////////////


    Avec UIB :

    /////////////////////////////////////////////////////////
    procedure TForm1.Button9Click(Sender: TObject);
    begin

    JvUIBDataSet4.Database := JvUIBDataBase1;
    JvUIBDataSet4.Transaction := JvUIBTransaction1;

    JvUIBDataSet4.SQL.Clear;

    JvUIBDataSet4.SQL.Add('Select * from client');

    JvUIBDataSet4.Open;


    Memo1.Clear;
    While not JvUIBDataSet4.Eof do
    begin
    Memo1.Lines.Add(inttostr(JvUIBDataSet4.FieldByName('Cli_Nom').AsInteger));
    JvUIBDataSet4.Next;
    end;
    JvUIBDataSet4.Close;
    end;
    /////////////////////////////////////////////////////////

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Bon la 'traduction' avance, mais un point me chagrine..

    if MyTable2.FindKey([MyMarche.NumMarche,NumLangue[j]]) then
    Findkey n'existe pas en UIB, tu mentionnes Locate, mais en vue des paramètres qu'il faut lui passer, il ne semble pas convenir..


    if MyTable2.FindKey([MyMarche.NumMarche,NumLangue[j]]) then
    "NumMarche" et "NumLangue" sont deux champs ( Integer ) de la table "Marche_T". Leur réunion est aussi la clé primaire de la table..

    La fonction Locate :
    Locate(const KeyFields : String; const KeyValues : Variant; Options : TLocateOptions) : Boolean;

    Une solution ? Un indice ? Un miracle ?

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    sur locate t'aurait donné la solution

    locate('num_marche;num_langue',vararrayof(MyMarche.NumMarche,NumLangue[j]),[])
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Ca ne marchait pas.
    Il manque des crochets

    MyTable2.Locate('NumMarche;NumLangue',VarArrayOf([MyMarche.NumMarche,NumLangue[j]]),[])
    Bon c'est galère mais ca avance.. Quand j'aurais fini je posterai la "solution"
    Merci de votre aide, et surement à bientot ^^

Discussions similaires

  1. Créer un objet à partir d'une BDD
    Par Jean-Marc68 dans le forum C#
    Réponses: 3
    Dernier message: 10/02/2013, 20h06
  2. Instanciation d'objet à partir d'un String
    Par Ensias dans le forum Langage
    Réponses: 1
    Dernier message: 05/03/2007, 17h27
  3. Réponses: 7
    Dernier message: 29/12/2006, 12h56
  4. Réponses: 21
    Dernier message: 22/06/2006, 21h11
  5. Réponses: 6
    Dernier message: 18/01/2006, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo