Dbf Datei mit vb6 auswerten ?

durchgeschummelt … :stuck_out_tongue:
Werde dein code nachher nochmal durchtesten aber im mom „verstehe“ ich das hier einfach besser:/ (Auch wenn es immer nochnicht der beste weg ist aber wie gesagt heute morgen wollte ich mir noch nen 2D Array basteln. :stuck_out_tongue:

Im Mom habe ich das Datenbankfile 2x geöffnet und vergleiche.
Wie kann ich zu einem bestimmten datensatz springen der bestimmte informationen enthält und den mit findnext with… den ausgang anzeigen lassen. Um das ganze mal vb6 nahe zu bringen:

Ich möchte in der Data2 nach diesem eintrag suchen:
Data2.Recordset(„DATE“) = Datecheck And Data2.Recordset(„NAME“) = PErsCheck And Data2.Recordset(„ACCESS“) = „Hintereingang innen“

und von diesem mit findnext nach:
Data2.Recordset(„DATE“) = Datecheck And Data2.Recordset(„NAME“) = PErsCheck And Data2.Recordset(„ACCESS“) = „Hintereingang außen“
springen.

Noch eine andere frage: ich bekomme aus Data1.Recordset(1) die Zeit welche ich an Zeitcheck (String) übergebe. integer ging wegen 00:00:00 nicht. am ende kommt Zeit = Data2.Recordset(1) - Timecheck wie rechne ich mit einer Zeit ? Variablentyp TIME gibt es nicht :confused:
danke mfg joe

Option Explicit
Dim MyFSO
Dim pfd As String
Dim Datecheck As String
Dim TImeCheck As String
Dim PErsCheck As String
Dim Türcheck As String

Private Sub Command1\_Click()
 rausrein
End Sub

Private Sub rausrein()
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 If Data1.Recordset("ACCESS") = "Hintereingang au¯en" Then
 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()
 Data2.Recordset.MoveFirst
 While Data2.Recordset.EOF = False
 If Data2.Recordset("DATE") = Datecheck And Data2.Recordset("NAME") = PErsCheck And Data2.Recordset("ACCESS") = "Hintereingang innen" Then
 If Data2.Recordset(1) \> TImeCheck Then
 List1.AddItem Data2.Recordset(0) & Chr(9) & Data2.Recordset(2) & Chr(9) & " kommt: " & TImeCheck & Chr(9) & " geht: " & Data2.Recordset(1) & Chr(9) & "summe: " '& 'Data2.Recordset(1) - TImeCheck
 End If
 End If
 Data2.Recordset.MoveNext
 Wend
End Sub

Hi Joe,

Werde dein code nachher nochmal durchtesten aber im mom
„verstehe“ ich das hier einfach besser:/

Da stehen aber die Antworten auf die Fragen, die hier stellst. :smile:

Im Mom habe ich das Datenbankfile 2x geöffnet und vergleiche.
Wie kann ich zu einem bestimmten datensatz springen der
bestimmte informationen enthält und den mit findnext with…
den ausgang anzeigen lassen. Um das ganze mal vb6 nahe zu
bringen:

Sieh in den Code, das steht da.

Ich möchte in der Data2 nach diesem eintrag suchen:
Data2.Recordset(„DATE“) = Datecheck And
Data2.Recordset(„NAME“) = PErsCheck And
Data2.Recordset(„ACCESS“) = „Hintereingang innen“

und von diesem mit findnext nach:
Data2.Recordset(„DATE“) = Datecheck And
Data2.Recordset(„NAME“) = PErsCheck And
Data2.Recordset(„ACCESS“) = „Hintereingang außen“
springen.

Wie du das mit Find machst, steht da auch. (su = „…“)

Noch eine andere frage: ich bekomme aus Data1.Recordset(1) die
Zeit welche ich an Zeitcheck (String) übergebe. integer ging
wegen 00:00:00 nicht. am ende kommt Zeit = Data2.Recordset(1)

  • Timecheck wie rechne ich mit einer Zeit ? Variablentyp TIME
    gibt es nicht :confused:

Dim Zeitcheck As Date. :smile: Um Zeiten zu addieren/subtrahieren nimmst Du ‚Dateadd(„s“,…)‘ für Sekunden … Das geht mit Sekunden, Minuten, Stunden Tage, Wochen …

Mit ‚Find‘ findest Du den Datensatz schneller. :smile:

Wenn Du den Code dahin umbaust, sieht das Ergebnis so aus wie der Code, den Du noch lesen wolltest. Genau das habe ich doch geschrieben.

Gruß, Rainer

Sorry :// Mich hatte der SQL „„HEader““ verscheucht…

Fn = „D:\00 Daten für Jonny\Programme\ACCESS\perslog1.dbf“
Nicht erkennbares Datenbankformat in ^^
Kacke…

Hi Joe,

Fn = „D:\00 Daten für Jonny\Programme\ACCESS\perslog1.dbf“
Nicht erkennbares Datenbankformat in ^^
Kacke…

Du hast für Data1.Content DBase angegeben? Dann müsste VB den richtigen Verweis von sich aus setzen.

Wenn das so nicht klappt, musst Du erst herausfinden, welcher Verweis benötigt wird. :frowning: Ich kann eben nichts testen, weil ich keine DBase-Datei habe. Auch andere Tippfehler in meinen Codes sind immer möglich, weil bei mir ja nichts läuft. Ich kann nur drauf los tippen, wie ich mir das denke. Fehler können mir nicht auffallen, weil ich kein Programm starten kann.

Gruß, Rainer

Hallo,

bekommt ihr es hin, oder soll man mal mithelfen?
Wenn ja,
Besteht der Conenct zur DB schon und kann man SQL Statements abfeuern?
Wie schaut dafür der Source aus?

Wie ist denn die DB aufgebaut? Welche tabellen und welche Felder?
Was wird denn genau wünscht?

MfG Alex

Du willst ne DBF datei ? kannst du haben :stuck_out_tongue:
da gibt es sie:

http://www.ichbinderfelix.de/perslog.dbf

bekomme dein Code nicht zum laufen.

Dazu kommt, das ich das nicht verstehe:
Dim Su As String

su = „Name = '“ & Data1.Recordset(„Name“) & „’ AND Zeit > #“ & Data1.Recordset(„Zeit“) & „#“
Data2.Recordset.FindFirst su

Wenn ich diese Zeile in mein Projekt mit einbauen will… bekomme ich nichts mehr zum laufen:

Ich will einfach mal an eine stelle springen zb an einen Datensatz wo in der Spalte DATE = 20071212 steht und in NAME = peter steht.
wenn ich den gefunden habe möchte ich mit findnext zum nächsten springen wo peter steht und disen ausgeben

Private Sub checkout()
Dim Zeit2 As String
 Data2.Recordset.MoveFirst
 While Data2.Recordset.EOF = False

' If Data2.Recordset("DATE") = Datecheck And Data2.Recordset("NAME") = PErsCheck And Data2.Recordset("ACCESS") = "Hintereingang innen" Then

 End If
 Data2.Recordset.MoveNext
 Wend
End Sub

HI Alex,
Ich habe nur ein dbf file keine online datebank.

im moment probiere ich mit findfirst und find next datensätze zu finden… schau mal, was ich Rainer eben geschrieben habe

Hi Alex,

bekommt ihr es hin, oder soll man mal mithelfen?

JAAAAAAAAAAAAA !!! :smile:

Wenn ja,
Besteht der Conenct zur DB schon und kann man SQL Statements
abfeuern?

Scheinbar nein. Ist die Syntax bei DBase denn anders als bei Access?

Wie schaut dafür der Source aus?

Wie ist denn die DB aufgebaut? Welche tabellen und welche
Felder?

Das ist kurz nach Deiner Frage gekommen, liegt parallel zu Deinem Beitrag (Link)

Was wird denn genau wünscht?

Wenn ich es richtig verstanden habe liegen in der Tabelle Daten, wann Mitarbeiter gekommen und gegangen sind, hübsch durcheinander. Gesucht ist wohl die Arbeitszeit. Was wann mal funktioniert hat, ist nicht ganz bei mir angekomman.

Gruß, Rainer

Hi Joe,

Du willst ne DBF datei ? kannst du haben :stuck_out_tongue:
da gibt es sie:

OK, die habe ich, die Tabelle auch im Flexgrid. Da fällt mir auf, daß die Software scheinbar nicht unterscheidet, ob Jemand kommt oder geht.

(Übrigens, das sind doch hoffentlich keine echten Personaldaten? Sonst entferne ich den Link schnell wieder. :smile:)

Ich will einfach mal an eine stelle springen zb an einen
Datensatz wo in der Spalte DATE = 20071212 steht und in NAME =
peter steht.

Das mache ich in der Tabelle jetzt als neuen ersten Schritt mal.

… Aaaalso. FindFirst mag VB mit der DBase-Datenbank nicht. Ein paar andere Eigenschaften, die ich mit Access immer verwende auch nicht.

Ich habe mal nach einem Vornamen gesucht, den es auch gibt, leider wirklich mit einer Schleife. :frowning: Mal sehen, ob Alex das hübscher hin bekommt.

Private Sub Command1\_Click()
 Dim n As Long
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 n = n + 1
 If UCase(Data1.Recordset(2)) Like UCase("\*Felix\*") Then
 MSFlexGrid1.TopRow = n + 1
 Exit Sub
 End If
 Data1.Recordset.MoveNext
 Wend
End Sub

Aber was mache ich nun mit den Daten?

Gruß, Rainer

Nabend,
ich komme einfach nicht weiter …ich muss lernen NEIN zu sagen wenn freunde mich fragen ob ich dazu ne idee hätte…

Die Datenbank auslesen und halbwegs sicher vergleichen geht.
Ich habe ein Problem mit doppelten einträgen die ich nicht gefilter bekomme. So kommt es vor das PErsonen zur gleichen Zeit 3 mal das Gebäude betreten. aber mein grösstes prob. ist noch das wenn ich von einem Datensatz den nächsten eintrag suche wo diese PErson an diesem Tag den ausgangsleser benutzt bekomme ich chaos wenn diese PErson das gebäude mehrmals betreten und verlassen hat. Deswegen würde ich gern. Jeden Datensatz einlesen wo die PErson den leser an der Hintertür außen benutzt und mit findnext suche wo diese PErson den leser an der hintertür innen benutzt. (Bei der Spalte Access in dem dbf File sind nur die einträge Hintertür außen und Hintertür innen relevant. LEser außen zum kommen und Leser innen zum verlassen).
Hier mein Code bis jetzt. Ich arbeite mit dem dbf File welches ich 2 mal Data1 und Data2 lade. + einen Command Button und List1.
bis später mfg jonny

http://www.ichbinderfelix.de/perslog.dbf

Option Explicit
Dim MyFSO
Dim pfd As String
Dim Datecheck As String
Dim TImeCheck As String
Dim PErsCheck As String
Dim Türcheck As String
Dim doppeltx As String
Dim doppelty As String
Dim doppeltz As String
Dim Zeit2 As Date


Private Sub Command1\_Click()
 rausrein
End Sub

Private Sub rausrein()
 Data1.Recordset.MoveFirst

 While Data1.Recordset.EOF = False
 If Data1.Recordset(0) = Datecheck And Data1.Recordset(1) = TImeCheck And Data1.Recordset(2) = PErsCheck And Data1.Recordset(4) = Türcheck Then
 Else
 If Data1.Recordset("ACCESS") = "Hintereingang au¯en" Then
 Datecheck = Data1.Recordset(0)
 TImeCheck = Data1.Recordset(1)
 PErsCheck = Data1.Recordset(2)
 Türcheck = Data1.Recordset(4)
 checkout
 Else

 End If
 End If
 Data1.Recordset.MoveNext
 Wend

End Sub

Private Sub checkout()

 Data2.Recordset.MoveFirst
 While Data2.Recordset.EOF = False
 If Data2.Recordset(1) \> TImeCheck Then

 If Data2.Recordset("DATE") = Datecheck And Data2.Recordset("NAME") = PErsCheck And Data2.Recordset("ACCESS") = "Hintereingang innen" Then

 List1.AddItem Data2.Recordset(0) & Chr(9) & Data2.Recordset(2) & Chr(9) & " kommt: " & TImeCheck & Chr(9) & " geht: " & Data2.Recordset(1) & Chr(9) & "summe: " '& Zeit2 - TImeCheck

 End If
 End If
 Data2.Recordset.MoveNext
 Wend
End Sub

Hi Joe,

jetzt ist bei mir im Haus auch endlich Ruhe eingezogen … :smile:

ich komme einfach nicht weiter …ich muss lernen NEIN zu
sagen wenn freunde mich fragen ob ich dazu ne idee hätte…

*gg* so schlimm ist es nun auch wieder nicht. :smile:

Ich habe mir Deinen Code nicht genau angesehen, aber wie Du zwei Recordsets geladen. Dann habe ich die einzelnen Vorgänge getrennt und klicke nacheinander die entsprechenden Button, so sehe ich am Schönsten, was passiert. Die Datenbank, die ich habe ist ja eh nur eine Kopie, also darf ich da auch Datensätze löschen. Wenn Du mit einer Kopie arbeitest, darfst Du das auch.

Erst mal nummeriere ich die Datensätze, damit ich einen Datensatz mit dem selben Inhalt, aber einer anderen Nummer finden kann.

Erst mal reduziere ich die Datenbank und lösche, was uns eh nicht interessiert.

Nun suche ich mit Hilfe dieser Nummer doppelte Datensätze und lösche die aus der Datenbank.

Nun kopiere ich die daten in ein neues Flexgrid um, weil ich die Reihenfolge ‚Name, Tag, Zeit, Ein-Ausgang‘ möchte, entferne dabei noch übrig gebliebene Datensätze, die sich nicht haben löschen lassen und sortiere danach das Flexgrid.

Als Letztes suche ich mir zwei Zeilen, in denen für den selben Tag erst ein Zugang, dann ein Ausgang steht und berechne die Differenz in Minuten. Die schreibe ich in die letzte Spalte.

Private Sub Command1\_Click()
 'Feld Mode wird für eine Numerierung missbraucht, da steht
 'bisher ohnehin nichts sinnvolles.
 Dim n As Integer
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 Data1.Recordset.Edit
 Data1.Recordset("Mode") = CStr(n)
 Data1.Recordset.Update
 n = n + 1
 Data1.Recordset.MoveNext
 Wend
 Data1.Refresh
 Data2.Refresh
 Me.Caption = n
End Sub

Private Sub Command2\_Click()
 'Alles löschen, was nichts mit dem Hintereingang zu tun hat
 Data1.Recordset.MoveLast
 While Data1.Recordset.BOF = False
 If Not Data1.Recordset("Access") Like "Hintereingang\*" Then
 Data1.Recordset.Delete
 End If
 Data1.Recordset.MovePrevious
 Wend
 Data1.Refresh
 Data2.Refresh
End Sub

Private Sub Command3\_Click()
 'Doppelte Datensätze entfernen
 Dim n As Integer
 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 n = n + 1
 Me.Caption = n
 DoEvents
 Data2.Recordset.MoveFirst
 While Data2.Recordset.EOF = False
 If Data1.Recordset(0) = Data2.Recordset(0) Then
 If Data1.Recordset(1) = Data2.Recordset(1) Then
 If Data1.Recordset(2) = Data2.Recordset(2) Then
 If Data1.Recordset(4) = Data2.Recordset(4) Then
 If Data1.Recordset(6) Data2.Recordset(6) Then
 Data2.Recordset.Delete
 End If
 End If
 End If
 End If
 End If
 Data2.Recordset.MoveNext
 Wend
 Data1.Recordset.MoveNext
 Wend
 Data1.Refresh
 Data2.Refresh
End Sub

Private Sub Command4\_Click()
 'Daten in ein neues Flexgrid kopieren und sortieren.
 Dim r As Integer, c As Integer
 MSFlexGrid3.Cols = 5
 MSFlexGrid3.Clear
 For r = 1 To MSFlexGrid1.Rows - 1
 If Trim(MSFlexGrid1.TextMatrix(r, 4)) "" Then
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 0) = MSFlexGrid1.TextMatrix(r, 2)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 1) = MSFlexGrid1.TextMatrix(r, 0)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 2) = MSFlexGrid1.TextMatrix(r, 1)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 3) = MSFlexGrid1.TextMatrix(r, 4)
 MSFlexGrid3.Rows = MSFlexGrid3.Rows + 1
 End If
 Next
 MSFlexGrid3.Rows = MSFlexGrid3.Rows - 1
 MSFlexGrid3.Col = 4
 MSFlexGrid3.ColSel = 0
 MSFlexGrid3.Sort = 1
 MSFlexGrid3.Col = 0
End Sub

Private Sub Command5\_Click()
 'Minuten berechnen und eintragen
 Dim r As Integer
 For r = 1 To MSFlexGrid3.Rows - 2
 If MSFlexGrid3.TextMatrix(r, 0) = MSFlexGrid3.TextMatrix(r + 1, 0) Then
 If MSFlexGrid3.TextMatrix(r, 1) = MSFlexGrid3.TextMatrix(r + 1, 1) Then
 If MSFlexGrid3.TextMatrix(r, 3) Like "Hintereingang au\*" Then
 If MSFlexGrid3.TextMatrix(r + 1, 3) Like "Hintereingang in\*" Then
 MSFlexGrid3.TextMatrix(r + 1, 4) = DateDiff("n", \_
 TimeValue(MSFlexGrid3.TextMatrix(r, 2)), \_
 TimeValue(MSFlexGrid3.TextMatrix(r + 1, 2)))
 End If
 End If
 End If
 End If
 Next
End Sub

Schön ist der Code nicht, aber er läuft. :smile:

Was ist das übrigens für eine schreckliche Zugangskontrolle und wie alt ist das Ding, daß es noch mit DBase arbeitet. Bei uns läuft ‚Zeus‘, damit gibt es solchen Ärger nicht. :smile:

Gruß, Rainer

Moin Rainer,
brauche nochmal 2-3 Eckdaten:stuck_out_tongue:
Ich habe 3 MS FlexGrind angelegt. 1 & 2 Die ihre daten von der gleichen Datei(dbf) bekommen und ein Leeres also einfach auf die form und fertig.

Bis zum „Button3“ funzt alles SEHR GUT °° bin mal wieder schwer beeindruckt … Wenn ich Knopf nr4 drücke sehe ich das FlexGrid3 5 Spalten zugewiesen bekommt, danach ist aber schluss :?
Habe nochmal versuchsweise ein Flex.refresh unten angefügt aber ohne erfolg. Das knopf 5 nicht geht wenn knopf 4 keine Daten von Flex1 in 3 Kopiert ist klar.
Wie kann ich das wieder gutmachen :frowning:(((
mfg jonny
PS. KP warum die Zugangskontrolle noch in dbf speichert. Sie scheint ja nichtmal ein Jahr alt zu sein, erst dachte ich das es einfach ein „schlechter Access export ist“… ist aber erstmal nicht relevant :stuck_out_tongue:

Private Sub Command4\_Click()
 'Daten in ein neues Flexgrid kopieren und sortieren.
 Dim r As Integer, c As Integer
 MSFlexGrid3.Cols = 5
 MSFlexGrid3.Clear
 For r = 1 To MSFlexGrid1.Rows - 1
 If Trim(MSFlexGrid1.TextMatrix(r, 4)) "" Then
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 0) = MSFlexGrid1.TextMatrix(r, 2)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 1) = MSFlexGrid1.TextMatrix(r, 0)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 2) = MSFlexGrid1.TextMatrix(r, 1)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 3) = MSFlexGrid1.TextMatrix(r, 4)
 MSFlexGrid3.Rows = MSFlexGrid3.Rows + 1
 End If
 Next
 MSFlexGrid3.Rows = MSFlexGrid3.Rows - 1
 MSFlexGrid3.Col = 4
 MSFlexGrid3.ColSel = 0
 MSFlexGrid3.Sort = 1
 MSFlexGrid3.Col = 0

 'MSFlexGrid3.Refresh
End Sub

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

Hi Joe,

Bis zum ‚Button3‘ funzt alles SEHR GUT °° bin mal wieder
schwer beeindruckt …

nein, mein Code ist schlecht, sehr schlecht! :frowning: Eleganter bekomme ich es aber mit DBase nicht hin. Ich dachte mir, besser so als gar nicht. Direkt in den Zellen des Flexgrid zu arbeiten ist ganz übel und funktioniert nur, weil das so wenige Datensätze sind. Bitte nicht merken. :smile:

Wenn ich Knopf nr4 drücke sehe ich das
FlexGrid3 5 Spalten zugewiesen bekommt, danach ist aber
schluss :?

und das erste Flexgrid heißt auch wirklich MSFlexgrid1? Du musst am Namen etwas geändert haben, eine andere Erklärung habe ich nicht. Flexgrid3 wird ja verstanden, sonst wären die 5 Spalten nicht da.

Setz mal eine Stoppunkt …

Private Sub Command4\_Click()
 'Daten in ein neues Flexgrid kopieren und sortieren.
 Dim r As Integer, c As Integer
 MSFlexGrid3.Cols = 5
 MSFlexGrid3.Clear
 For r = 1 To MSFlexGrid1.Rows - 1
 If Trim(MSFlexGrid1.TextMatrix(r, 4)) '' Then
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 0) =
MSFlexGrid1.TextMatrix(r, 2)

… hier hin und sieh nach, was in Flexgrid1 steht. Weil nichts übertragen wird, wird das Programm die Zeile eventuell gar nicht erreichen. Dann setze den Stoppunkt auf den Spaltenkopf uns sieh, wie viele Zeilen Dein Flexgrid hat und finde heraus, warum das nur zwei sind. :smile:

 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 1) =
MSFlexGrid1.TextMatrix(r, 0)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 2) =
MSFlexGrid1.TextMatrix(r, 1)
 MSFlexGrid3.TextMatrix(MSFlexGrid3.Rows - 1, 3) =
MSFlexGrid1.TextMatrix(r, 4)
 MSFlexGrid3.Rows = MSFlexGrid3.Rows + 1
 End If
 Next
 MSFlexGrid3.Rows = MSFlexGrid3.Rows - 1
 MSFlexGrid3.Col = 4
 MSFlexGrid3.ColSel = 0
 MSFlexGrid3.Sort = 1
 MSFlexGrid3.Col = 0

 'MSFlexGrid3.Refresh
End Sub

PS. KP warum die Zugangskontrolle noch in dbf speichert. Sie
scheint ja nichtmal ein Jahr alt zu sein, erst dachte ich das
es einfach ein ‚schlechter Access export ist‘… ist aber
erstmal nicht relevant :stuck_out_tongue:

Autsch. Ich dachte, das Ding ist über 15 Jahre alt. Ich kann dazu nur sagen, mein Chef hätte das nicht bezahlt. :smile:

Gruß, Rainer

Schlechter Code hin oder her :stuck_out_tongue: Funktion ist wichtig :smile:
wo wir auch schon beim thema Sind:
Evtl, hast nochmal 2 min minuten zeit um dir das mal anzuschauen:
http://www.ichbinderfelix.de/dbffilter.zip

Was mich noch wundert ist das ich nach dem durchführen vom „command2“
noch ein paar zeilen habe die Nummeriert sind aber sonst keinen Inhalt haben. Was komisch ist da sonst alles gelöscht wird was nicht Hintereingang im Datensatz hat.
Somit kann es ja beim command 4 dazu kommen das diese IF Schleife
If Trim(MSFlexGrid1.TextMatrix(r, 4)) „“ Then umlaufen wird … hmpf

 'Alles löschen, was nichts mit dem Hintereingang zu tun hat
 Data1.Recordset.MoveLast
 While Data1.Recordset.BOF = False
 If Not Data1.Recordset("Access") Like "Hintereingang\*" Then
 Data1.Recordset.Delete
 End If
 Data1.Recordset.MovePrevious
 Wend
 Data1.Refresh
 Data2.Refresh

Hallo Joe,

ich hab’s gefunden, meine Schuld. :frowning:

Wenn ich eine Tabelle habe, bei der ich keine feststehenden Spalten verwende, stelle ich die Eigenschaft ‚fixed Cols‘ auf 0. Das sieht man im Code nicht.

Dadurch hast Du die erste Spalte grau, die Daten fangen in Spalte 1 an. Bei mir fehlt die graue Spalte, die Daten fangen in Spalte 0 an, das verschiebt alles um eine Spalte.

Wenn Du ‚fixed Cols‘ auf Null stellst, läuft der Code fast schon, was noch falsch ist, ist die Verbindung von Flexgrid3 zu Data1 ist falsch. Das Feld muss leer bleiben.

Gruß, Rainer
PS. Warum die leeren Zeilen am Anfang der Tabelle nicht mit gelöscht werden, habe ich auch nicht herausfinden können. in der Sortierung ist auch noch ein Fehler, Die Zeiten werden nicht richtig sortiert. Das müsste man auch noch nacharbeiten.

Hallo Rainer,

JAAAAAAAAAAAAA !!! :smile:

Auf was bezog sich das nun ?
Ja, wir bekommen das hin oder Ja wir brauchen Hilfe ?

Scheinbar nein. Ist die Syntax bei DBase denn anders als bei
Access?

Ja aber wie kommt er dann an die Daten ran ?
Ich würde die Prinzipiell die DB via ADO öffnen und mir dann die Daten über ein SQL Statement holen und sie einfach im Flexgrid anzeigen :smile:
Nur dazu muesste man wissen, wie sie vorliegen und was die Kriterien sind! Das schoene dabei ist, das man Ressourcen spart und das prog flexibler halten kann :smile:

Ein simples Bsp. für den Zugriff auf eine DBASE DB schaut glaub wiefolgt aus. Ist ausm Hut geschrieben, und koennte sein das der eine oder andere Fehler da noch vorliegt :confused:

Option Explicit

Private Sub Form\_Load()
 sPath = "Dein Pfad"
 Dim rsTemp As New ADODB.Recordset
 Set cnn = New ADODB.Connection
 cnn.Open "Provider=MSDASQL;Driver={Microsoft dBASE Driver (\*.dbf)};DriverID=277;Dbq=" & sPath
End Sub

Public Function Connect(sFile As String)
 If cnn.State = 1 Then
 Set rs = New ADODB.Recordset
 With rs
 .CursorType = adOpenDynamic
 .CursorLocation = adUseClient
 .LockType = adLockOptimistic
 .Source = "select \* from [" & sFile & "]"
 .ActiveConnection = cnn
 .Open
 End With
 End If
End Function

Sollte eigentlich functionieren :smile:
Nun kannst du mit der DB handeln, als waere es eine Access DB :smile:
Die Daten kannst du dir nun mit normalen SQL Statements holen :smile:

Wie das funktioniert, geht zum Bsp. folgendermassen
Ist via Notepad, aus einem alten project kopiert :smile:

Private Sub fAdoErr(actSub As String) 'Fehlerbehandlung
Dim ErrNo() As Long
Dim ErrADO As ADODB.Error
Dim I As Integer
Dim strMsg As String
Dim bOnlyADO As Boolean
If Con.Errors.Count 0 Then
 ReDim ErrNo(Con.Errors.Count - 1)
 For Each ErrADO In Con.Errors
 strMsg = strMsg & "ADO-Error: " & ErrADO.Number & vbCrLf & "SQL-Error: " & ErrADO.SQLState & vbCrLf & ErrADO.Description
 ErrNo(I) = ErrADO.Number
 If Err.Number = ErrADO.Number Then bOnlyADO = True
 Next ErrADO
End If
If Not bOnlyADO Then
 strMsg = strMsg & vbCrLf & vbCrLf & "Fehler : " & Err.Number & vbCrLf & Err.Description
End If
MsgBox strMsg, vbExclamation, actSub
Con.Errors.Clear
Err.Clear
End Sub

Public Function RunSql(Statement As String, Rs As ADODB.Recordset) As Boolean
On Error GoTo ErrHandler
 If Rs.State = adStateOpen Then Rs.Close
 Rs.Open Statement, Con, adOpenDynamic, adLockPessimistic
 RunSql = True
 Exit Function
ErrHandler:
 Call fAdoErr("fRunSql")
End Function

Wie schaut dafür der Source aus?

Wie ist denn die DB aufgebaut? Welche tabellen und welche
Felder?

Das ist kurz nach Deiner Frage gekommen, liegt parallel zu
Deinem Beitrag (Link)

Puh da steht ne Menge :s Und wie ich sehe habt ihr es ja hinbekommen :smile: Auch wenn auf einem etwas ungewöhnlichen Weg :wink: Nun sein Project nochmal umstricken, waere ja wahnsinn und wenn er keine Aenderung in absehbarer zeit machen möchte, ist es fraglich nun nochmal alles auf dem Kopf zu stellen!

Was wird denn genau wünscht?

Wenn ich es richtig verstanden habe liegen in der Tabelle
Daten, wann Mitarbeiter gekommen und gegangen sind, hübsch
durcheinander. Gesucht ist wohl die Arbeitszeit. Was wann mal
funktioniert hat, ist nicht ganz bei mir angekomman.

Ok, liegen sie in einer Tabelle vor?
Welche Felder hat denn die Tabelle ?

In seinem Falle muesste er
Ein ID Feld haben
Ein was die zeit erfasst hat
Ein was sagt rein oder raus
Ein Feld was den Mitarbeiter beschreibt, sei es eine ID oder ein Name

In welchen Formaten liegen denn die Daten dann vor?
Normal wird ja pro Tag 2 Datensaetze angelegt ( einmal kommen und einmal gehen) An dem Tag wo das Proggi ausgefuehrt wird, kommt evtl. noch einmal kommen hinzu. Was soll mit diesen Tag geschehen ?
Ist es so gesichert, das er sich net zweimal anmelden kann, wenn er vergessen hat, sich abzumelden ? Wenn ja, wie soll dann verfahren werden ?

Wie du siehst, muesste man nun eine genaue Beschreibung des proggis haben :smile: Sollen da alle Daten aufgelistet werden, für den Tag X und alle Mitarbeiter oder nur für alle Tage und einen Mitarbeiter oder zwei etc.

Du kannst auch die Function RunSQL noch abaendern, so das du ihr das Flexgrid übergibst, dann das SQL Statement abfeuerst und die Bindung zum Flexgrid trennst, danach einfach wieder neu binden und einen Refresh machen. Danach sollte dort die Daten drinnen stehen :smile:

Wie du siehst wird dann das Proggi arg flexibel und steht späteren Änderungen nichts mehr im Wege :smile: Sei es irgendwelche Daten zu manipulieren etc :smile:

Gruß, Rainer

MfG Alex

Jo, das war es :stuck_out_tongue:
nun bin ich aber schon wieder dabei ab punkt 3 in eine Listbox auszugeben. Was ich nicht verstehe, Ich habe mir mit einem Stoppunkt mal den inhalt der Variablen im oberen leeren bereich anzeigen lasse.
dor steht überall Null also nichts drin wenn ich aber mit if die null felder rauswerfen will geht das nicht:

Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
If Data1.Recordset(0) = Null Or Data1.Recordset(1) = Null Or Data1.Recordset(2) = Null Or Data1.Recordset(4) = Null Then

 List1.AddItem treffer

 Else
 List1.AddItem Data1.Recordset(0) & Chr(9) & Data1.Recordset(1) & Chr(9) & Data1.Recordset(2)
 End If

 Data1.Recordset.MoveNext
 Wend

Hi Joe,

Was ich nicht verstehe, Ich habe mir mit einem
Stoppunkt mal den inhalt der Variablen im oberen leeren
bereich anzeigen lasse.
dor steht überall Null also nichts drin wenn ich aber mit if
die null felder rauswerfen will geht das nicht.

Ja, das habe ich auch nicht hin bekommen. Das war einer der Gründe für das Umkopieren. :smile:

Gruß, Rainer

Hi Alex,

JAA !!! :smile:

Auf was bezog sich das nun ?

darauf, daß nichts gelingt und wir Deine Hilfe benötigen.

Scheinbar nein. Ist die Syntax bei DBase denn anders als bei
Access?

Ja aber wie kommt er dann an die Daten ran ?

DAO und ‚Data‘-Steuerelement.

Ich würde die Prinzipiell die DB via ADO öffnen und mir dann
die Daten über ein SQL Statement holen und sie einfach im
Flexgrid anzeigen :smile:
Nur dazu muesste man wissen, wie sie vorliegen und was die
Kriterien sind! Das schoene dabei ist, das man Ressourcen
spart und das prog flexibler halten kann :smile:

Wenn man weiß wie … Du kennst meine Abneigung gegen ADO, die kommt von mangelndem Wissen. :smile:

Ein simples Bsp. für den Zugriff auf eine DBASE DB schaut
glaub wiefolgt aus. Ist ausm Hut geschrieben, und koennte sein
das der eine oder andere Fehler da noch vorliegt :confused:

Sollte eigentlich functionieren :smile:

Ja, scheint so.

Ich habe mal die Pfade eingetragen, etwas geschraubt …

Option Explicit

 Dim sPath As String
 Dim cnn As ADODB.Connection
 Dim rs As New ADODB.Recordset

Private Sub Form\_Load()
 Dim i As Long, n As Long
 sPath = "c:\"
 Set cnn = New ADODB.Connection
 cnn.Open "Provider=MSDASQL;Driver={Microsoft dBASE Driver (\*.dbf)};DriverID=277;Dbq=" & sPath

 If cnn.State = 1 Then
 Set rs = New ADODB.Recordset
 With rs
 .CursorType = adOpenDynamic
 .CursorLocation = adUseClient
 .LockType = adLockOptimistic
 .Source = "select \* from perslog"
 .ActiveConnection = cnn
 .Open
 End With
 End If

 rs.MoveFirst
 While rs.EOF = False
 n = n + 1
 For i = 0 To 5
 If rs(i) Null Then
 MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs(i)
 End If
 Next
 MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
 rs.MoveNext
 Wend
 Me.Caption = n
End Sub

Die Tabelle wird gelesen, die Anzahl Datensätze ist OK, aber das Flexgrid bleibt weiß, hat nur die passende Zahl Zeilen. :smile:

Das ist kurz nach Deiner Frage gekommen, liegt parallel zu
Deinem Beitrag (Link)

Puh da steht ne Menge :s Und wie ich sehe habt ihr es ja
hinbekommen :smile: Auch wenn auf einem etwas ungewöhnlichen Weg :wink:

*gg* Ja, deshlab war ich ja der Meinung, wir benötigen deine Hilfe. :smile:

Nun sein Project nochmal umstricken, waere ja wahnsinn und
wenn er keine Aenderung in absehbarer zeit machen möchte, ist
es fraglich nun nochmal alles auf dem Kopf zu stellen!

Wenn ich alles richtig verstanden habe, soll nur diese eine Tabelle ein mal gelesen und ausgewertet werden.

Ok, liegen sie in einer Tabelle vor?

Ja.

Welche Felder hat denn die Tabelle ?

In seinem Falle muesste er
Ein ID Feld haben
Ein was die zeit erfasst hat
Ein was sagt rein oder raus
Ein Feld was den Mitarbeiter beschreibt, sei es eine ID oder
ein Name

DATE - Datum
TIME - Zeit
NAME - Vorname Name
PERSCODE - leer (NULL)
ACCESS - Ort des Lesegerätes
KEY - leer (NULL)
MODE - in allen Datensätzen steht ‚kurz‘

In welchen Formaten liegen denn die Daten dann vor?
Normal wird ja pro Tag 2 Datensaetze angelegt ( einmal kommen
und einmal gehen) An dem Tag wo das Proggi ausgefuehrt wird,
kommt evtl. noch einmal kommen hinzu.

Immer wenn die Karte gelesen wird, wird ein Datensatz geschrieben, es gibt auch Dupkeys, keinen Schlüssel. Die Datensätze liegen sequentiell vor. Scheinbar öffnet die Karte die Tür, wenn die Tür schon offen ist, muss die Karte nicht benutzt werden. So können Mitarbeiter zehn mal hintereinander kommen, ohne jemals zu gehen. :smile: Auswertbare Daten sind der Glücksfall.

Was soll mit diesen Tag geschehen ?
Ist es so gesichert, das er sich net zweimal anmelden kann,
wenn er vergessen hat, sich abzumelden ?

Nein. Erfasst wird nur, welches Lesegerät die Tür geöffnet hat.

Wenn ja, wie soll dann verfahren werden ?

Wie du siehst, muesste man nun eine genaue Beschreibung des
proggis haben :smile:

Lieber nicht, sonst kommentieren wir das noch. :smile: Joe ist ja nicht Schuld, der hat die Daten nur von einem Freund bekommen.

Sollen da alle Daten aufgelistet werden, für
den Tag X und alle Mitarbeiter oder nur für alle Tage und
einen Mitarbeiter oder zwei etc.

Für alle Mitarbeiter, aber nur für den ‚Hintereingang‘, der innen und außen je ein Lesegerät hat, das scheinbar die Tür öffnet. Sind zwei Mitarbeiter zusammen, wird nur der erfasst, der die Tür öffnet.

Du kannst auch die Function RunSQL noch abaendern, so das du
ihr das Flexgrid übergibst,

Wie ich das ohne ADODC-Steuerelement schaffe, weiß ich nicht. :frowning:

dann das SQL Statement abfeuerst
und die Bindung zum Flexgrid trennst, danach einfach wieder
neu binden und einen Refresh machen. Danach sollte dort die
Daten drinnen stehen :smile:

Das wäre der Wunsch gewesen. :smile: Ich wollte das Recordset mit dem SQL-String filtern, sortieren … aber das habe ich erst mal nicht geschafft.

Wie du siehst wird dann das Proggi arg flexibel und steht
späteren Änderungen nichts mehr im Wege :smile: Sei es irgendwelche
Daten zu manipulieren etc :smile:

Und der Vorgang ist auch nicht so sehr exotisch, hilft bei anderen Problemen auch, deshalb wäre es schön, das noch fertig zu bekommen.

Gruß, Rainer

Hallo Rainer,

darauf, daß nichts gelingt und wir Deine Hilfe benötigen.

nagut dann schauen wir mal was sich da machen laesst :smile:
Aber wie gesagt, ich habe kein VB mehr und muss alles aus dem Kopf schreiben, von daher kann es passieren, das ich mal net alle Eigenschaften weiss oder vlt. den einen oder anderen Syntax Fehler drinn, habe. Aber das kannst du ja ausbügeln :wink:

DAO und ‚Data‘-Steuerelement.

Davon halt ich wiederrum nicht viel :s
Ich mag lieber ADO, wie du ja sicherlich weisst :smile:

Wenn man weiß wie … Du kennst meine Abneigung gegen ADO, die
kommt von mangelndem Wissen. :smile:

Ja das weiss ich! Aber ADO ist net schlecht. Man kann damit auch mehr machen, wie zum Bsp. Views anlegen und lesen *zwinker*
So schwer ist das eigentlich auch nicht :smile:

> rs.MoveFirst  
> While rs.EOF = False  
> n = n + 1  
> For i = 0 To 5  
> If rs(i) Null Then  
> MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) =  
> rs(i)  
> End If  
> Next  
> MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1  
> rs.MoveNext  
> Wend  
> Me.Caption = n  
> End Sub

Die Tabelle wird gelesen, die Anzahl Datensätze ist OK, aber
das Flexgrid bleibt weiß, hat nur die passende Zahl Zeilen.

-)

Hmmm, komisch. probiere mal Testhalber, einfach oben nen On Error Resume next und mache dann mal die Abfrage auf Null weg! Wie schaut es dann aus ? Ich daechte auch das du unter VB6 nicht so auf Null abfragen kannst!
Meines Erachtens geht das via isnull. ich aendere mal den rel. Source ab

     rs.MoveFirst
     While rs.EOF = False
     n = n + 1
     For i = 0 To 5
     If IsNull(rs(i)) then MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs(i)
     Next
     MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
     rs.MoveNext
     Wend
     Me.Caption = n
    End Sub




Aber warum machst du dir so kompliziert?
Gestalte das doch Variabler und weisse net direkt den Wert zu, sondern via 
MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = Function(rs(i))
Hier rufst du eine Function auf die Dir die gewuenschten Daten als STRING zurueckliefert! In der Function kannst du auf Null prüfen!
Ist es Null, so kannst du einen def. text oder nichts zurueckgeben. Ist es nicht Null, so wandelst du das Ergebnis in ein String um und schickst ihn zurueck :smile:
Wie das geht, weisst du? 



> \*gg\* Ja, deshlab war ich ja der Meinung, wir benötigen deine  
> Hilfe. :smile:

Naja die Hauptsache ist doch das man ans Ziel kommt oder ?



> Wenn ich alles richtig verstanden habe, soll nur diese eine  
> Tabelle ein mal gelesen und ausgewertet werden.


Naja wie oft man dann diese Tabelle liest, ist unrelevant. Geht ja auch ziemlich fix! Mit den passenden SQL Statements, kannst du wunderbar Daten filtern, sortieren etc.



> DATE - Datum  
> TIME - Zeit  
> NAME - Vorname Name  
> PERSCODE - leer (NULL)  
> ACCESS - Ort des Lesegerätes  
> KEY - leer (NULL)  
> MODE - in allen Datensätzen steht 'kurz'

Ok, sollen alle Felder im Flexgrid angezeigt werden? Wobei Perscode und Key genauso wie Mode keinen Sinn ergeben würden! Wozu ist eigentlich MODE da, wenn da immer das selbe steht?



> Immer wenn die Karte gelesen wird, wird ein Datensatz  
> geschrieben, es gibt auch Dupkeys, keinen Schlüssel.


Was verstehst du unter DupKeys ?



> Die Datensätze liegen sequentiell vor. Scheinbar öffnet die Karte  
> die Tür, wenn die Tür schon offen ist, muss die Karte nicht  
> benutzt werden. So können Mitarbeiter zehn mal hintereinander  
> kommen, ohne jemals zu gehen. :smile: Auswertbare Daten sind der  
> Glücksfall.



Das ist doch alles Mist oder :/
Wie will er denn dann die Daten auswerten, wenn er net weiss wann die Mitarbeiter gegangen sind ? \*gruebel\*
Man koennte in dem Falle eine Fixe zeit setzen wann sie gegangen sind oder eine Aufforderung, das man die Daten via Hand eingeben muss, im nachgang, was aber wiederrum eine modifizierung der Datensaetze bedeuten würde! 



> Nein. Erfasst wird nur, welches Lesegerät die Tür geöffnet  
> hat.


Und was ist mit der Zeit?
Sehe ich das richtig das dann zum Bsp folgender Datensatz angelegt wird?

Date = 01.01.2008
Zeit = 07:00 Uhr 
Name = Hans Meiser
PersCode = Null 
Acces = Was steht da ?
Key = Null
Mode = "kurz"



> Lieber nicht, sonst kommentieren wir das noch. :smile: Joe ist ja  
> nicht Schuld, der hat die Daten nur von einem Freund bekommen.

Das habe ich auch nicht behauptet Rainer. Es ist ziemlich wirr alles und er hat nun den Mist anna Backe kleben :s



> Für alle Mitarbeiter, aber nur für den 'Hintereingang', der  
> innen und außen je ein Lesegerät hat, das scheinbar die Tür  
> öffnet. Sind zwei Mitarbeiter zusammen, wird nur der erfasst,  
> der die Tür öffnet.

Gut, also steht unter Access = "Hintereingang" oder ?
Dann muesstest du eine Abfrage bauen alla



    
    Alle Mitarbeiter
    WO Access = Hintergang ist




Sehe ich das richtig ?



> Wie ich das ohne ADODC-Steuerelement schaffe, weiß ich nicht.  
> 
> > -(


Naja pass auf. Das Flexgrid, damit habe ich net allzuoft gearbeitet sondern mehr mit dem Datagrid :/
Hat das Felxgrid eine Eigenschaft DataSource ?



> Das wäre der Wunsch gewesen. :smile: Ich wollte das Recordset mit  
> dem SQL-String filtern, sortieren ... aber das habe ich erst  
> mal nicht geschafft.


Naja das sollte net das Thema sein :smile: 


> Und der Vorgang ist auch nicht so sehr exotisch, hilft bei  
> anderen Problemen auch, deshalb wäre es schön, das noch fertig  
> zu bekommen.

Na das denke ich doch mal :smile: So kompliziert hört sich das nicht an :smile:



> Gruß, Rainer

MfG Alex