Fortlaufende Nummerierung

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Fortlaufende Nummerierung

    Moin,
    bin ein newbi und komme nicht mehr weiter.
    Ich schreibe gerade ein Prog. (VB-Konsolenanwendung) für eine CD sammlung.
    Möchte gerne das die Nummerierung der CDs automatisch erfolgt, heiß es soll die Datei öffnen die letzte Nummer heraussuchen und um eins inc.

    Die Nr Vergabe soll in Lin 23 erfolgen


    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Console, System.IO
    3. Module Module1
    4. 'Die Dateinamen als Konstanten festlegen:
    5. Const CDsFile As String = "CDs.data"
    6. Const Interpreten As String = "Interpreten.dat"
    7. Structure TCD
    8. Dim Interpret_ID As Integer
    9. Dim Titel As String
    10. Dim Track_Anzahl As Integer
    11. End Structure
    12. Structure TInterpreten
    13. Dim Interpret_ID As Integer
    14. Dim Name As String
    15. End Structure
    16. 'Funktion zur Automatischen vergabe von Interpreten_ID.
    17. Function InterpretIDVergeben() As List(Of TCD)
    18. Dim fs As New IO.FileStream(CDsFile, IO.FileMode.OpenOrCreate)
    19. Dim CDsDatei As New IO.BinaryReader(fs)
    20. Dim StrucTemp As New TCD
    21. Dim ListTemp As New List(Of TCD)
    22. ListTemp.Clear()
    23. While CDsDatei.PeekChar > -1
    24. StrucTemp.Interpret_ID = CDsDatei.Read
    25. WriteLine(StrucTemp.Interpret_ID)
    26. ListTemp.Add(StrucTemp)
    27. End While
    28. CDsDatei.Close()
    29. fs.Close()
    30. fs.Dispose()
    31. 'Return (InterpretID)
    32. End Function
    33. 'Procedure zum Schreiben der CDListe in die Datei
    34. Sub CDListeToFile(ByVal CDListe As List(Of TCD))
    35. Dim fs As New IO.FileStream(CDsFile, IO.FileMode.OpenOrCreate)
    36. Dim CDsDatei As New IO.BinaryWriter(fs)
    37. Dim I As Integer
    38. For I = 0 To CDListe.Count - 1
    39. Try
    40. fs.Seek(0, SeekOrigin.End)
    41. CDsDatei.Write(CDListe(I).Interpret_ID)
    42. CDsDatei.Write(CDListe(I).Titel)
    43. CDsDatei.Write(CDListe(I).Track_Anzahl)
    44. Catch ex As Exception
    45. WriteLine("Fehler: " & ex.Message)
    46. CDsDatei.Close()
    47. End Try
    48. Next
    49. CDsDatei.Close()
    50. fs.Close()
    51. fs.Dispose()
    52. End Sub
    53. 'Procedure, weelche die Datei CDs ausliest und in der Konsole ausgibt
    54. Sub CDsAuslesen()
    55. Dim fs As New IO.FileStream(CDsFile, IO.FileMode.Open)
    56. Dim CDsDatei As New IO.BinaryReader(fs)
    57. Dim TestListe As TCD
    58. While CDsDatei.PeekChar <> -1
    59. TestListe.Interpret_ID = CDsDatei.ReadInt32()
    60. WriteLine(TestListe.Interpret_ID)
    61. TestListe.Titel = CDsDatei.ReadString()
    62. WriteLine(TestListe.Titel)
    63. TestListe.Track_Anzahl = CDsDatei.ReadInt32()
    64. WriteLine(TestListe.Track_Anzahl)
    65. WriteLine()
    66. End While
    67. CDsDatei.Close()
    68. fs.Close()
    69. fs.Dispose()
    70. End Sub
    71. Sub Main()
    72. Dim CDsListe As New List(Of TCD)
    73. Dim StrucCD As TCD
    74. Dim Interpret_ID As Integer
    75. Dim Entscheidung As String
    76. Dim templist As List(Of TCD)
    77. 'Interpret_ID = 0
    78. 'Hier werden die CD Daten eingelesen
    79. Do
    80. templist = InterpretIDVergeben()
    81. WriteLine()
    82. Write("Titel eingeben: ")
    83. StrucCD.Titel = ReadLine()
    84. WriteLine()
    85. Write("Track-Anzahl eingeben: ")
    86. StrucCD.Track_Anzahl = CInt(ReadLine())
    87. WriteLine()
    88. Write("Noch eine CD zur Liste hinzufügen (J/N)? ")
    89. Entscheidung = (ReadLine())
    90. CDsListe.Add(StrucCD)
    91. Loop Until (Entscheidung Like ("N") Or Entscheidung Like ("n"))
    92. CDListeToFile(CDsListe)
    93. CDsAuslesen()
    94. ReadLine()
    95. End Sub
    96. End Module
    Function InterpretIDVergeben() As List(Of TCD)

    Diese Methode soll die aktuelle InterpretID (also die alte + 1) zurückgeben, richtig (Zeile 23)? Dann müsste sie so heißen:

    Function InterpretIDVergeben() As integer

    und zurück gibst du

    return (ListTemp.count+1)

    Das sollte dann funktionieren - sofern das dein einziges Problem war. Für einen newbi aber schon eine beachtliche Leistung! Allerdings wenig OOP programmiert - wenn es nicht mehr werden soll reicht das, aber mit einem Klassendesign (Klasse ungleich Structure) hättest du vieeeeeel mehr Möglichkeiten!

    Edit: Habe mal wieder selbst gefailt. Die List(of TCD) brauchst du sicher für weiteren Programmcode. Also alles so lassen wie es ist und einfach

    VB.NET-Quellcode

    1. dim liste = InterpretIDVergeben()
    2. dim neueID = liste.count + 1


    benutzen. Würde dann in Zeile 101 gehören

    lg
    Oder Du nutzt einfach ein DataSet. Damit schlägst Du fast alle Deine Probleme auf einmal. So eine Aufgabenstellung wie Deine schreit nach DataSet und DataBinding.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @ all, Danke für die Tipps.
    Mir ist bewusst das dass Prog mit OOP "mächtiger" und anschaulicher ist, aber so ist nun mal die Aufgabe.

    Ein paar Fehler habe ich noch.

    VB.NET-Quellcode

    1. Return(ListTemp.Count+1)

    kommt der Fehler
    Der Wert vom Typ "Integer" kann nicht in "System.Collections.Generic.List(Of ConsoleApplication1.Module1.TCD)" konvertiert

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

    Die Funktion soll die Nummer_ID, beim Anlegen einer neuen CD automatisch vergeben.
    Heißt die CDs.data soll durchlaufen werden und die letzte Nummer vom Interpret_ID herausgesucht werden und die dann um eins erhöhen.

    Bsp.
    Anlegen einer neuen CD.
    Interpret_ID wird automatisch beim Start vergeben.
    Titel und Track Anzahl wird eingegeben.

    Wobei, berechnet nicht Count die Anzahl?
    Du liest die Datei aus und erhälst eine Liste (=> List(of TCD) ).

    mit liste.count fragst du ab, wieviele Einträge die Liste hat (=> Anzahl der TCD's).
    Willst du die zuletzt gelesene TCD haben, dann schreibe folgendes:

    dim letzteTCD as TCD = liste.last

    nun willst du eine neue (um eins erhöhte ID erzeugen), also schreibst du:

    dim neueID as integer = letzteTCD.Interpret_ID + 1

    Allerdings wird sich das nicht sofort in dein Programm einbringen lassen, z.B. macht es keinen Sinn wie in Zeile 100 immer wieder die Datei auszulesen während vermutlich schon wieder 20 neue CDs der anderen Liste hinzugefügt wurden. Eine ID wäre so nicht sehr aussagekräftig, da sie immer durch veraltete Informationen erzeugt wird.
    Achso: OOP-Programmieren und Konsolenprogramm stehen nicht auf dem Kriegsfuß. Erstell dir ein anständiges Klassendesign (Klassen, nicht Structures - es sei denn, du weißt genau was du tust) und steuer dieses mit dem Konsolenprogramm an.
    Von DataSets habe ich keine Ahnung aber wenn ich sowas machen müsste wäre es wohl die Wahl Nr. 1 xD