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

VB 6 et antérieur Discussion :

[VB6] Optimisation et simplification code


Sujet :

VB 6 et antérieur

  1. #1
    Membre averti
    Responsable services techniques
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Responsable services techniques
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut [VB6] Optimisation et simplification code
    Bonjour à tous !

    J'avance petit à petit dans le développement de mon petit programme de suivit des activités.
    Voici une petite capture d'écran :


    Quand l'utilisateur clique sur le bouton "valider et enregistrer", le programme doit "compiler" les renseignements cochés et saisis par l'utilisateur pour les inscrire dans un fichier csv (pour l'instant uniquement inscrit dans un msgbox).
    Voici une partie du code que j'ai essayé de réaliser à cet effet :
    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
    For aa = 1 To a
            ajoutlignesiaet = ""
            isvehicule = 0
            If Controls("ajoutagent" & aa).Value = 1 Then
                ajoutlignesiaet = Text1.Text & ";" & Controls("ajoutagent" & aa).Caption
                Controls("ajoutagent" & aa).Value = 0
     
                For tt = 1 To t
                    If Controls("ajouttache" & tt).Value = True Then
                    ajoutlignesiaet = ajoutlignesiaet & ";" & Controls("ajouttache" & tt).Caption
                    End If
                Next tt
                    For ll = 1 To l
                        If Controls("ajoutlocalis" & ll).Value = 1 Then
                            ajoutlignesiaet = ajoutlignesiaet & ";" & Controls("ajoutlocalis" & l).Caption& & ";" & Controls("ajoutqtelocalis" & ll).Text
                        End If
                    Next ll
                        For vv = 1 To v
                            If Controls("ajoutvehicule" & vv).Value = 1 Then
                               isvehicule = 1
                                ajoutlignesiaet = ajoutlignesiaet & ";" & Controls("ajoutvehicule" & vv).Caption & ";" & Controls("ajouthmvehicule" & vv).Text
                                Controls("ajoutvehicule" & vv).Value = 0
                            End If 
                         Next vv
                            If isvehicule = 0 Then
                                ajoutlignesiaet = ajoutlignesiaet & ";" & ";"
                            End If 
            End If
            If ajoutlignesiaet <> "" Then
            MsgBox ajoutlignesiaet
     
            End If 'agents.
            Next aa
    Petites explications sur les valeurs des variables :
    a est le nombre total d'agents (comme défini dans l'exemple ci-après),
    t est le nombre total de tâches
    l ________________ de localisation
    v________________ de véhicules

    Les checkbox et optionbutton sont créés de façon "dynamique" en fonction du contenu de fichiers csv.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fichier_agents = App.Path & "\liste_agents.csv"
    Open fichier_agents For Input As #1
    a = 0
    Dim ligneagent As String
    Do While Not EOF(1)
    a = a + 1
    Line Input #1, ligneagent
    Dim nom As String
    nom = Split(ligneagent, ";")(0)
    Set ajoutagent = Controls.Add("vb.checkbox", "ajoutagent" & a, Frame_agents)
    Controls("ajoutagent" & a).Caption = nom
    A des fins de simplifications, je n'ai pas copié ici les définitions des caractéristiques width, , left, visible etc ...

    Comme vous l'aurez compris, j'aimerai optimiser et simplifier le 1er code : celui qui lit l'état des objets et qui "construit" la variable ajoutlignesiaet
    Comme c'est bien le cas actuellement, cette variable doit être construite comme suit :
    date ; nom de l'agent ; tache effectuée ; localisation ; durée ; véhicule ; kilométres
    J'ai prévu d'ajouter ensuite les matériaux et leurs quantité

    Ca serait simple s'il n'y avait qu'un élément à chaque fois !
    Mais là où le code se complexifie, c'est dans l'exemple bidon suivant :
    Messieurs Durand et Martin ont fait de l'enrobé dans la rue de l'église pendant 2h, place de la mairie 1h et place des orangers 3h. Ils ont utilisés le véhicule 721 ATL 51 pour 8km et ils ont utilisé 3tonnes de mélange béton

    Pour que les données qui seront enregistrées dans le fichier csv soit exploitables, il conviendrait de répercuter les km des véhicules et la quantité des matériaux avec une fameuse réglé de 3 : dans l'exemple ça donnerait :
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
    06/08/2013;MARTIN Jean;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
    Avec cette méthode, chaque agent aura une saisie identique.

    En pratique il pourrait également être possible de grouper les km de véhicule utilisés sur une localisation sur un seul agent. De même que pour les matériaux et leur quantité. Dans l'exemple ça donnerait :
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;(8/(2+1+3))*2=2.67;mélange béton;(3/(2+1+3))*2=1
    06/08/2013;MARTIN Jean;enrobé;rue de l'église;2;;;;
    Le choix de l'une ou l'autre méthode sera en fonction de la faisabilité du code ! lol

    Par contre là où ça se complexifie vraiment, c'est si pour une même tache, 2 agents ont utilisés 5 véhicules sur 3 localisations et ont consommé 4 matériaux différents ! J'ose même pas imaginer un code pour "compiler" un tel bordel ! mdr


    Est-ce que quelqu'un qui aurait un bon sens logique et une certaine passion pour les casses-tete aurait une idée de code plus simple et plus optimisé que celui que j'ai créé ?

    Merci beaucoup par avance pour votre aide !

  2. #2
    Membre averti
    Responsable services techniques
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Responsable services techniques
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut
    Uppp

    Personne de peut m'aider à optimiser et simplifier ce bout de code ?

  3. #3
    Membre expérimenté
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Par défaut
    ___Ia ora na.
    ___Selon toute apparence, il s'agit de la suite de ce sujet que vous aviez ouvert le 15 juillet :
    http://www.developpez.net/forums/d13...est-enclenche/
    ___Les deux derniers messages (pourtant assez substantiels) y sont restés sans réponse ; et les suggestions (recours à des groupes de contrôles indexés, procédures WithEvents, déclarations), lettre morte. C'est évidemment votre droit le plus strict ; mais vous comprendrez que, pour ma part, je préfère ne pas remettre le doigt dans l'engrenage des Controls.Add("vb.checkbox", "ajoutagent" & a, Frame_agents) et autres Controls("ajoutlocalis" & ll) (avec a ou ll tantôt variables numériques, tantôt variables de chaîne).
    ___Bonne poursuite de votre projet.

  4. #4
    Membre averti
    Responsable services techniques
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Responsable services techniques
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut
    Bonjour,
    J'avais fait plusieurs essais avec l'aide des codes que vous m'aviez proposé : en créant un groupe.
    Malheureusement, il semble de cette solution ne fonctionne pas bien dans mon projet.
    Pour cette raison, et comme je dois avancer dans mon projet (plusieurs personnes attantent mon programme), j'ai renoncé temporairement à n'afficher un textbox que si l'optionbutton qui lui est associé est enclenché.
    Je l'ai d'ailleurs indiqué dans mon message du 17/7 à 15h04 :
    Citation Envoyé par cantonnier Voir le message
    Je remercie beaucoup tout ceux qui se sont interessé à mon problème, mais vu que ça à l'aire d'être un peu l'usine à gaz de n'afficher la textbox que quand l'optionbutton est enclenché, je pense que je vais renoncer à cette fonctionalité.
    La textbox sera toujours affichée, et si elle est remplie alors que l'optionbutton n'est pas enclenchée, j'afficherai un message (msgbox) pour avertir l'utilisateur.

    Encore une fois, je remercie beaucoup toutes les personnes qui se sont penchées sur ma question
    Suite à ce message, à 19h06, vous avez répondu 2 réponses très interessantes qui pourrait fort bien solutionner mon problème.
    C'est tout à votre honneur, c'est indontestable, et j'en conviens tout à fait.
    J'ai d'ailleurs gardé votre réponse en favoris pour pouvoir y revenir dans l'éventuelle version 2 de mon petit logiciel.
    Cependant, ne m'en veuillez pas de ne pas de ne pas encore avoir utilisé vos codes, mais je dois avancer mon programme.
    Comme dis, vos codes ne sont pas perdus, je m'en servirais très certainement dans la version 2 de mon petit programme.

  5. #5
    Membre expérimenté
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Par défaut
    ___Ia ora na.
    A] bref retour sur le passé
    Citation Envoyé par cantonnier Voir le message
    mais je dois avancer mon programme.
    ___Quelqu'un qui voudrait faire du mauvais esprit à peu de frais pourrait estimer que, quand on s'est engagé dans une mauvaise direction, plus on avance, plus on s'éloigne de son objectif - mais je m'en garderai, et me contenterai donc de vous rassurer :
    Citation Envoyé par cantonnier Voir le message
    ne m'en veuillez pas de ne pas de ne pas encore avoir utilisé vos codes
    ___Mon message n'était dicté ni par le dépit ni par l'animosité, simplement par la perplexité. Le reste n'a guère d'importance.

    ___Néanmoins, comme
    1) créer des contrôles par Controls.Add,
    2) employer des variables non déclarées et non typées,
    ne me paraissent toujours pas des pratiques judicieuses, précisons que ce qui suit ne les cautionne pas.

    B] Et venons-en au code proposé, que l'on doit donc placer dans la procédure Click du bouton [Valider et enregistrer].
    Citation Envoyé par cantonnier Voir le message
    le programme doit "compiler" les renseignements cochés et saisis par l'utilisateur pour les inscrire dans un fichier csv
    ___Rappelons qu'un tel fichier est composé de lignes elles-mêmes formées de champs séparés par une virgule (ou, comme ici, un point-virgule) ; seule sa place permet donc de savoir à quoi correspond chaque champ. Soit, dans votre exemple :
    date ; nom de l'agent ; tâche effectuée ; localisation ; durée ; véhicule ; kilomètres
    auxquels doivent s'ajouter ; matériau ; quantité

    Or
    1) Point de détail : le programme boucle sur les différentes cases à cocher (CheckBox) contenues dans le cadre Agents, avec l'intention de créer pour chacun de ceux qui sont impliqués une ligne de type
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;8;mélange béton;3
    mais la ligne 22 remet à 0 la (ou les) case(s) à cocher correspondant au véhicule ; seul le premier agent aura donc l'indication du véhicule et du kilométrage. Mais (voir 4d}) peut-être est-ce voulu.

    2) Point de détail : si aucune des cases d'option (OptionButton) n'est choisie dans le cadre Tâches, le champ sera manquant et la suite, décalée.

    3) Plus prégnant :
    a} revenons à l'exemple 1) ci-dessus mais en supposant que l'agent ait utilisé d'abord le véhicule 721atl51 puis le véhicule KAF008 ; dans l'état actuel du programme, on obtiendra une ligne du genre :
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;6;KAF008;4;mélange béton;3
    ___Comment savoir que les huitième et neuvième champs décrivent non pas le matériau (comme prévu dans la définition initiale) mais un deuxième véhicule ?
    ___Vous répondrez sans doute que c'est justement pourquoi il est envisagé de remplacer 8 par ((8/2)/(2+1+3))*2=1.33 et 3 par ((3/2)/(2+1+3))*2=0.5 ; mais est-ce vraiment simplifier ce bout de code ?

    b} reste le cas particulier des localisations ; le programme actuel boucle sur ces localisations comme sur les autres éléments (véhicules ou matériaux) ; mais cela ne correspond pas aux exemples donnés :
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
    06/08/2013;MARTIN Jean;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
    ___Visiblement, il s'agit de créer une ligne d'enregistrement non seulement par agent, mais encore par localisation ; du coup, le code lui-même va s'en trouver singulièrement compliqué : au lieu d'avoir (comme dans le programme présenté) une boucle principale sur les agents contenant côte-à-côte toutes les boucles secondaires des différents paramètres, il va falloir créer une boucle principale pour les agents, contenant une boucle principale secondaire pour les lieux, contenant elle-même, juxtaposées, les boucles secondaires - en enregistrant chaque ligne à la fin de chaque boucle principale secondaire, de façon à obtenir (en plus de ce qui est mentionné ci-dessus)
    06/08/2013;DURAND Michel;enrobé;place de la mairie;1;721atl51;((8/2)/(2+1+3))*1=0.66;mélange béton;((3/2)/(2+1+3))*1=0.25
    06/08/2013;MARTIN Jean;enrobé;place de la mairie;1;721atl51;((8/2)/(2+1+3))*1=0.66;mélange béton;((3/2)/(2+1+3))*1=0.25
    06/08/2013;DURAND Michel;enrobé;place des orangers;3;721atl51;((8/2)/(2+1+3))*3=2;mélange béton;((3/2)/(2+1+3))*3=0.75
    06/08/2013;MARTIN Jean;enrobé;place des orangers;3;721atl51;((8/2)/(2+1+3))*3=2;mélange béton;((3/2)/(2+1+3))*3=0.75
    ___Simplification, quand tu nous tiens.


    4) Il reste divers points non précisés :
    a} si deux agents utilisent le même véhicule, on divise le kilométrage et la quantité de matériaux par deux ; mais la durée enregistrée pour chaque lieu reste entière pour chacun. Il se peut que ce soit sans importance, mais cela demanderait vérification (significations différentes du total des différentes colonnes) ;

    b} quel est le lien prévu entre les zones de texte et les cases à cocher ? en effet, ou bien une zone de texte peut rester vide quand la case est cochée (mais comment exploiter l'item, sans parler du risque de division par 0 dans les règles de trois ?), ou bien chaque zone de texte doit être remplie - mais alors il faut le vérifier, et à quoi sert la case à cocher ? on pourrait tester directement le contenu de la zone de texte (double simplification) ;

    c} comment ces enregistrements csv seront-ils exploités ? Si c'est par un autre programme VB, on peut mettre dans les champs ce que l'on veut, et par exemple les typer : L=rue de l'église et V=721atl51 ; il suffit que le programme de relecture suive les mêmes conventions. Mais si c'est pour les récupérer dans un tableur, le problème est autre.

    d} Même incertitude quand on apprend que, dans une variante envisagée comme équivalente (Le choix de l'une ou l'autre méthode sera en fonction de la faisabilité du code !),
    ça donnerait :
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;(8/(2+1+3))*2=2.67;mélange béton;(3/(2+1+3))*2=1
    06/08/2013;MARTIN Jean;enrobé;rue de l'église;2;;;;
    ___Pourquoi pas ? mais alors à quoi sert la dernière ligne ? S'agit-il seulement de calculer le temps de travail des agents ? c'est bon (mais tout le reste des informations de DURAND est inutile). Combien de kilomètres chaque agent a parcouru ? impossible. Qui a utilisé tel véhicule tel jour ? bernique. Quel agent a répandu le plus d'enrobé pendant le mois ? pas question.
    ___Un peu comme Alice dans sa partie de cartes, on apprécierait d'avoir les règles du jeu autrement qu'au hasard des coups - et savoir ce qui doit être fait des informations avant de chercher sous quelle forme les présenter.

    ___Bon courage à vous, et bonne semaine à toutes et à tous.

    Post-scriptum :
    ___voici à quoi pourrait ressembler une version du programme utilisant des groupes de contrôles :
    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
    Private Sub btEnreg_Click()
    Dim I As Integer
     
    If (coTâche(0) Or coTâche(1) Or coTâche(2) Or coTâche(3)) = False Then
      MsgBox "Il faut choisir une tâche."
      Exit Sub
    End If
    Open "c:\Fichier.csv" For Append As 1
    Print #1, Text1.Text & ";"; '<- date
    For I = 0 To ccAgent.UBound
      If ccAgent(I).Value > 0 Then
        Print #1, "A=" & ccAgent(I).Caption & ";";
        If ccRàz.Value = 1 Then ccAgent(I).Value = 0
      End If
    Next
    For I = 0 To coTâche.UBound
      If coTâche(I) Then
        Print #1, "T=" & coTâche(I).Caption & ";";: Exit For
      End If
    Next
    Print #1, Boucle(txTemps, étLocal, "L");
    Print #1, Boucle(txKm, étVéhicule, "V");
    Print #1, Boucle(txMnD, étMnD, "N");
    Print #1, Boucle(txMD, étMD, "M");
    Close
     
    End Sub
    '
    '*******************************
    '
    Private Function Boucle(Tx As Variant, Et As Variant, C As String) As String
    Dim I As Integer, L As String
     
    For I = 0 To Tx.UBound
      If Tx(I).Text > "" Then
        L = L & C & "=" & Et(I).Caption & ";" & Tx(I).Text & ";"
        If ccRàz.Value = 1 Then Tx(I).Text = ""
      End If
    Next
    Boucle = L
     
    End Function
    NB1- ccXXX désigne les cases à cocher (CheckBox) ;
    ___on pourrait remplacer ccXXX(I).Value par ccXXX(I) ;
    ___ccRàz est un contrôle supplémentaire :
    s'il est enfoncé, la feuille est remise à zéro quand on appuie sur [Valider] ; sinon, les éléments entrés restent en l'état ;
    coXXX désigne les cases d'option (OptionButton) ;
    txXXX désigne les zones de texte (TextBox) ;
    ___on pourrait remplacer txXXX(I).Text par txXXX(I) ;
    étXXX désigne les étiquettes (Label), substituées aux cases à cocher ;
    ___on pourrait remplacer étXXX(I).Caption par étXXX(I).
    Tous ces contrôles (sauf ccRàz et Text1) sont indexés.
    NB2- les matériaux non divisables (MnD/N=) sont distingués des matériaux divisables (MD/M=), mais on pourrait peut-être réunir les deux séries.
    NB3- ce programme enregistre des données brutes, une simple photographie de la page au moment où on clique sur [Valider] ; pour l'exemple choisi dans le message d'ouverture de ce sujet, on enregistrerait cette ligne :
    06/08/2013;A=DURAND Michel;A=MARTIN Jean;T=enrobé;L=rue de l'église;2;L=place de la mairie;1;L=place des orangers;3;V=721atl51;8;M=mélange béton;3
    ___Ce serait au programme de lecture de traiter les données - puisque c'est lui qui sait ce qu'il veut en faire.

    Post-post-scriptum :
    ___Si on a placé dans la feuille un contrôle (par exemple) ccLocal(0) (CheckBox), pour en créer et instancier cinq autres dans le groupe, on pourra écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim I As Integer
     
    For I = 1 To 5
       Load ccLocal(I)
       With ccLocal(I)
          .Top = ccLocal(I - 1).Top + .Height + 60
          .Caption = "NomDeLaVoie": .Visible = True
       End With
    Next
    ___Les contrôles sont ainsi créés, dimensionnés, paramétrés et placés (ici les uns au-dessous des autres) ; et on dispose du code déjà entré dans toutes les procédures-événements de ccLocal. Par exemple, pour afficher ou cacher la zone de texte txTemps correspondante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub ccLocal_Click(Index As Integer)
       txTemps(Index).Visible = (ccLocal(Index).Value > 0)
    End Sub
    '************************
    ___Avec Controls.Add, il faut
    1) donner à chaque contrôle un nom différent (ccLocal1, ccLocal2, etc. / txTemps1, txTemps2, etc. - voir le deuxième code présenté dans le message initial de ce sujet) ;
    2) dimensionner (Height/Width), éventuellement paramétrer (Alignment, Style par exemple) et placer (Top/Left) chacun ; qu'est-ce que cela représente en pratique ? difficile à savoir :
    Citation Envoyé par cantonnier Voir le message
    A des fins de simplification et de compréhension, je vous ai épargné les définitions de width, top, letf etc... [...]
    A des fins de simplifications, je n'ai pas copié ici les définitions des caractéristiques width, , left, visible etc ...
    3) si l'on veut disposer de procédures-événements,
    a} déclarer chaque contrôle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private WithEvents ccLocal0 As CheckBox
    Private WithEvents ccLocal1 As CheckBox
    Private WithEvents ccLocal2 As CheckBox
    Private WithEvents ccLocal3 As CheckBox
    Private WithEvents ccLocal4 As CheckBox
    Private WithEvents ccLocal5 As CheckBox
    b} déclarer et remplr, dans la section [Général], chacune des procédures :
    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
    Private Sub ccLocal0_Click()
      txTemps0.Visible = (ccLocal0.Value > 0)
    End Sub
     
    Private Sub ccLocal1_Click()
      txTemps1.Visible = (ccLocal1.Value > 0)
    End Sub
     
    Private Sub ccLocal2_Click()
      txTemps2.Visible = (ccLocal2.Value > 0)
    End Sub
     
    Private Sub ccLocal3_Click()
      txTemps3.Visible = (ccLocal3.Value > 0)
    End Sub
     
    Private Sub ccLocal4_Click()
      txTemps4.Visible = (ccLocal4.Value > 0)
    End Sub
     
    Private Sub ccLocal5_Click()
      txTemps5.Visible = (ccLocal5.Value > 0)
    End Sub
    Et pourtant, c'est la première façon de faire (par groupes de contrôles) qui
    à l'aire d'être un peu l'usine à gaz

  6. #6
    Membre averti
    Responsable services techniques
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Responsable services techniques
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut
    Bonjour XylonAkau, et merci de vous pencher à nouveau sur mon casse-tête.

    Je n'ai pas encore pu testé votre bout de code, mais je peux prendre le temps de répondre à plusieurs de vos interogations :
    mais la ligne 22 remet à 0 la (ou les) case(s) à cocher correspondant au véhicule ; seul le premier agent aura donc l'indication du véhicule et du kilométrage. Mais (voir 4d}) peut-être est-ce voulu.
    .
    En effet, ce code est l'état d'avancé actuel de mon programme. Comme je l'ai indiqué, dans mon premier post :
    En pratique il pourrait également être possible de grouper les km de véhicule utilisés sur une localisation sur un seul agent.
    .
    Cherchant à simplifier le code, j'ai essayé de groupé les km sur 1 seul agant, ainsi, j'ai voulu décocher la checkbox pour qu'elle n'interfère plus avec un autre agent

    si aucune des cases d'option (OptionButton) n'est choisie dans le cadre Tâches, le champ sera manquant et la suite, décalée.
    Avant "d'écrire" ma variable ajoutlignesiaet, j'ai plusieurs "procèdures" qui vont tester si les textbox correspondant aux checkbox sont bien remplies et si leur contenu est valide.
    Pour ne pas embrouiller les personnes qui se penchent sur ma question, je 'nai pas voulu ajouter ces lignes de code

    revenons à l'exemple 1) ci-dessus mais en supposant que l'agent ait utilisé d'abord le véhicule 721atl51 puis le véhicule KAF008 ; dans l'état actuel du programme, on obtiendra une ligne du genre :

    Citation:
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;6;KAF008;4;mélange béton;3

    ___Comment savoir que les huitième et neuvième champs décrivent non pas le matériau (comme prévu dans la définition initiale) mais un deuxième véhicule ?
    .
    Sans vouloir spécialement vous contrarier, aux derniers essais j'ai fait, je n'ai pas ce résultat, mais bien
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;6

    Comment savoir que les huitième et neuvième champs décrivent non pas le matériau (comme prévu dans la définition initiale) mais un deuxième véhicule ?
    En effet, il ne faut pas que ces champs décrivent un second véhicule, mais bien les matériaux. Vous l'avez très bien compris.

    Vous répondrez sans doute que c'est justement pourquoi il est envisagé de remplacer 8 par ((8/2)/(2+1+3))*2=1.33 et 3 par ((3/2)/(2+1+3))*2=0.5 ; mais est-ce vraiment simplifier ce bout de code ?
    Ces calculs sont là simplement pour expliquer ma démarche de la régle de 3 : comme je l'ai indiqué dans mon premier message :
    il conviendrait de répercuter les km des véhicules et la quantité des matériaux avec une fameuse réglé de 3
    Visiblement, il s'agit de créer une ligne d'enregistrement non seulement par agent, mais encore par localisation ; du coup, le code lui-même va s'en trouver singulièrement compliqué
    Exactement ! vous avez tout à fait compris le coeur du problème !
    J'ai essayé de modifier mon code en utilisant des select case mais c'est encore plus mission impossible !

    si deux agents utilisent le même véhicule, on divise le kilométrage et la quantité de matériaux par deux ; mais la durée enregistrée pour chaque lieu reste entière pour chacun
    Tout à fait, on ne saisit pas la durée totale, mais le temps passé. Par exemple :
    DURAND et MARTIN ont travaillé de 14h à 16h, on saisit donc 2h.
    Le fichier excel prévu pour exploiter ces données prend tout ceci bien en compte

    quel est le lien prévu entre les zones de texte et les cases à cocher ? en effet, ou bien une zone de texte peut rester vide quand la case est cochée
    Comme dis, j'ai plusieurs "procèdures" qui vont tester si les textbox correspondant aux checkbox sont bien remplies et si leur contenu est valide.

    comment ces enregistrements csv seront-ils exploités
    J'ai déjà répondu en parti, avant : c'est un fichier Excel qui va exploiter les données enregistrées : quelques filtres pré-enregistrés, quelques codes VB, quelques graphiques etc ...
    C'est pour cela que j'ai choisi d'enregistrer mes données dans un fichier CSV, pour permettre l'utilisation sous Excel voire OpenOffice Calc

    mais alors à quoi sert la dernière ligne ? S'agit-il seulement de calculer le temps de travail des agents ? c'est bon (mais tout le reste des informations de DURAND est inutile). Combien de kilomètres chaque agent a parcouru ? impossible. Qui a utilisé tel véhicule tel jour ? bernique. Quel agent a répandu le plus d'enrobé pendant le mois ? pas question.
    Comme dis, afin de rendre le code "assimilable", j'ai pris concience que certaines fonctionalités (comme celles que vous évoquez) devont être sacrifiées.
    Cependant, si elle peuvent être conservées, mon petit logiciel en sera d'autant plus utile !
    C'est ce que j'ai expliqué dans mon premier post (je me suis peut être mal explimé, j'en conviens) :
    Pour que les données qui seront enregistrées dans le fichier csv soit exploitables, il conviendrait de répercuter les km des véhicules et la quantité des matériaux avec une fameuse réglé de 3
    [...]
    En pratique il pourrait également être possible de grouper les km de véhicule utilisés sur une localisation sur un seul agent. De même que pour les matériaux et leur quantité.


    Dès que j'ai accès à mon poste où est installé VB6, je teste votre code



    PS : Que signifie Ia ora na
    Une brève recherche dans Google m'a indiqué que Ia ora na pourrait être similaire à Bonjour en thaitien, mais avec un sens religieux. C'est bien ça ?

  7. #7
    Membre expérimenté
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Par défaut
    ___Ia ora na.
    (c'est en effet la formule de salutation habituelle dans les Îles de la Société).
    ___Si chacun de nous reprend le message précédent en y ajoutant ses commentaires, nous risquons de saturer le forum assez rapidement.
    ___Je ne prendrai donc que trois exemples :
    1)
    Citation Envoyé par cantonnier Voir le message
    Sans vouloir spécialement vous contrarier, aux derniers essais j'ai fait, je n'ai pas ce résultat, mais bien
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;6
    ___Utilisons-nous le même Basic ? si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      For vv = 1 To v
        If Controls("ajoutvehicule" & vv).Value = 1 Then
           isvehicule = 1
           ajoutlignesiaet = ajoutlignesiaet & ";" & Controls("ajoutvehicule" & vv).Caption & ";" & Controls("ajouthmvehicule" & vv).Text
           Controls("ajoutvehicule" & vv).Value = 0
        End If 
      Next vv
    (lignes 18 à 23 du programme présenté) et que l'on coche les deux cases 721ATL51 et KAF008, la ligne 4 ci-dessus (ligne 21 dans le programme présenté) s'exécutera
    >>> une fois pour vv = 1 (ou vv = "1") en ajoutant 721ATL51; et le contenu de ajouthmvehicule1 suivi de ";"
    >>> une fois pour vv = 3 (ou vv = "3") en ajoutant KAF008; et le contenu de ajouthmvehicule3 suivi de ";".
    ___A moins que l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Controls("ajoutvehicule" & vv).Value = 0
    ne décoche aussi (par un effet pernicieux que je ne suis pas allé tester) la case qui correspond au deuxième véhicule ? mais alors on ne pourrait jamais entrer qu'un seul véhicule à la fois - ce qui n'est guère mieux.

    2)
    Citation Envoyé par cantonnier Voir le message
    Cherchant à simplifier le code, j'ai essayé de groupé les km sur 1 seul agant, ainsi, j'ai voulu décocher la checkbox pour qu'elle n'interfère plus avec un autre agent
    ___Pourquoi pas ? mais alors,
    a} comment se fait-il que, dans votre exemple, les kilomètres soient répartis entre les deux agents ?
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
    06/08/2013;MARTIN Jean;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
    b} reprenons les mêmes choses sous un autre angle : puisque vous avez un fichier .csv dont une ligne peut être
    06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;6;béton;3
    c'est que, dans le tableur, vous avez les neuf mêmes colonnes :
    date | agent | tâche | lieu | durée | véhicule | km | matériau | quantité
    (ou onze si vous distinguez matériaux non divisibles / divisibles - mais le code présenté s'arrête avant).
    ___Comment fait-on actuellement, dans ce tableur, quand un agent a travaillé sur plusieurs lieux avec plusieurs véhicules ? Crée-t-on une ligne avec règles de trois ou répète-t-on les données de base sur chaque ligne ? Dans votre exemple (2 agents ayant travaillé sur 3 lieux), quelle est la forme utilisée ? comme dans l'exemple donné :
    Durand ... rue de l'Eglise
    Martin ... rue de l'Eglise
    Durand ... place de la Mairie [etc.]
    ___ou bien comme le suggère le code présenté :
    Durand ... rue de l'Eglise
    Durand ... place de la Mairie
    Durand ... place des Orangers
    Martin ... rue de l'Eglise [etc.]
    et s'il y a eu deux véhicules utilisés, dédouble-t-on chaque ligne ?
    Durand ... rue de l'Eglise ... 721atl51
    Durand ... rue de l'Eglise ... KAF008
    ou bien met-on les différents véhicules dans la même cellule ?
    Durand ... rue de l'Eglise ... 721atl51+KAF008

    "Donnez-moi un point d'appui, et je soulèverai le monde."
    ___C'est un peu le monde à l'envers : il est demandé de chercher comment présenter des données sans savoir comment (ni pour quoi) elles seront utilisées ; et cela pour aboutir à
    afin de rendre le code "assimilable", j'ai pris concience que certaines fonctionalités (comme celles que vous évoquez) devont être sacrifiées.
    ___Le cahier des charges du programme sera-t-il défini à la fin, en fonction de ce qui aura pu (ou n'aura pas pu) être fait ?

    c} En final de compte, que l'on répartisse les kilomètres ou qu'on les regroupe, c'est vous qui voyez ; que l'on implante telle fonction ou qu'on la laisse de côté, c'est vous qui voyez ; mais peut-on faire tantôt l'un, tantôt l'autre - et, quand le manque de cohérence est signalé, répondre
    "Je suis oiseau : voyez mes ailes ... - Je suis souris, vivent les rats !" ?

    3) J'avais indiqué :
    si aucune des cases d'option (OptionButton) n'est choisie dans le cadre Tâches, le champ sera manquant et la suite, décalée.
    ___Réponse :
    Citation Envoyé par cantonnier Voir le message
    Avant "d'écrire" ma variable ajoutlignesiaet, j'ai plusieurs "procèdures" qui vont tester si les textbox correspondant aux checkbox sont bien remplies et si leur contenu est valide.
    Pour ne pas embrouiller les personnes qui se penchent sur ma question, je 'nai pas voulu ajouter ces lignes de code
    ___Trois observations :
    a} il était question d'un problème propre aux cases d'option (OptionButton), pas aux cases à cocher (CheckBox) et zones de texte (TextBox) ;
    b} Avant "d'écrire" ma variable ajoutlignesiaet, j'ai plusieurs "procèdures"
    ___Si ce n'est pas indiscret, où sont-elles placées, ces procédures ? Dans la même procédure Click du bouton [Valider et Enregistrer] ?
    >>> si oui,
    - l'utilisateur pourra trouver cavalier qu'on attende qu'il clique sur [Valider] pour lui signaler que "A" ne convient pas dans la zone de texte "Nombre de kilomètres" ou que "3;5" est ambigu dans celle des "Quantités" ;
    - pourquoi parcourir toutes les zones de texte une première fois pour vérifier que leur contenu est correct puis une seconde fois pour enregistrer ledit contenu ?
    >>> sinon, où ? pas dans les procédures Click des cases à cocher, Change ou KeyPress des zones de texte ou autres LostFocus puisque la méthode Controls.Add empêche de disposer de procédures-événements pour les contrôles. A moins de recourir à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private WithEvents ajouttache As CheckBox
    mais c'était une solution évoquée dans l'un des messages dont vous avez dit (très généreusement) que c'étaient
    deux réponses très interessantes qui pourrait fort bien solutionner mon problème.
    C'est tout à votre honneur, c'est indontestable, et j'en conviens tout à fait.
    J'ai d'ailleurs gardé votre réponse en favoris pour pouvoir y revenir dans l'éventuelle version 2 de mon petit logiciel.
    ___Or nous n'en sommes toujours qu'à la version 1, me semble-t-il. Alors, où sont-elles ? (voir aussi le post-post-scriptum du message #5) ;
    c} la fin de votre réponse me fait penser aux lois secrètes de Venise au temps des Doges (pour ne pas radoter avec la partie de cartes d'Alice au Pays des Merveilles). Comment travailler sur un programme quand les règles du jeu changent au gré des états d'âme ou quand on n'en a que des morceaux expurgés - comme la mère oiseau ne dépose dans le bec de ses oisillons que des lambeaux de chair prédigérés ?

    ___A quoi bon poursuivre ? On voit se profiler l'ombre de ceux qui sont venus exposer un problème et demander une solution puis, quand on leur en a proposé une, ont passé le plus clair de leur temps à expliquer pourquoi ils avaient raison de faire comme ils faisaient plutôt que comme on leur conseillait de faire.

    ___Alors, une dernière réflexion :
    Citation Envoyé par cantonnier Voir le message
    vos codes ne sont pas perdus, je m'en servirais très certainement dans la version 2 de mon petit programme.
    ___Pourquoi ne pas commencer directement par la version 2 ?

    ___Bon courage, bonne programmation, et bon vent.

  8. #8
    Membre éclairé Avatar de petit rabot
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2010
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2010
    Messages : 236
    Par défaut
    J'ai l'impression de revivre mon projet lorsque j'utilisais un fichier .csv...
    Ne serait il pas plus judicieux de réaliser ton suivi avec une base de données type access? Tu pourrais ensuite faire comparatifs, des stats... beaucoup plus facilement.

Discussions similaires

  1. [VB6] Adaptation d'un code avec un fichier ini
    Par batmat86 dans le forum VB 6 et antérieur
    Réponses: 45
    Dernier message: 20/06/2006, 17h08
  2. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47
  3. [VB6] Aide sur un code
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/05/2006, 14h54
  4. [VB6]chaine de caractere + code super long
    Par riesseg dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 03/05/2006, 14h17
  5. [VB6][newbie] pb de code source...
    Par j3r311y dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/02/2006, 12h10

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