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

Connexion aux bases de données Firebird Discussion :

TIBDataSet comment faire de la mise à jour avec jointure


Sujet :

Connexion aux bases de données Firebird

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut TIBDataSet comment faire de la mise à jour avec jointure
    Bonjour

    Dans un projet j'ai besoin d'utiliser l'héritage de table:
    Je reprends l'exemple des véhicules.
    J'ai un première table "VEHICULE" (No, Nom, Type) et des tables annexes "CAMION", "BUS", etc. qui contiennent des informations spécifques pour un type donné.
    Le champ No est clé primaire dans toutes les tables, et en plus clé étrangère dans les tables annexes.

    J'utilise essentiellement ces tables au travers d'un mapping objet et ca fonctionne correctement.

    Je voudrais pouvoir éditer, avec modification des champs, la liste des camions (par exemple) dans un DbGrid.
    Pour ça j'utilise un TIBDataSet avec un SelectSQL:
    SELECT R_VEHICULE.F_NO, F_DATIM, F_CONDUCT, F_PV, F_PTC
    FROM R_VEHICULE INNER JOIN R_CAMION
    ON R_VEHICULE.F_NO = R_CAMION.F_NO

    Mais comment écrire le ModifySQL !!!!!

    Bien sur j'ai essayé:
    - UPDATE ... JOIN
    - Mettre deux UPDATE
    - utiliser OnUpDateRecord, qui n'est appelé quand des circonstances que je n'ai pas réussi à élucider

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Salut

    J'entends que tu veux changer seulement la table R_VEHICULE, non? Si est comme ça, tu dois cree une sentence SQL de update seulement de la table R_VEHICULE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    update R_VEHICULE set F_NO = :F_NO,......
    where f_no = :old_f_no
    A+

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Non, je veux changer les deux tables.
    L'utilisateur qui traite les camions voit une seule liste qui est une jointure de la table VEHICULE, qui contient le nom du conducteur, et de la table CAMION, qui contient le PV et le PTC. Et il peut modifier aussi bien le conducteur que le PTC

    Mais depuis, j'avance. J'essaye la combinaison suivante:
    1° le ModifySQL ne contient que le UPDATE à propos de la table VEHICULE.
    2° j'intercepte OnUpdateRecord où je fais la mise à jour de la table CAMION via un TIBSQL
    3° avant de fermer le TIBDataSet je teste "IBDataSet.UpdatePending" et s'il est vrai j'appelle IBDataSet.ApplyUpdate.
    NOTE: tout pourrait être traité dans le UpdatePending mais si ModifySQL est vide, le DataSet est en ReadOnly !!!

    J'avance à tatons, rien dans la doc Interbase et rien non plus sur le net pour traiter ce cas là
    J'ai pu trouver que dans ce cas il fallait utiliser TIBDataSet au lieu de TIBQuery qui ne peut parait-il traiter qu'une seule table, mais sans plus de détail.

  4. #4
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Citation Envoyé par uluru
    J'avance à tatons, rien dans la doc Interbase
    normal, c'est pas un problème Interbase
    c'est un problème Delphi
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    normal, c'est pas un problème Interbase, c'est un problème Delphi
    Qu'on ne puisse pas faire une requête :
    UPDATE R_VEHICULE JOIN R_CAMION ON
    c'est bien un probleme Interbase.

    De même, créer une vue V_CAMION = R_VEHICULE JOIN R_CAMION qui serait en lecture seule .

    Que la solution à mon problème soit dans Delphi ou Interbase ...

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Salut

    Si je ne me trompe pas, une requete avec "join" ne peut actualisé plus que 1 seule table et, dans Interbase/Firebird, je crois que les vues sont seulement de lecture

    Tu dois le faire en deux étapes et avec 2 TIBDataSet differents. Tu peux, par exemple, s'il veux modifier un champ de la table "secondaire", oubrir un nouveau form au moment d'essayer faire les changements sur ce champ.

    A+

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par cadetill
    Si je ne me trompe pas, une requete avec "join" ne peut actualisé plus que 1 seule table et, dans Interbase/Firebird, je crois que les vues sont seulement de lecture
    Je pense que tu as raison.

    Citation Envoyé par cadetill
    Tu dois le faire en deux étapes et avec 2 TIBDataSet differents. Tu peux, par exemple, s'il veux modifier un champ de la table "secondaire", oubrir un nouveau form au moment d'essayer faire les changements sur ce champ.
    c'est pas pratique du tout et la piste que j'explorait avec OnUpdateRecord fonctionne parfaitement.

  8. #8
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    sauf que tu pouvais très bien tout faire dans ton "OnUpdateRecord"
    tu ouvre une transaction
    tu fais tes deux updates (car il y a bien deux updates à faire) mais si ça t'amuse tu peux même le faire via une procédure stocké
    tu commit la transaction
    et basta et tes données sont cohérentes
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par makowski
    sauf que tu pouvais très bien tout faire dans ton "OnUpdateRecord"
    Citation Envoyé par uluru
    NOTE: tout pourrait être traité dans le UpdatePending mais si ModifySQL est vide, le DataSet est en ReadOnly !!!
    A la place de "UpdatePending", il fallait comprendre "OnUpDateRecord". Lapsus digital

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/03/2011, 23h26
  2. Comment créer une mise à jour avec DreamShield ?
    Par smyley dans le forum Dreamshield
    Réponses: 0
    Dernier message: 16/01/2008, 23h48
  3. Requête mise à jour avec jointure interne
    Par joquetino dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/01/2008, 17h41
  4. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 17h33
  5. Mise à jour avec jointure
    Par taupain dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/07/2004, 11h27

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