1. #1
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut Requête de suppression sous windev

    Bonjour,

    Je fais appel à vous car j'ai un souci concernant une requête de suppression en SQL sous WinDev.
    Je ne pense pas que ce qui me pose problème est la requête mais plutôt la façon de l'exécuter par la suite.

    Dans mon programme, je sélectionne un utilisateur, apparaît une liste de code que je peux ajouter et supprimer.
    Cependant mon bouton supprimer ne fonctionne pas.

    Voici mon 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
    iPos=TableSelect(TableCli)
     
    Inb=TableSelectOccurrence(TableCli)
    Pour i=Inb a 1 Pas -1
     
    SQL="DELETE Code FROM TableClient WHERE TableClient.IDUSER = TableClie.IDUSER'"+iPos+"'" //TableClient est ma table dans ma bdd, TableCli est ma table, soit mon tableau dans ma feuille
     
    HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL)
    HLitPremier(Req) //Lors de l'exécution c'est ici qu'il me signal une erreur mais quand je passe la souri sur IDUSER il me met bien la bonne info (que j'ai sélectionné) et la bonne position.
    TANTQUE PAS HEnDehors(Req)
    TableCli.CODE[i] = Req.CODE
    HLitSuivant(Req)
    FIN
     
    HLibèreRequête(Req)
    Merci pour votre aide.

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 1 103
    Points : 568
    Points
    568

    Par défaut

    Par définition une requete SQL avec Delete supprime mais ne renvoie pas résultat.

    Si vous voulez le résultat ET supprimer faites 2 requetes : une avec Select et, après le bloc de lecture que vous avez prévu et une autre ensuite pour deleter

  3. #3
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut

    Bonjour et merci pour votre réponse rapide.

    Cependant je ne comprend tout de même pas ce qui cloche.

    Je ne veux pas faire un sélect je veux seulement le supprimer de ma table.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 1 103
    Points : 568
    Points
    568

    Par défaut

    La syntaxe paraît bizarre
    En principe Delete et from ne sont pas séparés, il n'y a rien à mettre.
    Essayez d'afficher le contenu de SQL (via le debogueur), montrez la nous et essayez là tel quel.

    Personnellement je procède autrement.
    Je construis une chaine SQL avec tous les identifiants a effacer
    je la passe en une fois

    par exemple

    J'identifie les identifiants a effacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL = ""
    iPos=TableSelect(TableCli)
    Inb=TableSelectOccurrence(TableCli)
    Pour i=Inb a 1 Pas -1
       SQL = SQL + TableCli(i]
       SQL = SQL + ","
    HLitSuivant(Req)
    FIN
    Eviter que la chaine fisse par une ,
    SQL = SQL + "0"

    Et on passe le tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "Delete FROM TableClient where IDUSER in (" + SQL + ")"
    En faisant ainsi on limite au maximum le nombre d'accès à la base
    En étant maniaque j'éviterais aussi d'appeler une variable SQL parce que cela peut être un mot réservé.

    Je pense que si vous construisez votre chaine comme cela et que vous nous la montrez on devrait se rapprocher de ce que vous voulez faire.

  5. #5
    Membre averti
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2013
    Messages : 180
    Points : 432
    Points
    432

    Par défaut

    Petite digression par rapport à cela :

    Citation Envoyé par Delphi-ne Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Pour i=Inb a 1 Pas -1
       SQL = SQL + TableCli(i]
       SQL = SQL + ","
    HLitSuivant(Req)
    FIN
    Eviter que la chaine fisse par une ,
    SQL = SQL + "0"
    On peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL = ""
    Pour i=Inb a 1 Pas -1
       SQL+= [", "]+SQL
       HLitSuivant(Req)
    FIN
    La virgule n'est ajouté qui si la chaine est non vide et ne se termine pas déjà par une virgule.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 1 103
    Points : 568
    Points
    568

    Par défaut

    Effectivement c'est pratique

  7. #7
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut

    Merci pour vos réponses !

    J'ai essayé de comprendre dans un premier temps ce que Delphi-ne avait commenté.
    Puis j'ai essayé de "convertir" le code à ma sauce comme je l'ai compris avec le commentaire de Narwe.

    Du coup ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pour i=Inb a 1 Pas -1
       SQL="Delete FROM TableClient where IDUSER '"+k+"'"
       HLitSuivant(Req)
    FIN
    C'est bien ça ?

    Et j'ai pourtant une erreur sur HLitSuivant(Req), il me dit qu'il ne peut pas initialiser Req.

  8. #8
    Expert éminent
    Homme Profil pro
    Développeur Freelance
    Inscrit en
    janvier 2009
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Freelance

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 276
    Points : 6 923
    Points
    6 923

    Par défaut

    Bonjour,
    Qu'est-ce qui cloche ? Pas mal de choses.
    Pour commencer, la requête n'est pas du tout bonne.
    Comme l'a indiqué Delphi-ne, la bonne syntaxe pour un DELETE est celle-ci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete from MaTable Where ...
    Il faut ajouter les conditions de sélection des lignes à supprimer après le WHERE.
    Ensuite dans la requête il y a une jointure avec ... un champ Table. Ca ne peut pas fonctionner.
    Le code fait une boucle sur les lignes sélectionnées, mais à aucun moment l'indice de cette boucle n'est utilisé pour récupérer un Id quelconque à supprimer.
    iPos est utilisé dans la requête (mal utilisé d'ailleurs), mais il est affecté AVANT l'entrée dans la boucle.
    Enfin un DELETE ne renvoie rien, donc il n'est pas possible de parcourir un éventuel résultat pour savoir ce qui a été supprimé.

    Accessoirement il faudrait vérifier le retour de hExecuteRequeteSQL, je suis sûr que WinDev va indiquer que la requête ne peut pas être lancée.

    Tatayo.

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    1 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 1 533
    Points : 3 188
    Points
    3 188

    Par défaut

    Il y a un principe encore plus global qu'il faut appliquer, c'est de tester les codes retour des fonctions qu'on lance :

    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
     
     
    iPos=TableSelect(TableCli)
     
    Inb=TableSelectOccurrence(TableCli)
    Pour i=Inb a 1 Pas -1
     
    SQL="DELETE Code FROM TableClient WHERE TableClient.IDUSER = TableClie.IDUSER'"+iPos+"'" //TableClient est ma table dans ma bdd, TableCli est ma table, soit mon tableau dans ma feuille
    // J'ai laissé la requête initiale, je ne veux pas savoir si elle est correcte ou fausse 
     
    si pas HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL) alors 
        erreur ( " désolé cher utilisateur, mon programme plante",  herreurinfo() ) 
        renvoyer faux
    fin
    HLitPremier(Req) //Lors de l'exécution c'est ici qu'il me signal une erreur mais quand je passe la souri sur IDUSER il me met bien la bonne info (que j'ai sélectionné) et la bonne position.
    TANTQUE PAS HEnDehors(Req)
    TableCli.CODE[i] = Req.CODE
    HLitSuivant(Req)
    FIN
     
    HLibèreRequête(Req)
    J'ai remplacé la ligne HexecuteRequeteSQL() par si pas HexecuteRequeteSQL() alors , et les 3 lignes suivantes.

    Ainsi, à l'exécution, Windev va me dire si oui ou non la requête est valide ou non. Et il va me le dire par un message d'erreur choisi par moi, pas un message d'erreur imposé par le système. En plus, Windev va me donner des indications pour que je corrige mon programme !

    A faire systématiquement pour chaque HexecuteRequeteSQL()
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 1 103
    Points : 568
    Points
    568

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pour i=Inb a 1 Pas -1
     SQL="Delete FROM TableClient where IDUSER '"+k+"'"
     HLitSuivant(Req)
     FIN

    Si j'ai écrit cela c'est que j'étais malade avant d'aller déjeuner.
    Avec cette syntaxe on va avoir autant de fois Delete from que de lignes. Il ne le faut qu'une fois en début de requete.
    Ensuite à quoi correspond k ?

    Si on reprend mon code : j'ai ajouté des commentaires et le petit gadget propre à WD pour la ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL = ""
    iPos=TableSelect(TableCli)
    Inb=TableSelectOccurrence(TableCli)
    Pour i=Inb a 1 Pas -1
         // ici je liste les ID qu'il va falloir effacer
         SQL+= TableCli[i]
         SQL+= [", "]+SQL
    HLitSuivant(Req)
    FIN
    // ici je construis ma syntaxe. Je n'ai bien qu'une fois Delete from et le mot Where
    SQL = "Delete FROM TableClient where IDUSER in (" + SQL + ")"
    HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL)
    Par précaution sur vous n'êtes pas sûre de vous ne mettez pas la ligne HExecute.
    Juste un Trace. Cela vous permettra de voir la syntaxe avant de la lancer, sinon vous risquez d'avoir une effect destructeur en cas d'erreur.

  11. #11
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut

    Super !
    Merci pour vos explications !
    Je vais essayer cela

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 1 103
    Points : 568
    Points
    568

    Par défaut

    La recommandation de tbc92 consistant à toujours tester la bonne exécution est tout à fait justifiée.
    Personnellement j'utilise un module qui regroupe toutes mes syntaxes d'accès aux données et c'est à ce niveau que je gère les status de retour.

    Comme en Delphi naguère... Il y avait un DataModule exprès. C'était le bon temps.

  13. #13
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut

    J'ai encore l'erreur "la source de données "Req" n'est pas initialisée"...

    Voici la version sans SQL qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Inb=TableSelectOccurrence(TableCli)
    			POUR i=Inb A 1 PAS -1
    				HLitRecherchePremier(TableClient, IDUSER, TableCli.IDUSER[iPos])
    				SI HTrouve(TableClient) ALORS
    					SI HSupprime(TableClient) ALORS
    						TableSupprime(TableCli,iPos)
    					FIN
    				FIN
    			FIN

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    1 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 1 533
    Points : 3 188
    Points
    3 188

    Par défaut

    Et tu as lancé quoi comme code ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  15. #15
    Membre confirmé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 1 103
    Points : 568
    Points
    568

    Par défaut

    Je n'ai pas WD ici pour répondre sur ce point

    Par contre dans SQL vous avez quoi maintenant ?

  16. #16
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut

    J'ai mis cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL = ""
    iPos=TableSelect(TableCli)
    Inb=TableSelectOccurrence(TableCli)
    Pour i=Inb a 1 Pas -1
         // ici je liste les ID qu'il va falloir effacer
         SQL+= TableCli[i]
         SQL+= [", "]+SQL
    HLitSuivant(Req)
    FIN
    SQL = "Delete FROM TableClient where IDUSER in (" + SQL + ")"
    HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL)
    Et j'ai voulu mettre le SI PAS HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL) mais le code ne s'exécute pas jusqu'ici

  17. #17
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    1 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 1 533
    Points : 3 188
    Points
    3 188

    Par défaut

    Dans le code que tu as posté, il manque une instruction comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ipos = tableselect( TableClient, Inb)
    Entre la ligne 2 et 3.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  18. #18
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut

    Il me dit "Aucune syntaxe de TableSelect ne correspond"

  19. #19
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    1 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 1 533
    Points : 3 188
    Points
    3 188

    Par défaut

    Il faut que tu fasses quelques efforts. Le minimum, c'est de dire précisément ce que tu as testé.

    En relisant tout ça, je m'aperçois que ta table ne s'appelle pas tableClient, mais tableCli. Dans le conseil que je t'ai donné, j'avais donc mis un mauvais nom de table. Dans le dernier essai que tu as fait, tu as laissé tableClient, ou tu as corrigé par TableCli ?

    Deviner pourquoi un code ne marche pas, c'est facile, mais deviner ce que tu as mis dans ton programme, c'est beaucoup plus difficile.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  20. #20
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    mai 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    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 : 82
    Points : 49
    Points
    49

    Par défaut

    Oui j'avais remarqué et j'ai donc changé le nom de la table.

    J'ai écrit cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL = ""
    iPos=TableSelect(TableCli)
    iPos = TableSelect(TableCli, Inb) //Il me dit que aucune syntaxe de TableSelect ne correspond
    Inb=TableSelectOccurrence(TableCli)
    Pour i=Inb a 1 Pas -1
         // ici je liste les ID qu'il va falloir effacer
         SQL+= TableCli[i]
         SQL+= [", "]+SQL
    HLitSuivant(Req)
    FIN
    SQL = "Delete FROM TableClient where IDUSER in (" + SQL + ")"
    HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requête analyse croisée sous SQL SERVER
    Par motus_z dans le forum MS SQL-Server
    Réponses: 2
    Dernier message: 23/02/2006, 17h54
  2. Réponses: 2
    Dernier message: 03/02/2006, 15h12
  3. Requêtes analyses croisées sous SQL Server 2000
    Par callo dans le forum MS SQL-Server
    Réponses: 3
    Dernier message: 24/09/2005, 20h27
  4. PB de tables créées sous Windev
    Par Reynald dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/04/2004, 11h22
  5. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 18h04

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