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 :

IBdataset edit, delete, update :help:


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Par défaut IBdataset edit, delete, update :help:
    Salut à tous, je travaille sur un TFBDataSet qui est en fait la même chose qu'un IBDataset, mais qui est compatible avec la suite de composants UIB.
    Alors mon problème est que je charge des tables aléatoires, et ne peut donc pas fixer de manière statiques les propriétés insertSQL, editSQL etc... J'ai donc mis ce bout de code:
    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
     
    FBDataset.SQLDelete.Clear;
    FBDataset.sqlEdit.Clear;
    FBDataset.SQLInsert.clear;
     
    FBDataset.SQLRefresh.Text := 'SELECT * FROM ' + trim(cmbtables.Text);
    FBDataset.SQLSelect.text:='SELECT * FROM ' + trim(cmbtables.Text);
    FBDataset.active:=true;
     
    for i  := 0 to FBDataset.Fields.Count - 1 do
    begin
         if not isnumeric(fbdataset.Fields.fields[i].DisplayName) then
         	begin
         	if length(fields)>0 then
         	begin
         	   fields:=fields + ', :' + fbdataset.Fields.fields[i].DisplayName ;
         	   fieldsud:=fieldsud + ' AND (' + fbdataset.Fields.fields[i].DisplayName + '= :' + fbdataset.Fields.fields[i].DisplayName+ ')';
         	end
         	else
         	begin
               fields:=fields + ':' + fbdataset.Fields.fields[i].DisplayName;
         	   fieldsud:=fieldsud + '(' + fbdataset.Fields.fields[i].DisplayName + '= :' + fbdataset.Fields.fields[i].DisplayName+')';
         	end;
         end;
     end;
    FBDataset.SQLDelete.Text:='DELETE FROM ' + trim(cmbtables.Text) + ' WHERE ' + fieldsud + ';';
    FBDataset.sqlEdit.Text:='UPDATE ' + trim(cmbtables.Text) + ' SET ' + ansireplacetext(fieldsud,' AND ', ', ') + ';';
    FBDataset.sqlEdit.Text:=ansireplacetext(ansireplacetext(FBDataset.sqlEdit.Text,')',''),'(','');
     
    FBDataset.SQLInsert.Text:='INSERT INTO ' + trim(cmbtables.Text) + '(' + ansireplacetext(fields,':', '') + ') VALUES (' + fields + ');';
     showmessage(FBDataset.SQLDelete.Text);
      showmessage(FBDataset.sqlEdit.Text);
       showmessage(FBDataset.SQLInsert.Text);
    end;
    Les syntaxes SQL ont l'air bonne, seulement j'ai plein de soucis: Lorsque je fais un insert, je récupère l'enregistrement d'une autre ligne, la pluspart des edit plantent .... Ai-je oublié quelque chose? Faut-il spécifier soit même les valeurs rentrées dans les champs avec parambyname ? Si oui comment ?
    PS: J'utilise un DBNavigator pour insérer les champs.

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut Nek !

    Tu tombes bien je suis justement en train de me pencher sérieusement sur la suite des composants UIB.

    Bon j'ai regardé ton code, hummm, je me demande comment il marche !
    Je ne suis pas étonné que tu aies des mises à jour sur de mauvais enregistrements, and so on !

    Dans le cas présent - pour créer des TDataSet dynamiquement - je pense qu'il est préférable d'aller 'taper' dans les tables systèmes de la base Firebird pour récupérer les infos qui nous intéressent.

    C'est à dire tout d'abord les noms des champs constituants la table, et ensuite les champs constituants la clé primaire de cette table. Ceci étant nécessaires pour renseigner les instructions SQL Update, Delete et Refresh.

    Je te livre mon code tel quel. Il peut sûrement être optimisé mais l'essentiel est là. J'attends tes remarques.

    J'ai créer une procédure qui se charge de renseigner les différentes instructions SQL nécessaires au FBDataSet. Tu l'appelles en lui transmettant le nom de la table cible et le DataSet qui doit être renseigné.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    procedure BuildSQLStatements(TableName: string; FBDataSet: TFBDataSet);
    var
      Query: TJvUIBQuery;
      SQLSelect, SQLInsert, SQLEdit, SQLDelete, SQLRefresh, WhereEdit: string;
    begin
      // Instruction SELECT
      SQLSelect := 'select * from ' + TableName + ' order by ';
      // Instruction REFRESH
      SQLRefresh := 'select * from ' + TableName + ' where ';
      // Instruction DELETE
      SQLDelete := 'delete from ' + TableName + ' where ';
      // Clause WHERE de l'instruction UPDATE
      WhereEdit := ' where ';
     
      // Compléter les instructions SELECT, REFRESH et DELETE
      // Collecte des noms de champs constituant la clé primaire
      Query := TJvUIBQuery.Create(nil);
      try
        with Query do begin
          DataBase := DM.UIB_DB;
          Transaction := DM.trRead;
          SQL.Text := 'select R.RDB$INDEX_NAME, R.RDB$RELATION_NAME, I.RDB$FIELD_NAME ' +
                      'from RDB$INDEX_SEGMENTS I ' +
                      'join RDB$RELATION_CONSTRAINTS R on I.RDB$INDEX_NAME = R.RDB$INDEX_NAME ' +
                      'where R.RDB$CONSTRAINT_TYPE = ''PRIMARY KEY'' and ' +
                      'R.RDB$RELATION_NAME = ' + QuotedStr(TableName) + ' ' +
                      'order by I.RDB$FIELD_POSITION;';
          Open;
          while not Eof do begin
            SQLSelect := SQLSelect + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
            SQLRefresh := SQLRefresh +
                          Trim(Fields.ByNameAsString['RDB$FIELD_NAME'])+
                          ' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
            SQLDelete := SQLDelete +
                          Trim(Fields.ByNameAsString['RDB$FIELD_NAME'])+
                          ' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
            WhereEdit := WhereEdit +
                          Trim(Fields.ByNameAsString['RDB$FIELD_NAME'])+
                          ' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
            Next;
            if not Eof then begin
              SQLSelect := SQLSelect + ', ';
              SQLRefresh := SQLRefresh + ' AND ';
              SQLDelete := SQLDelete + ' AND ';
              WhereEdit := WhereEdit + ' AND ';
            end;
          end;
          Close(etmCommitRetaining);
        end;
      finally
        Query.Free;
      end;
     
      // Instruction INSERT
      SQLInsert := 'INSERT INTO ' + TableName + ' VALUES(';
      // Instruction UPDATE
      SQLEdit := 'UPDATE ' + TableName + ' SET ';
     
      // Collecte des noms et des types de champs de la table
      Query := TJvUIBQuery.Create(nil);
      try
        with Query do begin
          DataBase := DM.UIB_DB;
          Transaction := DM.trRead;
          SQL.Text := 'select RDB$FIELD_NAME ' +
                      'from RDB$RELATION_FIELDS ' +
                      'where RDB$RELATION_NAME = ' + QuotedStr(TableName) + ' ' +
                      'order by RDB$FIELD_POSITION;';
          Open;
          while not Eof do begin
            SQLInsert := SQLInsert + ':' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
            SQLEdit := SQLEdit +
                         Trim(Fields.ByNameAsString['RDB$FIELD_NAME']) +
                         ' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
            Next;
            if not Eof then begin
              SQLInsert := SQLInsert + ', ';
              SQLEdit := SQLEdit + ', ';
            end;
          end;
          SQLInsert := SQLInsert + ')';
          SQLEdit := SQLEdit + WhereEdit;
          Close(etmCommitRetaining);
        end;
      finally
        Query.Free;
      end;
     
      // Ecriture des instructions dans le DataSet
      FBDataSet.SQLSelect.Text := SQLSelect;
      FBDataSet.SQLEdit.Text := SQLEdit;
      FBDataSet.SQLInsert.Text := SQLInsert;
      FBDataSet.SQLDelete.Text := SQLDelete;
      FBDataSet.SQLRefresh.Text := SQLRefresh;
     
      // DEBUG
      ShowMessage('SQLSelect' + #13#10 + SQLSelect);
      ShowMessage('SQLInsert' + #13#10 + SQLInsert);
      ShowMessage('SQLEdit' + #13#10 + SQLEdit);
      ShowMessage('SQLDelete' + #13#10 + SQLDelete);
      ShowMessage('SQLRefresh' + #13#10 + SQLRefresh);
    end;
    Une limitation cependant à ce code: la table cible doit nécessairement contenir une clé primaire. (Code qui peut être modifié assez facilement).

    @+ Claudius.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Par défaut
    Merci de ta réponse (merci tardif car la notification par mail ne fonctionne pas)

Discussions similaires

  1. ADO.NET INSERT DELETE UPDATE refresh des composants graphic
    Par jeriko dans le forum Accès aux données
    Réponses: 5
    Dernier message: 15/01/2007, 15h17
  2. [ODBC] Faire une requête INSERT, DELETE, UPDATE
    Par avogadro dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/09/2006, 11h35
  3. pb requête delete/update avec opérateur like, connexion ADO
    Par jerome666 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 09/02/2006, 16h47
  4. Pb avec ON DELETE/UPDATE CASCADE
    Par trotters213 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 09/03/2005, 11h55
  5. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 15h40

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