Aus einer Datei lesen, mit Mid-Left-Funktion, Schulaufgabe

  • VB6

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Arby.

    Aus einer Datei lesen, mit Mid-Left-Funktion, Schulaufgabe

    Hallo.
    Ich bin momentan an einem einfachen Programm dran, das Werte aus einer txt-Datei lesen und verarbeiten soll.
    Das ist die Aufgabe:

    'Die einzelnen Geschäftsabschlüsse verschiedener Vertreter
    'sind in einer Datei gespeichert.
    'Am Monatsende soll für jeden Vertreter (immer 6) der
    'Gesamtumsatz berechnet und ausgegeben werden.
    'Ebenso wird für diesen Monat der Umsatz aller
    'Vertreter und der Durchschnittsumsatz berechnet.
    'Sie können davon ausgehen, dass die Umsätze eines
    'Vertreters alle zusammenhängend abgespeichert sind.
    'Die Datei ist nach der Vertreternummer (immer einstellig)
    'sortiert.

    'Die Datei (V-Umsatz-05.dat) hat folgende Struktur:
    ' 1,Umsatz
    ' 1,Umsatz
    ' :
    ' 2,Umsatz
    ' :
    ' 6,Umsatz

    'Variablenliste (Auszug):
    ' Du Durchschnittsumsatz (aller Vertreter)
    ' Gu Gesamtumsatz (aller Vertreter)
    ' Vu Gesamtumsatz (eines Vertreters)
    '
    ' Vnr_alt Vertreternummer alt
    ' Vnr aktuelle Vertreternummer
    ' Umsatz aktueller Umsatz

    Nun folgt die Datei, aus der gelesen werden soll:

    1,22346
    1,2346
    2,17346
    2,1244
    2,12376
    2,1832
    3,12726
    4,12536
    4,3234
    4,14386
    4,11316
    5,1274
    5,32326
    6,12546
    6,1535
    6,1434

    Dass die Werte mit der Left-Funktion für die Vertreternummer, und die Mid-Funktion für den Vertreterwert gebraucht wird ist mir klar. Nur weiß ich nicht wie ich diese verwenden soll.
    Hilfe wäre sehr nett.
    Mfg, Fr4sKo
    Dateien
    • Vertreter0.frm

      (15,43 kB, 109 mal heruntergeladen, zuletzt: )
    wie sieht es mit einer Gegenleistung aus :) klingt er nach einem Auftrag.
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Wenn dies ein "Auftrag" wäre, hätte ich es auch so umschrieben.
    Ich komme halt nicht wirklich weiter. Ich weiß, dass ich eine Schleife benutzen muss, am Besten die Do-Loop-Until, da ja nur eine bedingung gegeben ist, oder halt eine For-Next.
    Ich bin mir jedoch nicht sicher, wie ich dies umsetzen soll.
    Bis jetzt bin ich so weit:


    Visual Basic-Quellcode

    1. Private datnr As Integer
    2. Private Dateiname As String
    3. Private zeile As String
    4. Private VU As Single
    5. Private Gu As Single
    6. Private Du As Single
    7. Private Vnr_alt As Single
    8. Private Vnr As Single
    9. Private Umsatz(1 To 6, 1 To 16) As Integer
    10. Private P1 As Single
    11. Private P2 As Single
    12. Private l As Integer
    13. Private i As Integer
    14. Private n As Integer
    15. Private x As Integer
    16. Private Sub cmdAuswerten_Click()
    17. datnr = FreeFile
    18. Dateiname = txtDatname.Text
    19. On Error GoTo Fehler
    20. Open Dateiname For Input As datnr
    21. Do While Not EOF(datnr)
    22. Line Input #datnr, zeile
    23. 'Left-Funktion
    24. 'Text = Sommerurlaubreise
    25. 'Text(1) = Left(Text, 6) => Sommer
    26. 'Text(2) = Left(Text, 12) => Sommerurlaub
    27. 'Mid-Funktion
    28. 'strText = Willkommen hier auf der Homepage
    29. 'strWort = Mid(strText, 12) => hier auf der Homepage
    30. 'strWort = Mid(strText, 1, 10) => Willkommen
    31. 'strWort = Mid(strText, 50, 1) => " "
    32. 'strText = Ich und du
    33. 'Mid(strText, 1, 3) = "Wir" => Wir und Du
    34. 'Mid(strText, 9, 2) = "Er" => Ich und er
    35. For i = 1 To 6
    36. For n = 1 To 16
    37. Text(n) = zeile(n)
    38. P1(i) = Left(Text(n), 1)
    39. If VU(i) = P1(i) Then
    40. strText = zeile(n)
    41. Umsatz(i, n) = Mid(strText, 3)
    42. End If
    43. Next n
    44. Next i
    45. Close datnr
    46. For x = 1 To 6
    47. VU(x) = Umsatz(x, 1) + Umsatz(x, 2) + Umsatz(x, 3) + Umsatz(x, 4) + Umsatz(x, 5) + Umsatz(x, 6)
    48. Next x
    49. For l = 1 To 6
    50. lblVU(l) = VU(l)
    51. Next l
    52. Fehler:
    53. MsgBox ("Datei nicht gefunden, JUNGE.")
    54. txtDatname.Text = " "
    55. txtDatname.SetFocus
    56. End Sub



    Edit by LaMa5:
    - VB-Tag eingefügt, das nächste Mal bitte selbst dran denken (siehe VB-Paradise Guide)

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

    Hallo Fr4sKo,
    der Ansatz ist schon mal richtig. Du brauchst aber keine Arrays
    und keine For-Next-Schleifen. Den Umsatz und die anderen Variablen
    für Geldbeträge solltest du nicht als Integer anlegen, sondern besser
    als Double. Ändere den Code mal so:

    Visual Basic-Quellcode

    1. Vnr_alt = -1
    2. GU = 0
    3. DatNr = FreeFile
    4. Open Dateiname For Input As #DatNr
    5. Do While Not EOF(DatNr)
    6. Line Input #DatNr, Zeile
    7. Vnr = Val(Left$(Zeile, 1)) ' Aktueller Vertreter
    8. Umsatz = Val(Mid$(Zeile, 3)) ' aktueller Umsatz
    9. If Vnr <> Vnr_alt Then
    10. GU = GU + VU
    11. VU = 0
    12. Vnr_alt = Vnr
    13. End If
    14. VU = VU + Umsatz
    15. Loop
    16. Close #DatNr
    17. GU = GU + VU
    18. Du = GU / 6
    19. Exit Sub
    Gruss,

    Neptun

    Neptun schrieb:

    Den Umsatz und die anderen Variablen
    für Geldbeträge solltest du nicht als Integer anlegen, sondern besser
    als Double.

    Warum eigentlich?
    Die Werte, um die es geht, sind - wenn man dem Beispiel glauben darf - allesamt ganzzahlig. Zudem haben Fließkommawerte einen kleinen Nachteil gegenüber Integerwerten: Sie sind ungenau. Das mag für das vorliegende Beispiel nicht so dramatisch sein (zumal hier eh nur Ganzzahlen addiert werden) und im .NET Framework mag es durchaus sein, dass die Ungenauigkeit gegenüber den 32-Bit-Anwendungen, die man unter VS6/VB6 erstellt hatte, minimiert wurde, aber es gibt einfach ganz bestimmte Punkte im Wertebereich, die sich in Fließkommadarstellung nicht exakt wiedergeben lassen und dann zu Abweichungen bzw. Rundungsfehlern führen können.

    Das merkt man z.B. immer dann, wenn das Produkt zweier Fließkommawerte genau 1 ergeben müsste, aber sowas wie 1,000000000001 herauskommt.

    Im Finanzbereich würde ich daher sofern möglich immer nur mit Ganzzahlen oder dem Decimal-Typ rechnen.

    Wenn grundsätzlich nur Cent-Beträge (also max. 2 Nachkommastellen) vorkommen können, speichere ich solche Daten grundsätzlich in Cent ab, d.h. Euro-Beträge werden mit 100 multipliziert. Wenn Bruchteile vorkommen können (das passiert recht schnell, z.B. wenn man die Umsatzsteuer oder Rabatte berücksichtigen muss) geht man bis zu 5 Stellen hinters Komma. Und rechnet weiterhin mit Ganzzahlen. Oder eben Decimals.

    Nicht umsonst wird bei vielen Datenbanken, wenn ein Feldtyp "Money" unterstützt wird, intern der Datentyp Decimal (und nicht Float) dafür verwendet.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.