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

Langage SQL Discussion :

Faire un select sur tables puis un update


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 84
    Points : 49
    Points
    49
    Par défaut Faire un select sur tables puis un update
    Bonjour,

    Je bloque depuis deux jours sur une requête sql dans mon code WinDev.

    J'ai trois fichiers de données.
    Un fais le lien entre les deux autre : BDD_MAIN
    Le second est celui où je vais chercher la valeur à copier : BDD_SEC
    Le troisième est celui où je vais copier les valeurs trouvées : BDD_TROIS

    BDD_MAIN
    ID_TR : Unique
    NOM_CLI : Unique
    ...

    BDD_SEC
    NOM_CLI : Pas unique
    NUM_COM : Pas unique
    ...

    BDD_TROIS
    ID_TR : Pas Unique
    NOM_CLI : Pas unique
    NUM_COM : Pas unique
    ID_DET : Unique
    ...

    La combinaison de NOM_CLI et de NUM_COM est unique.
    Exemple : Si NOM_CLI = toto et NUM_COM = 12 alors on ne peut pas trouver d'autre enregistrement
    égale égale à NOM_CLI = toto et NUM_COM = 12 mais si NOM_CLI = titi et NUM_COM = 12 c'est possible et
    vice versa.

    Dans BDD_TROIS je n'ai pas toutes les valeurs de BDD_SEC.

    Je veux cependant mettre à jour les enregistrement dont BDD_SEC.NOM_CLI = BDD_TROIS.NOM_CLI
    et BDD_SEC.NUM_COM = BDD_TROIS.NUM_COM

    J'ai fais une requête, la trace m'indique :
    UPDATE BDD_TROIS SET NUM_COM WHERE ID_TR=1234 AND NUM_COM=12

    Mais quand je vais dans BDD_TROIS, la valeur ne s'est pas mise à jour ...

    Voici ma requête :

    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
    sqL="SELECT BDD_SEC.ID_DET, BDD_SEC.NOM_CLI, "+...
    	"BDD_SEC.NUM_COM "+..."
    	"FROM BDD_MAIN, BDD_SEC, BDD_TROIS "+...
    	"WHERE RD_MAIN.NOM_CLI = BDD_SEC.NOM_CLI "+...
    	"AND BDD_MAIN.ID_TR=BDD_TROIS.ID_TR "+...
    	"AND BDD_TROIS.NUM_COM = BDD_DEUX.NUM_COM"
    	HExécuteRequêteSQL(Rq,hRequêteDéfaut,sqL) 
    	HLitPremier(Rq)
    	TANTQUE PAS HEnDehors(Rq)			
    		sqll="update BDD_TROIS set NUM_COM="+Rq.NUM_COM+" +...
    		" where ID_DET="+Rq.ID_DET+" and NUM_COM='"+Rq.NUM_COM+"' "
    		Trace(sqll) 		
    		HExécuteRequêteSQL(RqQ,hRequêteDéfaut,sqll) 
    		HLitSuivant(Rq)		
    	FIN
    	HLibèreRequête(Rq)
    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Bonjour,
    Je pense que c'est plus un problème WinDev que SQL.
    Il faudrait commencer par poser un point d'arrêt, et tracer le code pas à pas pour voir ce qu'il se passe.
    Il serait aussi intéressant de tester le retour de HExécuteRequêteSQL() dans la boucle. Peut-être que WinDev pourrait nous dire ce qui ne va pas.

    Maintenant je ne comprends pas le but de la requête de mise à jour:
    Code Windev : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sqll="update BDD_TROIS set NUM_COM="+Rq.NUM_COM+" +.....
    " where ID_DET="+Rq.ID_DET+" and NUM_COM='"+Rq.NUM_COM+"' "
    La valeur que tu affectes à NUM_COM est celle qui est utilisé comme critère de sélection. Si je remplace les variables par des valeurs (au hasard):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    update BDD_TROIS set NUM_COM=1234
    where ID_DET=5 and NUM_COM='1234'
    Bref la requête ne fait rien !
    On peut également noter qu'il y a un problème de quote pour NUM_COM. Un coup il y en as, un coup non.

    Tatayo.

  3. #3
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 84
    Points : 49
    Points
    49
    Par défaut
    Bonjour et merci pour votre réponse.

    J'ai du m'emmêler les pinceaux en faisant une démo de ma requête avec des tables et des champs beta.
    En effet, dans BDD_SEC et BDD_TROIS il manque un champ : VAL_ACOPIER par exemple et donc la requête serait plutôt :

    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
    sqL="SELECT BDD_TROIS.ID_DET, BDD_SEC.NOM_CLI, "+...
    	"BDD_SEC.NUM_COM, BDD_SEC.VAL_ACOPIER "+..."
    	"FROM BDD_MAIN, BDD_SEC, BDD_TROIS "+...
    	"WHERE RD_MAIN.NOM_CLI = BDD_SEC.NOM_CLI "+...
    	"AND BDD_MAIN.ID_TR=BDD_TROIS.ID_TR "+...
    	"AND BDD_TROIS.NUM_COM = BDD_DEUX.NUM_COM"
    	HExécuteRequêteSQL(Rq,hRequêteDéfaut,sqL) 
    	HLitPremier(Rq)
    	TANTQUE PAS HEnDehors(Rq)	
    sqll="update BDD_TROIS set VAL_ACOPIER="+Rq.VAL_ACOPIER+" +.....
    " where ID_DET="+Rq.ID_DET+" and NUM_COM='"+Rq.NUM_COM+"' "
    Trace(sqll) 		
    		HExécuteRequêteSQL(RqQ,hRequêteDéfaut,sqll) 
    		HLitSuivant(Rq)		
    	FIN
    	HLibèreRequête(Rq)
    Désolé pour l'erreur.

    La trace m'indique bien les bonnes valeurs et mises à jour.

    UPDATE BDD_TROIS SET VAL_ACOPIER=1 WHERE ID_DET=1234 and NUM_COM='TEST'
    Mais rien ne se copie dans ma BDD_TROIS...

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'ai du mal à comprendre votre besoin...

    BDD_SEC
    NOM_CLI : Pas unique
    NUM_COM : Pas unique

    La combinaison de NOM_CLI et de NUM_COM est unique.
    Dans cette dernière phrase, vous parlez bien de BDD_SEC ?

    Dans BDD_TROIS je n'ai pas toutes les valeurs de BDD_SEC.

    Je veux cependant mettre à jour les enregistrement dont BDD_SEC.NOM_CLI = BDD_TROIS.NOM_CLI
    et BDD_SEC.NUM_COM = BDD_TROIS.NUM_COM
    Voulez-vous :
    1) Mettre à jour les NUM_COM pour les NOM_CLI existants ?
    2) Ajouter les couples (NOM_CLI, NUM_COM) qui n'existent pas dans BDD_TROIS ?
    3) Autre chose ?

    Selon votre besoin et votre SGBD, il y a peut-être une requête ensembliste qui peut faire votre mise à jour d'un coup sans boucler sur le résultat d'un SELECT.

    Ensuite, les jointures se font avec l'opérateur JOIN depuis 1992, soit 25 ans ; il serait temps de s'y mettre !

  5. #5
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 84
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    Merci beaucoup pour votre aide. En fait erreur bête, une " ' " trainaint dans un des champ à updater ...

    Merci pour votre temps.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/09/2009, 17h02
  2. Faire un SELECT sur 2 tables?
    Par outshined dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/09/2006, 22h42
  3. [Hibernate][Tomcat] Select sur tables
    Par parasol007 dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 12/05/2006, 15h01
  4. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 15h38
  5. Faire un select sur une quantité défini d'élément
    Par tripper.dim dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2005, 12h14

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