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 :

Fonction qui n'est pas executée


Sujet :

WinDev

  1. #1
    Nouveau membre du Club Avatar de chenevierebooks
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Décembre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeuse informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 41
    Points : 35
    Points
    35
    Par défaut Fonction qui n'est pas executée
    Bonjour à tous et toutes, j'ai à nouveau besoin de vos lumières sur un problème dont j'avais déjà parlé ici et qui me semblait résolu , mais en fait non.
    J'ai une classe Connexion qui permet de se connecter a la base de données. J'ai donc mis dans le code du projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gclConnexion est un CConnexion()
    dans le code d'une procédure globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PROCÉDURE Connexion()
     
    gclConnexion.p_stServeurCS.sTypeConnexion	= "HFSQL"
    ... et tout le patracaisse ...
    gclConnexion.p_stServeurCS.sBase                      = "BaseTest"
     
    RENVOYER gclConnexion.ConnexionCS()
    quand je lance le GO, je ne passe pas dans la procédure, le pas à pas passe dessus mais ne rentre pas dans le code. Et ce qui m'étonne en plus, c'est que sans lancer le GO, j'ai une erreur "Erreur :L'expression ne renvoie pas de résultat.", comme s'il ne la voyait pas. Pourtant la procédure renvoie bien un booléen. Est-ce que c'est un problème de portée ? Ce qui me trouble encore plus : si je ferme Windev et que je le redémarre, c'est OK, lela connexion fonctionne, je n'ai pas le message d'erreur de compilation,jusqu'à ce que je le ferme à nouveau. Quelqu'un a une idée de ce qui peut bien se passer ?

  2. #2
    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,

    Une idée : tu donnes le nom d'un type de données à ta procédure (connexion). Est-ce que ça pourrait expliquer le souci ?
    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

  3. #3
    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
    Comme Frenchsting.
    En ajoutant un autre problème : ta classe aussi porte ce nom Connexion qui est un mot réservé.
    Windev est très 'cool' avec ça. Par exemple maTable désigne parfois la table ( et on va faire maTable..x pour récupérer l'emplacement de la table), ou parfois maTable désigne le numéro de la ligne sélectionnée dans la table. C'est clool, c'est moins long à taper que maTable.numligne, mais c'est contre-nature.
    Il ne faut pas trop jouer avec le feu.
    Systématiquement, je fais en sorte de nommer les objets que je créé de façon qu'il n'y ait pas d'ambiguité : ClassConnexion est une classe ProcConnexion est une procédure ...
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Nouveau membre du Club Avatar de chenevierebooks
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Décembre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeuse informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    C'est vrai que je n'ai pas pensé à la correspondance de nom de ma procédure et des mots clés de Windev. Je vais modifier le nom de ma fonction et faire quelques tests. Merci beaucoup.

  5. #5
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    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 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Pour bien comprendre ce qui va suivre, il faut se référer à ton post initial
    Ta méthode "Connecter" fait un HChangeConnexion et un HChangeRep.

    Tout d'abord, essayons de "faire un peu plus objet". Tu fais un savant mélange du procédural et du code objet.
    Lorsque tu crées un classe, c'est pour simplifier la vie de l'utilisateur (de la classe.) Pourquoi lui imposer d'affecter les données de connexion alors que cela peut se faire via une méthode de la classe ou mieux, dans le constructeur.
    e.g. :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    ETypeCnx est une Enumération
    	HFCS=hAccèsHFClientServeur
    	MySQL=hAccèsNatifMySQL
    FIN
    CConnexion est une Classe
    PRIVÉ
    	m_cnxBase est une Connexion	//Donnée de connexion à la base choisie
    	m_cnxServeur est Connexion	//Données de connexion à la racine du serveur, utilisée pour créer une nouvelle base
    	m_eType est ETypeCnx		//Moteur de la base
    FIN
     
    PROCÉDURE Constructeur(eAccèsBase est ETypeCnx,saNomBase est chaîne,saRepTravail est chaîne="")
    m_eType=eAccèsBase
    m_saRepertoire=saRepTravail
     
    m_cnxBase..Provider=eAccèsBase..Valeur
    m_cnxBase..BaseDeDonnées=saNomBase
    //L'affectation m_cnxServeur=m_cnxBase se fait par adresse et m_cnxServeur<=m_cnxBase est impossible, on doit donc "doubler"
    //le code (i.e. affecter les données à m_cnxBase et à m_cnxServeur)
    m_cnxServeur..Provider=eAccèsBase..Valeur
    SELON eAccèsBase
    	CAS HFCS
    		m_cnxBase..Serveur="localhost:4900"
    		m_cnxBase..Utilisateur="adminHFCS"
    		m_cnxBase..MotDePasse="MdpHFCS"
     
    		m_cnxServeur..Serveur		= "localhost:4900"
    		m_cnxServeur..Utilisateur	= "adminHFCS"
    		m_cnxServeur..MotDePasse	= "MdpHFCS"
    	CAS MySQL
    		m_cnxBase..Serveur		= "localhost"
    		m_cnxBase..Utilisateur	= "adminMySQL"
    		m_cnxBase..MotDePasse	= "MdpMySQL"
     
    		m_cnxServeur..Serveur		= "localhost"
    		m_cnxServeur..Utilisateur	= "adminMySQL"
    		m_cnxServeur..MotDePasse	= "MdpMySQL"
    FIN
     
    PROCÉDURE Constructeur()
    //Permet la déclaration d'une instance sans paramètre
    La méthode de connexion (testée) devient :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    // Résumé : Connecte l'utilisateur à une base de données et se place dans le répertoire de travail
    // Description des paramètres d'entrée/sortie de 'ConnecterBase' :
    //
    // Syntaxe :
    //[ <Résultat> = ] ConnecterBase ()
    //
    // Paramètres :
    //	Aucun
    // Valeur de retour :
    // 	booléen : Vrai : OK, Faux NOK
     
    FONCTION ConnecterBase() :booléen
    HChangeConnexion("*",m_cnxBase)
    //Certains moteurs (dont MySQL) ne gèrent pas les répertoires dans une base, on doit donc créer une nouvelle base
    //pour simuler HChangeRep
    SI :m_saRepertoire<>"" ALORS
    	SI m_eType=HFCS ALORS
    		HChangeRep("*",:m_saRepertoire)
    	SINON
    		:SQLChangeRep()
    	FIN
    	HCréationSiInexistant("*")
    FIN
    RENVOYER Vrai
     
    CAS ERREUR:
    ErreurPropage(dbgInfo(dbgElément))
    RENVOYER Faux
    CAS EXCEPTION:
    ExceptionPropage(dbgInfo(dbgElément))
    RENVOYER Faux
    Avec :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    // Résumé : Crée éventuellement une BDD à la racine du serveur (non HFSQL) est ce connecte à cette base
    // Description des paramètres d'entrée/sortie de 'SQLChangeRep' :
    //
    // Syntaxe :
    //[ <Résultat> = ] SQLChangeRep ()
    //
    // Paramètres :
    //	Aucun
    // Valeur de retour :
    // 	booléen : // 	Aucune
    //
    FONCTION PRIVÉE SQLChangeRep() :booléen
    REQ_CréeBase est une Source de Données
    saCodeCréation est chaîne
    saNomNouvelleBase est chaîne
     
    //Initialisation
    saCodeCréation=
    [
    	CREATE DATABASE IF NOT EXISTS %1
    	CHARACTER SET latin1
    	COLLATE latin1_general_ci
    ]
     
    HOuvreConnexion(m_cnxServeur)
     
    saNomNouvelleBase=ChaîneConstruit("%1_%2",:m_cnxBase..BaseDeDonnées,:m_saRepertoire)
    saCodeCréation=ChaîneConstruit(saCodeCréation,saNomNouvelleBase)
    HExécuteRequêteSQL(REQ_CréeBase,m_cnxServeur,hRequêteSansCorrection,saCodeCréation)
     
    :m_cnxBase..BaseDeDonnées=saNomNouvelleBase
    HChangeConnexion("*",m_cnxBase)
    RENVOYER Vrai
     
    CAS ERREUR:
    ErreurPropage(dbgInfo(dbgElément))
    RENVOYER Faux
    CAS EXCEPTION:
    ExceptionPropage(dbgInfo(dbgElément))
    RENVOYER Faux
    La fonction "Connexion" est devenue inutile dans la mesure où l'affectation se fait dans la classe
    Utilisation
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    clCnxHFCS est CConnexion(CConnexion.HFCS,"MaBase","MonRep")
     
    clCnxHFCS:ConnecterBase()
     
    //Gestion des erreurs et des exceptions
    saErrMsg est chaîne
    CAS ERREUR:
    TitreSuivant("Erreur. Ctrl+C pour copier")
    SELON ErreurInfo(errCode)
    	//Erreurs connues		
    	AUTRE CAS :
    		saErrMsg=ChaîneConstruit("%5%2Erreur n° %1%2%3%2Consultez votre fournisseur",...
    		ErreurInfo(errCode),CRLF,ErreurInfo(errMessage),dbgInfo(dbgElément))
    FIN
    SI PAS EnModeTestAutomatique ALORS
    	Erreur(saErrMsg)
    SINON
    	dbgErreur(saErrMsg)
    FIN
    RENVOYER Faux
     
    CAS EXCEPTION:
    TitreSuivant("Exception. Ctrl+C pour copier")
    SELON ExceptionInfo(errCode)
    	//Exceptions connues par leur N°
    	AUTRE CAS
    		saErrMsg=ChaîneConstruit("%5%2Exception n° %1%2%3%2Consultez votre fournisseur",...
    		ExceptionInfo(errCode),CRLF,ExceptionInfo(errMessage),dbgInfo(dbgElément))
    FIN
    SI PAS EnModeTestAutomatique ALORS
    	Erreur(saErrMsg)
    SINON
    	dbgErreur(saErrMsg)
    FIN
    RENVOYER Faux
    Après, on peux toujours envisager de ne plus mettre les données concernant le serveur (Nom, port) et l'utilisateur(Nom, Mdp) en dur mais de les sauvegarder dans la base de registre et de les récupérer quand le besoin s'en fait sentir. Mais ça, c'est une autre histoire.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

Discussions similaires

  1. Fonction qui n'est pas reconnue par chrome et opéra
    Par sergefaure dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/01/2016, 17h13
  2. Réponses: 12
    Dernier message: 30/04/2015, 16h07
  3. [AJAX] script ajax basique qui n'est pas executé
    Par cuisto44000 dans le forum AJAX
    Réponses: 31
    Dernier message: 22/12/2011, 19h55
  4. Réponses: 8
    Dernier message: 14/05/2009, 22h54
  5. Fonction qui n'est pas reconnue
    Par petitours dans le forum IHM
    Réponses: 4
    Dernier message: 17/08/2007, 15h28

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