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 :

[WD11] rangement dans une zone mémoire


Sujet :

WinDev

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 67
    Points : 46
    Points
    46
    Par défaut [WD11] rangement dans une zone mémoire
    Bonjour,

    Je viens vous demander de l'aide parce que je n'arrive plus à m'en sortir (je m'embrouille un peu)
    Voilà, j'ai mis des enregistrements dans une zone mémoire sZoneMem avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sClé = numPeriode
    sValeur = numPeriode + TAB + compteur + TAB + dateDeb + TAB + dateFin
    Donc ça peut donner comme valeurs par exemple (les dates sont sous forme de chaîne dans la zone mais ça ne change pas grand chose) :
    01 00 11/01/2002 14/05/2002
    01 01 11/01/2002 12/05/2002
    02 00 07/10/2002 30/11/2002
    03 00 08/04/2002 22/06/2002
    03 01 09/04/2002 01/07/2002
    03 02 09/04/2002 25/06/2002
    ...
    Donc je voudrais pouvoir garder un seul numéro de période, celui avec le plus grand compteur. Jusque là, pas très compliqué.
    Donc ça donnerait :
    01 01 11/01/2002 12/05/2002
    02 00 07/10/2002 30/11/2002
    03 02 09/04/2002 25/06/2002
    ...
    Mais pour chaque numéro de période, il faut que je garde la date de début la plus petite et la date de fin la plus grande. Donc dans mes valeurs, il faudrait que ça arrive à :
    01 01 11/01/2002 14/05/2002
    02 00 07/10/2002 30/11/2002
    03 02 08/04/2002 01/07/2002
    ...
    Et je n'arrive pas à le faire simplement ^^"
    Vous pourriez m'aider s'il vous plait ?
    (je vous donnerais bien le code que j'ai déjà fait mais c'est vraiment chaotique avec des ExtraitChaine, des MemRécupère dans tous les coins ainsi que des SI enfin bref, je ne m'en sors plus ^^")

  2. #2
    Membre habitué Avatar de Christophe.LOGEL
    Homme Profil pro
    Expert WinDev / WebDev
    Inscrit en
    Mars 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Expert WinDev / WebDev
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 121
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    Si ca ne vous dérange pas de passer par une table mémoire pour faire votre traitement cela sera 10 X simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -> Ajout des lignes dans la table (datedeb et dateFin doivent être de la forme 20070327) :
    TableAjoute(MaTable, numPeriode + TAB + compteur + TAB + dateDeb + TAB + dateFin)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -> Tri des lignes par date  début + Date fin (à la fin des ajouts) :
    TableTrie(Matable, "+NumPeriode", "-Date_Debut","+Date_Fin") //NumPeriode, Date_Debut et Date_Fin sont des noms de colonnes de la table "MaTable"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -> Balayage de la table :
    si MaTable..Occurrence>0 alors
      DateCourante est une chaine = MaTable.Date_Debut[MaTable..Occurrence]
     
      POUR i= (MaTable..Occurrence - 1) à 1 PAS -1
           SI MaTable.Date_Debut[i]=DateCourante alors
               TableSupprime(MaTable, i)
           SINON
               DateCourante = MaTable.Date_Debut[i]
           FIN
      FIN
    FIN
    P.S. : Code tapé à la volée, il peut contenir des erreurs...

    Bon dév.,

    Totof
    www.sigmasys.fr
    Christophe LOGEL
    www.sigmasys.fr

  3. #3
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    La table ne m'arrange pas pour la suite. J'ai besoin des infos dans une zone mémoire pour pouvoir les utiliser pour trouver les infos à mettre dans un état.
    En plus, il faut que je mette une table dans la fenêtre.
    (et il faudrait que je change le reste du code qui traite des résultats dans la zone mémoire lol)

    Est-ce que ce code irait ? J'ai l'impression qu'il y a quelque chose qui cloche :
    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
    MemDernier(sZoneMem)
    sNumPeriodeAnc = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),1,TAB)
    sCompteurAnc = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),2,TAB)
    sDateDebAnc = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),3,TAB)
    sDateFinAnc = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),4,TAB)
    MemPrécédent(sZoneMem)
    TANTQUE PAS MemEnDehors(sZoneMem)
    	sNumPeriode = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),1,TAB)
    	sCompteur = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),2,TAB)
    	sDateDeb = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),3,TAB)
    	sDateFin = ExtraitChaîne(MemRécupère(sZoneMem,MemEnCours(sZoneMem)),4,TAB)
    	SI sNumPeriodeAnc = sNumPeriode ALORS
    		SI sCompteurAnc > sCompteur ALORS
    			SI sDateDebAnc > sDateDeb ALORS
    				MemModifie(sZoneMem,MemValClé(sZoneMem),sNumPeriodeAnc+TAB+sCompteurAnc+TAB+sDateDeb+TAB+sDateFinAnc,MemEnCours(sZoneMem)+1)
    				sDateDebAnc = sDateDeb
    			FIN
    			SI sDateFinAnc < sDateFin ALORS
    				MemModifie(sZoneMem,MemValClé(sZoneMem),sNumPeriodeAnc+TAB+sCompteurAnc+TAB+sDateDebAnc+TAB+sDateFin,MemEnCours(sZoneMem)+1)
    				sDateFinAnc = sDateFin
    			FIN
    			MemSupprime(sZoneMem,MemEnCours(sZoneMem))
    		SINON
    			sCompteurAnc = sCompteur
    			sDateDebAnc = sDateDeb
    			sDateFinAnc = sDateFin
    			MemSupprime(sZoneMem,MemEnCours(sZoneMem)+1)
    		FIN
    	FIN
    	sNumPeriodeAnc = sNumPeriode
     
    	MemPrécédent(sZoneMem)
    FIN
    Quand je vérifie les résultats que ce code me donne, je n'ai pas toujours ce que je devrais avoir ^^"

  4. #4
    Membre habitué Avatar de Christophe.LOGEL
    Homme Profil pro
    Expert WinDev / WebDev
    Inscrit en
    Mars 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Expert WinDev / WebDev
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 121
    Points : 182
    Points
    182
    Par défaut
    Re,

    Comme dit plus haut dans ma proposition d'utilisation de table mémoire le principe reste le même pour les zones mémoires.
    Il faut trier le contenu de la zone mémoire par rapport aux dates.
    Pour cela vous avez à disposition la méthode Memtrie (Voir l'aide de WinDev).

    Bon dév.,

    Totof
    Christophe LOGEL
    www.sigmasys.fr

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Les "enregistrements" viennent d'ou ?

    Car s'ils viennent d'un fichier, avec un index sur n° de période, je ferais un truc de ce genre...

    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
     
    local
       nlNumPer est un entier //ou autre selon :mouarf: 
       clDatDeb est une chaine 
       clDatFin  est une chaine
       nlCompteur est un entier //ou autre selon :roll: 
     
    clDatDeb = "99999999"
    clDatFin = "00000000"
    nlNumPer = 0
    nlCompteur = 0
    hlitpremier( fic_periode, num_per) //Les noms sortent tout droit de mon imagination
    tantque pas hendehors( fic_periode)
    <div style="margin-left:40px">
    si nlNumPer <> fic_periode.num_per alors
    <div style="margin-left:40px">
    si nlNumPer <> 0 alors
    <div style="margin-left:40px">
    //on ecrit dans la zone mémoire les données précédentes
    MemAjoute( "ZM_PERIODE", nlNumPer, nlNumer+tab+nlCompteur+tab+clDatDeb+tab+clDatFin)</div>fin
    nlNumPer = fic_periode.num_per
    clDatDeb = "99999999"
    clDatFin = "00000000"
    nlCompteur = 0</div>fin
    si clDatDeb > fic_periode.deb_per alors
    <div style="margin-left:40px">
    clDatDeb = fic_periode.deb_per</div>fin
    si clDatFin < fic_periode.fin_per alors
    <div style="margin-left:40px">
    clDatFin = fic_periode.fin_per</div>fin
    si nlCompteur < fic_periode.cpt_per alors
    <div style="margin-left:40px">
    nlCompteur = fic_periode.cpt_per</div>fin
    hlitsuivant( fic_periode, num_per)</div>fin
    //On ajoute la dernière période...
    si nlNumPer <> 0 alors
    <div style="margin-left:40px">
    //on ecrit dans la zone mémoire les données précédentes
    MemAjoute( "ZM_PERIODE", nlNumPer, nlNumer+tab+nlCompteur+tab+clDatDeb+tab+clDatFin)</div>fin
    MemTri( "ZM_PERIODE")
    Normalement, ça devrait donner ce que tu veux.
    ATTENTION ! PAS TESTÉ !

  6. #6
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    Merci pour votre aide, je vais voir si ça marche ^^

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/04/2009, 03h00
  2. utilisation d'une zone mémoire dans un formulaire
    Par pursang25 dans le forum Access
    Réponses: 3
    Dernier message: 29/06/2006, 12h41
  3. Sélection valeur par défaut dans une zone de liste
    Par Cécile154 dans le forum IHM
    Réponses: 2
    Dernier message: 15/02/2005, 18h20
  4. Comment afficher les toolTipText dans une zone de statut ?
    Par nicok01 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/01/2005, 13h32
  5. Tabulation dans une zone SELECT
    Par jfphan dans le forum ASP
    Réponses: 4
    Dernier message: 03/10/2003, 15h30

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