Mitgliederverwaltung - Hilfe bei der Erstellung sauberen Codes

  • VB.NET
  • .NET 4.5

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

    Ah verstanden. Wie gesagt, Kopfrechnen wäre lästig, aber vertretbar.
    Viel schlimmer finde ich den anderen Punkt - das mehrmalige Dialog öffnen und schließen für einen Einkauf.
    Angenehmer wäre den Kunden zu öffnen, anzuklicken was er will, und dann wird automatisch gesucht ob Neuanmeldung / Verzug drauf kommt (und ggf. an die Datenschutzerklärung erinnert) und dann stehen da die beiden Marken, die er will und die Gesamtkosten.
    Das halte ich für benutzerfreundlicher.

    Ich bin mir zumindest ziemlich sicher, dass ich mein DataSet dahin korrekt angepasst habe.
    Decimal für Währungen habe ich auch eingepflegt.
    Außerdem hab ich die Table "Lieferant" doch wieder um seine Adresse erweitert und eine neue Table für meine eigenen Daten hinzugefügt.
    Wenn ich nämlich eh speichere, wann ich welche Marken bekomme, und wann welche Marken abgerechnet werden, kann ich ja auch gleich eine Quittung erzeugen und drucken.
    Dann brauche ich das auch nicht mehr von Hand.

    Edit: und sorry an @tragl in deinem Post 15 war die Version mit "Kunde" KundeEinkauf" und "Einkaufsposition" bereits enthalten.
    Hab ich aber gekonnt ignoriert...
    Bilder
    • DataSet neu.png

      160,93 kB, 1.322×786, 52 mal angesehen
    @DerSmurf
    macht ja nix. Wenn du nu so zufrieden mit deinem dataset bist, dann würde ich deiner stelle ohne firlefanz eine art testanwendung basteln mit dem dataset - ein paar test-einträge bauen und
    schauen, ob du damit zufrieden bist (das reine Handling, nicht die Optik oder sonst was). Erst wenn das alles passt kannst dich um Optik etc. kümmern
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    DerSmurf schrieb:

    Hmm. Wie benenne ich denn das DataSet korrekt?

    Prinzipiell so, dass du was damit anzufangen weißt.

    dtsAngelshop oder so würde mir da vorschweben. Wobei dtsMain m.E. auch ginge
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ich wollte gerade das DataSet in meine Solution kloppen und mal ein grundlegendes Design erstellen, also wie ich vorhabe, dass der User navigiert und so.
    Damit ihr euch mal anschauen könnt, ob ihr das für sinnvoll erachtet und vor allem, obs mit meinem DataSet realisierbar ist. (denn wie gesagt, je komplexer das DTS ist, desto abstrakter wirds für mich).
    Aber scheinbar bin ich doch zu doof, für den Solution explorer.
    Ich habe die _DataSetTemplate.sln im Solution Explorer geöffnet (rechtsklick --> öffnen mit).
    Im Solution Explorer habe ich dann nichts weiter gemacht, als auf "CreateTemplateChild" geklickt und als Namen hab ich "Angelmarken" eingegeben.
    Die Solution wird dann ohne gemecker unter neuem Namen erstellt und auch gleich im Solution Explorer geöffnet.
    Hier fällt mir aber auf, dass nach dem kopieren (CreateTemplateChild) im linken Fenster nur noch Angelmarken.vbjpro angezeigt wird.
    Vor dem kopieren (also mit dem geöffneten Template) standen dort noch die "GeneralHelpers.vbjpro" und "WinformHelpers.vbjpro".
    Öffne ich aber die neu erzeugte Angelmarken.sln, dann werden mir im Solution Explorer die beiden angezeigt.

    Auch beim öffnen der Angelmarken.sln mit VS, werden mir alle drei Projekte im Projektmappen Explorer angezeigt.
    Aber beim Laden der frmAngelmarken, werde ich mit Fehlern überschüttet. Was hab ich falsch gemacht?

    Edit: @ErfinderDesRades sag mal gibt es eigentlich irgendwo eine Erklärung, was ich mir da genau kopiere?
    Ich sehe ein, dass es sinnbefreit ist bereits vorhandenes neu zu erfinden, bloß weil man lieber sein eigenes Zeug verwendet.
    Aber wenn ich fremden Code verwende (von dem ich wie gesagt, in keiner Weise davon ausgehe, dass er mir nicht hilft), dann muss ich ja wissen, wozu überhaupt.
    Oder merke ich das schon, wenn ich am Schreiben des Codes bin? Bzw. wenn ich fertig bin, und du mir sagst, wie es mit deiner Solution einfacher gegangen wäre?
    Bilder
    • FehlerBeimOeffnen.jpg

      367,79 kB, 1.920×1.080, 36 mal angesehen
    • Kopiervorgang.jpg

      275,67 kB, 1.920×1.080, 33 mal angesehen
    Dateien
    • Angelmarken00.zip

      (229,35 kB, 14 mal heruntergeladen, zuletzt: )

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

    DerSmurf schrieb:

    Hier fällt mir aber auf, dass nach dem kopieren (CreateTemplateChild) im linken Fenster nur noch Angelmarken.vbjpro angezeigt wird.
    Der SolutionExplorer hat oben eine Combobox, da kann man eine Art Viewmode einstellen.
    Entweder Complete oder UserCodeOnly
    Bei UserCodeOnly sind Helpers-Projekte ausgeblendet.
    Für die Funktion ist das ohne Belang.



    Was alles beim TemplateChild umkopiert und umbenannt ist, ist glaub im Post aufgelistet, wo man den SolutionExplorer downloaden kann.
    Wie (dort) gesagt: Es werden alle Sources des HauptProjektes umkopiert - wie sie im SolutionExplorer als im HauptProjekt eingebunden zu sehen sind.
    Helpers-Projekte werden nicht umkopiert - die sollen ja im neuen Projekt auf exakt dieselbe Weise wieder eingebunden sein.
    Beim Umkopieren gibt es Umbenennungen an Ordnern, Dateien und in Datei-Inhalten.
    Es ist ziemlich komplex (und ist mir jetzt zu doof, den Text des Postes hier nochmal zu wiederholen).
    Aber ansatzweise:
    _DataSetTemplate.sln liegt in einem Solution-Ordner _DataSetTemplate. Sie enthält einen ProjektOrdner gleichen Namens: _DataSetTemplate.
    Darin das ProjektFile _DataSetTemplate.vbProj. Ausserdem das Form frm_DataSetTemplate, mit seinen Dateien frm_DataSetTemplate.vb und frm_DataSetTemplate.Designer.vb.
    In diesen Dateien ist Code, etwa die Zeile

    VB.NET-Quellcode

    1. Public Class frm_DataSetTemplate

    Entsprechend auch Dateien des vorbereiteten Datasets.
    Nicht zu vergessen, dass auch in der _DataSetTemplate.sln selbst, und in der _DataSetTemplate.vbproj die Zeichenfolge _DataSetTemplate vorkommt.
    Also das ganze Gesummse, und noch paar Sachen mehr, wird umbenannt. Alles was vorher _DataSetTemplate hiess, heisst nun Angelmarken.

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

    Shit. Bitte Verzeih!

    DerSmurf schrieb:

    Edit: @ErfinderDesRades sag mal gibt es eigentlich irgendwo eine Erklärung, was ich mir da genau kopiere?

    Diese Frage zielte nicht auf den Solution Explorer ab. Hier weiß ich, was er kann und was das soll. (Habe ja den Thread wo der Donwload ist).
    Die Frage zielte ab auf das was ich da kopiere (also das _DatasetTemplate).
    Muss ich im Voraus wissen, wo der Vorteil ist dein Template zu verwenden, im Vergleich zu einer neuen leeren Solution?
    Oder finde ich das einfach bei der Erstellung des Programmes heraus?

    Und es bleibt meine Frage: Warum kann ich die Solution mit dem Solution Explorer nicht lauffähig kopieren?

    DerSmurf schrieb:

    Aber beim Laden der frmAngelmarken, werde ich mit Fehlern überschüttet. Was hab ich falsch gemacht?

    wie ich diese erstellt habe. s.o.

    DerSmurf schrieb:

    der Vorteil ist dein Template zu verwenden, im Vergleich zu einer neuen leeren Solution?
    achso.
    Aber das habich glaub in post#2 gesagt oder so.
    Das Template stellt eine sehr erprobte Anwendungs-Architektur hin:
    Haupt-Anwendung, Helper-Bibliotheken, Ordner fürs Dataset, Datei zum Abspeichern des Datasets, Code-Datei für Business-Logik. Business-Logik für ein global zugreifbares Dataset ist bereits implementiert, die Importe sind im frmAngelmarken bereits gesetzt.
    Also kanns eiglich losgehen - die Lokomotive ist richtigrum auf die Schiene gebracht.

    Betrübt mich etwas, dass SolutionExplorer bei dir iwelchen Mist baut - bei mir gehts Out of the box
    Dateien
    • Angelmarken01.zip

      (224,05 kB, 15 mal heruntergeladen, zuletzt: )
    Auch deine angehängte Solution zeigt mir im VS einen Fehler:
    Beim öffnen von frmAngelmarken.vb (siehe Bild).
    Wenn ich VS schließe (ohne speichern) und die Solution neu öffne, startet es ohne Fehler. Jedoch lässt sich das ganze nicht kompilieren.

    Edit: ähm. Eigentlich kann die Solution die du hochgeladen hast, doch bei dir auch nicht laufen. Oder ich komme gerade gar nicht klar.
    Die Verweise von "Angelmarken" auf "GeneralHelpers" und "WinFormHelpers" laufen bei mir beide ins leere. Die dlls gibt es nicht.

    Wenn das ganze bei dir läuft. Was ist dann bei uns anders?

    und noch ein Edit:
    Wenn ich dein DataSetTemplate aus Post 2 starte, erhalte ich den gleichen Fehler wie nach dem kopieren mit dem Solution Explorer. (Post 47)
    Könnte es sein, dass dein angehangenes Template einen Fehler hat und es garnicht am Solution Explorer liegt? Oder dass ich vor dem kopieren noch was machen muss?
    Denn auch in dieser Solution laufen die Verweise auf die Helpers ins leere.
    Und ich habe mit dem Solution Explorer einer meiner Solutions kopiert, das klappe einwandrei.

    Ich habe in meinem "VBProgramme" Ordner die _AllHelpers und das _DataSetTemplate gepackt.
    Dann habe ich die GeneralHelpers und WinFormHelpers als .sln gespeichert und kompiliert.
    Nun läuft das DatasetTemplate ohne Fehler. Wenn ich dies kopiere erhalte ich eine Fehlerfreie Solution mit ein paar Controls auf der Mainform, einem DataSet mit einer kleinen "Kunde" Table, einen Verweis auf das dts und eine Bindingsource im Programm. So soll das doch sein oder? Hab die Solution mal angehängt.
    Bilder
    • Fehler.png

      101,97 kB, 1.920×1.080, 22 mal angesehen
    • GehlervormStarten.png

      120,28 kB, 1.920×1.080, 21 mal angesehen
    • Verweise.png

      176,23 kB, 1.920×1.080, 28 mal angesehen
    Dateien
    • Angelmarken00.zip

      (229,99 kB, 14 mal heruntergeladen, zuletzt: )

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

    DerSmurf schrieb:

    Edit: ähm. Eigentlich kann die Solution die du hochgeladen hast, doch bei dir auch nicht laufen. Oder ich komme gerade gar nicht klar.
    Die Verweise von "Angelmarken" auf "GeneralHelpers" und "WinFormHelpers" laufen bei mir beide ins leere. Die dlls gibt es nicht.

    Ja, ich hab einen "Fehler" in GeneralHelpers. Die binden neuerdings Nuget.Newtonsoft.Json mit ein, und das zickt rum.
    "Restore Nuget Packages" geht nicht, also muss man über"Manage Nuget Packages Newtonsoft.Json deinstallieren und wieder re-installieren.

    Wohl einfacher, du löschst die Methode GeneralHelpers.ObjectX.ToJsonString()

    Ach, und noch ein:
    Wenn man eine sone Solution aussm INet zieht, will VisualStudio die DatenDatei-Xml auch als Dataset interpretieren, und typisierte Methoden generieren.
    Da muss man in den Dateieigenschaften von dtsAngelmarken.xml den Eintrag Custom Tool: MSDatasetGenerator löschen.

    Also dassis Mist, da werd ich das Template nochmal umbasteln.

    Probierma mit dem:
    Dateien
    • Angelmarken00.zip

      (223,43 kB, 18 mal heruntergeladen, zuletzt: )

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

    Sehr schön, das klappt.
    Ich habe mir die Helpers in den Hauptordner meiner VB Programme gepackt und die Angelmarken Solution ebenfalls (damit die Helpers einfach für andere Projekte erreichbar sind).
    Dann habe ich die Projektmappen der Helpers neu in meine Angelmarken Solution gepackt und die Verweise gesetzt, und mir im Anschluss eine neue _DatasetTemplate mit SolutionExplorer kopiert.
    Daraus habe ich mir dann eine neue "Angelmarken" Solution kopiert. Geht alles ohne Probleme.

    Hier eine Frage. Hast du die Projektmappen deiner Helpers im Code, weil du ab und an auf den Code zugreifst?
    Dann wäre es doch kontraproduktiv immer die gleichen Helpers zu verwenden (dafür sorgt ja der SolutionExplorer). Weil du diese Änderungen in anderen Projekten (die auf die gleichen Helpers zugreifen) nicht willst / brauchst
    Oder hat es einen anderen Grund, dass die Projekte da mit drinne sind? (Nur ein Verweis auf die dll würde ja den gleichen Dienst tun)

    Ich habe jetzt das DataSet ins Projekt übernommen und mal ein ganz grobes Layout erstellt. Hier habe ich dann in Labels geschrieben, was ich an der Stelle will, dass mein Programm macht.
    Dazu hier nochmal ein Zitat aus dem Post was mein Programm können soll:
    Spoiler anzeigen
    • Speicherung der Personen / Vereinsmitglieder und wann sie welche Marken zu welchem Preis kaufen

    Wenn jemand kommt und Marken kaufen will, schaue ich in meiner Personen "Datenbank", ob diese existiert. Wenn nicht wird sie angelegt.
    Dann wird die Person ausgewählt und es ist anklickbar, was für Marken verkauft werden sollen.
    Also Fischereiabgabe 1 Jahr, Fischereiabgabe 5 Jahre, Fischereiabgabe Jugend, DAV Erwachsen, usw.
    Hier sollen Prüfungen erfolgen (Ist Jugend / Erwachsenenmarke ok, oder passt das mit dem alter nicht, ist er ein neues DAV Mitglied, also muss Neuanmeldung gezahlt werden. Ist es nach dem 01.04. und muss Verzug bezahlt werden, kauft er SA oder MeckPomm Karte - ist der Fischereischein vorhanden, ...).
    Ganz wichtig ist eine Erinnerung an eine evtl. erforderliche Datenschutzerklärung (bei allen DAV Neumitgliedern)
    Nach dem Klick auf die entsprechende(n) Marken, soll eine kleine Übersicht erscheinen wo Positionsname und Kosten auftauchen:
    Also Abgabe 1 Jahr Erwachsen - 12 €DAV Erwachsen - 73 €Neuanmeldung - 5 €gesamt - 90 €es soll abrufbar sein, wie viele Marken sich im Bestand befinden müssen.
    • Hierzu Speicherung der Lieferungen (die Menge an Lieferungen ist sehr überschaubar) und Abrechnungen.
    Also nach dem Motto am 02.01. sind 200 Marken gekommen. Am 05.04. wurden 120 abgerechnet. Am 01.05. wurden 40 abgerechnet.
    Es sind aktuell 180 Adressen gespeichert. Müssen also 20 Marken vorhanden sein.
    eben ein System zum Speichern der Abrechnungen / Lieferungen
    inklusive der Möglichkeit die eingescannten Abrechnungs- / Lieferzettel hierzu im Programm zu organisieren (ohne den Win Explorer zu benötigen). Also z.B. durch Drag & Drop auf die Form - Zuordnung zu einem Liefer- / Abrechnungsvorgang - automatische Benennung der Datei und Ablage am entsprechenden Ort
    • eine Exportfunktion der Daten nach Art der Marke (Abgabe 1 Jahr, Abgabe 5 Jahre,, ...)
    ich weiß noch nicht in welches Format. Denkbar wäre xls (EPPlus), pdf (PDFFileWriter), oder eben direkt zum Drucker.
    • export der kompletten Daten, was über eine Person gespeichert wird
    Also die Adressdaten, sowie die Daten wann welche Marke verkauft wurde - quasi alles was "mein Programm über die Person weiß"
    • Die Datenbank oder eben die xml die das DataSet enthält muss verschlüsselt sein
    hier denke ich an eine Verschlüsselung mit dieser CryptoDings Bibliothek mit Passwort und dem Salt dingen da.
    Allerdings würde ich das Passowrt glaube ich im Code speichern. Denn bei jedem Start ein PW eingeben ist lästig.
    • Programm soll auf Touchgeräten vernünftig ohne Tastatur und Maus bedienbar sein
    Wenn ich Marken an einen Kunden verkaufe, der bereits gespeichert ist, soll das ganze mit ein paar weniges Fingertouches vonstatten gehen.Es soll aber auch das anlegen eines Kunden per Touch komfortabel möglich sein (so komfortabel wie die Bildschirmtastatur halt ist)


    Kannst du hier mal bitte drüber schauen, ob das für dich alles schlüssig ist?

    Und noch eine Frage. Wie verschlüssel ich die gespeicherte xml. Ich verstehe dein speichern des Dts nicht ganz.
    Das ipassiert bei mir bisher nur per Me.Dataset.Writexml(Dateiname)
    Dateien
    • Angelmarken00.zip

      (243,06 kB, 12 mal heruntergeladen, zuletzt: )

    DerSmurf schrieb:

    Hier eine Frage. Hast du die Projektmappen deiner Helpers im Code, weil du ab und an auf den Code zugreifst?
    Dann wäre es doch kontraproduktiv immer die gleichen Helpers zu verwenden (dafür sorgt ja der SolutionExplorer). Weil du diese Änderungen in anderen Projekten (die auf die gleichen Helpers zugreifen) nicht willst / brauchst
    Oder hat es einen anderen Grund, dass die Projekte da mit drinne sind? (Nur ein Verweis auf die dll würde ja den gleichen Dienst tun)
    Ja, ich hab die Helpers-Projekte immer als Projekte in der jeweiligen Solution, und mit Projekt-Verweisen eingebunden - keine dlls.
    Gelegentlich ergeben sich noch Erweiterungen/Verbesserungen für die Helpers, wenn ich an einem bestimmten Projekt arbeite. Die Verbesserungen kommen dann allen meinen Solutions zugute.
    Wenn ich mit SolutionExplorer was verzippe, dann verzippt das quasi meine gesamte Programmier-Umgebung, nur dass bei mir noch viele weitere Solution-Ordner herumliegen, neben der momentan in Arbeit befindlichen Anwendungs-Solution. Alle diese Solutions haben dieselben Helpers auf dieselbe Weise eingebunden.



    Jo, dein Programm-Konzept scheint mir schlüssig.
    Datenmodell-mässig sehe ich da zwei Bereiche: 1) Personen+Einkäufe 2) Lieferungen+Abrechnungen

    Dann hast du noch viel Export-Funktionalität, was streng genommen nicht zum Datenmodell gehört. Weil einen Export musste nicht abspeichern, sondern kannste im Zweifelsfall erneut ausführen.

    Dann willst du scheints noch was importieren.

    Und dann noch was verschlüsseln. Zum Verschlüsseln habich Tut gemacht, mit so Crypto-Dingens. Ist ziemlich verschwurbelt, also kann man viel falsch machen. Aber man kanns auch richtig machen, und ist nicht sooo viel Aufwand, wenn man weiss wie.
    Ich würde das Verschlüsseln aber weit nach hinten vertagen. Ist eine eigene Baustelle und eine zusätzliche Komplexität, die dir während Haupt-Entwicklung nur zur Last fällt.
    Und je später du dir das antust, desto mehr Erfahrung hast du zuvor gewonnen.
    Ja. Das Crypto Dings verwende ich in einem meiner Programme.
    Aber stimmt schon, ist lästig - gerade wenn man sich Mal schnell die XML ansehen will, weil im DTS was komisch ist - machen wir also als letztes.

    Ich mach mich Mal Ran ein bisschen Code zu schreiben.
    Ihr hört von mir
    So Ich habe jetzt mal mit der Mitgliederverwaltung angefangen. Das ist wohl der einfachste Part.
    Da sollten sich am einfachsten meine strukturellen Fehler finden lassen (und evtl. Fehler, die ich oft mache, weil ich ähnliches schon oft gemacht habe).
    Aber zwei Fragen vorab.
    1. Die Sub EnsureDefaults

    VB.NET-Quellcode

    1. Public Sub EnsureDefaults(Table As DataTable)
    2. For Each col As DataColumn In Table.Columns
    3. With col
    4. 'nicht nötig bei AllowDbNull, PrimKeys, AutoIncrement oder wenns den DefaultValue schon gibt
    5. If .AllowDBNull OrElse .Unique OrElse .AutoIncrement OrElse Not Convert.IsDBNull(.DefaultValue) Then Continue For
    6. If .DataType Is GetType(String) Then
    7. .DefaultValue = "<n.a.>"
    8. Else
    9. .DefaultValue = Activator.CreateInstance(.DataType)
    10. End If
    11. End With
    12. Next
    13. End Sub

    Das schreibt mir in alle string Spalten (bzw. bei BindingSource.EditNew(of ..) ein <n.a.> in die Textboxen. Das finde ich sehr unschön und störend.
    Wo ist der Sinn? Geht es hier darum DBNull zu vermeiden, wenn ich den DefaultValue vergessen habe?
    Sollte ich dann immer einen DefaultValue vergeben, auch wenn ich beim hinzufufügen / editieren einer DataTableRow sicherstellen kann, dass die Spalte nicht leer bleibt?

    2. Ich verstehe die DataSet register Geschichte nicht:

    VB.NET-Quellcode

    1. Dts.DataFile("..\..\DataStuff\AngelmarkenData.xml").Register(Me).Fill

    Hat das was mit der Speicherung zu tun? Also DataSet to xml. Oder was macht das?

    Edit:
    Ich habe die Personenverwaltung (TabPage Personenverwaltung) jetzt mal fertig gestellt.
    Die Speicherung des DataSets als xml, sowie die n.a. Geschichte hab ich jetzt - wegen der Fragen oben - erstmal weg gelassen.
    Ansonsten wäre dieser Teil (erstmal) fertig. Wie findet ihr meine Umsetzung (optisch und codetechnisch)?
    Dateien

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

    Bedeutet dein 1. Ja, ja auf beide Fragen?
    Kannst du mir erklären warum ich dann immer einen Default value festlegen sollte?

    Und dürfte ich zu 2. Eine andere Antwort bekommen? (Für mich ist vieles noch nicht selbstverständlich / selbsterklärend)
    1. natürlich nicht.
    2. ja und nein, weil ich kann mich nur wiederholen
      Schau doch einfach nochmal hin - was siehst du da?

      VB.NET-Quellcode

      1. Dts.DataFile("..\..\DataStuff\AngelmarkenData.xml").Register(Me).Fill
      Ich sehe da drei Methoden, nämlich: .DataFile(), .Register() und .Fill(). Genau darauf gehe ich ein:
      Register() ist nötig für formübergreifendes Databinding, .DataFile() legt fest, wo das Dataset hinschreibt/liest, was .Fill() macht errätst du nie!