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

VBA Access Discussion :

Optimisation de longueur


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Décembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Optimisation de longueur
    Bonjour.
    Je travaille sur un projet dans access 2007. Voici en gros mon projet :
    Je dois souvent couper des barres d’acier de différentes longueurs (ex. : 2 fois 96, 3 fois 50 6 fois 240, 5 fois 386 … etc.) Mes longueurs de barres d’origine sont de 240, 480 et 600. Je veux entrer le maximum de longueurs coupées dans les plus petites longueurs d’origine et avoir le moins de perte possible. Si le moins de perte est dans une longueur de 480 alors je prends cette longueur sinon je prends plusieurs petites si c’est mieux.
    J’ai fait une base de données qui se nomme ‘optimisation’ avec les champs [item], [produits], [Quantitée] et [longueur] pour pouvoir entrer mes dimensions et quantitées à couper. Dans ma form ‘optimisation’ j’ai 5 choix de longueur d’origine avec lesquels je peux utiliser pour faire mes découpes.
    Ce que j’ai fais combine les longueurs dans ma barre. Ca va assez bien jusque là. Ce que j’aimerais c’est d’optimiser pour avoir le moins de perte possible et d’utiliser les plus courtes longueurs disponible autant que possible et utiliser différente longueur s’il le faut. Je ne trouve pas comment faire pour imbriquer une boucle de calcul d’optimisation.

    Voici le code que j’ai fais :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    Private Sub Calculer_Click()
     
    Me.Recordset.MoveFirst
     
    Dim b(0 To 4) As Integer ' taille des barres
    Dim m(0 To 200, 0 To 2) As Double ' taille et nb des morceaux
    Dim r As Integer
    Dim i As Integer
    Dim j As Integer
    Dim t As Boolean
    Dim tot As Integer
    Dim l As String
    Dim LO As Integer
     
    ' Initialisation des tableaux de longueur disponible
    b(0) = [LONG]
    b(1) = [Long2]
    b(2) = [Long3]
    b(3) = [Long4]
    b(4) = [Long5]
     
        For LO = 1 To 200
     
    m(LO, 0) = [Longueur]
    m(LO, 1) = [Quantitee]
    m(LO, 2) = [Item]
     
     
    ‘Lecture des données
     
    Me.Recordset.MoveNext
       If Me.Recordset.EOF Then
            Me.Recordset.MovePrevious
        GoTo BOUCLE
     
        End If
     
        Next
     
    ' Boucle de calcul
    BOUCLE:
     
    Dim lngindex As Long
        Dim lngTmp As Long
     
        DoCmd.OpenForm ("frmProgressBar")
        For lngindex = 4 To 10000000
            ProgressBar lngindex, 10000000, lngTmp
        Next
        DoCmd.Close acForm, "frmProgressBar"
     
     
    Do
    t = False
    r = b(0)
    l = ""
    tot = 0
     
      'Vérifie si la longueur est plus grande que celle disponible
     
        If m(LO, 0) > r Then
            r = b(1)
        End If
     
        If m(LO, 0) > r Then
            r = b(2)
        End If
     
        If m(LO, 0) > r Then
            r = b(3)
        End If
     
        If m(LO, 0) > r Then
            r = b(4)
        End If
     
     
    For j = LBound(m, 1) To UBound(m, 1)
    If m(j, 1) > 0 Then ' si le nb de morceaux est > 0
    t = True ' Pour continuer la boucle s'il reste des morceaux à couper
     
    For i = m(j, 1) To 1 Step -1
    If m(j, 0) * i <= r Then
    m(j, 1) = m(j, 1) - i     
     
    ' Construction de la ligne pour affichage
    If l = "" Then
    l = "(" & i & "    fois     " & m(j, 0) & ")"
          Else
    l = l & "      +   " & "(" & i & "    fois      " & m(j, 0) & ")"
    End If
     
    ' Totalisation de la longueur des morceaux
     
    tot = tot + m(j, 0) * i
    ' Calcul du reste de longueur de la barre
    r = r - m(j, 0) * i
     
    Exit For
    End If
    Next
    End If
    Next
     
    ' Affichage des résultats dans la zone de liste ‘list1’
        Dim z As String
        Dim db As Database
        Dim rs As Recordset
        Set db = CurrentDb
        Set rs = db.OpenRecordset("Resultat")
     
       If t Then List1.AddItem "      " & l & "   = " & tot & "           - Chute " & b(0) - tot
    z = l & "   = " & tot & "           - Chute " & b(0) - tot
     
    ‘Enregistrement dans la table resultat
       With rs   
           rs.AddNew             ' Add new record
           !Calcul = z     ' Set fields
           !PRODUIT = Me.PRODUIT             
           rs.Update             ' Save changes.
           rs.Bookmark = rs.LastModified   ' Go to new record
     
        End With
            rs.Close
    Loop While t
    End Sub

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Bonjour; sans trop connaître les détails ni les contraintes du problème, je penserais à combiner les fonctions INT et MOD pour trouver la solution. Exemple: si la longueur d'un barre donnée est de 630, et que la longueur minimale est de 150, alors le nombre de découpes max est de z = int(630/150) soit 4, et j'ai un reste immuable de 30 (= 630 MOD 150).

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/10/2014, 13h15
  2. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  3. Optimisation d'une liste de longueurs
    Par Pierre845 dans le forum MATLAB
    Réponses: 5
    Dernier message: 22/12/2009, 09h14
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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