Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Network am November 05, 2010, 11:11:41

Titel: falsches Ergebnis in der Stückberechnung
Beitrag von: Network am November 05, 2010, 11:11:41
Guten Tag Zusammen,

nach diversen Tipps und Informationen, welche ich in diesem Forum gefunden habe, möchte ich mich heute auch mal mit einem Problem an euch wenden.

Ich bastele an einer Reststückverwaltung für Stahlklötze herum. In einer Suchmaske gebe ich (u. a.) die Abmessungen für Dicke, Breite und Länge ein. Dies wird mit einer Tabelle verglichen und das Ergebnis (die vorhandenen Reststücke, welche mindestens die Suchmaße haben) in einem Unterformular angezeigt.

In einer Spalte im diesem Unterformular soll dann die Menge ausgegeben werden, die aus dem aufgeführten Reststück gesägt werden kann (und das für jedes Reststück welches gefunden wird).

Dies habe ich soweit (wenn wahrscheinlich viel zu kompliziert; also nicht verzweifeln) hinbekommen. Aber leider wird mir das Ergebnis nur für das erste Stück angezeigt und bei allen weiteren Reststücken das erste Ergebnis ausgegeben (und nicht neu berechnet).

Für Eure Hilfe im voraus vielen Dank.

Anbei mal ein Beispiel:

Gesucht wird ein Reststück aus dem ich 20 Stücke mit folgenden Abmessungen sägen kann:
                      100 x 120 x 300 mm

Gefunden wurde:   100 x 200 x 2800 mm   =   9 Stück machbar
                 100 x 215 x 1015 mm   =   3 Stück machbar
                 110 x 210 x 3800 mm   = 12 Stück machbar
              ***   270 x 475 x 1700 mm   = 40 Stück machbar
                usw.

*** am Beispiel des gefundenen 4. Stücks wird überprüft, bei welcher Kombination man die meisten Stücke erhält. (Diese Tabelle ist unwichtig, nur zur Erklärung. Benötigt wird nur das größtmögliche Ergebnis)

          Dick   Breit    Lang      
   IST   270   475   1700      40
SOLL   100   120   300   
   
           Ist   Soll   mit SB AnzahlGesamt
Dicke   270   100   103   2   
Breite   475   120   123   3   30
Länge   1700 300   303   5   
               
Dicke   270   120   123   2   
Breite   475   100   103   4   40
Länge   1700 300   303   5   
               
Dicke   270   300   300   0   
Breite   475   100   103   4   0
Länge   1700 120   123   13   
               
Dicke   270   100   103   2   
Breite   475   300   300   1   26
Länge   1700 120   123   13   
               
Dicke   270   120   123   2   
Breite   475   300   300   1   32
Länge   1700 100   103   16   
               
Dicke   270   300   300   0   
Breite   475   120   123   3   0
Länge   1700 100   103   16   

Es heißt also bei der zweiten Kombination erhalte ich die größtmögliche Stückzahl von 40. Es soll immer die größtmögliche Stückzahl ausgegeben werden.

Anbei den Code, den ich bisher erstellt habe:


' ############### Stückberechnung ##################

On Error Resume Next

Dim sb As Long    ' Sägeblattstärke

Dim di As Long    ' Dicke IST
Dim bi As Long    ' Breite IST
Dim li As Long    ' Länge IST

Dim ds As Long    ' Dicke SOLL
Dim bs As Long    ' Breite SOLL
Dim ls As Long    ' Länge SOLL

Dim a_d As Long   ' Dicke Ergebnis
Dim a_b As Long   ' Breite Ergebnis
Dim a_l As Long   ' Länge Ergebnis

Dim b_d As Long   ' Dicke Ergebnis
Dim b_b As Long   ' Breite Ergebnis
Dim b_l As Long   ' Länge Ergebnis

Dim c_d As Long   ' Dicke Ergebnis
Dim c_b As Long   ' Breite Ergebnis
Dim c_l As Long   ' Länge Ergebnis

Dim d_d As Long   ' Dicke Ergebnis
Dim d_b As Long   ' Breite Ergebnis
Dim d_l As Long   ' Länge Ergebnis

Dim e_d As Long   ' Dicke Ergebnis
Dim e_b As Long   ' Breite Ergebnis
Dim e_l As Long   ' Länge Ergebnis

Dim f_d As Long   ' Dicke Ergebnis
Dim f_b As Long   ' Breite Ergebnis
Dim f_l As Long   ' Länge Ergebnis

' #################### Felder zuweisen ######################

sb = 3    ' Sägeblattstärke

di = Forms![F_SUCHE]![F_SUCHE Unterformular]![T_AKTUELL.Dicke]
bi = Forms![F_SUCHE]![F_SUCHE Unterformular]![T_AKTUELL.Breite]
li = Forms![F_SUCHE]![F_SUCHE Unterformular]![T_AKTUELL.Laenge]
ds = Forms![F_SUCHE]![Kombinationsfeld4]  ' Dicke SOLL
bs = Forms![F_SUCHE]![Kombinationsfeld6]  ' Breite SOLL
ls = Forms![F_SUCHE]![Kombinationsfeld10]  ' Länge SOLL

' #################### Berechnung ######################
' wenn das Ergebnis größer ,,1" ist soll zum Sollmaß noch die Sägeblattstärke zugerechnet werden.

For i = 1 To 100   '  Schleife für jedes gefundene Reststück

    If di / ds > 0 And di / ds < 2 Then
        a_d = Int(di / ds)
    Else
        a_d = Int(di / (ds + sb) - 0.05)
    End If
   
    If bs = 0 Then
        a_b = 0
    Else
        If bi / bs > 0 And bi / bs > 2 Then
            a_b = Int(bi / bs)
        Else
            a_b = Int(bi / (bs + sb) - 0.05)
        End If
    End If
   
    If li / ls > 0 And li / ls < 2 Then
        a_l = Int(li / ls)
    Else
        a_l = Int(li / (ls + sb) - 0.05)
    End If
   
    If bs = 0 Then
        b_d = 0
    Else
        If di / bs > 0 And di / bs < 2 Then
            b_d = Int(di / bs)
        Else
            b_d = Int(di / (bs + sb) - 0.05)
        End If
    End If
   
    If bi / ds > 0 And bi / ds < 2 Then
        b_b = Int(bi / ds)
    Else
        b_b = Int(bi / (ds + sb) - 0.05)
    End If
   
    If li / ls > 0 And li / ls < 2 Then
        b_l = Int(li / ls)
    Else
        b_l = Int(li / (ls + sb) - 0.05)
    End If
   
    If di / ls > 0 And di / ls < 2 Then
        c_d = Int(di / ls)
    Else
        c_d = Int(di / (ls + sb) - 0.05)
    End If
   
    If bi / ds > 0 And bi / ds < 2 Then
        c_b = Int(bi / ds)
    Else
        c_b = Int(bi / (ds + sb) - 0.05)
    End If
   
    If bs = 0 Then
        c_l = 0
    Else
        If li / bs > 0 And li / bs < 2 Then
            c_l = Int(li / bs)
        Else
            c_l = Int(li / (bs + sb) - 0.05)
        End If
    End If
   
    If di / ds > 0 And di / ds < 2 Then
        d_d = Int(di / ds)
    Else
        d_d = Int(di / (ds + sb) - 0.05)
    End If
   
    If bi / ls > 0 And bi / ls < 2 Then
        d_b = Int(bi / ls)
    Else
        d_b = Int(bi / (ls + sb) - 0.05)
    End If
   
    If bs = 0 Then
        d_l = 0
    Else
        If li / bs > 0 And li / bs < 2 Then
            d_l = Int(li / bs)
        Else
            d_l = Int(li / (bs + sb) - 0.05)
        End If
    End If
   
    If bs = 0 Then
        e_d = 0
    Else
        If di / bs > 0 And di / bs < 2 Then
            e_d = Int(di / bs)
        Else
            e_d = Int(di / (bs + sb) - 0.05)
        End If
    End If
   
    If bi / ls > 0 And bi / ls < 2 Then
        e_b = Int(bi / ls)
    Else
        e_b = Int(bi / (ls + sb) - 0.05)
    End If
   
    If li / ds > 0 And li / ds < 2 Then
        e_l = Int(li / ds)
    Else
        e_l = Int(li / (ds + sb) - 0.05)
    End If
   
    If di / ls > 0 And di / ls < 2 Then
        f_d = Int(di / ls)
    Else
        f_d = Int(di / (ls + sb) - 0.05)
    End If
   
    If bs = 0 Then
        f_b = 0
    Else
        If bi / bs > 0 And bi / bs < 2 Then
            f_b = Int(bi / bs)
        Else
            f_b = Int(bi / (bs + sb) - 0.05)
        End If
    End If
   
    If li / ds > 0 And li / ds < 2 Then
        f_l = Int(li / ds)
    Else
        f_l = Int(li / (ds + sb) - 0.05)
    End If

    '------------------------------------------
    'IST Maße ---------------------------------
    '------------------------------------------
    Text264 = di
    Text265 = bi
    Text266 = li
    '------------------------------------------
    'FELDER ZUWEISEN --------------------------
    '------------------------------------------
    Text346 = 0
    Text336 = di
    Text337 = bi
    Text338 = li
    Text294 = di
    Text295 = bi
    Text296 = li
    Text297 = di
    Text298 = bi
    Text299 = li
    Text300 = di
    Text301 = bi
    Text302 = li
    Text303 = di
    Text304 = bi
    Text305 = li
    Text306 = di
    Text307 = bi
    Text308 = li
    Text312 = ds
    Text313 = bs
    Text314 = ls
    Text315 = bs
    Text316 = ds
    Text317 = ls
    Text318 = ls
    Text319 = ds
    Text320 = bs
    Text321 = ds
    Text322 = ls
    Text323 = bs
    Text324 = bs
    Text325 = ls
    Text326 = ds
    Text327 = ls
    Text328 = bs
    Text329 = ds
    Text276 = a_d
    Text277 = a_b
    Text278 = a_l
    Text279 = b_d
    Text280 = b_b
    Text281 = b_l
    Text282 = c_d
    Text283 = c_b
    Text284 = c_l
    Text285 = d_d
    Text286 = d_b
    Text287 = d_l
    Text288 = e_d
    Text289 = e_b
    Text290 = e_l
    Text343 = f_d
    Text344 = f_b
    Text345 = f_l

    'Gruppe A ---------------------------------
    If Text276 = 0 Or Text277 = 0 Or Text278 = 0 Then
        Text330 = 0
    Else
        Text330 = (Text276 * Text277 * Text278)
    End If
    'Gruppe B ---------------------------------
    If Text279 = 0 Or Text280 = 0 Or Text281 = 0 Then
        Text332 = 0
    Else
        Text332 = (Text279 * Text280 * Text281)
    End If
    'Gruppe C ---------------------------------
    If Text282 = 0 Or Text283 = 0 Or Text284 = 0 Then
        Text333 = 0
    Else
        Text333 = (Text282 * Text283 * Text284)
    End If
    'Gruppe D ---------------------------------
    If Text285 = 0 Or Text286 = 0 Or Text287 = 0 Then
        Text334 = 0
    Else
        Text334 = (Text285 * Text286 * Text287)
    End If
    '------------------------------------------
    'Gruppe E ---------------------------------
    '------------------------------------------
    If Text288 = 0 Or Text289 = 0 Or Text290 = 0 Then
        Text335 = 0
    Else
        Text335 = (Text288 * Text289 * Text290)
    End If
    'Gruppe F ---------------------------------
    If Text343 = 0 Or Text344 = 0 Or Text345 = 0 Then
        Text339 = 0
    Else
        Text339 = (Text343 * Text344 * Text345)
    End If
   
    If Text330 >= Text332 And Text330 >= Text333 And Text330 >= Text334 And Text330 >= Text335 And Text330 >= Text339 Then
        Text346 = Text330
    Else
        If Text332 >= Text330 And Text332 >= Text333 And Text332 >= Text334 And Text332 >= Text335 And Text332 >= Text339 Then
            Text346 = Text332
        Else
            If Text333 >= Text330 And Text333 >= Text332 And Text333 >= Text334 And Text333 >= Text335 And Text333 >= Text339 Then
                Text346 = Text333
            Else
                If Text334 >= Text330 And Text334 >= Text332 And Text334 >= Text333 And Text334 >= Text335 And Text334 >= Text339 Then
                    Text346 = Text334
                Else
                    If Text335 >= Text330 And Text335 >= Text332 And Text335 >= Text333 And Text335 >= Text334 And Text335 >= Text339 Then
                        Text346 = Text335
                    Else

                        If Text339 >= Text330 And Text339 >= Text332 And Text339 >= Text333 And Text339 >= Text334 And Text339 >= Text335 Then
                            Text346 = Text339
                        End If
                    End If
                End If
            End If
        End If
    End If
Next
Adminedit: Code formatiert
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: Hondo am November 05, 2010, 12:23:56
Hallo,
aus deinem Code werde ich nicht schlau.
Aber das ist ja auch ein schwieriges Thema.
Ich empfehle dir zuerst den Algorithmus händisch zu entwickeln und dann umsetzen.

Ich bin da kein Fachmann, ich kann dir nicht sonst weiterhelfen.
Andreas
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: Network am November 05, 2010, 12:45:31
Hallo Andreas,

danke für deine prompte Antwort. Aber ich bin absoluter Anfänger und "stricke mir die Programme so zusammen, wie ich meine das es funktionieren könnte ohne irgendwelches Hintergrund- und überhaupt Wissen über viele Befehle und deren Auswirkung.
Ich weiß leider nicht, wie ich es besser Beschreiben könnte, damit es verständlicher ist.
Vielleicht nochmal einfacher: Ich habe einen großen Würfel und möchte wissen vieviele kleine Würfel (größtmögliche Menge) mit einer bestimmten Größe daraus bekommen könnte (keine Volumenberechnung).

Danke Thomas
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: database am November 06, 2010, 21:55:38
Hallo,

so ich hab' mich mal ein wenig mit deinem Problem herumgespielt und ein kleines Beispiel erstellt.

In diesem Beispiel werden in einem Formular (frmReste) die gewünschten Dimensionen (Breite, Dicke, Länge und Sägeblattstärke) eingegeben und anschließend auf 'Berechnen' geklickt.
Alle gefundenen passenden Reststücke werden in eine Tabelle (tblZaehler) eingetragen. Die Abfrage 'qryErgebnisse' auf diese Tabelle ist die Datenherkunft für das Unterformular.
Im Unterformular wird dann der entsprechende Datensatz zum passenden Reststück inkl der maximalen Anzahl der möglichen Schnittteile angezeigt.

Schau dir das Ding mal an, vielleicht kannst du damit was anfangen?

Grüße
Peter


[Anhang gelöscht durch Administrator]
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: Hondo am November 06, 2010, 22:18:20
Hallo Peter,
hab dein Beispiel mal eben kurz getestet und da ist noch eine Unstimmigkeit drin.
Wenn ich ein Bauteil produzieren möchte mit 100*200*10000 würde ein Reststück mit 100x200*2800 gerade passen, es wird aber das Reststück mit dem größten Querschnitt ausgewählt.

Andreas
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: database am November 06, 2010, 22:33:19
Hallo Andreas,

Zitates wird aber das Reststück mit dem größten Querschnitt ausgewählt
nein, nein, nicht das mit dem größten Querschnitt sondern das, aus dem die meisten Teile geschnitten werden können,
dass es gleichzeitig auch das mit dem größten Querschnitt ist - ist reiner Zufall. ;)

lt. Angaben des TO geht es nicht um die Stücke, die gerade passen - ich würde auch eher die zuerst nehmen um den Abfallhaufen
kleiner zu machen - sondern um den Rest aus dem die meisten Stücke geschnitten werden können.  :-\

ich hätte es so aufgefasst nach diesen Aussagen...

ZitatBenötigt wird nur das größtmögliche Ergebnis
oder...
Zitatvieviele kleine Würfel (größtmögliche Menge)
und ...
ZitatEs soll immer die größtmögliche Stückzahl ausgegeben werden

Grüße
Peter
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: Hondo am November 06, 2010, 22:42:04
OK, wenn man die max. Stückzahl herausholen will stimmt das schon.
Aber schon cool dein Code, wäre doch was für den Download-Bereich?

Andreas
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: database am November 07, 2010, 10:23:48
Hallo Andreas, Guten Morgen,

gerne, wenn du ihn im DL-Bereich deponieren willst - warum nicht  ;D

Habe das Beispiel noch etwas abgerundet und adaptiert ...


Grüße
Peter
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: Hondo am November 07, 2010, 14:57:32
Hallo,
wurde soeben in den Download-Bereich eingefügt.
Eigentlich kannst du die Datei dann in deinem Post löschen.

Andreas
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: database am November 07, 2010, 15:24:07
Ist erledigt,

vielen Dank Andreas und schönen Sonntag noch!

Grüße
Peter
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: Network am November 08, 2010, 08:22:02
Guten Morgen Zusammen,

vielen Dank für eure prompte Hilfe!!!

Wow, bei euch sieht das so einfach aus (habe mich aber noch nicht wirklich mit deinem Code auseinander gesetzt; auf den ersten Blick habe ich es nicht verstanden; aber das nur am Rand). Aber eine Bitte habe ich noch (wie soll es auch anders sein :-)

Ausgegeben werden sollen alle "passenden" Stücke mit der machbaren Stückzahl und um es noch ein wenig komplizierter zu machen; die z.B. "3 mm" fürs Sägeblatt sollen jeweils "automatisch" für die Dicke, Breite oder Länge berücksichtigt werden, wenn man mehr als ein Stück aus der Dicke, aus der Breite oder der Länge bekommen würde.

Wenn z. B. ein vorhandenes Stück schon 100 mm breit ist und 100 mm in der Breite benötigt werden, ist es ja nicht mehr erforderlich eine Sägeblattstärke hinzuzurechnen. Bei zwei Stücke in der Breite müsste das vorhandene Stück also mindestens 203 mm breit sein.

Vielen Dank und einen angenehmen Wochenanfang.

Thomas
Titel: Re: falsches Ergebnis in der Stückberechnung
Beitrag von: Hondo am November 08, 2010, 09:11:39
Hallo,
ich denke du hast eine gute Ausgangsbasis für dein eigenes Programm so dass du das entsprechend modifizieren kannst.
Schließlich sind wir hier nicht beim Wunschkonzert wo man eine Anwendung auf Anfrage bestellen kann.

Gruß Andreas