Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Connexion aux bases de données
Connexion aux bases de données Forum d'entraide sur la connectivité Firebird: composants, drivers, transactions, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2006, 14h01   #1
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
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
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 15h31   #2
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
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 :
1
2
3
 
UPDATE R_VEHICULE SET F_NO = :F_NO,......
WHERE f_no = :old_f_no
A+
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 16h11   #3
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
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.
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 16h37   #4
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 17h08   #5
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Citation:
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 ...
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 18h25   #6
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
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+
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 18h32   #7
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
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.
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 19h02   #8
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2006, 10h09   #9
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
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
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h44.


 
 
 
 
Partenaires

Hébergement Web