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 :

WDE27 - Aide compréhension mauvaise exécution de requete HFSQL


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 10
    Points
    10
    Par défaut WDE27 - Aide compréhension mauvaise exécution de requete HFSQL
    Bonsoir,

    Je me lance dans la création d'un petit outil pour mon travail, et je veux cette fois-ci me passer d'une base MySql, et utiliser à la place les fichiers HFSQL.

    J'ai créé mon analyse avec tous les fichiers.

    Cet outil, doit permettre dans un 1er temps à s'identifier avec un login et un mot de passe. Ces infos sont stockées dans le fichier USER dont voici la description :

    Nom : 2024-01-10_21h35_01.jpg
Affichages : 159
Taille : 10,0 Ko

    Niveau fenêtres du projet, j'ai la fenêtre principale qui contient un menu de connexion et 2 autres qui sont grisés :

    Nom : 2024-01-10_21h35_57.jpg
Affichages : 151
Taille : 9,8 Ko

    Et l'idée et que les 2 autres menus se dégrisent si l'utilisateur a saisi le bon login + mot de passe.

    J'ai créé une requête de sélection des données avec 2 paramètres :

    Nom : 2024-01-10_21h37_22.jpg
Affichages : 156
Taille : 25,9 Ko

    et son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    	USER.USR_LOGIN AS USR_LOGIN,	
    	USER.USR_MDP AS USR_MDP
    FROM 
    	USER
    WHERE 
    	USER.USR_LOGIN = {pUSR_LOGIN}
    	AND	USER.USR_MDP = {pUSR_MDP}
    Si je teste cette requête avec comme valeur pour les variables : SU et 2691 tout se passe bien :

    Nom : 2024-01-10_21h38_38.jpg
Affichages : 154
Taille : 38,0 Ko

    1 enregistrement trouvé ce qui est normal :

    Nom : 2024-01-10_21h39_05.jpg
Affichages : 154
Taille : 21,0 Ko

    Maintenant, c'est côté code que cela se corse. En cliquant sur le menu Connexion, j'ouvre cette fenêtre où l'on doit saisir les 2 infos : login et mdp :

    Nom : 2024-01-10_21h40_25.jpg
Affichages : 153
Taille : 16,0 Ko

    Et le code suivant sur le bouton valider :

    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
    REQ_Selection_SU.pUSR_LOGIN	= SAI_Login
    REQ_Selection_SU.pUSR_MDP	= SAI_MotDePasse
     
    SI SAI_Login="SU" ALORS
    	SI REQ_Selection_SU.ExécuteRequête()= Faux ALORS
    		Erreur(HErreurInfo())
    		RENVOYER ""
    	SINON
    		REQ_Selection_SU.ExécuteRequête()
     
    		SI REQ_Selection_SU.NbEnr() <> 1 ALORS
    			Info("non")
    		SINON
    			Info("oui")
    			FEN_Main.OPT_Activité..Etat		= Actif
    			FEN_Main.OPT_Paramétrage..Etat	= Actif
    			Ferme(FEN_Login)
    		FIN
    	FIN
    FIN
    Pour le moment, j'ai mis info dans le SI qui regarde ce qu'il se passe en fonction du nombre d'enregistrements trouvés histoire de comprendre ce qu'il se passe.

    Si je tape un login et un mot de passe différent de ceux attendus (SU et 2691) rien ne se passe en cliquant sur valider alors que je voudrai avoir au moins le message "NON"
    Si je tape le bon login (SU) et quelques soit le mot de passe saisi ensuite, à chaque fois j'ai le message "OUI" qui s'affiche et la fenêtre se ferme et les menus se dégrisent. Cela ne devrait pas être le cas car volontairement j'ai mis un mauvais mot de passe.

    J'ai beau regardé sur le net des exemples et l'aide en ligne de PCSoft, j'avoue ne pas comprendre. Sûrement à ma non maîtrise du sujet.

    Si qqun peut m'aider pour y voir + clair et comprendre ce que je fais de mal.
    Merci à tlm.

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    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 057
    Points : 9 397
    Points
    9 397
    Par défaut
    Dans ton code ,tu as ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Si SAI_login = "SU alors 
       // différentes choses
    Fin
    Donc si SAI_Login n'est pas "SU" , il ne se passera rien, pas d'affichage de Non ni Oui, on ne passe pas par le code que tu nous as montré.

    Ensuite, tu testes ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si REQ_Selection_SU.ExécuteRequête()= Faux
    Je ne vois pas le code de ExécuteRequête(), mais à coup sûr, cette fonction renvoie Vrai si la requête s'exécute correctement, et Faux si la requête ne s'exécute pas correctement. Plus clairement, ça renvoie Faux si il y a une erreur de syntaxe dans ta requête, were à la place de where par exemple.
    Regarde la documentation de hexecuteRequeteSQL ou mieux ici, dans le paragraphe 'Syntaxe'
    Pour récupérer la (les) ligne(s) renvoyées par la requête, il faut utiliser la fonction hLitPremier() (exemple dans le 1er lien ci-dessus).

    Sinon, si tu as des connaissances en MySQL ou en SQL en général, je te conseille d'utiliser Windev, mais de garder tes fichiers en MySQL.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 811
    Points : 5 270
    Points
    5 270
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Déjà, tu testes le fait que SAI_Login="SU" mais tu n'indiques rien sur la conduite à tenir SINON.
    Toutefois, pourquoi faire ce test. Si la requête ne renvoie rien, (REQ_Selection_SU.NbEnr() <> 1) on a un mauvais couple c'est ce qui nous importe, que SAI_Login soit ou non égal à "SU".
    Donc le test sur REQ_Selection_SU.NbEnr() <> 1 suffit (à condition toutefois de ne pas oublier le SINON ...)

    Remarque 1 :
    USR_Login est une clé alternative

    Remarque 2 :
    Il faut crypter le MDP ou le hasher. La deuxième solution évite d'avoir à décrypter le mot de passe pour le comparer avec le MDP saisi.

    Le code devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FONCTION VérifieMDP(saLogin est chaîne,saMDP est chaîne) : booléen
     
    HLitRecherchePremier(USER,AK_USR_Login,saLogin)	//Les erreurs sont centralisées
    RENVOYER HashVérifieChaîne(HA_SHA3_256,saMDP,USER.USR_MDP)	//L'algo de hash sera celui utilisé lors de l'enregistrement
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SI VérifieMDP(SAI_Login,SAi_MDP)
         Info("OK")
    SINON
         Info("NOK")
    FIN
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 811
    Points : 5 270
    Points
    5 270
    Billets dans le blog
    1
    Par défaut
    @tbc92
    Depuis la V25, ExécuteRequête() est la syntaxe préfixée de HExécuteRequête. Adieu nos HXXX.
    Ainsi, HLitPremier(<Source>) devient <Source>.LitPremier
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    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 057
    Points : 9 397
    Points
    9 397
    Par défaut
    Lol,
    Je viens de recevoir mon numéro de clé pour passer à la dernière version ... alors que je suis resté à WD24.
    J'étais passé totalement à coté de cette nouveauté.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    Tu as plutôt raté 300 nouveautés d'un coup. Préfixage de toutes les fonctions hXXXX pour WD, WB et WM...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  7. #7
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 811
    Points : 5 270
    Points
    5 270
    Billets dans le blog
    1
    Par défaut
    Sans compter le préfixage pour les tables et certainement d'autres.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    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 057
    Points : 9 397
    Points
    9 397
    Par défaut
    En fait, je n'utilise plus Windev depuis quelques années. A part très occasionnellement, pour consulter du code écrit il y a 10 ou 15 ans.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci pour vos retours.

    Utilisant une version Express, elle n'accepte qu'une seule requête dans le projet.
    Je vais donc repasser par une base MySql.

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    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 057
    Points : 9 397
    Points
    9 397
    Par défaut
    Dans Windev, il y a la notion de Requete (un fichier .WDR dans le répertoire de ton projet pour chaque requête). Dans WDE, tu es limité à un seul fichier WDR. Ok, possible.
    Mais dans Windev ou WDE, tu peux parfaitement exécuter des requêtes sans passer par ces fichiers WDR. Donc a priori sans limitation sur le nombre de requêtes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sch est une chaine
    sch = [
    select * from fichier1
    order by USR_Login
    ]
    hexecuterequeteSql ( maConnexion, sch, ... )
    Et tu peux utiliser WDE avec des tables MySQL.

    Mais, soyons honnête, WDE est un outil d'évaluation, on ne peut pas sérieusement l'utiliser. Et si je me souviens bien, si tu crées un projet un peu sérieux en WDE, et que finalement, tu décides de franchir le pas, et acheter Windev, je crois que c'est galère de réouvrir avec WD un projet créé sous WDE.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 372
    Points : 627
    Points
    627
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Mais, soyons honnête, WDE est un outil d'évaluation, on ne peut pas sérieusement l'utiliser. Et si je me souviens bien, si tu crées un projet un peu sérieux en WDE, et que finalement, tu décides de franchir le pas, et acheter Windev, je crois que c'est galère de réouvrir avec WD un projet créé sous WDE.
    Salut non c'est l'inverse
    On ne peut pas ouvrir d'exemples ou de projets windev avec la version express .
    Mais une fois que l'on a ouvert un projet express avec la version avec dongles on ne peut plus réouvrir avec L'Express.

  12. #12
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Citation Envoyé par winvsmac Voir le message
    Merci pour vos retours.

    Utilisant une version Express, elle n'accepte qu'une seule requête dans le projet.
    Je vais donc repasser par une base MySql.
    Rien ne t'empêche d'utiliser des requêtes "texte" plutôt que des requêtes avec l'assistant. Cela te permettra d'avoir plus de souplesse pour les écrire. Notamment si tu es amené à "empiler" les jointures.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  13. #13
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Mieux que les requêtes dans des chaines ce sont les variables de type 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
    17
    18
     
    maRequete est une Requête SQL = 
    [
    SELECT CLIENT.ID, CLIENT.Nom
    FROM CLIENT
    order by CLIENT.Nom
    ]
     
    SI HExécuteRequête(maRequete) ALORS
    	HLitPremier(maRequete,hForwardOnly+hSansRafraîchir)
    	TANTQUE PAS HEnDehors(maRequete)
    //
    		HLitSuivant(maRequete)
    	FIN
    SINON
    	Erreur("Erreur Exécution Requête",HErreurInfo(hErrComplet))
    FIN
    HLibèreRequête(maRequete)
    à la condition d'avoir une analyse associée, cela présente plusieurs avantages comme
    - le contrôle de la syntaxe (mais limité à la compréhension du SQLdu wlangage. C'est à dire pas de syntaxe propriétaire SQL Server ou autre). Ce contrôle sera de nouveau effectué si l'analyse évolue. Par exemple mettra une erreur si la requête contient une colonne qu'on vient de supprimer dans l'analyse

  14. #14
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    Dans l'idée, c'est bien mais comment fait-on si on a plusieurs connexions ? Et, l'inconvénient majeur (pour moi) est que tu dois avoir une analyse reliée à cette requête.

    Par exemple, dans mon projet, j'ai une analyse (pour HFCS) et une base postgresql, sans analyse, donc. Je fais donc à l'ancienne, si je fais une modif dans la structure d'une des tables (HFCS ou pg), je fais une recherche dans dans le code avant suppression.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  15. #15
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    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 057
    Points : 9 397
    Points
    9 397
    Par défaut
    Rien ne t'empêche de créer dans ton analyse les descriptions de fichiers pour les fichiers PostgreSQL, mais en fait, je fais comme toi.
    J'ai fait il y a quelques années une application assez lourde. Pour être 'réglo', j'ai créé une analyse, et j'ai déclaré certains fichiers dans cette analyse. Mais dans les faits, la majorité de mes fichiers n'apparaissent nulle pas dans l'analyse.
    Je perds certaines fonctionnalités, évidemment, mais je ne regrette absolument pas ce choix.

    J'ai par exemple des requêtes qui sont construites comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ch = " select XXXCOLONNESXXX  from XXXTABLESXXX where XXXCLAUSESXXX "
    pour i = 1 a n 
       ch_colonnes = ch_colonnes+ ....
       ch_tables = ch_tables + ....
       ch_clauses = ch_clauses+ ....
    fin
    ch = remplace ( ch, "XXXCOLONNESXXX", ch_colonnes)
    ch = remplace ( ch, "XXXTABLESXXX ", ch_tables )
    ch = remplace ( ch, "XXXCLAUSESXXX ", ch_clauses)
    A quoi me servirait une analyse ou une variable de type requête pour ça.

    Et par ailleurs, ma base de données est sous ORACLE, et je ne veux surtout pas que Windev vérifie si ma requête est 'correcte'. Il y a plein de fonctionnalités Oracle qui sont très efficaces, et qui seraient rejetées par le vérificateur de requête Windev.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  16. #16
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Je plussoie concernant la description de fichiers.
    Personnellement, je n'ai même pas besoin de ça en fait. J'utilise soit un hdeclareexterne() si je veux faire un parcours simple, soit rien du tout si je fais une requête SQL.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

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

Discussions similaires

  1. [Access 2000] Aide pour finir une requête
    Par Tankian dans le forum Access
    Réponses: 4
    Dernier message: 21/12/2005, 19h53
  2. Aide pour écrire une requête complexe
    Par julienbdx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/11/2005, 16h58
  3. Besoin d'aide pour une sous requete
    Par Celia1303 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/10/2005, 14h09
  4. Aide pour optimiser une requete
    Par Akanath dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/09/2005, 11h05
  5. probleme de d'excution de requete sql
    Par timsah dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/09/2005, 19h06

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