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

WinDev Discussion :

Requête de suppression sous windev


Sujet :

WinDev

  1. #21
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Voici différentes pistes pour que tu trouves toi même la solution ...

    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
     
     
    QL = ""
    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
         trace ( " L'utilisateur a sélectionné la ligne n°" + i   + " le nom du client pour cette ligne est " + tableCli[i].nomClient )
         SQL+= TableCli[i]
         SQL+= [", "]+SQL
    HLitSuivant(Req)
    FIN
    SQL = "Delete FROM TableClient where IDUSER in (" + SQL + ")"
     
    si ouinon ( SQL +RC+RC + " Ok, on continue ?" )  = non alors renvoyer faux
     
    HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL)
    Ca ne va rien corriger à ton programme, ça va juste afficher des informations qui vont t'aider à comprendre pourquoi ton programme ne marche pas.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  2. #22
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    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 : 253
    Points : 668
    Points
    668
    Par défaut
    Citation Envoyé par laura_duj Voir le message
    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)
    Citation Envoyé par tbc92 Voir le message
    Voici différentes pistes pour que tu trouves toi même la solution ...
    Hummm... Si ça plante dès la ligne 3, les indications proposées ne pourront pas servir.
    Le plantage est dûau fait que Inb=0 (au mieux car on ne voit pas la déclaration).
    Il faut déplacer cette ligne dans la boucle POUR qui liste les lignes sélectionné.
    Elle permettra de modifier l'indice i qui est un compteur sur les lignes sélectionnée uniquement en indice de table
    Grosso modo, on obtient cela :
    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
     
    // iPos=TableSelect(TableCli) // Inutile
    // iPos = TableSelect(TableCli, Inb) // Ma lplacé
    Inb=TableSelectOccurrence(TableCli)
     
    // Parcourt des lignes sélectionnée dans la table.
    // Si la table fait 4 lignes et qu'on sélectionne les lignes 2 et 4, Inb vaut 2 et i va donc être 2 puis 1
    Pour i=Inb a 1 Pas -1
         // ici je liste les ID qu'il va falloir effacer
    //     SQL+= TableCli[i]
    //     SQL+= [", "]+SQL
        iPos = TableSelect(TableCli, i) // Toujours avec l'exemple de la table de 4 lignes iPos va prendre la valeur 4 (avec i=2à puis 2 avec i=1)
        SQL+= [", "]+TableCli[iPos].<Nom de la colonne de la table contenant l'Id User>
        // HLitSuivant(Req) // Inutile et cette ligne devait faire planté le programme car situé avant le HExecute (en plus il s'agit d'une requête de suppression pas de résultat à lire
    FIN
    SQL = "Delete FROM TableClient where IDUSER in (" + SQL + ")"
    HExécuteRequêteSQL(Req, hRequêteDéfaut, SQL)

  3. #23
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    J'ajouterai ceci:
    Code WinDev : 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) // A quoi ça sert, tu n'utilises pas cette variable
    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
         trace ( " L'utilisateur a sélectionné la ligne n°" + i   + " le nom du client pour cette ligne est " + tableCli[i].nomClient )
         SQL+= TableCli[i] // que vaut SQL
         SQL+= [", "]+SQL // Et maintenant, que vaut SQL ?
    HLitSuivant(Req) //Il me dit que la requête n'est pas initialisée. Où l'est-elle ?
    FIN

    Je pense que tu devrais prendre un peu de recul sur ton code, car visiblement ça part dans tous les sens.
    Si tu sélectionnes les lignes 4 et 5, que vaut inb ? Quelles sont les valeurs prises par i à chaque itération ?

    Je rappelle à toutes fins utiles que WinDev possède un débuggeur intégré.
    Pose un point d'arrêt sur la première ligne, puis trace ton code pas à pas en surveillant tes variables. (surtout SQL et i).
    Relis bien les codes proposés dans cette discussion, et compare avec ton code.

    Tatayo.

  4. #24
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Bonjour,

    En faisant comme ça tout simplement non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL est une chaîne = "DELETE FROM TableClient WHERE TableClient.IDUSER IN (%1)"
    sListe est une chaîne
     
    POUR TOUTE LIGNE SELECTIONNEE DE TableCli
    	sListe += [","] + TableClie.IDUSER
    FIN
    SI PAS HExécuteRequêteSQL("REQ",hRequêteDéfaut,ChaîneConstruit(SQL,sListe)) ALORS
    	Erreur(HErreurInfo())
    SINON
    	Info("supprimés")
    FIN
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  5. #25
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    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 à tous pour votre aide.

    PhilouZ j'ai essayé ton code mais il me dit que l'initialisation de la requête est impossible, le user sélectionné est inattendu.

    Narwe J'ai également essayé ton code, i et iPos sont correct, IDUSER sélectionné l'est aussi et la requête me sort "DELETE FROM TableClient where IDUSER in (a123456)" ce qui est vrai.
    Cependant la ligne ne s'efface pas dans ma fenêtre et ne s'efface pas non plus dans ma bdd.
    Je pense qu'on est plus très loin, je vous remercie vraiment !

    Quand on débute ce n'est pas forcément simple mais je vous remercie tous pour votre aide.

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Le code client étant alphanumérique, il doit être entouré de quote dans le code SQL.

    Tatayo.

  7. #27
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Il faut bien lire les messages d'erreurs. Il ne te dit pas 'le user sélectionné est inattendu', il te dit 'a123456 est inattendu'.

    Imagine une requete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM TableClient WHERE TableClient.IDUSER = NOMCLIENT

    Pour SQL, IDUSER et NOMCLIENT sont des noms de colonnes de la table, il sait gérer, il détruit les enregistrements qui ont la même chose dans la colonne IdUser et dans la colonne NOMCLIENT

    Maintenant, imagine cette requete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM TableClient WHERE TableClient.IDUSER = 123
    123 est un nombre, ce n'est donc pas un nom de colonne, Il va supprimer les enregistrements avec le nombre 123 dans la colonne idUser. Plus ou moins ce qu'on cherche faire, mais nous, on doit traiter des chaines de caractères, et pas des nombres.

    Et maintenant, cette requete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM TableClient WHERE TableClient.IDUSER = a123456
    Pour SQL, cette requète est exactement comme la 1ère, a123456 n'est pas un nombre , c'est donc un nom de colonne, au même titre que idUser . Et, pas de pot, il n'y a pas de colonne qui s'appelle idUser. Donc il envoie un message d'erreur pas forcément très clair, qui dit " la colonne a123456 n'existe pas "

    La bonne requete est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM TableClient WHERE TableClient.IDUSER = 'a123456'
    Dans ce cas, SQL interprète a123456 comme dans le 2ème exemple, il considère bien que c'est une valeur, et pas un nom de colonne.

    Et quand on met in ( ) à la place de =, c'est pareil.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #28
    Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    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
    Merci effectivement ça fonctionne beaucoup mieux.
    Merci pour le raisonnement !

  9. #29
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Ce qui me choque c'est qu'un champ ID puisse être alphanumérique.

    C'est purement conventionnel mais un champ ID est un Identifiant (ou Identity) et il est généré automatiquement pas le gestionnaire de base de données dans la suite logique des nombres au moment de l'insertion.

    Cela n'agit pas sur le fonctionnement mais cela fait partie des usages.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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, 16h54
  2. Réponses: 2
    Dernier message: 03/02/2006, 14h12
  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, 19h27
  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, 10h22
  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, 17h04

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