variable Datei auslesen

Da Hacker

Erfahrenes Mitglied
Hallo!

Ich hätte da mal wieder ein Problem für euch :-) ;) :
Also sicher habt ihr schon beim Lesen des Threadtitels gedacht "Ouhhh! So ein Anfänger" oder so. Aber es ist nicht das Problem eine Datei zu schreiben oder auszulesen, sondern eine Datei auszulesen, die sich während einer Zeitperiode geändert hat.
Einfaches, praktisches Beispiel.
Ich habe den Auftrag ein Kundenerfassungssystem mit VB zu programmieren. Ich habe angefangen und schon das Anlegen einer neuen Datenbankdatei bei einem Fehler programmiert. Und eben auch das EINFACHE Auslesen.
Ich gebe euch hier meinen Code für das Schreiben der Datei:
Code:
Datensatz(1, 1) = TxtName.Text
Datensatz(1, 2) = TxtVorname.Text
Datensatz(1, 3) = TxtFirma.Text
Datensatz(1, 4) = TxtStrasse.Text
Datensatz(1, 5) = TxtPLZ.Text
Datensatz(1, 6) = TxtWohnort.Text
Datensatz(1, 7) = TxtTelefonPrivat.Text
Datensatz(1, 8) = TxtTelefonGeschaeftlich.Text
Datensatz(1, 9) = TxtMobil.Text
Datensatz(1, 10) = TxtEmail.Text
Datensatz(1, 11) = TxtInternet.Text
Datensatz(1, 12) = TxtKommentar.Text
Kundennummer = TxtKundennummer.Text
KanalNeuSpeichern = FreeFile
LblStatus.Caption = "Status: Neue Datei wird erstellt..."
Open PfadNeuSpeichern For Append As KanalNeuSpeichern
LblStatus.Caption = "Status: Daten werden geschrieben..."
Write #KanalNeuSpeichern, "[Neuer Kunde:]" & vbNewLine, Datensatz(1, 1), Datensatz(1, 2), Datensatz(1, 3), Datensatz(1, 4), Datensatz(1, 5), Datensatz(1, 6), Datensatz(1, 7), Datensatz(1, 8), Datensatz(1, 9), Datensatz(1, 10), Datensatz(1, 11), Datensatz(1, 12) & vbNewLine
LblStatus.Caption = "Status: Daten geschrieben!"
Close KanalNeuSpeichern
Wie ihr bereits seht, habe ich Arrays für die Datensätze benutzt.
Aber nun schnell weiter, denn ich überprüfe die geschriebenen Dateien immer und daran liegt wirklich nicht das Problem.
Hier der Code für das Lesen der Datei:
Code:
Dim i As Integer
Dim j As Integer
i = 0
j = 0
Open PfadLaden For Input As KanalLaden
'Schleife(Achtung!) für das Lesen der Daten:
Do While EOF(KanalLaden) = True
Input #KanalLaden, LEER 'Der Platzhalter für '[Neuer Kunde:]
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
i = i + 1
Input #KanalLaden, Datensatz(j, i)
j = j + 1 'Einen Datensatz addieren, weil der nächste dran ist
i = 0
Loop
'Mir soll angezeigt werden, ob irgendetwas gelesen wird:
Dim 
popo = 0
For popo = popo To 12
MsgBox "Erster Datensatz, diverse:" & Datensatz(0, popo) & vbNewLine & " = " & , vbInformation, "Einige Daten:"
Next popo
Close KanalLaden
Also die Überprüfung mit der Messagebox hat ergeben, dass keine Daten gelesen werden. Zumindest nicht, wenn mehr als ein Kunde in jener drinnen steht. :(

So, jetzt kommt mein Appell an euch. Ich hoffe, dass ihr mir soweit helfen könnt, dass ich weiß, wie ich die Indexes - in Verbindung mit dem Lesen von geschriebenen Dateien - benutzen kann. Ich werde dann, bei einem funktionierenden Code die Messagebox am Schluss der Lesefunktion durch Zuweisungen in Labels und Listboxes umändern. Aber bitte schreibt mir, warum es den weiteren Verlauf der Speicherung nicht ließt :) !
Meine Vermutung:
Also ich denke mal, dass das Problem an den vielen Input-Funktionen liegt, die ja eigentlich immer wieder zurück an den ersten Eintrag der Datei verwiesen werden. Aber ich habe echt keinen Plan, wie ich die Variablen aneinander knüpfen kann und dabei auch noch das Erhöhen der Indexe mache - ausgenommen tausende von Variablen zu deklarieren, aber klar: Das möchte ich natürlich nicht ;) :) !

Ich habe schon die Forensuche benutzt, aber dadurch nur gelernt, wie man EOF benutzt.
Ihr habt mir schon so oft weitergeholfen, deshalb danke ich euch schon jetzt vielmals im Voraus. Und vielen Dank auch für das Lesen meines langen Textes ;) :
Da' Hacker
 
Moin Hacker,

also beim überfliegen fällt mir auf, dass Dein Schleifenkonstrukt nicht funktionieren kann.

Code:
Do While EOF(KanalLaden) = True
Wenn mich meine logischen Kenntnisse nicht trügen, wird diese Schleife nie durchlaufen. Denn sobald die Datei geöffnet ist, und etwas drinsteht, ist EOF eigentlich FALSE.

Ändere es doch mal in
Code:
Do While Not EOF(KanalLaden)

Gruß
Das Orakel
 
Hallo Orakel,

die perfekte Lösung! Vielen Dank! Hat gleich auf Anhieb geklappt - okay danach kam der Fehler "Einlesen nach Dateiende", aber diesen konnte ich schon selber kaschieren, weil ich die Datensatz()-Elemente falsch strukturiert habe.

So, aber ein neues Problem. Nun bringt das Programm die richtigen Ergebnisse, allerdings möchte mein Auftraggeber, dass die vorhandenen Kundennummern aufgelistet werden. Ich hätte jetzt für jeden Kunden eine neue Datei anlegen können und die dann in einer DirListBox anzeigen lassen, aber das war mir dann doch etwas zu viel "Müll".
Jetzt ist die Variable bei meinem Code, die die Kundennummer enthält:
"Datensatz(?, 2)"
Ich habe nun eine For-Schleife kreiert, die eine Variable anstelle von "?" immer wieder erhöht und mit "ListKundennummer.AddItem" einer Liste hinzufügt. Soweit auch keine Schwierigkeit.
Doch nun die Probleme:
Die For-Schleife leite ich so ein: "For AktKundennummer = AktKundennummer to 100". Dabei ergiebt sich allerdings das Problem, dass eben nur 100 Kundennummern angezeigt werden. Ich muss also wissen, wieviele "?" von Datensatz(?, 2) bereits belegt sind.
Wieder meine Überlegung:
Es müsste ja irgendwie so gehen: For AktKundennummer = AktKundennummer to Datensatz(max(Datensatz)). Naja. Sieht schon etwas komisch aus, deshalb geht das auch nicht. Wie kann ich die maximale Indexanzahl für "?" herausfinden?
Problem 2:
Sobald die Kundennummern angezeigt werden, soll der Benutzer diese anklicken können und die Daten dafür in irgendeiner Form angezeigt bekommen. Dabei habe ich irgendwie einen kleinen Denkfehler. Mir will einfach nicht einfallen, wie ich es realisieren könnte, den Index der angezeigten Kundennummern zu übernehmen und dazu die passenden Daten aus der Datei "zu fischen". Wie könnte ich das machen?

Nochmal Danke an Orakel! Diese zwei Aufgaben sind bestimmt ein Klacks für euch.

Ciao:
Da' Hacker
PS: Hier im Board gibt es bereits "Hacker", deshalb wäre es nett, wenn ihr mich mit "Da' Hacker" anschreiben könntet. Aber das müsst ihr natürlich nicht, ihr könnt auch einfach "Adam" schreiben ;) .
 
Hi DaHacker,

also Problem 1: Du hast natürlich recht das Teil heist nicht Max, sondern UBound

For aktKundennummer = LBound(Datensatz) To UBound(Datensatz)

Problem 2: Sehe ich eigentlich nicht als kritisch. Der Erste Eintrag in Deiner Listbox müßte doch dem ersten Datensatzelement (Datensatz(0, x)) entsprechen.

Also solltest Du mit Datensatz(ListKundennummer.ListIndex, x) den entsprechenden gewünschten Datensatz erhalten. Kann sein, dass Du evtl. ListIndex + 1 nehmen mußt. Probiers einfach.

Gruß
Das Orakel
 
Hallo!

Ein weiteres Mal danke ich dir, Orakel!
Wunderbar! :-)
Mein Auftraggeber wird wohl äußert zufrieden sein. Du kannst mir glauben, wenn ich dafür Geld bekommen würde, dann hättest du einen provisorischen Anteil erhalten - und das wäre viel! (vorausgesetzt, das Geld wäre auch viel ;) :) )
Zu deiner 1. Lösung:
Das hat bei mir nicht ganz geklappt. Aber das liegt daran, dass ich beim Datensatz(?, ) das "?" auf maximal 2000 Einträge gestellt habe. Folgedessen wurde die Listbox auch für 2000 Einträge präperiert. Ich habe das jetzt so einfach *AufdenKopfschlag* gelöst, dass ich die "J"-Variable genommen habe (siehe oben im Code), denn die hat ja schon die maximal belegten Stellen. Zumindest habe ich aber nun die Begriffe "LBound" und "UBound" 'in Action' gesehen :) .
Zu deiner 2. Lösung:
Genau, richtig!
In meinem Fall also:
Code:
TxtName.Text = Datensatz(ListKundennummer.ListIndex, 0)
TxtVorname.Text = Datensatz(ListKundennummer.ListIndex, 1)
TxtKundennummer.Text = Datensatz(ListKundennummer.ListIndex, 2)
TxtFirma.Text = Datensatz(ListKundennummer.ListIndex, 3)
TxtStrasse.Text = Datensatz(ListKundennummer.ListIndex, 4)
TxtPLZ.Text = Datensatz(ListKundennummer.ListIndex, 5)
TxtWohnort.Text = Datensatz(ListKundennummer.ListIndex, 6)
TxtTelefonPrivat.Text = Datensatz(ListKundennummer.ListIndex, 7)
TxtTelefonGeschaeftlich.Text = Datensatz(ListKundennummer.ListIndex, 8)
TxtMobil.Text = Datensatz(ListKundennummer.ListIndex, 9)
TxtEmail.Text = Datensatz(ListKundennummer.ListIndex, 10)
TxtInternet.Text = Datensatz(ListKundennummer.ListIndex, 11)
TxtKommentar.Text = Datensatz(ListKundennummer.ListIndex, 12)
Nunja, wie du siehst, sind alle deine Vorschläge mehr als perfekt. Vielen Dank nochmal!
Ich überlege, ob ich das Programm hier nicht reinstellen sollte. Aber das möchte ich erstmal mit meinem Auftraggeber ausmachen.

Und entschuldige meine späte Antwort - ich hatte gestern meine FIBU(Finanzbuchhaltung)-Abschlussprüfung :mad: :( ;)

Es kann sein, dass ich mich eventuell nochmal melde, wegen dem Überschreiben bereits vorhandener Daten, aber ich denke, das könnte ich auch alleine schaffen. ;)

Vielen Dank und Ciao:
Da' Hacker *alserledigtmarkier'*
 
Zurück