Immer erste Zeile einer Tabelle löschen wenn auf Löschen geklickt wird

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Diablo.

    Immer erste Zeile einer Tabelle löschen wenn auf Löschen geklickt wird

    Hallo,

    ich habe eine *.sdf Datenbank und möchte, wenn 20 Einträge vorhanden sind, dass die erste Zeile gelöscht wird.

    Oder auch: Auf Löschen klicken und die erste Zeile gelöscht wird. Nur wie finde ich herraus welche ID nun die letzte Zeile ist? (ID Nummern sind vorhanden)
    Vielleicht mal etwas spezifizieren.

    Du willst Grundsätzlich die erste Zeile löschen? Anhand welches Kriteriums. Niedrigste ID, zuletzt Hinzugefügt, Alphabetisch sortiert?
    Wieso brauchst du die ID der letzten Zeile wenn du die erste löschen willst? Aber letzte Zeile wird wohl oder übel die Höchste ID sein, in so fern diese mit autoincrement hinzugefügt wurde.

    Brauchst du nun Hilfe beim Code oder wie man auf die Datenbank zugreift?
    Also die erste Zeile damit meine ich die niedrigste ID. D.h. wenn ich also folgende Datenbank habe:

    ID------Betrag-----Verwendung
    1--------5€-----------Essen
    2-------10€-----------Blubb
    3--------3€-----------Blubb
    4-------30€-----------T-Shirt
    5-------40€-----------Hemd

    Und wenn jetzt z.b. eine 6 Zeiledazu kommt:

    6-------30€-----------Essen

    Dann soll die erste Zeile gelöscht werden (1--------5€-----------Essen)

    Nun benötige ich hilfe, wie ich das realisiere.
    Also wie finde ich herraus das die niedrigste ID die erste ist und diese gelöscht werden soll?

    Per TextBox-Eingabe wäre das ja z.b. so:

    Man gibt die ID der Zeile an (meinetwegen die 3) und die 3. Zeile wird gelöscht.


    VB.NET-Quellcode

    1. Private Sub cmdLöschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLöschen.Click
    2. '# Löschbutton-Prozedur
    3. Dim Cb As New SqlCeCommandBuilder(DaBelege)
    4. Dim Cmd As SqlCeCommand = Cn.CreateCommand
    5. ' Dim ds As New DataSet
    6. Try
    7. 'MessageBox.Show("number of Row(s) - " & ds.Tables(1).Rows.Count)
    8. Cmd.CommandText = "Delete From Belege Where BelegNr = " & TextBox1.Text
    9. DaBelege = New SqlCeDataAdapter(Cmd)
    10. Dim Anzahl As Integer = DaBelege.Update(TaBelege)
    11. DaBelege.Fill(TaBelege)
    12. DataGridView1.DataSource = TaBelege
    13. MessageBox.Show(Anzahl & " Datensatz / Datensätze wurde(n) gelöscht.", My.Application.Info.Title)
    14. Catch ex As Exception
    15. MessageBox.Show(ex.Message)
    16. End Try
    17. End Sub
    Ok gut.

    An sich würd ich das so machen. Du frägst die Datenbank ab und lässt die die ID(Belegnummern) ausgeben.
    Entweder du speicherst alls in ein array oder du überprüfst mit einer Schleife direkt welches die niedrigste ID ist.

    Beispiel

    VB.NET-Quellcode

    1. for each ID as int in array
    2. if ID < check_id then
    3. check_id = ID
    4. end if
    5. next


    dann kannst du mit deinem Programm oben einfach die check_id einfügen, statt diese aus der Textbox zu nehmen.

    Vielleicht gibtz auch ne Funktion um direkt den niedrigsten Wert einer Abfrage zu ermitteln Da musst du die Profis fragen :)

    Achja die niedrigste ID ist in dem Fall immer der erste eintrag, da ja für jeden neuen Eintrag eine höhere ID angelegt wird.
    Wenn also die Zeile mit ID 1 gelöscht wird und eine neue hinzukommt, wird die neue mit einer noch nie da gewesenen höheren ID angelegt. In so fern du auto increment für den Primärschlüssel angegeben hast, was ich dir sehr empfehle :).

    Edit: ne ganz einfach möglichkeit wäre auch.
    Du legst eine Variable an, welche bei jeder löschaktion um 1 erhöht wird. Diese repräsentiert die aktuell niedrigste ID in der Tabelle.
    Jedes mal wenn du löschen klickst entfernt sie die aktuell "älteste" Zeile. Ist aber dirty und kann ins Auge gehen falls du mal eine falsch eingetragene Zeile zwischendurch löschst.

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

    Also einen Tabellenschlüssel ist gesetzt und die IDs gehen beim anlegen einer Tabelle auch automatisch hoch.

    Nur deinen Code vertehe ich noch nicht so ganz :rolleyes: Denn: VB markiert mit "int" und "Array". Heißt int -> integer? Außerm kommt: "Array" ist ein Typ und kann nicht als Ausdruck verwendet werden. Bin bisschen überfordert mit der Aufgabe, weil ich ja noch nicht mal so ganz weiß was ein "Typ" ist.

    Ok habe es jetzt mit Hilfe so gelöst:

    VB.NET-Quellcode

    1. Private Sub cmdLöschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLöschen.Click
    2. '# Löschbutton-Prozedur
    3. Dim Cb As New SqlCeCommandBuilder(DaBelege)
    4. Dim Cmd As SqlCeCommand = Cn.CreateCommand
    5. Dim ds As New DataSet
    6. Try
    7. Dim lID As Integer
    8. Dim l_checkID As Integer
    9. For I As Integer = DataGridView1.RowCount - 1 To 0 Step -1
    10. lID = DataGridView1.Rows.Item(I).Cells(0).Value
    11. If lID < l_checkID Then
    12. l_checkID = lID
    13. End If
    14. Next
    15. Cmd.CommandText = "Delete From Belege Where BelegNr = " & lID 'TextBox1.Text
    16. DaBelege = New SqlCeDataAdapter(Cmd)
    17. 'TaBelege = New DataTable("Belege")
    18. Dim Anzahl As Integer = DaBelege.Update(TaBelege)
    19. DaBelege.Fill(TaBelege)
    20. DataGridView1.DataSource = TaBelege
    21. MessageBox.Show(Anzahl & " Datensatz / Datensätze wurde(n) gelöscht.", My.Application.Info.Title)
    22. Catch ex As Exception
    23. MessageBox.Show(ex.Message)
    24. End Try
    25. End Sub



    Allerdings wird ja ein "Update" der Tabelle erst nach Neustart des Programms angezeigt, wie kann ich dem entgegenwirken, sodass GLEICH ein Update ausgeführt wird?

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

    Äh ja sorry meinte Integer...sorry da kam es Java durch :whistling: . Dem array musst du natürlich einen Namen verpassen und beim Schleifenkopf den array_namen verwenden.

    VB.NET-Quellcode

    1. Dim array_name as new Arraylist


    Allerdings wird ja ein "Update" der Tabelle erst nach Neustart des Programms angezeigt, wie kann ich dem entgegenwirken, sodass GLEICH ein Update ausgeführt wird?


    Na in dem du die Tabelle neu lädst, mit den Daten des Servers. Pack doch die Programmzeilen, die deine Tabelle beim Start füllt in ein eigenes Sub.

    VB.NET-Quellcode

    1. Privat Sub daten_laden()
    2. 'Dein Code um die Tabelle zu laden
    3. End Sub


    Das rufst du dann bei Programmstart einmal auf...und nach dem du ein Datensatz gelöscht hast bzw hinzugefügt hast.

    VB.NET-Quellcode

    1. Private Sub cmdLöschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLöschen.Click
    2. ' Dein Code
    3. End Try
    4. daten_laden()
    5. End Sub
    So, habe es soweit hin bekommen, dass eine Zeile (sofern min. 10 vorhanden sind) gelöscht wird. Und zwar sollte die Zeile mit der niedrigsten ID gelöscht werden.
    Sofern die Datenbank auch keine neuen Zeilen hinzu bekommt, klappt das auch, aber wenn ich neue hinzufüge gehts nicht mehr, dann nimmt er die neueste Zeile. Er schreibt sie auch nicht unter die anderen (vorhandenen), sondern ÜBER die alten (also an erster Stelle)...

    Code:

    VB.NET-Quellcode

    1. Imports System.Data.SqlServerCe
    2. Public Class BelegeDBSQL
    3. 'Private DBPfad As String = "BelegeDBSQL.mdf"
    4. Private CnSt As String = "Data Source=BelegeDBSQL.sdf" ' = "Data Source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=BelegeDBSQL; User Instance=true"
    5. Private DaKonten As SqlCeDataAdapter
    6. Private DaBelege As SqlCeDataAdapter
    7. Private TaKonten As DataTable
    8. Private TaBelege As DataTable
    9. Private Cn As SqlCeConnection
    10. Dim SelectedRows As String
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. '# Bei Start des Programms wird die Tabelle eingelesen
    13. DB_Load()
    14. End Sub
    15. Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    16. '# Beim Start wird die Datenbank aus der ComboBox aktualisiert und im DataGridView angezeigt
    17. DB_Reload()
    18. End Sub
    19. Private Sub DB_Load()
    20. '# Die Datenbank wird ausgelesen und die einzelnen Felder der Tabelle Konten in der ComboBox ausgegeben
    21. Try
    22. Cn = New SqlCeConnection(CnSt)
    23. Dim Cmd As SqlCeCommand = Cn.CreateCommand
    24. Cmd.CommandText = "Select * From Konten"
    25. DaKonten = New SqlCeDataAdapter(Cmd)
    26. TaKonten = New DataTable("Konten")
    27. DaKonten.Fill(TaKonten)
    28. ComboBox1.DisplayMember = "KontoName"
    29. ComboBox1.ValueMember = "KontoNr"
    30. ComboBox1.DataSource = TaKonten
    31. ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
    32. Catch ex As Exception
    33. MessageBox.Show(ex.Message)
    34. End Try
    35. End Sub
    36. Private Sub DB_Reload()
    37. '# Die Datenbank wird ausgelesen und die selektierte Tabelle im DataGridView angezeigt
    38. Dim Cmd As SqlCeCommand = Cn.CreateCommand
    39. Cmd.CommandText = "Select * From Belege Where Belege.KontoNr=@KontoNr"
    40. ' Cmd.CommandText = "Select Betrag, Datum, KontoName, Beschreibung, BelegNr From " &
    41. ' "Belege Inner Join Konten On Belege.KontoNr = Konten.KontoNr Where Belege.KontoNr=@KontoNr"
    42. Cmd.Parameters.AddWithValue("KontoNr", ComboBox1.SelectedValue)
    43. DaBelege = New SqlCeDataAdapter(Cmd)
    44. TaBelege = New DataTable("Belege")
    45. DaBelege.Fill(TaBelege)
    46. DataGridView1.DataSource = TaBelege
    47. End Sub
    48. Private Sub DB_Delete()
    49. '# Lösch-Prozedur
    50. Dim Cb As New SqlCeCommandBuilder(DaBelege)
    51. Dim Cmd As SqlCeCommand = Cn.CreateCommand
    52. '# Von der größten Zahl bis zur niedrigsten (max. 0) zählt er die Tabelle herrunter und löscht dann die niedrigste
    53. Try
    54. Dim lID As Integer
    55. Dim l_checkID As Integer
    56. For I As Integer = DataGridView1.RowCount - 1 To 0 Step -1
    57. lID = DataGridView1.Rows.Item(I).Cells(0).Value
    58. If lID < l_checkID Then
    59. l_checkID = lID
    60. End If
    61. Next
    62. '# Hier löscht er die zuvor "herrausgefundene" niedrigste Zeile
    63. Cmd.CommandText = "Delete From Belege Where BelegNr = " & lID 'TextBox1.Text
    64. DaBelege = New SqlCeDataAdapter(Cmd)
    65. 'TaBelege = New DataTable("Belege")
    66. Dim Anzahl As Integer = DaBelege.Update(TaBelege)
    67. DaBelege.Fill(TaBelege)
    68. DataGridView1.DataSource = TaBelege
    69. MessageBox.Show(Anzahl & " Datensatz / Datensätze wurde(n) gelöscht.", My.Application.Info.Title)
    70. Catch ex As Exception
    71. MessageBox.Show(ex.Message)
    72. End Try
    73. '# Datenbankupdate, damit der Löschvorgang direkt angezeigt wird.
    74. DB_Reload()
    75. End Sub
    76. Private Sub cmdSchreiben_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAktualisieren.Click
    77. '# Hier schreibt er die Tabelle neu bzw. aktualisiert sie
    78. Try
    79. Dim Cb As New SqlCeCommandBuilder(DaBelege)
    80. Dim Anzahl As Integer = DaBelege.Update(TaBelege)
    81. MessageBox.Show(Anzahl & " Datensatz / Datensätze wurde(n) aktualisiert.", My.Application.Info.Title)
    82. Catch ex As Exception
    83. MessageBox.Show(ex.Message)
    84. End Try
    85. ' If DataGridView1.RowCount > 10 Then
    86. 'DB_Delete()
    87. 'End If
    88. DB_Reload()
    89. End Sub
    90. Private Sub cmdLöschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLöschen.Click
    91. '# Löschbutton-Prozedur
    92. Dim Cb As New SqlCeCommandBuilder(DaBelege)
    93. Dim Cmd As SqlCeCommand = Cn.CreateCommand
    94. Try
    95. Dim lID As Integer
    96. Dim l_checkID As Integer
    97. For I As Integer = DataGridView1.RowCount - 1 To 0 Step -1
    98. lID = DataGridView1.Rows.Item(I).Cells(0).Value
    99. If lID < l_checkID Then
    100. l_checkID = lID
    101. End If
    102. Next
    103. Cmd.CommandText = "Delete From Belege Where BelegNr = " & lID 'TextBox1.Text
    104. DaBelege = New SqlCeDataAdapter(Cmd)
    105. 'TaBelege = New DataTable("Belege")
    106. Dim Anzahl As Integer = DaBelege.Update(TaBelege)
    107. DaBelege.Fill(TaBelege)
    108. DataGridView1.DataSource = TaBelege
    109. MessageBox.Show(Anzahl & " Datensatz / Datensätze wurde(n) gelöscht.", My.Application.Info.Title)
    110. Catch ex As Exception
    111. MessageBox.Show(ex.Message)
    112. End Try
    113. '# Datenbankupdate, damit der Löschvorgang direkt angezeigt wird.
    114. DB_Reload()
    115. End Sub
    116. Private Sub DataGridView1_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles DataGridView1.UserDeletingRow
    117. '# Abfrgae ob die Zeile gelöscht werden soll (mit ENTF)
    118. If (Not e.Row.IsNewRow) Then
    119. Dim response As DialogResult = MessageBox.Show("Möchten Sie wirkliche diese Zeile löschen?", "Zeile löschen?", _
    120. MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
    121. If (response = DialogResult.No) Then
    122. e.Cancel = True
    123. End If
    124. End If
    125. End Sub
    126. Private Sub cmdÖffnen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdÖffnen.Click
    127. '# Zeigt den Öffnen-Dialog
    128. OpenFileDialog1.Filter = "sdf(*.sdf)| *.sdf"
    129. OpenFileDialog1.ShowDialog()
    130. Dim sFilePath As String = OpenFileDialog1.FileName
    131. Try
    132. Cn = New SqlCeConnection(CnSt)
    133. Dim Cmd As SqlCeCommand = Cn.CreateCommand
    134. Cmd.CommandText = "Select * From Konten"
    135. DaKonten = New SqlCeDataAdapter(Cmd)
    136. TaKonten = New DataTable("Konten")
    137. DaKonten.Fill(TaKonten)
    138. ComboBox1.DisplayMember = "KontoName"
    139. ComboBox1.ValueMember = "KontoNr"
    140. ComboBox1.DataSource = TaKonten
    141. ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
    142. Catch ex As Exception
    143. MessageBox.Show(ex.Message)
    144. End Try
    145. End Sub
    146. End Class