Fachlich korrekte Datenmodellierung

  • C#

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von TehBasic.

    Dann können wir auch gleich noch kundenspezifische Rabatte (Großkunden, Kleinkunden) und einen Preisaufschlag (Faktor auf alle Einzelposten der Gesamtsumme) einführen, von dem der nicht produzierende Teil der Angestellten bezahlt wird, die Sekretärin z.B.
    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!
    interessant wäre ggfls. wirklich ein "virtuelles" baustellenlager in dem die benötigte zeit zu vollkostensätzen (also inkl. gemeinkosten und fixkosten) enthalten ist.
    dann kann abschliessend auch beurteilt werden wie der auftrag gelaufen ist (die im handwerk so häufig verschmähte begleitkalkulation).

    dann brauchst du in der tat eine tabelle für personal und eine für die bewertung (kosten) des personals wiederrum mit datum für die zeitliche gültigkeit der kosten (preis historie).
    Gruß Hannes
    @EDR Sorry, hab die anderen 2 Artikel übersehen. Werde mich gleich auf diese stürzen.

    @hans im glück @RodFromGermany
    Das mit der Preis Historie ist auf jeden Fall interessant! Über Rabatte habe ich mir jedoch noch gar keine Gedanken gemacht. Wie würdet ihr diese implementieren? Als eigene Position in der Rechnung?
    Das Unternehmen ist sehr klein (besteht gerade mal aus 4-5 Mann), daher sind keine nicht-produzierenden Angestellten vorhanden. Das macht es derzeit irrelevant (jedoch interessant wenn das Unternehmen einmal diese größe erreicht). Ich würde mich jetzt einmal um das wesentliche kümmern.


    lg
    TehBasic

    TehBasic schrieb:

    um das wesentliche kümmern.
    Es ist besser, solche Dinge gleich mit vorzusehen als sie später "reinzuzwängen".
    Da genügt es zumindest, dass Du Dir einen entsprechenden Kommentar reinschreibst und gelegentlich daran zu implementieren, also echten Code schreiben, aber diesen nicht freischalten.
    Rabatte kannst Du erst implementieren, wenn Ihr in der Firma dazu eine "interne Richtlinie" verabschiedet, die es dann zu implementieren gilt, denn was nützt es, wenn Du das eine implementierst und der Chef was ganz anderes gemeint hat.
    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!

    TehBasic schrieb:

    Das Unternehmen ist sehr klein


    naja 5 Mann verursachen bei einem Stundenlohn von - von mir aus gemittelt 15€ - Lohnkosten von rund 32.000€ pro Mann + soz Vers. ca. 7500€, also zusammen runde 200.000€ !
    Sollte man da nicht schon genau rechnen?

    Wenn du z.B. die Produktivität der Mitarbeiter ermittelst, das sind im Handwerk ca. 1500 verrechenbare Stunden pro Jahr (2088 Std. bezahlt das Unternehmen mindestestens abzgl. Urlaub, Schulung, Krankheit, Feiertage.....) , kostet jeder Mitarbeiter selbst schonmal 26,33€ / Std. Netto.
    Wenn du nun diese 26,33€ ins Projekt buchst und dann dagegen rechnest was du für Umsätze erzielst dürfte das auch in dieser Unternehmensgröße hoch interessant sein.
    Gruß Hannes
    ich sehe eher wie TehBasic - sich nicht durch alle möglichen vorauseilenden Anforderungen verrückt machen lassen, sondern erstmal kleine Brötchen backen.
    Bedeutet imho für ihn, dasser erstmal die Technologie in den Griff kriegen muss. Also erstmal überhaupt ein komplexes Modell umsetzen, unds auch soweit hinbringen, dass er mit Databinding und pipapo das angezeigt bekommt, was er sehen will.
    Dann kann man erweitern.

    So verstehe ich "Entwicklung": Man plant nicht den großen Wurf am grünen Tisch, wo man bis zum ersten Testlauf 3 Wochen dran codet, sondern man fängt klein an, und sieht zu, dass mans binnen Stunden lauffähig hat.
    Und dann zyklisch immer wieder refactorieren, erweitern, testlauf, refactorieren, erweitern, testlauf, ...

    ("refactorieren": struckturelle Code-Verbesserung unter Erhalt der momentanen Funktionalität)

    Die Crux dabei ist, dass Technologie und Architektur eben auch erweiterbar sein müssen.
    Jo, und das ist imo beim DatasetOnly-Ansatz schon so leidlich gegeben, also für dieses Projekt wirds vmtl. ausreichen, und sonst kann man immer noch switchen.
    @hans im glück
    Ich denke du hast da was falsch verstanden, was das Programm werden soll. Es ist eine einfache Rechnungsautomatisierung, die (derzeit noch) eine Rechnung bzw. einen Kostenvoranschlag erstellen soll. Das Unternehmen besitzt eine externe Quelle (Buchhaltungsunternehmen) welches diese Informationen zur Verfügung stellt. Ein CRM System, dass Teile der Buchhaltung ersetzt ist nicht in meinem Interesse (derzeit noch nicht) und übersteigt mMn die Komplexität der Software.

    Aber die Ideen sind wirklich gut, ich werde dann ggf darüber nachdenken die Software immer weiter zu erweitern. Aber fürn Anfang finde ich derzeitige Problemstellung ausreichend :)

    lg
    TehBasic

    ErfinderDesRades schrieb:

    ("refactorieren": struckturelle Code-Verbesserung unter Erhalt der momentanen Funktionalität)

    @TehBasic Wenn Du so weit bist, sind UnitTests das, was Du brauchst, da wird jede Prozedur mit beliebigen Startbedingungen und vorgebbaren Ergebnissen vom Automaten getestet. Solch ist ungemein hilfreich und zeitsparend.
    Allerdings brauchst Du da ein etwas professionelleres VisualStudio.
    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!

    RodFromGermany schrieb:

    Allerdings brauchst Du da ein etwas professionelleres VisualStudio.

    muss aber auch nix kosten - im VS2013-Community ist UnitTest-Unterstützung enthalten.
    Imo braucht man dafür aber v.a. ein fortgeschritteneres Verständnis von Architektur und Entwicklung.

    Ich für mein Teil kann mich bislang fürs test-driven-Development nicht erwärmen.
    Bei mir werden ständig Properties und Signaturen geändert, wenn ich da jedesmal die unit-tests nachführen wollte, oder gar vorrausschauend immer erst neue UTs ausbaldowern - ich würd glaub'n Vogel kriegen.

    Tests scheinen mir erst dann sinnvoll, wenn man die Aussensichtbarkeiten seiner Klassen nicht mehr ständig verändert.

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

    EaranMaleasi schrieb:

    komplett im Vorraus zu Planen
    geht nicht, da kommen immer Änderungswünsche.
    Wenn man die Patameter jedoch "sachte" ändert (in kleineren Scheiben, Prozedurweise), kann man die Änderungen im TestCode locker parallel dazu mitmachen. Die Testdaten müssen dann natürlich angepasst werden.
    Ich mach mir da gern eine Tabelle (pro Zeile wird da ein Test gefahren), da kan man auch schnell ne weitere Spalte anhängen.
    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!
    Hallo!

    Ich stehe gerade komplett am Schlauch. Ich möchte die Einträge Filtern und zwar mit dem "LIKE" Operator :)
    Da die ComboBox-Cells ja Datengebunden sind und deren ValueMember ja Zahlen sind, kann ich den LIKE Operator ja nicht anwenden...

    So sieht mein Ding derzeit aus. Die Obere Combobox ist auch Datengebunden und filtert mir immer den einen Datensatz aus den ich anklicke.
    Wäre es irgendwie machbar auch ähnliche Datensätze rauszufiltern?

    P.S. Verwendet wird BindingSource.Filter.


    LG TehBasic
    Bilder
    • Screenshot_3.png

      20,8 kB, 872×398, 94 mal angesehen
    Also ob folgendes an Deiner Stelle mit den ComboBoxen geht oder Dir weiterhilft, dies weiß ich leider nicht wirklich, aber anderweitig verwende ich bei SQL und Zahlen häufig "BETWEEN" oder warum muss es "LIKE" sein?

    Edit: Nee wird Dir wohl nicht weiterhlefen! (Hatte dies gedanklich auf die Felder wie Lohn bezogen, aber MaterialID (oder aich DienstID und EinheitID) ist ja vom ValueMember her Integer, aber es wird "Verzinkt" etc. angezeigt.)

    Der Filter müsste sich also z.B. auch auf die Material-Tabelle erstrecken, aber wie dies geht, weiß ich leider momentan auch nicht - EDR zeigt wie!

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Thias“ ()

    Naja, müssen muss es gar nicht. Ich suche eben die richtige Verwendung davon mit dem Databinding oder eben eine Alternative.

    Mein Ziel ist es Datensätze mit ähnlichem Text zu Filtern.
    z.B.: Input "Einfass%" => die 4 Records auf dem Screenshot.


    lg
    Eine datengebundene Combobox ist im Grunde ein Auswahlfeld für Integer, weil der ValueMember bestimmt, was .SelectedValue ist. Und der ValueMember bezeichnet einen PrimKey, also einen Integer, und "Ähnlichkeit" gibts da nicht: Entweder ein Fremdschlüssel verweist auf einen Primkey oder nicht, ein "Ähnlichkeitsschlüssel" ist gottlob noch nicht erfunden worden.
    Daher scheidet Combobox aus.
    Wie wolltest du ühaupt "Einfass%" in eine datengebundenen Combo eingeben? Da kannste nix reinschreiben - reinschreiben geht nur bei ungebundenen Combos, die sind aber in eim datengebundenen Szenario aus anderen Gründen komplett unnütz.

    Also was du machen kannst, wenn du "liken" willst, ist, dass du eine berechnete Spalte einbaust, die enthält dann Textwerte, ist mit TextboxColumns anzuzeigen, und die kann man auch mit Like filtern.

    TehBasic schrieb:

    ...wäre es sinnvoll es bei dieser Struktur (siehe Screenshot) zu belassen?

    Gerade habe ich mir nochmals so Deine Datenbankstruktur angesehen - auch wenn ich Deinen aktuellen Stand nicht kenne - so ist es an sich üblich (zumindest so wie ich es kenne) - in der Datenbank zu hinterlegen wann und von wem ein Datensatz zuerst angelegt wurde und wann und von wem er zuletzt geändert wurde.

    Also jede Tabelle bekäme dann noch die Felder: User-Add, DateTime-Add, User-Update, DateTime-Update

    Natürlich kannst Du sagen, dass dies bei Deiner kleinen Firma eventuell (aktuell) nicht so wichtig ist, aber gerade in Firmen, wo diverse Mitarbeiter auf die Daten zugreifen, ist es ganz wichtig.

    Manchmal ist es sogar wichtig jede Änderung an einem Datensatz von dem entsprechenden Mitarbeiter zu protokollieren.

    Diese Datenbank-Felder zeigt man natürlich auch nicht im DataGridView an - sondern die Anwendung befüllt diese Felder selbständig im Hintergrund!
    Ich habe mir selbst noch einmal die Datenbankstruktur angesehen und finde jedesmal etwas verbesserungswürdiges.
    Screenshot_4 zeigt hier den derzeitigen Aufbau der DB. Irgendwie ist aber jeder Datensatz eigen. Mit eigen meine ich, dass noch jede Menge Redundanzen vorhanden sind.

    Auch gut zu betrachten im Screenshot_5, wo ein Artikel z.B. "Hochzugschutzblech" mehrmals vorkommt, eben mit einer anderen Dimension.
    Die veränderte Dimension, verändert natürlich auch den Preis. Die Datenbank ist etwa 3 Jahre alt, stammt daher aus einer Zeit wo ich von Datenbanken weniger Schimmer hatte als heute. Nochmal 1038 Datensätze einzuklopfen und auf Richtigkeit zu überprüfen (seufz...)

    Naja, falls mir wer auf die Sprünge helfen will das Teil zu modellieren:

    Ein Artikel hätte dann mehre Dimensionen\Längen zur Verfügung, wobei nicht zwingend vorgeschrieben ist, dass diese einem konkreten Schema folgt (variiert von Artikel zu Artikel).
    Ein Artikel kann als Dimension\Länge eine Spanne von einer Maßeinheit haben (z.B. 60-80cm welche in Laufmeter verrechnet werden), einen generalisierenden Wert (z.B. ab > 80cm wird in m2 verrechnet). Oder auch eine Dimension von DN150 (DN = Innendurchmesser eines Rohres, auch in STK oder Laufmeter verrechnet). Aus diesen "Vorgaben" wird ja ersichtlich, dass die Einheit von der Dimension abhängig ist. Fehlt mir da noch was bei diesem Ansatz?


    EDIT: @Thias derzeit gibt es nur einen Nutzer, wird wahrscheinlich in nächster Zeit auch so bleiben. Ich werde diese Idee trotzdem in das Projekt implementieren, da es wahrscheinlich mehr Aufwand darstellt das nachträglich zu implementieren als es jetzt einfach mit einzubeziehen.

    lg
    TehBasic
    Bilder
    • Screenshot_4.png

      26,84 kB, 956×505, 75 mal angesehen
    • Screenshot_5.png

      20,74 kB, 220×423, 63 mal angesehen
    • Screenshot_6.png

      15,57 kB, 195×392, 85 mal angesehen