speichern von Umsatzstatistik, wie?

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

Es gibt 79 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    Relevant werden da mehrere Tabellen nur, wenn Du wirklich x Warengruppen hast:

    Tabelle 1: Warengruppe
    ID - Int32
    Name - String

    Tabelle2: Tagesdaten
    ID - Int32
    Datum - DateTime
    Kundenzahlen - Int32

    Tabelle3: Zwischentabelle
    ID - Int32
    WarengruppenID - Int32 (Verweis auf Tabelle Warengruppe)
    TagesdatenID - Int32 (Verweis auf Tabelle Tagesdaten)
    Warengruppenumsatz - Int32 (also in Cent)

    Dann kannst Du 8, 12, 1000 Warengruppen anlegen, ihnen alle einen eigenen Namen verpassen (Fischfutter, Katzenkratzbürsten, Hundehaarpflegemittel, ...), den Tag Revue passieren lassen (Kundenzahlen merken, Datum speichern) und dann in die Zwischentabelle reinschreiben, an welchem Tag für welche Warengruppe wieviel Umsatz gemacht wurde. Das später in einen Tages-, Monats- Quartals-, Jahreumsatz umzuwandeln ist ziemlich pillepalle.
    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.
    Ja. Ich werds mal mit x Warengruppen machen.
    Denn das ganze mit 8 Warengruppen und entsprechender Auswertung wäre ja nix neues für mich.
    Also zum x-ten mal die vier views Videos an, denn ich merke ich bin eingestaubt...
    will ja nicht mit Fragen nerven, die ich mir eigentlich selbst beantworten können sollte.

    aber eine Frage noch:

    VaporiZed schrieb:

    Warengruppenumsatz - Int32 (also in Cent)

    warum int32 und nicht double?
    Probier's aus. Aber nicht am Ende meckern, dass es nicht (immer) klappt :P . Hier etwas Lektüre aus stackoverflow.
    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.
    OK - also 4 Views gucken - heruasfinden, warum Int und nicht Double und dann kanns abgehen.
    Aber eine "Vorüberlegungsfrage" habe ich für mich noch nicht klären können.
    Ich möchte eine Eingabemaske ähnlich, wie der aus dem Bild in Post 16 erstellen.
    Also eine Textbox mit entsprechendem Label für jede Warengruppe.

    Wenn aber die Menge der Warengruppen zur Entwicklungszeit nicht bekannt ist, kann ich die Textboxen ja nicht im Designer erstellen.
    Ich müsste sie per Code zur Laufzeit erzeugen - das stell ich mir unelegant vor, aber sollte ja soweit möglich sein.
    Allerdings bekomme ich ja dann keinen gescheiten "speicher" code generiert.

    Wie würdet ihr dieses Prolem lösen?
    Was konkret meinst Du damit, dass Du keinen Speichercode hinbekommst?
    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.

    DerSmurf schrieb:

    Wenn aber die Menge der Warengruppen zur Entwicklungszeit nicht bekannt ist, kann ich die Textboxen ja nicht im Designer erstellen.
    Ich müsste sie per Code zur Laufzeit erzeugen - das stell ich mir unelegant vor, aber sollte ja soweit möglich sein.
    Allerdings bekomme ich ja dann keinen gescheiten "speicher" code generiert.


    Ich bau meine tools immer auf nem TabControl auf, und auf einem Tab pflege ich die "StammDaten".
    Also da werden alle möglichen übergeordneten Tabellen editierbar präsentiert, welche im eiglichen Tagesgeschäft nur auswählbar sind.
    Also deine Warengruppen wären auf "Stammdaten" anzuzeigen, und da musste einmal die 8 Warengruppen, die du hast, anlegen, bevor du auf der Hauptseite Tageseinnahmen eingeben kannst und je einer WG zuordnen.

    Zum Speichern findet sich bestimmt was bei die 4-Views, zumindest ein Verweis auf
    Daten laden und speichern täte ich dort erwarten.
    Nehmen wir an, ich biete in den Settings meines Programmes die Möglichkeiten Warengruppen hinzuzufügen.
    Nun sagen wir, der User hat dort 3 Warengruppen erstellt "Futter - Zubehör - und Blümchen)
    Wenn er nun auf einen Button "Einnahme Eintragen" klickt - öffnet sich eine Form, auf der er das Datum, die Kundenzahl und eben die Einnahmen seiner 13 Warengruppen eintragen kann.
    Nach dem Eintragen klickt er auf speichern.
    Nun müssen alle Textbox Werte geprüft und in int32 umgerechnet werden. Das sollte ja problemlos mit einer For Each Schleife funktionieren, wenn ich die per Code erstellten Textboxen (also die Warengruppen Textboxen) in einem Überelement gruppiere.
    Nun muss meine speichern Sub ja aber noch den Inhalt der Textboxen den entsprechenden Warengruppen zuweisen.
    Aber wie verklickere ich meinem Code, was da wozu gehört? Also welche Textbox ist Futter, welche Zubehör. welche Blümchen.

    Edit: @ErfinderDesRades unsere Posts haben sich überschnitte.
    MIt ist soweit im groben Ablauf alles klar - zumindest habe ich dazu eine Idee.
    Außer: "..., bevor du auf der Hauptseite Tageseinnahmen eingeben kannst und je einer WG zuordnen. (Zitatfunktion geht grad iwie nicht).

    Wie ordne ich zu, wenn ich nicht weiß wie viele WG es geben wird.

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

    Für mich scheint das Datenmodell etwas verwirrt zu sein (mag sein, dass ich etwas überlesen habe). Du müsstest Produkte haben, die zu einer gewissen Warengruppe gehören. D. h., du hast eine Tabelle mit den Produktstammdaten (Id, Name, WarengruppenId, etc). Dann hast du deine Warengruppentabelle (Id, Warengruppenname, etc) und dann die Umsatztabelle (KundenId, ProduktId, Verkaufsdatum, Menge, Umsatz, etc). Dann kannst du auswerten, was du willst.

    Du scheinst das Datenmodell nach deinen Auswerteanforderungen anzulegen. Stattdessen benutze doch die entspr. SQL-Abfragen, um die gewünschte Auswertungen zu bekommen.

    vb_fan schrieb:

    Du scheinst das Datenmodell nach deinen Auswerteanforderungen anzulegen. Stattdessen benutze doch die entspr. SQL-Abfragen, um die gewünschte Auswertungen zu bekommen.

    Nein. Über das Auswerten der Daten mache ich mir noch überhaupt keine Gedanken.
    Denn das kann ich ja sowohl mit dem Eintabelligen DataSet, oder eben dem dreitabelligen gleichermaßen.
    Mein einzeiges Problem ist die Daten mit einer gescheiten UI ins DataSet zu bekommen.

    DerSmurf schrieb:

    Aber wie verklickere ich meinem Code, was da wozu gehört? Also welche Textbox ist Futter, welche Zubehör. welche Blümchen.


    DerSmurf schrieb:

    Wie ordne ich zu, wenn ich nicht weiß wie viele WG es geben wird.


    Diese zwei Fragen sprechen doch sehr deutlich aus, dass du - zumindest aus meiner Sicht - falsch liegst. Du verkaufst doch Produkte und nicht Warengruppen. Warengruppe ist übergeordnet. Der User/Bediener/Admin, wer auch immer legt am Anfang in den Stammdaten x Warengruppen an, dann legt er seine Produkte an/oder verpasst den bereits existierenden Produkten eine Warengruppe und dann kann verkauft werden. Deine Umsätze kommen doch über die Produkte und nicht über die Warengruppe. D. h., nicht der Warengruppe muss der Umstatz zugeordnet werden. Das kommt dann über die entsprechende Auswertung/Abfrage.
    Die Zuordnung erfolgt am besten über DataBinding und UserControls (UC). Du erstellst also die UCs (bestehend aus je 1 TextBox und 1 Label) dynamisch, beschriftest die Labels und den UCs gibst Du eine Warengruppe an die Hand. Das geht in ner For-Schleife. Und wenn dann auf [Speichern] geklickt wird, wird in der Zwischentabelle eine neue Zeile angelegt, die eben auf die Warengruppe des UCs und die Tagesdaten-Zeile verweist.
    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.
    Ok. Ich glaube das habe ich gerafft. Ich mach mich einfach mal ran.

    @vb_fan auch falsch
    Ich speichere nur DIE TAGESEINNAHME PRO WARENGRUPPE, und die Kundenzahl.
    Dies soll dann einem Datum zugeordnet werden (deswegen die drei Tabellen).
    Also nix mit Verweis auf Artikel oder dergleichen.

    DerSmurf schrieb:

    auch falsch
    ist etwas harsch. vb_fan versucht, Dein WaWi-Denken nachzuvollziehen. Es ist erstmal datenbankgedanklich nicht klar, warum Du nicht nur die Verkäufe aller Artikel speicherst und die Daten dann zusammenfasst. Es wäre tatsächlich ein ungeklärter Punkt. Aber ich vermute mal, dass es gar nicht Sinn Deines Programms ist, die einzelnen Verkäufe zu erfassen. Dafür wirst Du wahrscheinlich ein eigenes, vom Finanzamt anerkanntes Kassenprogramm haben. Deines wird wohl nur als Ergänzung zum Kassenprogramm laufen, um Auswertungen zu machen und andere Hilfsfunktionen zu erfüllen.
    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.
    Oh, ja. Du hast recht @VaporiZed, da hab ich mich nicht von meiner besten Seite gezeigt,

    Sorry @vb_fan ich meinte meinen Post natürlich nicht so derb (unfreundlich) wie es rüber kommt
    und entschuldige mich hiermit in aller Form dafür!

    Aber es ist exakt so, wie Vaporized im obigen Post beschreibt.
    So. Ich habe das Datenmodell mal umgesetzt und eine Art Raw - Joining View erstellt, um zu prüfen ob mein Datenmodell passt.
    Ich bin mir recht sicher, dass es so ist, wies sein sollte, würde euch aber gerne bitten, mir dies zu bestätigen.
    Denn da ich nicht so ganz genau weiß, was ich jetzt als nächstes tue, also wie ich eine benutzerfreundliche Eingabemaske erstelle (aber es selber probieren möchte), möchte ich zu 100% sichergehen, dass mein Datenmodell korrekt ist.
    Das Projekt (noch vollkommen ohne Code - nur speichern und laden der xml Datei) habe ich angehängt.
    Eine kleine xml mit Daten habe ich im Degub Ordner gelassen.

    Edit:
    Anhang gelöscht - unten gibts nen neuen :)

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

    Huhu
    Ich habe jetzt einfach mal angefangen und auch schon einen (halbwegs) funktionierenden Code zum eintragen geschaffen.
    Der funktioniert . aber ich glaube nicht, dass mein Code sonderlich gut ist.

    1.
    @ErfinderDesRades sagt in seinen Video Tutorials, dass ich nicht codetechnisch auf ID meiner DataTables zugreifen muss. In meinem Code tue ich dies aber (und weiß mir auch nicht anders zu helfen).

    2.
    Außerdem bekomme ich (im Designer) das Databindings meiner drei Controls auf der TabPage "Umsatz eintragen" also "Datum", "Kundenzahl" und "Tageseinnahme" nicht so gesetzt, dass sich Kundenzahl und Tageseinnahme aus der BindingSource ändert, wenn ich ein Datum auswähle (Sorry @VaporiZed - sowas hatten wir schon mal)
    Ändere ich die DailyIncomeBindingsource.current über die TabPage "Umsatz" unteres DGV, dann werden mir der korrekte Umsatz und die koreckte Kundenzahl auf der TabPage "Umsatz eintragen" jedoch angezeigt.

    3.
    Meine erstellen Textboxen anhand der Warengruppen sollen natürlich auch ein Binding haben (aus den gleichen Gründen wie in Punkt2).
    Hier scheitere ich aber am Code, da ich die Parameter der "Binding.Add" Methode aus der MSDN nicht begreife. Bzw. nicht auf mein Projekt ummünzen kann.

    und 4. bleibt natürlich die Frage von oben:
    Ist mein Datenmodell und die Beziehungen korrekt?
    Dateien
    • Income.zip

      (44,21 kB, 43 mal heruntergeladen, zuletzt: )
    Ein Beispiel für Punkt 1.

    VB.NET-Quellcode

    1. DSIncome.DistributionTable.Rows.Add(newDistributionRow)

    Das ist schon falsch angegangen. Sorry, nein. Nicht falsch. Aber es geht (auch) anders:

    VB.NET-Quellcode

    1. DSIncome.DistributionTable.AddDistributionTableRow(DSIncome.ProductGroup(0), DSIncome.DailyIncome(1), 2)

    Also keine Angabe von IDs der Rows, die Du verlinken/hinterlegen willst, sondern die Angabe der konkreten Rows.

    Zu 2.: Das verstehe ich nicht. Werden die Daten nicht zum passenden Zeitpunkt übernommen, also wenn Du auf [Speichern] klickst oder was willst Du erreichen, was jetzt noch nicht ist?
    3.: Tu es nicht. 1. weil es so nicht geht, da Du ja damit eine Eigenschaft vom BindingSource.Current bindest (obwohl Du ja quasi die ganzen Listeneinträge binden willst, daher geht das nicht). 2. Mach es besser mit einem weiteren DGV. Dann ist es sehr einfach.
    4.: Ja, sieht gut aus.
    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.
    Zu 2. Wenn ich im DGV, dass an die DailyIncomeBindingSource gebunden ist, einen Eintrag anklicke, wird mir auf der TP "Umsatz eintragen" in den Controls Tagesumsatz und Kunden der entsprechende Wert angezeigt.
    Wenn ich auf der gleichen TP das Datum ändere - müsste sich doch eigentlich die BindingSource Position ebenfalls ändern - und entsprechend auch die Werte der beiden NUDs. Tuts aber nicht.

    Zu 3. OK - leuchtet ein - lass ich bleiben
    Aber rätst du mir ein DGV einzubauen, um Daten zu ändern, oder ein DGV zum Eintragen der Daten (also anstelle meiner Codegenerierten Textboxen)?
    Und was meintest du dann in Post#31 - wenn nicht ein DataBinding:

    VaporiZed schrieb:

    beschriftest die Labels und den UCs gibst Du eine Warengruppe an die Hand.

    Und ist der Code für meine Labels und Textboxen echt OK? Das würde mich ein bisschen stolz machen :)

    Zu 4. Perfekt.
    P.S. den Tableeintrag DSIncome.DailyIncome.DailyTakings (also Tageseinnahme) lasse ich natürlich Codetechnisch errechnen.
    Auch deinen Rat die Umsätze als INT32 zu speichern, habe ich nicht vergessen.
    Hatte (bzw. habe) nur erstmal genug zu tun, meinen Code überhaupt zum laufen zu bekommen.

    DerSmurf schrieb:

    Wenn ich auf der gleichen TP das Datum ändere - müsste sich doch eigentlich die BindingSource Position ebenfalls ändern
    Aus zwei Gründen nein: Der DTP ist ungebunden, hat also keinen Einfluss auf die BS-Position. Aber wenn er gebunden wäre, würde sich der gebundene Wert von BS.Current ändern. Aber nicht die BS.Position. Stell Dir vor, dass Du ein Datum einstellst, welches nicht in der BS-Liste bzw. DataTable drinsteht. Was soll Dein Programm Dir da anzeigen? Letztenendes kannst Du nur die Position durch Listen setzen oder z.B. durch Buttons ändern, die explizit den BS.Positionswert festlegen. Aber durch einen Wert in der Tabelle eine BS.Position festzulegen, geht zumindest nicht ohne Zusatzcode.

    DerSmurf schrieb:

    rätst du mir ein DGV einzubauen, um Daten zu ändern, oder ein DGV zum Eintragen der Daten
    Kommt bei mir erstmal gedanklich auf's Gleiche raus. Oder meinst Du eines zur Anzeige/Manipulation eines Datensatzes oder alternativ Eingabe neuer Daten und dann beim Klick auf [Speichern] wird erst ein neuer Datensatz angelegt? Wie Du willst, ist Dein Programm.
    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.

    VaporiZed schrieb:

    Aber durch einen Wert in der Tabelle eine BS.Position festzulegen, geht zumindest nicht ohne Zusatzcode.

    Ja ok. Macht Sinn. Aber ich habe ja eh eine Abfrage im Speichern Button geschrieben, der prüft, ob das Datum bereits vorhanden ist.
    Diese Abfrage kann ich ja evtl. ins DTP Change Event schmeißen und mir dann die Werte aus der Binding Source holen, sofern es was zu holen gibt. Hier könnte ich mir ja dann auch die Werte für die "Codeerstellten" Textboxen holen.
    Denn ich finde die Textboxen als User sehr viel angenehmer, als ein ändern über eine DGV.
    Zumal ich die Daten in einer Textbox, über einen speichern Button z.B., vor dem Eintragen ins DataSet noch validieren kann, oder eben aus einer Double Eingabe eine Int32 erstellen kann.
    Ich mach einfach mal weiter und schaue wie weit ich komme.

    DerSmurf schrieb:

    Und ist der Code für meine Labels und Textboxen echt OK? Das würde mich ein bisschen stolz machen

    Hiermit meine ich den Code, der die UCs erstellt. Bitte mach mich stolz :)