Wie Daten weiter verarbeiten und Druckausgabe

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Wie Daten weiter verarbeiten und Druckausgabe

    Als erstes, ich bin Anfänger, also Nachsicht :)
    Ich möchte ein Programm für eine Zuschnittsoptimierung für Stabprofile schreiben. Dazu sollen in Textboxen Anzahl und Länge geschrieben werden und ich möchte diese auf genormte Stabprofile optimieren. Die Berechnung funktioniert jetzt erstmal. Ist im Moment nur auf ein Stab ausgelegt, wird dann aber erweitert. Möchte mich nun erstmal der Weiterverarbeitung kümmern.

    Das habe ich alles:
    6000 = Profillänge
    5x400, 3x200, 8x500, 2x900, 2x700 = Diese Zeile ist meine Vorgabe
    5x400, 2x200, 8x500, 0x900, 0x700 = Diese Zeile habe ich errechnet

    Was ich jetzt tun möchte:
    Dies soll später so lange laufen, bis alle Teilprofile = 0 sind. Die 1x200, 2x900, 2x700 zu speichern. und danach möchte ich eine Druckausgabe machen wo drin steht, 1x Profil 6000 = 1x200, 2x900, 2x700 usw.
    Hoffe man versteht was ich machen möchte.
    Fragen:
    - Was würde sich für das speichern hier anbieten?
    - Wie würde ich dann die Daten weiter verarbeiten können.
    - Ich habe schon mal eine Druckausgabe erstellt und ist schon sehr aufwändig, wenn man Linien usw einzeichnen möchte. Gibt es ein Tool wo ich grafisch mein Blatt erstellen kann und die in Code umgewandelt werden kann?

    Braucht ihr dafür meinen Quellcode?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Waxweazle“ ()

    Waxweazle schrieb:

    Hoffe man versteht was ich machen möchte.
    Leider nein. :/
    Zum Speichern mach Dir eine serialisierbare Klasse, die enthält Properties mit allen Deinen Werten, ausch als List(Of Double), die serialisierst Du dann als XML.
    Lesen und Schreiben ist dann praktisch ein Einzeiler.
    Wenn Du eine Tabelle drucken willst, musst Du jede Zeile und jede Linie platzieren. Für Tabellen als solche gibt es fertige Klassen, die das organisieren.
    Sieh Dir mal diese Form an, einfach starten und Button drücken:
    Form2.zip
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok dann versuche ich mein Programm mal zu erklären. Es gibt genormte Stabprofile, die man zukauft (meist eine Länge von 6000 mm). Diese kann man aber so nicht verbauen, da ich ja immer andere Längen brauche, als Beispiel 5x400mm, 3x200mm, 8x500mm, 2x900mm, 2x700mm. So um nun zu ermitteln wie viele Profile ich kaufen muss und welche Teile ich am besten aus den 6000 mm Profil schneide, möchte ich dieses Programm schreiben. Lösung hier wäre jetzt:
    1x 6000 = 2x900 + 2x700 + 5x 500 + 1x 200 + Rest 100
    1x 6000 = 3x500 + 5x400 + 2x 200 + Rest 2100
    Das heißt, in diesem Fall müsste ich 2 Profile a 6000mm bestellen und hätte am Ende meine kleinen Profile plus die Reststücke.

    So nun für das Ausdrucksformular müsste ich diese Wert zwischenspeichern, damit ich diese einfach wieder aufrufen kann für das Ausdrucken. Wäre dann die serialisierbare Klasse das Mittel dafür?

    Deine Form2.zip lade ich und dann? Kein Button bei mir da.
    Nimm ein neues Projekt, binde RFGs Dateien ein und setze Form2 als Startformular. Fertig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Waxweazle schrieb:

    Deine Form2.zip lade ich und dann?
    Die ZIP ist ein gepacktes Archiv enthält 3 Dateien, die zusammen eine Form sind.
    Entpacke die ZIP, kopiere die 3 Dateien in Dein Projekt (ich nehme mal an, dass es da noch keine Form2 gibt) und füge Deinem Projekt existierende Dateien hinzu, bei der Dateiauswahl klickst Du nur auf Form2.vb, nicht aber auf die anderen beiden Dateien.
    Der Rest steht bei @VaporiZed.
    Feddich. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok habe auf dem Schlauch gestanden. Hat funktioniert, muss ich mir dann anschauen, wenn ich dann mal beim Drucken ankomme.

    Erst muss ich mich um die Daten kümmern die da rein sollen. Ist dann die vorgeschlagene serialisierbare Klasse das was ich mir dann mal für diesen Fall anschauen sollten.

    Waxweazle schrieb:

    5x400, 2x200, 8x500, 0x900, 0x700 = Diese Zeile habe ich errechnet
    Wenn ich das richtig verstanden habe, sollte die Summe dieser Terme 6000 sein.
    Bei mit kommt da 6400 raus, bei 200 müsste 0 stehen.
    Und: Wird da eine Schnittbreite berücksichtigt?
    Für eine serialisierbare Klasse hab ich Dir mal ein kleines Beispiel gemacht, Form, 3 Button, ListBox
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. Imports System.Text
    4. Public Class Form1
    5. Private XmlFile As String = "c:\temp\data.xml" ' Pfad zum Speichern / Lesen
    6. Private Data As MyData
    7. Public Sub New()
    8. Me.InitializeComponent()
    9. ' Daten-Instanz erstellen und befüllen
    10. Me.Data = New MyData()
    11. Me.Data.name = "Test Status"
    12. Me.Data.address = "0000"
    13. Me.Data.type = 9999
    14. Me.Data.timestamp = DateTime.Now
    15. Me.Data.flags = 0
    16. Me.Data.user = "Tester"
    17. Me.Data.SingleValues = New List(Of Integer) From {1, 2, 3, 4, 5}
    18. End Sub
    19. ''' <summary>
    20. ''' Daten auf Festplatte schreiben
    21. ''' </summary>
    22. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    23. Me.WriteData(Me.Data, Me.XmlFile)
    24. End Sub
    25. ''' <summary>
    26. ''' Daten von Festplatte laden
    27. ''' </summary>
    28. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    29. Me.Data = Me.LoadData(Me.XmlFile)
    30. End Sub
    31. ''' <summary>
    32. ''' aktuelle Daten darstellen
    33. ''' </summary>
    34. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    35. Me.ListBox1.Items.Clear()
    36. ' hier: nur das Integer-Array
    37. For Each value In Me.Data.SingleValues
    38. Me.ListBox1.Items.Add(value)
    39. Next
    40. End Sub
    41. ''' <summary>
    42. ''' Daten in eine Datei schreiben
    43. ''' </summary>
    44. ''' <param name="data">die zu speichernde Instanz</param>
    45. ''' <param name="file">Dateiname</param>
    46. Public Sub WriteData(data As MyData, file As String)
    47. ' Serialize object to a XML file.
    48. Using sw As New StreamWriter(file, False, Encoding.Default)
    49. Dim x As New XmlSerializer(data.[GetType]())
    50. x.Serialize(sw, data)
    51. End Using
    52. End Sub
    53. ''' <summary>
    54. ''' Daten aus einer Datei lesen
    55. ''' </summary>
    56. ''' <param name="file">Dateiname</param>
    57. ''' <returns>die geladene Instanz</returns>
    58. Public Function LoadData(file As String) As MyData
    59. Dim data As New MyData()
    60. Try
    61. ' Deserialize XML file to a new object.
    62. Using sr As New StreamReader(file, Encoding.Default)
    63. Dim x As New XmlSerializer(data.GetType())
    64. data = DirectCast(x.Deserialize(sr), MyData)
    65. End Using
    66. Return data
    67. Catch
    68. ' nix tun, die Daten-Instanz ist nicht valid,
    69. ' es wird die Instanz übergeben, die bei MyData.New() erzeugt wird
    70. End Try
    71. Return data
    72. End Function
    73. End Class
    74. Public Class MyData
    75. ' alle vorkommenden Daten
    76. Public Property name() As String
    77. Public Property address() As String
    78. Public Property type() As Integer
    79. Public Property timestamp() As DateTime
    80. Public Property flags() As Integer
    81. Public Property user() As String
    82. Public Property SingleValues() As List(Of Integer)
    83. Public Sub New()
    84. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    85. Me.name = "Hase"
    86. Me.SingleValues = New List(Of Integer)
    87. End Sub
    88. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja das hast du richtig verstanden, aber habe es im ersten Post vielleicht nicht gut ausgedrückt. Die Werte die du da hin geschrieben hast, sind nicht die Werte für den ersten Zuschnitt. Sondern die Werte nach Abzug. Im dritten Post habe ich es vielleicht etwas besser beschrieben.
    Schnittbreite des Sägeblattes kommt später mit rein, soll auch Variabel werden. Denke aber das ist jetzt kein großes Werk dies noch ein zu bringen.

    Dein Beispiel werde ich mir mal nachher ansehen. Danke.

    @RodFromGermany
    Habe mir dein Beispiel mal angeschaut. Das mit dem laden und speichern hab ich soweit verstanden. Die Zeile mit :
    Me.Data.SingleValues = New List(Of Integer) From {1, 2, 3, 4, 5}
    werde ich nicht schlüssig. Wofür ist das genau.
    Dann habe ich jetzt noch nicht verstanden, wie ich meine Daten einbringe. Denke das geht in der MyData, aber da verließ mich auch mein Durchblick mal wieder.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Waxweazle“ ()

    Waxweazle schrieb:

    Wofür ist das genau.
    Ich wollte Dir demonstrieren, dass Du da auch eine List(Of T) ganz easy serialisieren kannst. Einfach nur als Beispiel, How to ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So konnte das nach langem suchen (war meine erste list of) und probieren jetzt hin bekommen die Daten in die XML zu bekommen. XML sieht jetzt so aus (Ist jetzt ein Durchlauf, d.h. nur ein Profil wird jetzt erstmal errechnet)

    -<stabnr>
    <int>1</int>
    </stabnr>
    <stabstk/>
    -<stabl>
    <int>6000</int>
    </stabl>
    -<profilstk>
    <int>2</int>
    <int>2</int>
    <int>5</int>
    <int>1</int>
    </profilstk>
    -<profill>
    <int>900</int>
    <int>700</int>
    <int>500</int>
    <int>200</int>
    </profill>
    -<restl>
    <int>100</int>
    </restl>
    </MyData>

    Jetzt habe ich das Problem:
    Diese Werte gehören alle zu einem Stab 6000mm (bei mir mit stabnr = 1 gekennzeichnet). Wenn ich jetzt weitere Stäbe berechnen sollte habe ich ja keine Zuordnung mehr, welches Profil zu welchem Stab gehört. Wie kann ich jetzt erreichen, dass allen meine profill und profilstk dem Stab 1 zugeordnet bleiben, damit ich diese später weiter verarbeiten kann.
    @VB1963 Jou.
    @Waxweazle Hör mal auf rumzuproggen und stell mal zunächst das Problem als Datenmodell dar.
    Mach ne Skizze, was wie zusammenhängt, das modellieren wir dann aus, und wenn das rund ist, machst Du Dein Programm drum herum. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    1. Bitte »Erweiterte Antwort« verwenden und dort das Bild hochladen. Das Forum kann's, daher sind externe Hoster ungern gesehen.
    2. m.E. ist ein Datenmodell = z.B. Screenshot eines typ. DataSets, also die grafische Übersicht, welche Klassen welche Objekte modellieren/darstellen und welche Eigenschaften diese Klassen/Objekte haben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Waxweazle schrieb:

    Also manchmal schreibt ihr für mich nur Bahnhof
    Dann musst Du genau sagen, was Du nicht verstanden hast, und Du bekommst präzise Antworten.
    Da der Ablauf ziemlich gut beschrieben ist, kannst Du ja daraus einen Programmablauf generieren.
    Eine große Schleife, in der Deine Einzelaufgaben aufgerufen werden.
    Für mich stellt sich beim Punkt Zwischenspeichern und Drucken folgendes Problem:
    Ich gehe mal davon aus, dass pro Runde genau ein s Stange verarbeitet wird und demzufolge genau ein Datensatz anfällt.
    Bei mehreren Runden fallen mehrere Datensätze an.
    Das sieht mir einfach nach einer DataTable aus, wo jede Zeile einen solchen Datensatz repräsentiert.
    So eine DataTable lässt sich mit einem Einzeiler als XML speichern und laden.
    Nun könntest Du warten, bis 20 Durchläufe vorbei sind und dann die 20 Datensätze mit einem Mal drucken, das ist aber egal.
    Frage:
    Was soll wie gespeichert und dokumentiert werden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB1963 schrieb:

    Restlängen
    kommen in die Wühlkiste. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VB1963
    Das Programm wird ja erst genutzt wenn ja mehrere Stäbe verschnitten werden sollen und die Reststücke landen dann entweder im Schrott, weil zu klein oder werden ins Lager eingelagert.

    @RodFromGermany
    Ich hatte gedacht ich hätte verstanden was du möchtest und deswegen meine hervorragende Skizzendarstellung gemacht :) und dann hat mich VaporiZed wieder verwirrt und ich wusste nicht ob es das war was du wolltest. Brauchst du jetzt noch irgendeine Darstellung von mir?
    Deine Beschreibung in Post 16 trifft genau zu. So steht mein Programm schon.
    Was jetzt ansteht bei mir:
    Ich möchte nach der ersten Schleife mein Profilsatz (Stab Nr. 1) speichern und falls nötig geht es nochmal in die Schleife für Profil Nr. 2 dann wieder speichern usw. Dann möchte ich eine Druckvorschau machen, wo ich dann auf diese Daten zugreifen möchte.
    So ist mal mein Plan, hab ja nicht viel Erfahrung mit Programmieren und hoffe, dass der gut und richtig ist.
    Ich werde mir mal Datatable anschauen.