Aufbau Typisiertes DataSet / DataTable / Beziehungen

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

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Ich hab bei mir immer die Aktualisierung auf Cascade, damit die angeschlossenen Tabellen die Änderungen mitbekommen.
    Löschen hab ich immer auf "none", außer an 1-2 Stellen wo es sinn macht.

    Würde man da auch Cascade machen, löscht man z.b. einen Artikel aus der Datenbank und in allen Bestellungen oder Aufträgen, die den Artikel enthalten würde die Position auch mit gelöscht werden, weil
    es den Artikel nicht mehr gibt. Ich arbeite da eher mit einer Boolean-Spalte "Aktiv". Brauch ich den Artikel nicht mehr (oder meinetwegen User, Mitarbeiter etc.) dann stelle ich Aktiv=False und die Programmlogik
    übernimmt den Rest.

    EDIT: So sind die Relationen im Übrigen auch in der Datenbank eingestellt. Ich hab nicht getestet, was passiert wenn das DataSet anders eingestellt ist, als die Datenbank
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    Moin moin

    So habe mir nun eine Testumgebung geschaffen. Siehe Bilder.

    1.) Ich kann also Datensätze auf dem Hauptform hinzufügen und auch ändern.

    2.) Ich kann in den Forms Category & Payments bestehende Datensätze ändern. ( Aus 'Bank' mache ich 'Bankverbindung' ) Das wird dann auf dem Hauptform " Transactionstabelle => DGV " übernommen, und in den Comboboxen als neue Auswahlmöglichkeit. :thumbsup:

    3.) Im Form Category / Payments kann ich aber nicht einen schon verwendeten Datensatz löschen. :!: :!:
    Fehlermeldung! Muss ich dann in schön abfangen :)

    4.) Einen Datensatz den ich NICHT in der TransactionsTabelle verwende, kann ich in Cat/Pay löschen. :thumbup:

    So sollte das doch richtig sein :?:

    Weiter:
    Wenn ich die DB wie in meinem Fall mit Access erstelle und dort die Beziehungen mit erstelle, brauche ich im VS-Designer nichts ändern. Ähhmmm fast nichts.
    Das einzigste was ich ändern muss sie die "AutoIncementwerte". Die stehen immer auf " -1 " und dann zählt auf den Forms alles im Minus.
    Warum eigentlich :?:
    Bilder
    • beziehungen-1.jpg

      243,34 kB, 729×563, 337 mal angesehen
    • beziehungen-2.jpg

      384,19 kB, 1.098×576, 322 mal angesehen
    • beziehungen-3.jpg

      253,6 kB, 863×389, 321 mal angesehen
    • beziehungen-4.jpg

      101,98 kB, 521×265, 317 mal angesehen
    • beziehungen-5.jpg

      208,04 kB, 726×369, 325 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Zuerstmal würde ich dringend von Access abraten, wenn du nicht durch ungewöhnliche Umstände dazu gezwungen wirst. Nimm SQL Server oder irgendeine aktuelle lightweight popular Database mit ansprechendem UI. Wobei man mit Datebanken prinzipiell nur per SQl kommunizieren sollte. Dein Problem löst scih dann wenn du Constraints verstehst.https://www.w3schools.com/sql/sql_constraints.asp
    Zu Punkt 3 und 4: Wenn das so ist wie gewünscht, dann ok. Lässt sich aber leicht durch LINQ abfragen. Im Sinne von: If Transactions.Any(Function(x) x.Category Is CategoryToDelete) Then

    Ich würd eher ne Sicherheitsfrage beim Löschen oder einen Hinweis einbauen: »Diese Kategorie wird bereits von bestehenden Transaktionen verwendet.« plus ggf: »Soll diese Kategorie wirklich zusammen mit den betroffenen Transaktionen gelöscht werden?«

    Amelie schrieb:

    Das einzigste was ich ändern muss sie die "AutoIncementwerte". Die stehen immer auf " -1 " und dann zählt auf den Forms alles im Minus.
    Warum eigentlich
    Einzig kann man nicht steigern, dass wusste damals schon Captain Jack Sparrow ;) . tDS-only: IDs gehen von Haus aus ins Negative. Mit DB: DB zählt von Haus aus ins Positive -> Konfliktvermeidung.
    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
    Das mit der Abfrage beim Löschen hatte ich auch so vor zu machen.

    Im Moment konstruiere ich mir eine Klasse für "Payments & Category" um Codeverdoppelungen einzusparen, was das Laden, Speichern etc betrifft.


    @Coldfire
    Die Umstände zwingen mich im Moment.
    1.) Zum Üben
    2.) wird das später nur auf einem OffLine Laptop laufen
    3.) ... ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    um Codeverdoppelungen einzusparen, was das Laden, Speichern etc betrifft.

    Da kann ich dir nur die Extensions von ErfinderDesRades an's Herz legen. Speichern geht bei mir anwendungsweit mit Dts.SaveDts. Wenn du mit DataSet-Only (also ohne Datenbank arbeitest), dann werden sowieso immer alle Daten geladen
    Edit: Er hat auch was, um das Ganze später an eine Datenbank (SQL, MYSQL, Access) anzubinden - dafür muss man sich mit dem Thema gründlich befassen. Die Daten müssen dann z.B. "manuell" geladen werden, über Custom-Fills.
    Von Access kann ich dir ebenfalls abraten - hat bei mir nur Müll gemacht.

    Amelie schrieb:

    wird das später nur auf einem OffLine Laptop laufen

    Dann nimm DataSet-Only oder installier dort einen lokalen SQL-Express oder sowas

    Amelie schrieb:

    Einen Datensatz den ich NICHT in der TransactionsTabelle verwende, kann ich in Cat/Pay löschen.

    Ist korrekt. Solange keine untergeordneten Datensätze da sind, kann man die Parents löschen

    Amelie schrieb:

    3.) Im Form Category / Payments kann ich aber nicht einen schon verwendeten Datensatz löschen.
    Fehlermeldung! Muss ich dann in schön abfangen

    auch das ist korrekt. Du hast zu dem Parent(Category) einen oder mehrere Childs(Payments) - da die Löschweitergabe nicht auf Cascade steht, sondern verhindert wird - kann auch nicht gelöscht werden, solange die Childs vorhanden sind.
    Wenn du alle Childs mit der entsprechenden Category löschst, dann kannst du danach auch die Category löschen.


    Solltest du hier eine allgemeine Methode gefunden haben, um den "Fehler" schön darzustellen, dann gib gerne eine Rückmeldung sowas hätte ich auch gerne, war bisher zu faul mich drum zu kümmern. In meiner Anwendung kann
    nur ich als Admin löschen, die "normalen User" dürfen das nicht. ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Solltest du hier eine allgemeine Methode gefunden haben, um den "Fehler" schön darzustellen, dann gib gerne eine Rückmeldung
    Wie meinst Du das? Der Fehler kann doch - wie geschrieben - im Voraus abgefangen werden. Beim Löschversuch wird durch einfache (LINQ-)Abfrage geprüft, ob die Kategorie bereits in Benutzung ist und falls ja, zeigt man ne Hinweisbox an.
    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: Jo, bei mir sind's immer DGV's aus denen ich dann Zeilen -> und somit den Datensatz lösche. Dazu hab ich bereits eine allgemeine "Löschabfrage" und e As KeyEventArgs, weil
    ich überall wenn dann mit ENTF lösche. Ich bin grad dabei mir anzuschauen, ob die Row mit übergeben wird. Wenn ja, kann ich mir daraus die DataBoundItem und somit die Row ziehen und dann entsprechend prüfen

    EDIT: Außerdem muss ich überlegen wie ich das generell anstelle, denn: z.B. möchte ich aus meiner Tabelle "Standort" einen Eintrag löschen. Die Tabelle ist in mind. 10 anderen Tabellen als FK definiert - wie prüf' ich das ab? ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    Moin moin

    So ich bin nun ein ganzes Stück weiter gekommen.
    So habe ich das mit dem "Löschen" nun gemacht.
    Wenn ich nun versuche Datensätze bei "Payments" oder "Category" zu löschen, welche eine Beziehung haben, erhalte ich die Messagebox.
    Wobei "ändern" kann ich ja, werde also den Txt noch verbessern.

    Spoiler anzeigen

    In der Class:

    VB.NET-Quellcode

    1. Friend Shared Event DeleteResult As EventHandler(Of Boolean)
    2. Protected Sub RaiseDeleteResult(success As Boolean)
    3. RaiseEvent DeleteResult(Me, success)
    4. End Sub
    5. Friend Shared Event DeleteErrorResult As EventHandler(Of String)
    6. Protected Sub RaiseDeleteErrorResult(message As String)
    7. RaiseEvent DeleteErrorResult(Me, message)
    8. End Sub
    9. Public Sub DeleteEntry(table As String, rowIndex As Integer)
    10. Try
    11. Dim tableToDelete As DataTable = Nothing
    12. Dim bindingSourceToDelete As BindingSource = Nothing
    13. Select Case table
    14. Case "Category"
    15. tableToDelete = Me.DbBudgetDS.Category
    16. bindingSourceToDelete = Me.CategoryBindingSource
    17. Case "Payments"
    18. tableToDelete = Me.DbBudgetDS.Payments
    19. bindingSourceToDelete = Me.PaymentsBindingSource
    20. Case "Transactions"
    21. tableToDelete = Me.DbBudgetDS.Transactions
    22. bindingSourceToDelete = Me.TransactionsBindingSource
    23. Case Else
    24. Debug.WriteLine(invalidTable)
    25. _errorLogger.WriteError(invalidTable)
    26. Return
    27. End Select
    28. If rowIndex >= 0 AndAlso rowIndex < tableToDelete.Rows.Count Then
    29. Dim result As DialogResult = MessageBox.Show("Möchten Sie den Datensatz wirklich löschen?", "Achtung: Löschen bestätigen", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    30. If result = DialogResult.Yes Then
    31. tableToDelete.Rows(rowIndex).Delete()
    32. Me.TableAdapterManager.UpdateAll(Me.DbBudgetDS)
    33. RaiseDeleteResult(True)
    34. Else
    35. RaiseDeleteResult(False)
    36. End If
    37. Else
    38. Debug.WriteLine("Ungültiger rowIndex.")
    39. _errorLogger.WriteError("Ungültiger rowIndex.")
    40. RaiseDeleteResult(False)
    41. End If
    42. Catch ex As Exception
    43. Dim errortext As String = "Fehler beim Löschen des Eintrags: " & ex.Message
    44. _errorLogger.WriteError(errortext)
    45. RaiseDeleteErrorResult(errortext)
    46. End Try
    47. End Sub

    Auf dem Form:

    VB.NET-Quellcode

    1. Public Class frmPayments
    2. Private WithEvents _paymentsManager As New DataManager
    3. Private table As String = "Payments"
    4. Public Sub New()
    5. InitializeComponent()
    6. _paymentsManager.PaymentsBindingSource = Me.PaymentsBindingSource
    7. _paymentsManager.PaymentsTableAdapter = Me.PaymentsTableAdapter
    8. _paymentsManager.TableAdapterManager = Me.TableAdapterManager
    9. _paymentsManager.DbBudgetDS = Me.DbBudgetDS
    10. _paymentsManager.LoadDatas(table)
    11. End Sub
    12. Private Sub DeleteFailed(sender As Object, message As String) Handles _paymentsManager.DeleteErrorResult
    13. MessageBox.Show($"Achtung: Löschen so nicht möglich{Environment.NewLine}{message}", "Achtung!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    14. End Sub
    15. Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
    16. _paymentsManager.CancelAddDatas(table)
    17. End Sub
    18. Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    19. Me.Validate()
    20. _paymentsManager.SaveDatas(table)
    21. End Sub
    22. Private Sub btnDeleteEntry_Click(sender As Object, e As EventArgs) Handles btnDeleteEntry.Click
    23. Me.Validate()
    24. If dgvPayments.SelectedRows.Count > 0 Then
    25. Dim rowIndex As Integer = dgvPayments.SelectedRows(0).Index
    26. _paymentsManager.DeleteEntry(table, rowIndex)
    27. Else
    28. ' Fehlermeldung, wenn keine Zeile ausgewählt ist
    29. Debug.WriteLine("Bitte wählen Sie eine Zeile zum Löschen aus.")
    30. End If
    31. End Sub
    32. End Class

    Bilder
    • löschen.png

      68,31 kB, 847×493, 275 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Was mir beim Design auffällt: Auch beim datengebundenen DGV darfst Du die Beschriftungen der Spalten anpassen und so die HeaderText-Werte vom Englischen ins Deutsche übertragen. Allein um schon zu klären, welche Bedeutung der Boolean-Wert bzw. die CheckBox-Column mit der Bezeichnung Type bedeutet. Die Werte der letzten Spalte sind nämlich mal True/Checked oder False/Unchecked. Aber wofür das dann jeweils steht, blickt keiner außer Dir.
    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

    Das mit dem DGV mache ich noch. Mir gehts erstmal um den Code und das mit den Klassen usw...
    Musste auch erst lange suchen bis ich im DGV die "Namen" der Payments/Category anstelle der Zahlen aus der TransactionsTabelle. :)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @VaporiZed

    Nach dem crash gestern habe ich nun meine Class und die DB-Abfragen etc soweit fertig.

    Bei den ersten Test´s scheint alles so zu funktionieren wie es soll. :)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports MyBudget.dbBudgetDSTableAdapters
    2. Partial Public Class DataManager
    3. ' Handelt die Fehlerprotokolierung
    4. Private _errorLogger As New ErrorLogger
    5. ' Das DataSet und der TableManger
    6. Friend Property DbBudgetDS As New dbBudgetDS()
    7. Friend Property TableAdapterManager As New TableAdapterManager()
    8. ' Die BindingSources und TableAdapter
    9. Friend Property CategoryBindingSource As New BindingSource()
    10. Friend Property CategoryTableAdapter As New CategoryTableAdapter()
    11. Friend Property PaymentsBindingSource As New BindingSource()
    12. Friend Property PaymentsTableAdapter As New PaymentsTableAdapter()
    13. Friend Property TransactionsBindingSource As New BindingSource()
    14. Friend Property TransactionsTableAdapter As New TransactionsTableAdapter()
    15. End Class


    VB.NET-Quellcode

    1. Partial Public Class DataManager
    2. Private _datehelper As New DateHelper
    3. Friend Shared Event LoadDataResult As EventHandler(Of Boolean)
    4. Protected Sub RaiseLoadResult(success As Boolean)
    5. RaiseEvent LoadDataResult(Me, success)
    6. End Sub
    7. Friend Shared Event CountDataResult As EventHandler(Of Integer)
    8. Protected Sub RaiseCountResult(count As Integer)
    9. RaiseEvent CountDataResult(Me, count)
    10. End Sub
    11. Private Function GetRowCount(tableName As String) As Integer
    12. If Me.DbBudgetDS Is Nothing OrElse Not Me.DbBudgetDS.Tables.Contains(tableName) Then
    13. Return 0
    14. End If
    15. Dim table As DataTable = Me.DbBudgetDS.Tables(tableName)
    16. Return table.Rows.Count
    17. End Function
    18. Public Sub LoadDatas(table As String, selcteddate As String)
    19. Dim NoDataMessage As String = $"Keine Daten in {table} gefunden."
    20. Try
    21. Dim count As Integer = 0
    22. Select Case table
    23. Case "Category"
    24. Me.CategoryTableAdapter.Fill(Me.DbBudgetDS.Category)
    25. Case "Payments"
    26. Me.PaymentsTableAdapter.Fill(Me.DbBudgetDS.Payments)
    27. Case "Transactions"
    28. Me.PaymentsTableAdapter.Fill(Me.DbBudgetDS.Payments)
    29. Me.CategoryTableAdapter.Fill(Me.DbBudgetDS.Category)
    30. '----------------------------
    31. ' Transactionen nach Datum aus der DB holen
    32. Dim startDate As Date = Date.ParseExact(selcteddate, "MM.yyyy", CultureInfo.InvariantCulture)
    33. Dim endDate As Date = startDate.AddMonths(1).AddDays(-1)
    34. Debug.WriteLine(startDate & " - " & endDate)
    35. Me.TransactionsTableAdapter.ClearBeforeFill = True
    36. Me.TransactionsTableAdapter.FillByDatum(Me.DbBudgetDS.Transactions, startDate, endDate)
    37. '----------------------------
    38. ' Alle Transactionen aus der DB holen
    39. 'Me.TransactionsTableAdapter.Fill(Me.DbBudgetDS.Transactions)
    40. count = GetRowCount("Transactions")
    41. Case Else
    42. Debug.WriteLine(invalidTable)
    43. _errorLogger.WriteError(invalidTable)
    44. RaiseLoadResult(False)
    45. Return
    46. End Select
    47. Dim success As Boolean = (count > 0)
    48. RaiseLoadResult(success)
    49. If Not success Then
    50. Debug.WriteLine(NoDataMessage)
    51. _errorLogger.WriteError(NoDataMessage)
    52. End If
    53. RaiseCountResult(count)
    54. Catch ex As Exception
    55. Debug.WriteLine(ex.ToString())
    56. _errorLogger.WriteError(LoadDataErrorMessage & ex.Message)
    57. RaiseLoadResult(False)
    58. Return
    59. End Try
    60. End Sub
    61. Friend Shared Event CancelResult As EventHandler(Of Boolean)
    62. Protected Sub RaiseCancelResult(cancel As Boolean)
    63. RaiseEvent CancelResult(Me, cancel)
    64. End Sub
    65. Public Sub CancelAddDatas(table As String)
    66. Try
    67. Select Case table
    68. Case "Category"
    69. Me.CategoryBindingSource.CancelEdit()
    70. RaiseCancelResult(True)
    71. Case "Payments"
    72. Me.PaymentsBindingSource.CancelEdit()
    73. RaiseCancelResult(True)
    74. Case "Transactions"
    75. Me.TransactionsBindingSource.CancelEdit()
    76. RaiseCancelResult(True)
    77. Case Else
    78. Debug.WriteLine(invalidTable)
    79. _errorLogger.WriteError(invalidTable)
    80. RaiseCancelResult(False)
    81. Return
    82. End Select
    83. Catch ex As Exception
    84. Debug.WriteLine(CancelDataMessage & ex.Message)
    85. _errorLogger.WriteError(CancelDataMessage & ex.Message)
    86. RaiseCancelResult(False)
    87. Return
    88. End Try
    89. End Sub
    90. Friend Shared Event SaveResult As EventHandler(Of Boolean)
    91. Protected Sub RaiseSaveResult(success As Boolean)
    92. RaiseEvent SaveResult(Me, success)
    93. End Sub
    94. Friend Shared Event SaveErrorResult As EventHandler(Of Boolean)
    95. Protected Sub RaiseSaveErrorResult(writeerror As Boolean)
    96. RaiseEvent SaveErrorResult(Me, writeerror)
    97. End Sub
    98. Public Sub SaveDatas(table As String)
    99. Try
    100. Select Case table
    101. Case "Category"
    102. Me.CategoryBindingSource.EndEdit()
    103. Case "Payments"
    104. Me.PaymentsBindingSource.EndEdit()
    105. Case "Transactions"
    106. Me.TransactionsBindingSource.EndEdit()
    107. Case Else
    108. Debug.WriteLine(invalidTable)
    109. _errorLogger.WriteError(invalidTable)
    110. RaiseSaveResult(False)
    111. Return
    112. End Select
    113. Me.TableAdapterManager.UpdateAll(Me.DbBudgetDS)
    114. RaiseSaveResult(True)
    115. Debug.WriteLine($"SaveDatas: {table} UpdateAll successful")
    116. Catch ex As Exception
    117. RaiseSaveErrorResult(False)
    118. End Try
    119. End Sub
    120. Friend Shared Event DeleteResult As EventHandler(Of Boolean)
    121. Protected Sub RaiseDeleteResult(success As Boolean)
    122. RaiseEvent DeleteResult(Me, success)
    123. End Sub
    124. Friend Shared Event DeleteErrorResult As EventHandler(Of String)
    125. Protected Sub RaiseDeleteErrorResult(message As String)
    126. RaiseEvent DeleteErrorResult(Me, message)
    127. End Sub
    128. Public Sub DeleteEntry(table As String, rowIndex As Integer)
    129. Try
    130. Dim tableToDelete As DataTable = Nothing
    131. Dim bindingSourceToDelete As BindingSource = Nothing
    132. Select Case table
    133. Case "Category"
    134. tableToDelete = Me.DbBudgetDS.Category
    135. bindingSourceToDelete = Me.CategoryBindingSource
    136. Case "Payments"
    137. tableToDelete = Me.DbBudgetDS.Payments
    138. bindingSourceToDelete = Me.PaymentsBindingSource
    139. Case "Transactions"
    140. tableToDelete = Me.DbBudgetDS.Transactions
    141. bindingSourceToDelete = Me.TransactionsBindingSource
    142. Case Else
    143. Debug.WriteLine(invalidTable)
    144. _errorLogger.WriteError(invalidTable)
    145. Return
    146. End Select
    147. If rowIndex >= 0 AndAlso rowIndex < tableToDelete.Rows.Count Then
    148. Dim result As DialogResult = MessageBox.Show("Möchten Sie diesen Datensatz wirklich löschen?" & Environment.NewLine & "Die Daten sind unwiederbringlich gelöscht!", "Achtung: Löschen bestätigen", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    149. If result = DialogResult.Yes Then
    150. tableToDelete.Rows(rowIndex).Delete()
    151. Me.TableAdapterManager.UpdateAll(Me.DbBudgetDS)
    152. RaiseDeleteResult(True)
    153. Else
    154. RaiseDeleteResult(False)
    155. End If
    156. Else
    157. Debug.WriteLine("Versuch eine ungültige Zeile zu löschen.")
    158. _errorLogger.WriteError("Versuch eine ungültige Zeile zu löschen.")
    159. RaiseDeleteResult(False)
    160. End If
    161. Catch ex As Exception
    162. Dim errortext As String = "Fehler beim Löschen des Eintrags: " & ex.Message
    163. _errorLogger.WriteError(errortext)
    164. RaiseDeleteErrorResult(errortext)
    165. End Try
    166. End Sub
    167. End Class

    Bilder
    • form.png

      54,47 kB, 1.283×548, 266 mal angesehen
    • transaction.png

      26,08 kB, 839×483, 279 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Da ich ebenfalls ein privates Kassenbuch habe, ein paar Anmerkungen: Datumseingabe per DateTimePicker oder MonthCalendar, Betrag per NumericUpDown, ggf. Vorlagen für wiederkehrende Zahlungen. Ich unterscheide noch verschiedene Konten, was aber den Aufwand erhöht.
    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

    Das mit dem DateTimePicker fand ich nicht so toll, habe hier eine "MaskedTextBox" eingesetzt.
    Bei dem Betrag, hatte ich erst versucht, aber habe das mit dem "Numeric" nicht hinbekommen. :(

    Was mir nun noch aufgefallen ist, das ich beim GesamtBetrag evtl nur immer das gewählte "Jahr" anzeigen lasse. Muss mal sehen wie ich die SQL Abfrage baue.

    Wie hast du das mit dem "Vorlagen" gemacht :?:
    Auch eine Combobox oder ???

    Was sagst du zu meiner Class :?:
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    aber habe das mit dem "Numeric" nicht hinbekommen.
    Ein guter Grund, es hier zu besprechen. Problemaufschub führt zu Frust. Was klappt denn nicht?

    Deine Klasse: Category und Payments - Singular und Plural. Es sollte nur eines sein, also entweder Category und Payment oder Categories und Payments. Aber welches, das ist abhängig davon, wen Du fragst. Der eine sagt so, der andere so. Beispiel: EdR ist für Singularbenennung, ich für Pluralbenennung. Entscheide Dich für eines.
    Mwst_Vat: Wenn der Rest englisch ist, dann mach TaxRate draus.
    UserID: Ist das Kassenbuch für mehrere?

    Bzgl. Vorlagen: Ich selektiere eine Transaktion und kann mit dieser per Knopfdruck eine Vorlage erstellen. Es werden dann fixe Daten gespeichert. Mein Kassenbuch ist anders aufgebaut, daher speichere ich andere/zusätzliche Daten: betroffenes Konto (da ich auch Bartransaktionen speichere), Ort, Verrechnungsstelle, Position, Betrag. Die Vorlagennamen lasse ich in einer ListBox anzeigen und dann kann ich auf Knopfdruck bei Bedarf aus einer Vorlage wieder eine zusätzliche Transaktion machen. Geht natürlich auch mit ner ComboBox statt ner ListBox.
    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

    Das mit der UserID habe ich gemacht, weil ich das ganze mit einem "login" versehen habe, ansonsten ist das nur für eine Person gedacht!

    Bzgl "NumericUp.." habe das nicht vernünftig "formatiert" bekommen. Hatte auch da schon versucht mit einem MaskTexbox zu arbeiten- ;(

    Wenn ich das so lese, scheint dein "Kassenbuch" viel umfangreicher zu sein. Das was ich hier nun habe reicht für die Zwecke aber ich werde wenn ich das ganz fertig habe, mal mit Vorlagen experimentieren..sofern das mit meinem Code möglich ist.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich versteh grad immer noch nicht konkret das NumericUpDown-Problem. Es ist von Haus aus mit 2 Nachkommastellen eingestellt (was ja genau richtig ist) und man kann Minimal und Maximalwert einstellen. Und zur Laufzeit nur gültige Zahlen vorgegebenen Bereich mit angegebener Genauigkeit eingeben. So what?
    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.