Anzeige von Bestellungen / Beständen in übersichtlich (meine Form ist nicht hübsch)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    Anzeige von Bestellungen / Beständen in übersichtlich (meine Form ist nicht hübsch)

    Holla
    In meinem Bestellprogramm speichere ich zu jedem Artikel die Bestellmengen und für manche Firmen auch Bestände.
    Ein Bild von DataSet und Form habe ich angehängt.
    Alle DGVs sind über die Datenquelle auf die Form gezogen. Und alle Funktion läuft einwandfrei.
    Ich habe jedoch ein Problem mit der Darstellung der Daten.
    Es wird sehr unübersichtlich, wenn ich eine Bestellung tätige, ohne einen Bestand anzulegen.
    Dann stehen die Bestellungen nicht mehr schön neben den Beständen und man sucht in den beiden DGVs kreuz und quer.
    Also z.B. Bestellung am 03.05.21, aber kein Bestand an diesem Datum.
    Dann habe ich einen anderen Bestand, als dem vom 03.05. (weils da ja keinen gibt), neben meiner Bestellung.
    Mir fällt aber tatsächlich nichts ein, wie ich das übersichtlicher gestalten kann.
    Hat jemand eine Idee hierzu?
    Bilder
    • Dataset.png

      102,48 kB, 1.920×1.080, 81 mal angesehen
    • Form.png

      101,4 kB, 1.920×1.080, 85 mal angesehen
    Ich versteh leider nicht, was Du anzeigen willst (außer was Schönes). Was vom 03.05. seh ich gar nicht auf dem Screenshot, nur was vom 17.
    Und dann stellt sich die Frage, was Du bei Bestand oder Bestellung anzeigen lassen willst. Wenn es darum geht, wieviel Du wann bestellt hast, ok. Aber Bestand? Zum damaligen Zeitpunkt? Vor Lieferung, nach Lieferung? Reicht der aktuelle Bestand nicht? Und warum ist der Bestand optional? Ist also kein Warenwirtschaftsprogramm. Sonst müsstest Du ja alles loggen.
    btw: Warum ist das Haupt-DGV auf CellSelect, nicht auf FullRowSelect? Bekommt man andere Anzeigen, wenn man in Zeile#1, Spalte#2 klickt als Z#1, S#1?
    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.
    Bitte verzeiht. Ich war in dem Irrglauben unterwegs, dass klar ist, was das Programm macht, wenn ich das DataSet zeige.
    Also es handelt sich um ein Bestellprogramm (Einzelhändler bestellt bei Lieferant).
    Dies ist asugegliedert aus meinem Hauptprogramm und läd eine xml für jeden Lieferanten.
    In dieser xml ist der gesamte Warenbestand, sowie Bestellungen und ggf. Bestände dieses Lieferanten (sowie Adresse, und Gedöns) gespiechert.
    Der Grund hierfür ist, dass das Programm zeitgleich auf mehreren PCs laufen soll.
    Im Grunde speichere ich was ich bestellen möchte (also zu den betreffenden Artikeln eine Menge), dann ist es möglich die Bestellung abzuschließen. Es wird eine entsprechende pdf erstellt und diese automatisch (so der User da rauf klickt), als Email versendet.

    Also in der Praxis laufe ich durch den Laden, scanne mit EAN Code Scanner ein, was ich brauche, ändere ggf. die Bestellmenge, und schicke die pdf per Mail weg.
    Bei manchen Lieferanten speichere ich aber zusätzlich noch einen Bestand.
    Im angehängten Beispiel das letzte mal am 03.05. da waren 35 Säcke da.
    Das brauche ich, wenn ich z.B. immer auf die gleiche SollMenge aufstocke.
    Also sagen wir Artikel1, SOLL 15 mal vorhanden sein, Artikel2 SOLL 20 mal vorhanden sein, usw.
    Dann laufe ich rum und speichere die Bestände, damit ich dann (in einem Rutsch) entsprechend die Bestellmengen festlegen kann.
    Und anhand der älteren Bestellungen / Bestände sehe ich die SOLLMenge und merke ob diese ggf. aufzustocken ist.
    Also z.B. bei letzer Bestellung war der Bestand 10, die Bestellung auch 10, jetzt sind 0 da. Ich weiß, 20 wären zu wenig zum bestellen.
    Wie gesagt, codetechnisch funktioniert das zu 100% - aber die GUI meines Programmes ist eher schlecht (unübersichtlich).
    Die Artikelliste wird sehr klein (ich arbeite auf 10 Zoll oder sowas), wenn ich Bestand und Bestellung einblende und in Bestand / Bestellung kommt es zum verrutschen, wenn mal keine Bestellung oder Bestand gespeichert wurde.
    Im Beispiel sieht man, dass bis zum 03.03.21 Bestellungen und Bestände schön nebeneinander sind, danach nicht mehr - da gehts dann kreuz und quer.
    Das kreuz und quer finde ich jetzt nicht so schlimm (da gewöhnt man sich dran), aber ich habe keine Idee wie ich das optisch aufwerten kann, und z.B. das Platzproblem löse.
    Designed ist das ganze mit Splitcontainern die Splitcontainer fassen.
    Hier male ich auch gerne mal ein Bildchen auf dem man sieht, welche Container da wie zusammenhängen.

    Wenn das Bildchen hier nicht reicht, lade ich natürlich auch die Solution hoch.
    Das wäre allerdings mit etwas Aufwand verbunden, da das Programm z.B. in den Unterordner des Hauptprogramms kompiliert, ich einen geeigneten Beispieltdatensatz erstellen muss, etc. (das scheut mich nicht, aber ich mags nicht machen, wenn ihr das garnicht braucht)
    Aber wie gesagt - würde ich machen wenn ihr braucht.
    Bilder
    • Unbenannt.png

      224,57 kB, 2.736×1.764, 63 mal angesehen

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

    DerSmurf schrieb:


    Mir fällt aber tatsächlich nichts ein, wie ich das übersichtlicher gestalten kann.
    Hat jemand eine Idee hierzu?


    bei platz probleme mit Tabpages versucht ? um die Tabpages zu erweitern verwende eine Tabelle (Datenbank Tabelle oder..)
    also Tabpages werden von dieser Tabelle Dynamisch erstellt und gleichzeitig fügst du in der Tabpage ein DGV ein.
    Ich habe mir diverse Programme bei meinen Vertretern angeschaut.
    Die allermeisten fallen raus, weil diese optisch wunderschön sind.
    Aber damit arbeiten möchte ich in vielen Fällen nicht, weil man für eine Sache teilweise zu oft touchen muss.
    (Artikel in einen Warenkorb ziehen und so. Ist zwar nett, aber wenn ich 800 Artikel am Tag bestelle, gehts mir das schnell auf den Sack)
    Auch das Beispielprogramm vom @ErfinderDesRades habe ich mir zu Gemüte geführt (bereits beim erstellen der jetzigen Version).
    In beiden Fällen habe ich einige Inspirationen gefunden, und ich bin prinzipiell mit meiner Lösung auch zufrieden. Sehr sogar.

    Aber dann kamen die Bestände dazu (ohne diese, wie gesagt, bin ich mit der Funktion und Optik mehr als zufrieden).
    Aber ich schaffe es einfach nicht, Bestands- und Bestellungstabelle sinnvoll auf der Form zu verteilen.
    Also (damit ihr eine Vorstellung habt, was ich als schön (funktionell) empfinde), wenn ihr euch auf meinem Screenshot die Tabelle "Bestand" wegdenkt. Die Bestellungen Tabelle rutscht dann entsprechend an diese Stelle und die Tabelle mit den Artikeln wird entsprechend größer.

    Aber evtl. wäre eine Kombination aus dem Vorschlag von @Kasi (auch wenn ich den nicht zu 100% verstanden habe) mit dem Programm vom @ErfinderDesRades möglich.
    Ich haue mir ein TabControl auf die Form. TabPage1 enthält das was ihr auf dem Bild seht (ohne Bestandtabelle).
    Die Tabelle für die Bestellungen rutscht unter die Tastatur (sodass nur Kategorie, oder Bestellungen angezeigt werden können).
    Dann habe ich genug Platz für Artikeltabelle und für die Artikelinfos (die Labels).
    Das ist dann die Ansicht, die ich bei 90% der Firmen brauche (also da brauche ich keine Besstände).
    Für die anderen 10% der Firmen (wo ich mit Beständen arbeite, füge ich dann eine zweite Tab Page hinzu.
    TabPage2 enthält dann (anders aufbereitet) alles inklusive der Bestände.
    Also zum Beispiel nur Artikeltabelle mit Bestellungen / Beständen in diese INTEGRIERT.
    Oder nur eine (zusätzliche) Tabelle für Bestellungen UND Bestände (nicht wie jetzt jeweils eine).
    Wäre eins der beiden problemlos umsaetzbar?

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

    Warum machst du dir nicht mit TabPages Sektionen rein?
    Und wenn du 800 Pos. am Tag bestellst - wäre es da nicht sinnvoll, deine Bestandsführung mit aufzunehmen und dir einen
    Bestellvorschlag servieren zu lassen anhand von Bestand (Ist) und Bestand (soll)?

    Die Reine Einsicht in die Bestände würde ich dann auf eine separate TabPage packen, die Bestellung an sich ebenfalls.
    Auf der Hauptform vielleicht nur Artikelinfo's anzeigen lassen wie:
    - aktueller Bestand
    - Soll-Bestand (oder auch Mindestbestand oder Eiserner bestand)
    - Bestell-Bestand (wieviele sind bestellt)
    - Lieferant, etc.
    die Liste lässt sich nach Belieben fortsetzen. Weiß nicht, ob das eher deiner Vorstellung entspricht - könnte ich mir aber gut vorstellen wenn
    ich sowas bauen würde.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Na, stell dir vor ich bestelle Würstchen, Tiefkühlpommes, Bratwurst und 30 weitere Artikel für meine Dönerbude.
    Jetzt geh ich rum und schreibe auf (Würstchen 5 Stück da, Tiefkühlpommes 3 Stück da, Bratwurst 13 Stück da, ...).
    Das speichere ich jetzt als StockEntry.
    Da meine Verkafuszahlen bei diesen Artikel stark schwanken (und ich nicht immer die annähernd gleiche Menge bestelle, wie bei meinen anderen Lieferanten), schaue ich nun:
    Würstchen:
    01.05. Bestand: 10
    01.05. Bestellung: 15 (=insgesamt 25)
    18.05.: Bestand: 5
    18.05. Bestellung: 20 (um auf 25 Bestand aufzustocken)

    Das wie gesagt, mache ich nur bei 10% der Lieferanten so. Bei allen anderen Bestelle ich halt, wie man so bestellt.
    Ich guck was da ist, schau auf die alten Bestellungen. Wenn beim letzten mal 2 Ve bestellt wurden und jetzt nix mehr da ist, brauche ich wohl 3 oder 4 Ve. (hier reicht also die OrderTable).
    Aber für die anderen 10% brauche ich auch die StockEntry Row.
    Die zum Beispiel auch bei Lieferanten, wo ich große Bestellungen, dafür selten mache.
    Vogelfutter aus Belgien. Da bestelle ich 4 bis 5 mal im Jahr, dafür für jeweils kleine 5 stellige Beträge.
    Da muss die Bestellung sitzen. Hier brauche ich meine alten Bestände und Bestellungen, damit ich genau sehe, auf welche Menge aufgestockt wurde, um genau zu wissen, wie viele Säcke verkauft wurden.
    warum haben deine Bestände ein Datum?
    Bei mir wäre mit Bestand immer der aktuelle gemeint.
    Wenn ich was verkaufe wirds weniger, wenn ich was geliefert bekomme mehr. Also:
    Würstchen: 5

    Vom Prinzip her eine berechnete Spalte:
    Artikel.Bestand = Sum(Fk_Artikel_Lieferung).Anzahl - Sum(Fk_Artikel_Verkauf).Anzahl
    Ah. Jetzt verstehe ich worauf du hinaus willst.
    Das scheitert an nicht gespeicherten Beständen.
    Ich habe zwei Kassen. Beide so lustig Retro mit Warengruppentasten und den Zahlenknöppen 00 und 0 bis 9.
    Da wird nur der Preis eingetippt, kein Artikel.

    DerSmurf schrieb:



    Aber evtl. wäre eine Kombination aus dem Vorschlag von @Kasi (auch wenn ich den nicht zu 100% verstanden habe) mit dem Programm vom @ErfinderDesRades möglich.


    für die Bezeichnungen und wieviele Tabpages Dynamisch zu halten brauchst du eine Tabelle
    ob DB oder XML oder ...
    hier mit einer Datenbank Tabelle die so aussieht


    in einem Modul:

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Module modMain
    3. Public DB_OleDBConnection As System.Data.OleDb.OleDbConnection
    4. Public sDBError As String
    5. Public TabControlsTable As New Hashtable
    6. Public Sub FillTabControls(ByVal tb As TabControl, _
    7. ByVal sSQL As String, _
    8. ByVal sTable As String, _
    9. ByVal sFirstItem As String)
    10. Dim totalRow As Long = 0
    11. Dim da As New OleDbDataAdapter(sSQL, DB_OleDBConnection)
    12. Dim ds As New DataSet()
    13. da.Fill(ds, sTable)
    14. totalRow = ds.Tables(sTable).Rows.Count - 1
    15. tb.TabPages.Clear()
    16. If sFirstItem <> "" Then
    17. tb.TabPages.Add(New TabPage(sFirstItem))
    18. End If
    19. For i As Integer = 0 To totalRow
    20. tb.TabPages.Add(New TabPage("" & ds.Tables(sTable).Rows(i).ItemArray.GetValue(0).ToString()))
    21. Dim txt As New DataGridView
    22. txt.Name = ds.Tables(sTable).Rows(i).ItemArray.GetValue(0).ToString()
    23. 'größe
    24. txt.SetBounds(10, 10, 350, 130)
    25. txt.Text = i
    26. txt.Tag = i
    27. 'Event Clicked
    28. AddHandler txt.Click, AddressOf ClickMe
    29. TabControlsTable.Add(txt.Name, i)
    30. tb.TabPages(i).Controls.Add(txt)
    31. Next i
    32. If tb.TabPages.Count > 0 Then
    33. tb.SelectedIndex = 0
    34. End If
    35. End Sub
    36. Public Sub ClickMe(ByVal sender As System.Object, ByVal e As System.EventArgs)
    37. Dim dgv As DataGridView = DirectCast(sender, DataGridView)
    38. MessageBox.Show("Clicked: " & dgv.Tag)
    39. MessageBox.Show("Clicked: " & dgv.Name)
    40. End Sub
    41. Public ReadOnly Property ErrorString() As String
    42. Get
    43. Return sDBError
    44. End Get
    45. End Property
    46. Public Function DBConnectionIsOpen() As Boolean
    47. Dim bRetVal As Boolean = False
    48. If Not IsNothing(DB_OleDBConnection) Then
    49. bRetVal = IIf(DB_OleDBConnection.State = System.Data.ConnectionState.Open, True, False)
    50. End If
    51. Return bRetVal
    52. End Function
    53. Public Function Open(ByVal sDBString As String) As Boolean
    54. Dim bRetVal As Boolean = False
    55. Try
    56. If IsNothing(DB_OleDBConnection) Then DB_OleDBConnection = New System.Data.OleDb.OleDbConnection
    57. With DB_OleDBConnection
    58. If (DBConnectionIsOpen() = True) Then .Close()
    59. .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDBString
    60. .Open()
    61. bRetVal = DBConnectionIsOpen()
    62. End With
    63. Catch ex As Exception
    64. Dim Titel As String = "ConnectionOpen"
    65. MessageBox.Show(ex.Message.ToString, Titel, MessageBoxButtons.OK, MessageBoxIcon.Error)
    66. bRetVal = False
    67. End Try
    68. Return bRetVal
    69. End Function
    70. End Module



    und in der Form füge ein TabControl hinzu und Code

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub setTabControlPages()
    3. modMain.FillTabControls(TabControl1, "SELECT TabBezeichnung, ID FROM tbl_TabPageReiter ORDER BY ID ASC", "tbl_TabPageReiter", "")
    4. End Sub
    5. Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    6. Open("D:\TestCheck.mdb")
    7. setTabControlPages()
    8. End Sub
    9. End Class


    die Tabelle wird ausgelesen und Tabpages mit Datagridview erstellt, sieht dann so aus

    so kannst du ganz einfach dein TabControl erweitern/ändern ohne in der Form zu wurschteln

    Lagerhaltung ist komplex, ein paar schlagwörter noch:
    Mindestbestand
    Bestellzeitpunkt (wie lange dauert eine Lieferung des Artikels)



    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Kasi“ ()