Dbf Datei mit vb6 auswerten ?

Ich habe ein DBF datei die ich gern anhand von später festgelegten kriterien Filternmöchte. Erst hatte ich Excel im Kopf da aber die datei mehr als 65000 einträge hat wird das mit meinem Office 2003 wohl nichts.

Wie kann ich eine DBF datei mit VB6 Laden um Sie danach Zeilenweise auf ein Kriterium zu prüfen ?
DANKE !
mfg joe

Hi Joe,

Wie kann ich eine DBF datei mit VB6 Laden um Sie danach
Zeilenweise auf ein Kriterium zu prüfen ?

das würde ich mich ganz einfach machen, ohne viel Code.

Das Steuerelement ‚Data‘ auf die Form legen.
Die Eigenschft ‚Content‘ auf die entsprechende DBase-Version stellen.
Bei ‚Datasource‘ den Pfad eingeben oder auswählen
Bei Recordsource die Tabelle auswählen.

In Data1.Recordset(Spalte) stehen dann die Daten. Die ganze Tabelle zeigt man am leichtesten in einem Flexgrid an, im Flexgrid einfach bei ‚Datasource‘ das Element ‚Data1‘ (oder wie immer Du es taufst) auswählen.

Gruß, Rainer

Goil! der Punkt geht an VB6. und an dich natürlich.
Was ist ein Flexgrid ? :stuck_out_tongue:

Wie sollte ich nun vorgehen wenn Ich alle Einträge aus mehrenen Spalten listen möchte bei denen in der Spalte TYP, „hintertür“ drinsteht.

Mfg JOnny

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

Goil! der Punkt geht an VB6. und an dich natürlich.
Was ist ein Flexgrid ? :stuck_out_tongue:

da muss ich eine Gegenfrage stellen: Welche Version von VB6 hast Du denn? In der Standard-Edition ist das MsFlexgrid nicht enthalten, das heißt aber nicht, daß du es nicht verwenden kannst. :smile:

Wenn Du die Version Pro oder Enterprise hast, dann klick beim Öffnen mal nicht auf Standard, sondern Auf ‚VB Pro Edition Steuerelemente‘. :smile: Dann findest Du in der Werkzeugsammlung (schön gelb zum schnell finden. :smile:) Das MsFlexgrid.

Wie sollte ich nun vorgehen wenn Ich alle Einträge aus
mehrenen Spalten listen möchte bei denen in der Spalte TYP,
‚hintertür‘ drinsteht.

hmmm. Mal ein rudimentärer Code, der erklärt eventuell am meisten.

Data1.Recordset.MoveFirst
While Data1.Recordset.EOF = False
 If Data1.Recordset('Typ') = 'hintertür' Then
 'Mal in eine Liste ausgeben
 List1.AddItem Data1.Recordset(0)
 End If
 Data1.Recordset.MoveNext
Wend

OK? Oder was ist noch unklar?

Gruß, Rainer

PS. Achtung! Der Code ist so nicht Lauffähig!
W-w-w verändert die Anführungszeichen in ein Abostroph.

Es Funktioniert !!!
Im Flexgrid sind alle Daten richtig dargestellt aber in der List1 und beim schreiben in eine Datei werden umlaute zerkloppt:

Br³ggemeier Ernst Hintereingang au¯en

reicht es hier die Schriftart zu verändern ?

Ich schreibe die gefilterten sachen in eine TXT und öffne den Excel mit der datei. Oder meinst du das der Code so auch als VBS akzeptiert wird ?

mfg jonny

Hi Joe,

Es Funktioniert !!!

schön. :smile:

Im Flexgrid sind alle Daten richtig dargestellt aber in der
List1 und beim schreiben in eine Datei werden umlaute
zerkloppt:

Br³ggemeier Ernst Hintereingang au¯en

reicht es hier die Schriftart zu verändern ?

Das weiß ich nicht. Wenn nichts anderes hilft, gibt es ja immer noch Replace. :smile:

Ich schreibe die gefilterten sachen in eine TXT und öffne den
Excel mit der datei. Oder meinst du das der Code so auch als
VBS akzeptiert wird ?

VBS? Nein. VBS kennt keine Steuerelemente und kann afaik nicht mit Datenbanken umgehen. Da müsstest Du das File als Textdatei zeilenweise lesen, verarbeiten und die Zeilen in eine andere Textdatei schreiben. Das geht auch, ist aber ein völlig anderer Code. In VBS sieht das komplett anders aus. Wenn Du das mit VBS machen möchtest, kann ich ja mal einen Code dazu stricken, dann müsstest Du mir aber vorher mal eine Beispieldatei mailen, so etwas habe ich nicht und testen muss ich schon. Ohne Test einen fehlerfreien Code zu schreiben schaffe ich in VBS nicht, dazu habe ich zu wenig Übung.

Gruß, Rainer

Moin Rainer,
Replace macht es möglich. 1a Ausgabe.

Ich habe nur noch ein verständniss problem:
Wo Wohnt „Data1.Recordset.MoveFirst“ ?
Ich habe folgenden COde auf ein Button (command1) gelegt und beim Klick wurde meine Datei erstellt. Nun möchte ich aber das sobald ich das programm starte folgeder Code ausgeführt wird. Wenn ich es die die form packe schmeisst er mir ein fehler.

mfg jonny

Data1.Recordset.MoveFirst
While Data1.Recordset.EOF = False
 If Data1.Recordset('Typ') = 'hintertür' Then
 'Mal in eine Liste ausgeben
 List1.AddItem Data1.Recordset(0)
 End If
 Data1.Recordset.MoveNext
Wend

Hi Joe,

Replace macht es möglich. 1a Ausgabe.

gut.

Ich habe nur noch ein verständniss problem:
Wo Wohnt „Data1.Recordset.MoveFirst“ ?

Das Steuerelement Data1 stellt die Verbindung zur Datenbank her und beinhaltet in der Eigenschaft .Recordset eine Abfrage, die Du verwenden kannst. Mit .MoveFirst weist Du den Zeiger der abfrage an, sich auf den ersten Datensatz der Abfrage zu stellen.

Ich habe folgenden COde auf ein Button (command1) gelegt und
beim Klick wurde meine Datei erstellt. Nun möchte ich aber das
sobald ich das programm starte folgeder Code ausgeführt wird.
Wenn ich es die die form packe schmeisst er mir ein fehler.

mfg jonny

Data1.Recordset.MoveFirst
While Data1.Recordset.EOF = False
If Data1.Recordset(‚Typ‘) = ‚hintertür‘ Then
'Mal in eine Liste ausgeben
List1.AddItem Data1.Recordset(0)
End If
Data1.Recordset.MoveNext
Wend

Wenn die Verbindung zur datenbank steht und funktioniert, fällt mir nir noch ein, daß Du die Liste, in die Du etwas schreiben willst, nicht auf die Form gelegt hast.

Wie lautet denn der Fehler?

Gruß, Rainer

Der Fehler lautet:
Objekt Variable or With Block variable not set
Data1.Recordset.MoveFirst

evtl. sollte ich einen Timer einbauen der 3 Sek wartet bis es losgeht ?

Hi Joe,

nein, ein Timer nützt da gar nichts. Heißt Dein Data-Steuerelemnt denn auch wirklich ‚Data1‘? Und die Daten werden im Flexgrid angezeigt?

Hast Du eigentlich die Abostrophs durch Anführungseichen ersetzt? Nicht daß wir hier über den Bug im w-w-w stolpern. :smile:

Gruß, Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin Rainer,
nun kommt der Code;/

ist leider nicht ganz lauffähig im moment. aber zu öffnen einer dbf reicht es.
Wenn ich die „rausrein“ sub über ein command button starte funktioniert alles , wenn ich sie aber direk aus der Form1 aufrufe … bekomme ich die fehlermeldung.
mfg jonny… mein größtes Problem kommt später ://

Option Explicit
Dim MyFSO
Dim textvar As String
Dim f As Long
Dim ff As Long
Dim Outfile As String
Dim pfd As String
Dim Einlesen As String
Dim na As String
Dim N As Long
Dim x As Long
Dim y As Long
Dim Rausx() As String
Dim Reinx() As String

Private Function FileExists(FileName As String) As Boolean
 If FileName "" Then
 FileExists = (Dir$(FileName) "")
 Else
 FileExists = False
 End If
End Function

Private Sub Command1\_Click()
 rausrein
End Sub

Private Sub Form\_Load()
 pfd = App.Path
 If Right(pfd, 1) "\" Then pfd = pfd & "\"
End Sub

Private Sub Speichern()
 f = FreeFile
 If FileExists(Outfile) Then
 Open Outfile For Append As #f
 Print #f, textvar
 Close #f
 Else
 Open Outfile For Output As #f
 Print #f, textvar
 Close #f
 End If
End Sub

Private Sub rein()
ff = FreeFile
N = 0
na = pfd & "rein.txt"
Open na For Input As #ff
 While Not EOF(ff)
 Line Input #ff, Einlesen
 List1.AddItem Einlesen
 N = N + 1
Wend
Close #ff
End Sub

Private Sub raus()
ff = FreeFile
N = 0
na = pfd & "raus.txt"
Open na For Input As #ff
 While Not EOF(ff)
 Line Input #ff, Einlesen
 List2.AddItem Einlesen
 N = N + 1
Wend
Close #ff
End Sub

Private Sub rausrein()
 x = 0
 y = 0
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 Outfile = pfd & "rein.txt"
 If Data1.Recordset("ACCESS") = "Hintereingang au¯en" Then
 textvar = Data1.Recordset(0) & Chr(9) & Data1.Recordset(1) & Chr(9) & Data1.Recordset(2) & Chr(9) & Data1.Recordset(4)
 textvar = Replace(textvar, "¯", "ß") 'Punkt durch leerzeichen ersätzen
 textvar = Replace(textvar, "³", "ü") 'Punkt durch leerzeichen ersätzen
 End If

 Outfile = pfd & "raus.txt"
 If Data1.Recordset("ACCESS") = "Hintereingang innen" Then
 textvar = Data1.Recordset(0) & Chr(9) & Data1.Recordset(1) & Chr(9) & Data1.Recordset(2) & Chr(9) & Data1.Recordset(4)
 textvar = Replace(textvar, "¯", "ß")
 textvar = Replace(textvar, "³", "ü")
 End If
 Data1.Recordset.MoveNext
 Wend
 Shell "C:\Programme\Microsoft Office\OFFICE11\Excel.exe " & Outfile, vbNormalFocus
 rein
 raus
End Sub

Hi Joe,

ist leider nicht ganz lauffähig im moment. aber zu öffnen
einer dbf reicht es.
Wenn ich die „rausrein“ sub über ein command button starte
funktioniert alles , wenn ich sie aber direk aus der Form1
aufrufe … bekomme ich die fehlermeldung.

Ahhh, OK, Du willst in ein Steuerelement schreiben, das noch nicht geladen ist. Schreibe in Form_Load als erste Zeile:

Me.Show

Dann wird es gehen, denke ich. :smile: Zum Testen habe ich gerade keine Zeit, bin schon weg …

mfg jonny… mein größtes Problem kommt später ://

Ok, dann habe ich etwas zum knobeln. :smile:

Gruß, Rainer

Moin Rainer:smile:
du hast es so gewollt:stuck_out_tongue:

Ok, dann habe ich etwas zum knobeln. :smile:
Gruß, Rainer

Ich habe wenn das mit dem 2D Array klappt 2x ein 2D Array.
in dem einem Stehen von links nach rechts Folgende Daten

Datum Zeit Person Rein
… … … …
… … … …

in dem nächstem 2D Array

Datum Zeit Person Raus
… … … …
… … … …

(ich habe von einem Freund eine dbf datei bekommen und soll mal versuchen Arbeitszeiten von Leuten die anhand eines Magnetkartenlesers aufgezeichnet wurden ob sie rein oder rausgegangen sind)

Leider kann ich die Liste nicht 1:1 aneinander legen da die ersten 10 einträge in dem „Rein“ Array vom testen kommen allso ging dort jemand 10 mal rein und nie raus. Nun wollte ich erstmal anhand des DAtums und der Person in der nächsten Liste schauen wann diese Person seit dem Datum & ZEt das nächste mal mit raus auftaucht. Weiteres problem ist das der Leser teilweise beim kommen oder gehen 2 statt nur einen eintrag in die db gemacht hat, das sollte aber erstmal nebensächlich sein. Evtl mache ich nochmal ein Filter um doppelte einträge oder einträge die die gleiche person innerhalb weniger sekunden an der gleichen tür gemacht hat filtert/löscht.

Es ist eine Liste über mehrere monate.
Also Grundform ist eine Dbf datei die ich nun erstmal Filter und in 2 2DArray schreiben möchte um mit dem Daten zu arbeiten.

So ich nage weiter am knochen

Hi Joe.

du hast es so gewollt:stuck_out_tongue:

Ja, :smile:

Ich habe wenn das mit dem 2D Array klappt 2x ein 2D Array.
in dem einem Stehen von links nach rechts Folgende Daten

Datum Zeit Person Rein
… … … …
… … … …

in dem nächstem 2D Array

Datum Zeit Person Raus
… … … …
… … … …

Oder Dir geht der Speicher aus. :smile:

Du hast doch eine Datenbank, verwende doch deren Funktionen. Die Daten in ein Array zu übertragen ist nicht sinnvoll.

Wie sieht es mit Deinen SQL-Kenntnissen aus?

Gruß, Rainer

Wie sieht es mit Deinen SQL-Kenntnissen aus?

ufff!!!

Select db
Select Table who…
get

mehr habe ich auf anhieb nicht zu bieten :stuck_out_tongue:
ist schon paar jahre her.
werde mich mal kurz aufwärmen und die Array geschichte rausschmeissen

Hi Joe,

SqlStr = „SELECT * FROM Tabelle WHERE Feld1 = '“ & Textvariable & „’“

Und schon kannst Du damit ein Recordset erzeugen, das gleich das gewünschte Ergebnis enthält. Lass doch den Computer arbeiten. :smile:

Gruß, Rainer

Ich habe hier nur das dbf.File welches ich mit VB6 auslese.

ich spiele mal etwas mit Data1.Recordset.FindFirst und find next.
habe aber noch keinen lösungsansatz… evtl ist nun derZeitpunk wo ich mal einen Stift und ein stück papier auspacken sollte.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Rainer,
Ich nehme mir in der Rausrein SUB jeden datensatz vom eingangsleser und schau über die Checout Sub ob es an diesem Datum zu diser person eine Meldung am ausgangsleser gibt. Leider bekomme ich die meldung
Kein aktueller Datensatz . der debuger zeigt auf Data1.Recordset.MoveNext im raus rein. Warum ?

von der Logic ist das ganze so ein guter anfang oder ? ich hatte mich da heute morgen etwas verlaufen … (ich war weit weg von zuhause)
Danke, mfg joe

Private Sub rausrein()
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 If Data1.Recordset("ACCESS") = "Hintereingang au¯en" Then
 'textvar = Data1.Recordset(0) & Chr(9) & Data1.Recordset(1) & Chr(9) & Data1.Recordset(2) & Chr(9) & Data1.Recordset(4)
 Datecheck = Data1.Recordset(0)
 TImeCheck = Data1.Recordset(1)
 PErsCheck = Data1.Recordset(2)
 Türcheck = Data1.Recordset(4)
 checkout
 End If
 Data1.Recordset.MoveNext
 Wend

End Sub

Private Sub checkout()

 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 If Data1.Recordset("DATE") = Datecheck And Data1.Recordset("NAME") = PErsCheck And Data1.Recordset("ACCESS") = "Hintereingang innen" Then
 List1.AddItem Data1.Recordset(0) & Chr(9) & Data1.Recordset(1) & Chr(9) & Data1.Recordset(2) & Chr(9) & Data1.Recordset(4)
 List1.AddItem Datecheck & Chr(9) & TImeCheck & Chr(9) & PErsCheck & Chr(9) & Türcheck
 End If
 Data1.Recordset.MoveNext
 Wend
End Sub

Data1.Recordset.MoveNext im raus rein. Warum ?

Ich antworte mir mal selber (ich naP)

ist ja klar das die stelle nicht passt wenn ich in der Datenbank in einer anderen Sub weiter „suche“

habe nun Data2 Objekt eingefügt und die datenbank 2 mal geöffnet.
melde mich wieder

HiJoe,

Ich nehme mir in der Rausrein SUB jeden datensatz vom
eingangsleser und schau über die Checout Sub ob es an diesem
Datum zu diser person eine Meldung am ausgangsleser gibt.
Leider bekomme ich die meldung
Kein aktueller Datensatz . der debuger zeigt auf
Data1.Recordset.MoveNext im raus rein. Warum ?

Du kurbelst in der Prozedur Checkout ja das selbe Recordset durch, wenn die beendet ist, steht der Zeiger auf EOF (EndOfFile) und dem letzten Datensatz. Dann kommt das Programm zurück, soll zum nächsten Datensatz springen und da ist keine mehr.

Was ich bisher verstanden habe:

Du hast in einer Tabelle Daten einer Zugangskontrolle, sowohl Eingang als auch Ausgang. Nun willst Du die Zugänge mit den Abgängen vergleichen.

Das würde ich mit zwei Abfragen (Recordsets) und FindFirst lösen.

Beispiel, die Feldnamen und der Umgang damit passen natürlich nicht zu Deiner Datenbank.

Option Explicit
Dim Db As Database
Dim Rst\_1 As Recordset
Dim Rst\_2 As Recordset

Private Sub Form\_Load()
 Dim Fn As String
 Dim Sql\_1 As String
 Me.Show

 Fn = "Pfad zur Datenbank"
 Set Db = OpenDatabase(Fn)
 Sql\_1 = "SELECT \* FROM Tabelle WHERE Status = 'Zugang'"
 sql\_2 = "SELECT \* FROM Tabelle WHERE Status = 'Abgang'"
 Set Rst\_1 = Db.openrecordset(Sql\_1)
 Set Rst\_2 = Db.openrecordset(sql\_2)
 Set Data1.Recordset = Rst\_1
 Set Data2.Recordset = Rst\_2
End Sub

Private Sub Command1\_Click()
 Dim su As String
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 su = "Name = '" & Data1.Recordset("Name") & "' AND Zeit \> #" & Data1.Recordset("Zeit") & "#"
 Data2.Recordset.FindFirst su
 If Data2.Recordset.NoMatch = False Then
 'Mach was mit dem gefundenen Datensatz
 End If
 Wend
End Sub

Ahhh, Anführungszeichen gehen wieder! :smile:

Gruß, Rainer