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 :

Insertion d'un champ dans différentes tables Paradox en même temps


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de Rahim-US
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2009
    Messages : 151
    Points : 134
    Points
    134
    Par défaut Insertion d'un champ dans différentes tables Paradox en même temps
    Salut,

    J'utilise Delphi 7, j'ai ajouter deux composants TTable avec les DataSource...
    je voudrai savoir si c'est possible de faire une insertion/modification d'un champs dans deux tables Paradox différentes en même temps.

    Exemple:

    Table1:
    - CODE_EQUIP
    - NOM_EQUIP
    .
    .

    Table2:
    - CODE_EQUIP
    - CODE_ETAT
    - DATE

    Dans cet exemple je veux insérer le même champs CODE_EQUIP dans la Table1 et Table2 en même temps
    Est ce qu'il y a des paramètres dans delphi ou bien dans le Module de base de données.
    je ne veux pas utiliser le SQL si ce n'est pas la seule solution.

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par Rahim-US Voir le message
    J'utilise Delphi 7, j'ai ajouter deux composants TTable avec les DataSource...
    je voudrai savoir si c'est possible de faire une insertion/modification d'un champs dans deux tables Paradox différentes en même temps.
    En même temps, quelque soit le SGBD, ce n'est pas possible.
    Par contre, pour assurer la consistance des données, utiliser une transaction qui englobera les 2 insertions successives est la solution.
    Tout s'est bien passé, on valide ("commit") et les 2 tables contiennent les lignes insérées.
    Une étape s'est mal passée, on annule ("rollback") et aucune ligne ne sera insérée dans les tables.
    Philippe.

  3. #3
    Membre habitué Avatar de Rahim-US
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2009
    Messages : 151
    Points : 134
    Points
    134
    Par défaut
    Merci pour ta réponse, donc dans mon cas il est nécessaire d'utiliser le SQL ou bien il y a une autre méthode pour l'insertion.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    En même temps, quelque soit le SGBD, ce n'est pas possible.
    Pour Paradox, ce n'est pas possible

    Citation Envoyé par Rahim-US Voir le message
    Merci pour ta réponse, donc dans mon cas il est nécessaire d'utiliser le SQL ou bien il y a une autre méthode pour l'insertion.
    Cela ne changera rien, tu utiliseras toujours deux SQL séparé, tu ne peux pas faire un script qui permettra de faire les deux ensemble de façon cohérent.

    Conserve ton code actuel avec soit tes deux TTable avec les deux séries de Edit/.../Post


    D'ailleurs, les Transactions en paradox, cela n'existe pas non plus !
    Donc pas de COMMIT ni de ROLLBACK
    EDIT : Finalement, cela existe, les transactions locales ne sont pas si mal

    Pour d'autre SGBD comme SQL Server, Oracle ... il est possible de mettre en place un trigger lors de la modification d'un champ d'une table provoquant la mise à jour d'une autre table
    Par exemple pour de l'historisation de modification de données (Qui, Quand, Quoi, Valeur Originelle, Remplacé par)

    Sinon, ton problème de valeur a dupliquer, cela sens la redondance de données !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    D'ailleurs, les Transactions en paradox, cela n'existe pas non plus !
    Donc pas de COMMIT ni de ROLLBACK
    Puis qu'il s'agit de Paradox et de manière sous entendu le BDE, on peut quand même utiliser les transactions locales, sans oublier les limitations qui en découlent...
    http://docwiki.embarcadero.com/RADSt...l_Transactions
    Philippe.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    sans oublier les limitations qui en découlent...
    Je pense que la limitation cruciale c'est :
    Plusieurs tables sont ouvertes.
    En pourtant cela fonctionne quand même !
    La documentation semble fausse (ou imprécise) car en fait les transactions sur Paradox fonctionne beaucoup mieux que je n'aurais pu le croire, ces transactions locales sont pas si mal que cela même sur plusieurs tables en même temps !
    Par contre, les modifications sont visibles par une autre instance du module ou un autre outil de visualisation, ce n'est pas isolé comme sur un SGBD type Sybase ou Oracle
    Durant une transaction d'une instance, une autre instance peut lire les données des enregistrements de l'autre instance mais ne peut pas les modifier, c'est le fonctionnement imposé par TransIsolation tiDirtyRead

    J'ai fait un code, il insère C1/R/C2
    R est rollbacké, et C1/C2 sont commités, le résultat est tout à fait ce qu'il devrait être !
    Lorsque j'ai fait du Paradox au tout début des années 2000, j'avais du très mal faire mes tests sous D5, car à l'époque j'étais convaincu que cela fonctionnait moins bien que sur InterBase 6
    Je suis resté sur ce mauvais apriori !
    J'avais tord !

    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
    procedure TZooShaiVCLParadoxForm.btnTestRollBackClick(Sender: TObject);
    var
      D: string;
    begin
      dbDataBaseParadox.StartTransaction();
     
      D := 'C1_' + DateTimeToStr(Now());
      tblTableContact.Append();
      tblTableCompany.Append();
      tblTablePerson.Append();
      tblTableContact.FieldByName('class').AsString := D;
      tblTableContact.FieldByName('id').AsString := D;
      tblTableCompany.FieldByName('class').AsString := D;
      tblTableCompany.FieldByName('id').AsString := D;
      tblTablePerson.FieldByName('class').AsString := D;
      tblTablePerson.FieldByName('id').AsString := D;
      tblTableContact.Post();
      tblTableCompany.Post();
      tblTablePerson.Post();
     
      dbDataBaseParadox.Commit();
      tblTableContact.Refresh();
      tblTableCompany.Refresh();
      tblTablePerson.Refresh();
     
      dbDataBaseParadox.StartTransaction();
     
      D := 'R_' + DateTimeToStr(Now());
      tblTableContact.Append();
      tblTableCompany.Append();
      tblTablePerson.Append();
      tblTableContact.FieldByName('class').AsString := D;
      tblTableContact.FieldByName('id').AsString := D;
      tblTableCompany.FieldByName('class').AsString := D;
      tblTableCompany.FieldByName('id').AsString := D;
      tblTablePerson.FieldByName('class').AsString := D;
      tblTablePerson.FieldByName('id').AsString := D;
      tblTableContact.Post();
      tblTableCompany.Post();
      tblTablePerson.Post();
     
      dbDataBaseParadox.Rollback();
      tblTableContact.Refresh();
      tblTableCompany.Refresh();
      tblTablePerson.Refresh();
     
      dbDataBaseParadox.StartTransaction();
     
      D := 'C2_' + DateTimeToStr(Now());
      tblTableContact.Append();
      tblTableCompany.Append();
      tblTablePerson.Append();
      tblTableContact.FieldByName('class').AsString := D;
      tblTableContact.FieldByName('id').AsString := D;
      tblTableCompany.FieldByName('class').AsString := D;
      tblTableCompany.FieldByName('id').AsString := D;
      tblTablePerson.FieldByName('class').AsString := D;
      tblTablePerson.FieldByName('id').AsString := D;
      tblTableContact.Post();
      tblTableCompany.Post();
      tblTablePerson.Post();
     
      dbDataBaseParadox.Commit();
      tblTableContact.Refresh();
      tblTableCompany.Refresh();
      tblTablePerson.Refresh();
    end;
    la même chose fonctionne aussi en SQL

    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
    procedure TZooShaiVCLParadoxForm.btnTestRollBackQueryClick(Sender: TObject);
    var
      D: string;
    begin
      dbDataBaseParadox.StartTransaction();
     
      D := 'IC1_' + DateTimeToStr(Now());
     
      qryUpdate.SQL.Text := 'INSERT INTO Contact (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
      qryUpdate.SQL.Text := 'INSERT INTO Company (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
      qryUpdate.SQL.Text := 'INSERT INTO Person (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
     
      dbDataBaseParadox.Commit();
      tblTableContact.Refresh();
      tblTableCompany.Refresh();
      tblTablePerson.Refresh();
     
      dbDataBaseParadox.StartTransaction();
     
      D := 'IR1_' + DateTimeToStr(Now());
     
      qryUpdate.SQL.Text := 'INSERT INTO Contact (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
      qryUpdate.SQL.Text := 'INSERT INTO Company (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
      qryUpdate.SQL.Text := 'INSERT INTO Person (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
     
      dbDataBaseParadox.Rollback();
      tblTableContact.Refresh();
      tblTableCompany.Refresh();
      tblTablePerson.Refresh();
     
      dbDataBaseParadox.StartTransaction();
     
      D := 'IC2_' + DateTimeToStr(Now());
     
      qryUpdate.SQL.Text := 'INSERT INTO Contact (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
      qryUpdate.SQL.Text := 'INSERT INTO Company (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
      qryUpdate.SQL.Text := 'INSERT INTO Person (class, id) VALUES(:pclass, :pid)';
      qryUpdate.ParamByName('pclass').AsString := D;
      qryUpdate.ParamByName('pid').AsString := D;
      qryUpdate.ExecSQL();
     
      dbDataBaseParadox.Commit();
      tblTableContact.Refresh();
      tblTableCompany.Refresh();
      tblTablePerson.Refresh();
    end;
    Je n'utilise plus Paradox depuis plus de 10 ans mais je suis ravi d'avoir appris un truc, Merci Ph. B.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre habitué Avatar de Rahim-US
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2009
    Messages : 151
    Points : 134
    Points
    134
    Par défaut
    Je vous remercie beaucoup pour vos réponses je continue donc avec plusieurs SQL.

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Je n'utilise plus Paradox depuis plus de 10 ans mais je suis ravi d'avoir appris un truc, Merci Ph. B.
    Avec plaisir...
    Pour ma part, je lis toujours vos interventions avec intérêts, j'en retire toujours des éléments intéressants...
    Et je n'utilise plus du tout Paradox depuis mi-2010, mais je n'ai pas encore réemployé la mémoire que j'y avais allouée.
    Philippe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/01/2009, 13h54
  2. Réponses: 6
    Dernier message: 09/07/2007, 15h39
  3. Inserer un champs dans une table Paradox
    Par Stmic dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/04/2007, 12h05
  4. Inserer un champs dans une table Paradox
    Par Stmic dans le forum Paradox
    Réponses: 3
    Dernier message: 26/04/2007, 12h30
  5. supprimer le contenu d'un champ dans une table paradox
    Par ouldfella dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/04/2006, 13h24

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