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
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
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
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]
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
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
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
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
Hallo,
wurde soeben in den Download-Bereich eingefügt.
Eigentlich kannst du die Datei dann in deinem Post löschen.
Andreas
Ist erledigt,
vielen Dank Andreas und schönen Sonntag noch!
Grüße
Peter
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
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