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 :

Problème de code - Manipulation de chaine de caractères


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 126
    Points : 105
    Points
    105
    Par défaut Problème de code - Manipulation de chaine de caractères
    Salut à tous, je suis nouveau dans ce forum
    Je rencontre un problème dans un code que j'utilisait dans Access sans problème, mais quand je l'ai transcrite en WLangage, il ya un problème.
    Voici le 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
    16
    Procedure GetLetter(StartLetter est chaine, Loops est chaîne)
    	strAlpha est une chaine
    	i est entier
    	t est une chaine
    strAlpha = "AWKBNDPLRFUVETYZQHJMXCG"
    i = Position(strAlpha, StartLetter)
    t = StartLetter
    Pour i = i A i + (Loops - 1)
        t = Milieu(strAlpha, Position(strAlpha, t) + 1, 1)
    	i++
    Fin
    	si StartLetter ="" ou StartLetter = "G" alors
    		renvoyer = "A"
    	sinon
    		renvoyer = t
    	Fin
    Cette fonction renvoie des lettres. Par exemple: quand je met GetLetter("A", 1) il m'envois W, et quand je met GetLetter("W",1) il m'envoie K, donc la
    foncton renvoie la lettre suivant celle mise dans la fonction.
    Pour toute question je suis à vous
    Merci de votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 126
    Points : 105
    Points
    105
    Par défaut Oups!!!!!!!!!!!!!!!!!
    Loops est un entier

  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
    1. Loops sert à quoi ??? J'imagine que dans ton code initial, Loops sert à RENVOYER le résultat, mais aucune certitude là dessus. J'ai supprimé LOOPS.
    2.choisis des noms de variable explicites. Souvent t représente le temps, t pour représenter une chaine, c'est vraiment inhabituel. Par défaut, dans Windev, Windev t'empêche de nommer les variables avec des noms 'trompeurs', Si tu tapes t est une chaine, il remplace t pas st. (s=String)

    Voici une solution (non testée, mais ça devrait être bon)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Procedure GetLetter(StartLetter est chaine )
    strAlpha est une chaine
    i est entier
    strAlpha = "AWKBNDPLRFUVETYZQHJMXCG"
    i = position ( strAlpha, Startletter)
    i = i+1 
    si i > taille(strAlpha) alors i = 1 
    renvoyer strAlpha[[i]]
    Idéalement, faudrait aussi tester le cas où StartLetter n'est aucune des lettres de StrAlpha :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure GetLetter(StartLetter est chaine )
    strAlpha est une chaine
    i est entier
    strAlpha = "AWKBNDPLRFUVETYZQHJMXCG"
    i = position ( strAlpha, Startletter)
    si i = 0 alors renvoyer NULL         // Traitement d'erreur 
    i = i+1 
    si i > taille(strAlpha) alors i = 1 
    renvoyer strAlpha[[i]]
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 126
    Points : 105
    Points
    105
    Par défaut
    Salut, Merci pour votre réponse rapide.
    Je devrais posé au faite tout le problème, je suis désolé.
    je voudrais créer un champs Matricule qui représente une numérotation perso.
    Au premier enregistrement, c'est à dire si pas enregistrement dans la fiche ce champs matricule prend la valeur "100000A" et après
    Au deuxième "100001W", au troisième "100002K" donc le matricule est composé d'une incrémentation (100000, 100002,...........) et de la fonction GetLetter qui prendra la lettre du dernier enregistrement pour s'incrémenter (C'est à dire : pour le 4ème : on concatène 100003 et GetLetter(LettreDuDernierEnregistrement) qui doit renvoyer B, ainsi le 4ème sera "100003B").
    Voici ma piste, mais non efficace
    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
    Ival est un entier
    DLettre est une chaîne
    i est un entier
    //lit le dernier enregistrement
    HLitDernier(T_Eleves.Matricule)
     
    //prend le numéro de l'enregistrement en cours
    i=HNumEnr(T_Eleves)
     
    //vérifi s'il y'a déja un engegistrement dans la base de donneés
    SI HEnDehors(T_Eleves)= Vrai ALORS
    	i=100000
    	DLettre=Droite(T_Eleves.Matricule,1)
    	Ival=i+GetLetter(DLettre)
    SINON
     
    	//s'il y'a déjà un enregistrement
    	i+=100000
    	Ival=i+GetLetter(DLettre)
    FIN
    SAI_Matricule=Ival
    Encore, Merci

  5. #5
    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
    Tu dis que ton code ne fait pas ce que tu veux ... A priori, tu sais ligne par ligne ce que ton code est sensé faire. Tu peux exécuter ton code en mode DEBUG pour regarder à quel moment ton code fait un truc différent du truc attendu.
    Si tu ne sais pas comment lancer ton programme en mode DEBUG, voir ce lien : https://doc.pcsoft.fr/fr-FR/?2019001

    Voici quand même quelques trucs qui me perturbent dans ton code :

    Ligne 5 : HLitDernier(T_Eleves.Matricule, Matricule) au lieu de HLitDernier(T_Eleves.Matricule) : Je cherche la ligne avec le plus grand n° de matricule. Si on ne précise pas, Windev prend la dernière ligne, selon un critère qu'on ne maîrtise pas trop.

    Ligne 8 : hNumEnr () renvoie un n° mais ce n° est plus ou moins inexploitable ; En particulier si un jour tu détruis des enregistrements dans ton fichier, ce n° deviendra complètement inexploitable. Ici, il faut que tu fasses i = val ( T_Eleves.Matricule)

    Au passage, il faut gérer en plus le cas où le fichier T_Eleves est vide.

    Enfin, le gros bug : ligne 14 ou ligne 18 : Ival = I + GetLetter(DLettre)
    I est déclaré comme un entier , Ival aussi est déclaré comme un entier ; Si I vaut 10001 et GetLetter(DLettre) vaut "K" par exemple, Windev va tenter d'additionner 10001 et K , je ne sais pas trop ce que ça va donner , peut-être 10001, peut-être un autre nombre, plus grand, mais ça ne va pas donner une chaine de caractères. Ca va donner un nombre, puisque tu as mis au tout début : Ival est un entier.

    La solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sVal est une chaine
    I est un entier 
    I = 10001
    sVal = numeriqueverschaine(I) + GetLetter(DLettre)
    Ainsi, Windev convertit I en chaine de caractères. Et quand il doit Additionner 2 chaines de Caractères, il comprend bien qu'il faut coller la 2ème chaine à la fin de la première. Additionner 2 chaines de Caractères , ou additionner 2 nombres, ce n'est pas du tout la même chose.

    Ca, c'est la base de la programmation. Quand on fait des erreurs comme ça, c'est qu'on n'a pas les bases, on va faire des erreurs partout. Il faut lire des TUTORIELS sur la programmation.
    Et selon moi, il faut que tu lises des tutoriels d'initiation à la programmation (peu importe le langage).
    Et ensuite, il faut que tu lises le manuel d'Auto-formation sur Windev. Le manuel d'auto-formation est fait pour des gens qui ont déjà un peu de bases sur la programmation... tu n'as pas ces bases.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 126
    Points : 105
    Points
    105
    Par défaut
    Merci, pour la reponse et la remarque. Débutant en windev, je m'y mettrais sur ces tutos.
    Pour le code, je vérifie et je vous reviens.

Discussions similaires

  1. problème de code avec un tableau
    Par richard038 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/05/2006, 17h35
  2. problème de code javascript pour une vue 360°
    Par tomguiss dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/03/2006, 22h50
  3. [POO] Problème de code PHP avec Internet Explorer
    Par bzoler dans le forum Langage
    Réponses: 5
    Dernier message: 12/02/2006, 11h00
  4. Problème de code besoin d un petit depannage
    Par rakengoule dans le forum MFC
    Réponses: 3
    Dernier message: 10/10/2005, 16h25
  5. Probléme de code non portable
    Par Stany dans le forum Windows
    Réponses: 2
    Dernier message: 23/08/2005, 11h02

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