Dbf Datei mit vb6 auswerten ?

und da ist mir doch glatt ein Fehler unterlaufen :s
Richtig muss es heissen

If **not** IsNull(rs(i)) then MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs(i)

MfG Alex

Moin, iht 2.
Das kind ist im Bett und die frau versorgt. (es geht weiter)

In der Theorie habe ich die abfrage schon fertig. aber Praktisch sieht es anders aus.
Ich denke es ist am einfachsten. die Datenbank zeile für Zeile durchzugehen und immer wenn in der Access Spalte steht hintertür aussen wird Mitarbeiter Datum Zeit in eine variable gelesen und mit Findnext "gleicher Mitarbeiter am gleichem Tag who Access Hintertür innen. dort den wieder alles lesen und von miraus in eine Liste zusammenwürfeln. gerade am Anfang der Datenbank gibt es ein paar datensätze die wohl durch testen der Tür oder der Karten entstanden sind aber wenn am gleichen Tag einfach kein ausgang erfolg kann der erstmal verworfen ignoriert werden.

Ich starte mal VB und melde mich wieder.
bis hier Danke! habe mir eure einträge oben nun mehrfach durchgelesen und behaupte sie auch zu verstehen :smile: mal schauen wie es weitergeht
mfg joe

Hi Alex,

nagut dann schauen wir mal was sich da machen laesst :smile:
Aber wie gesagt, ich habe kein VB mehr

??? Das geht? … *fg*

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

Ja, weiß ich.

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

Ja, klar. :frowning: Mit ‚If Isnull()‘ gehts. Daten sind da.

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?

Ja, wie ich eine Funktion verwende weiß ich.

*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.

Jetzt würde es gehen, ja. :smile: Damit komme ich zurecht.

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?

Das weiß Niemand von uns. Joe hat die Daten ja auch nur so bekommen.

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

Was verstehst du unter DupKeys ?

Doppelte Einträge, der Inhalt aller Felder identisch. Beim Anlegen von Tabellen kann man das für künftige Datensätze zulassen, oder auch nicht. Üblich ist, das nicht zuzulassen. :smile:

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 :confused:

Ich habe ja schon geschrieben, wenn mein Zugangssystem das machen würde, hätte ich für die Anschaffung eines Neuen gesorgt und dem Chef empfohlen, das hier nicht zu bezahlen.

Daß das so ist, ist ja die Ursache, warum Joe sich damit beschäftigt.

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!

Man kann eben nur die Tage auswerten, an denen zufällig Eingangs- und Ausgangsdaten vorhanden sind. Über die anderen Tage kann man nichts sagen. Als Anwesendheitskontrolle ist das nicht aussagekräftig.

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

20080101

Zeit = 07:00 Uhr

07:00:00

Name = Hans Meiser

Ja

PersCode = Null

Ja, aber ‚NULL‘

Acces = Was steht da ?

‚Hintereingang innen‘ oder ‚Hintereingang außen‘

Key = Null

‚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 ?

'LIKE ‚Hintereingang%‘ weil innen und außen unterschieden wird.

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 :confused:

Mit dem verbugten Ding? Dann bau ich mir lieber selbst was. :frowning:
Du hast ja kein VB6 mehr, sonst würde ich Dir jetzt einen hübschen Bug zeigen. :smile:

Hat das Felxgrid eine Eigenschaft DataSource ?

Ja, aber zur Laufzeit schreibgeschützt.

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:

Mit DAO ging es nicht, mit ADO geht es jetzt. :smile: Ein Punkt für Dich.

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:

Ja, OK.

Das Problem ist ja gelöst und ich habe jetzt einen schönen Code zum Abschreiben. :smile:

Danke!

Gruß, Rainer

Code zum Abschreiben OO NEED.
Ich war aber auch fleissig
Was mich nur stört ist es das es tatsächlich leute gibt die 3 mal am tag rein aber nur einmal rausgehen … das sollte bestraft werden.
mfg joe

Private Sub Command6\_Click()
Dim Fund As Integer
Fund = 0

 Data1.Recordset.MoveFirst
 While Data1.Recordset.EOF = False
 If Data1.Recordset("ACCESS") = "Hintereingang au¯en" Then
 Data2.Recordset.MoveFirst
 While Data2.Recordset.EOF = False

 If Data2.Recordset("ACCESS") = "Hintereingang au¯en" And Data1.Recordset("NAME") = Data2.Recordset("NAME") And Data1.Recordset("TIME") = Data2.Recordset("TIME") And Data1.Recordset("DATE") = Data2.Recordset("DATE") Then
 Fund = 1
 End If

 If Fund = 1 And Data2.Recordset("Access") = "Hintereingang innen" And Data2.Recordset(0) = Data1.Recordset(0) And Data2.Recordset(2) = Data1.Recordset(2) And Data2.Recordset(1) \> Data1.Recordset(1) Then
 Fund = 0
 List1.AddItem Data1.Recordset(0) & Chr(9) & Data1.Recordset(2) & Chr(9) & Data1.Recordset(1) & Chr(9) & Data2.Recordset(1)
 End If

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

Hi Joe,

Code zum Abschreiben OO NEED.

*gg*

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 Not IsNull(rs(i)) Then
 MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, i) = rs(i)
 End If
 Next
 MSHFlexGrid1.Rows = MSHFlexGrid1.Rows + 1
 rs.MoveNext
 Wend
 Me.Caption = n
End Sub

Ich war aber auch fleissig
Was mich nur stört ist es das es tatsächlich leute gibt die 3
mal am tag rein aber nur einmal rausgehen … das sollte
bestraft werden.

Wer da bestraft werden sollte ist der Hersteller des Systems. :smile:
Wenn ich nicht schon ‚Zeus‘ hätte, würde ich nach dem Namen fragen um zu wissen, was ich nicht will. :smile:

Gruß, Rainer

Hi Alex,

und da ist mir doch glatt ein Fehler unterlaufen :s
Richtig muss es heissen

If not IsNull(rs(i)) then
MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs(i)

das war klar, das habe ich natürlich so eingebaut. :smile:

Gruß, Rainer

sooooo

  1. ADODB.Connection bekomme ich über ADODC Steuerelement wo ich als Database Connection auf mein dbf File verweise ? richtig ?

  2. MSHFlexGrid1 ist ein MSFlexGrid welches umbenannt wurde ?

  3. sPath = „c:“ ??

bis gleich mfg Joe

Hallo Joe,

das ist doch aber wie Porsche fahren mit angezogener Handbremse :confused:
Wenn du einfach nur alle Datensaetze haben magst, wo der Mitarbeiter x einmal die Tuere innen und einmal die Türe aussen betaetigt hat, so bedarf das nen kleines Statement. Dann haste alle Daten. Ist x mal schneller, nicht so störanfaellig und Resourcenschoenender :smile:

Ich selbst habe lange nichts mehr mit SQL gemacht. Aber dazu hamma ja hier nen SQL Brett, die dir sicherlich den Syntax sagen koennen.

Ich muesste jetzt mal probieren wie der Syntax genau lautet, aber du muesste zwei Select Abfragen schachteln. Ist eigentlich nicht kompliziert :s Einmal eine Abfrage Where Access = ‚Hintertür aussen‘ und dann bei der zweiten einfach das Datum vergleichen und Access = Hintertür innen" And Mitarbeiter = Mitarbeiter :smile:

Somit hast du dann in deinem Recordset, nur noch alle Mitarbeiter die die Tuere am gleichen Tag einmal von innen und einmal von aussen benutzt haben :smile:

MfG Alex

Hallo Rainer,

und klappt das nun mit „Null Abfrage“ ?

MfG Alex

Hi Joe,

  1. ADODB.Connection bekomme ich über ADODC Steuerelement wo
    ich als Database Connection auf mein dbf File verweise ?
    richtig ?

Nein, ohne Steuerelement. Nur der Verweis auf ‚Microsoft ActiveX Data oBject 2.0 Library‘.

  1. MSHFlexGrid1 ist ein MSFlexGrid welches umbenannt wurde ?

Nein, das andere Flexgrid. VB6 hat zwei davon. Das MSFlexgrid für DAO, das MSHFlexgrid für ADO.

  1. sPath = „c:“ ??

Da habe ich das File ‚perslog.dbf‘ abgelegt, dann werden die zu tippenden Pfade kurz. :smile: Ich bin eben ein Faultier.

Nun noch mal mit dem richtigen SQL-String:

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 WHERE Access LIKE 'Hinter%' ORDER BY NAME, DATE, TIME"
 .ActiveConnection = cnn
 .Open
 End With
 End If


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

Gruß, Rainer

Hi Alex,

und klappt das nun mit „Null Abfrage“ ?

ja, alles perfekt. Ich habe Joe eben den geänderten Code mit dem passenden SQL-String gepostet …

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 WHERE Access LIKE 'Hinter%' ORDER BY NAME, DATE, TIME"
 .ActiveConnection = cnn
 .Open
 End With
 End If


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

Danke für die Hilfe, so sieht das doch schon sehr viel freundlicher aus. :smile:

Gruß, Rainer


hatte ich mal erwähnt das auf meinem Firmenlaptop
Win2k Sp4 Installiert ist :///
[Microsoft][ODBC dBASE Driver] Die Ausgewählte Sortierreihenfolge wird nicht vom Betriebssystem unterstützt.

Wenn es dafür keine Lösung gibt werde ich morgen erstmal fragen was für ein System die Datenbank füttert.

Kurz dachte ich, alles wäre gut :stuck_out_tongue:

mfg joe

-> .Open

Hallo Rainer,

kürzer, uebersichtlicher und Flexibler :smile:
Ich würde aber noch die RunSql Routine einbauen, smoit kannst du mit einem Aufruf jede Art von SQL Statements abschicken und somit die Daten nochmehr filtern. Je nach Auswahl :smile:

Aber meine eine Frage hast du mir noch net beantwortet :s

Hat das Flexgrid eine Eigenschaft DataSource oder bind etc. ?

MfG Alex

Hi Joe,

hatte ich mal erwähnt das auf meinem Firmenlaptop
Win2k Sp4 Installiert ist :///

Nein, noch nicht.

[Microsoft][ODBC dBASE Driver] Die Ausgewählte
Sortierreihenfolge wird nicht vom Betriebssystem unterstützt.

*gg* sach ma, ohne irgend welche Probleme geht es nicht … *fg*
Auf meinem Schelppi (XP-Home) läuft der Code. Daß das vom BS abhängt hätte ich nun wirklich nicht erraten.

Wenn es dafür keine Lösung gibt werde ich morgen erstmal
fragen was für ein System die Datenbank füttert.

‚Order By‘ weg lassen, dann sind die Datensätze nicht so sortiert, wie wir das gern hätten. Die Sortierung ist nicht in der Reihenfolge, wie die Felder in der Datenbank liegen, das kann Dein ODBC-Treiber scheinbar nicht. Versuch mal …
.Source = „SELECT * FROM perslog WHERE Access LIKE ‚Hinter%‘ ORDER BY NAME“
… nur nach Namen sortieren.

Kurz dachte ich, alles wäre gut :stuck_out_tongue:

Der Teil im SQL-String, der die Doppelten ausfiltert fehlt auch noch, aber das fällt mir einfach nicht ein, da muss ich in meinen Unterlagen nachsehen. Ich bin aber erst Mittwoch wieder in der Firma. Nur ob das dann geht, wenn Order By schon fehl schlägt? … Das Problem dabei ist DBase. Mit einer .mdb wäre das nicht passiert. Die haben wirklich Prügel verdient …

Gruß, Rainer

-> .Open

Ja, er versteht den SQL-String nicht, das passiert erst, wenn er angewendet werden soll.

Hi Alex,

kürzer, uebersichtlicher und Flexibler :smile:

klar. :smile:

Ich würde aber noch die RunSql Routine einbauen, smoit kannst
du mit einem Aufruf jede Art von SQL Statements abschicken und
somit die Daten nochmehr filtern. Je nach Auswahl :smile:

Das verstehe ich noch nicht. Vertagen wir das? Mir platzt gleich der Kopf. :smile:

Aber meine eine Frage hast du mir noch net beantwortet :s

Hat das Flexgrid eine Eigenschaft DataSource oder bind etc. ?

Doch, hast du überlesen. :smile:

Ja, die Eigenschaft .Datasource gibt es, aber die ist zur Laufzeit schreibgeschützt.

Gruß, Rainer

Hallo Joe

ich tippe mal darauf das der Fehler in der ORDERBY Klausel haengt!

Rainer schrieb folgendes

ORDER BY NAME, DATE, TIME

das bedeutet das die Daten nach dem Feld Name dann nach dem Feld Date und dann nach dem Time sortiert wird!
Hast du die ganzen Felder ? Wenn ja dann probiere mal ein Feld nach dem anderen rauszunehmen
Also

ORDERBY NAME
'danach 
ORDERBY NAME, DATE
'danach 
ORDERBY NAME, DATE, TIME

Wobei es sich bei Date, Name und Time bei VB6 um vorbelegte Worte handelt die man eigentlich nicht nehmen sollte!

Ansonsten schaue mal auf die Seite
http://www.visualbasic.at/forum/showflat.php?Cat=&Nu…
da hatte auch jemand das selbe problem :smile:

Wenn es dafür keine Lösung gibt werde ich morgen erstmal
fragen was für ein System die Datenbank füttert.

Brauchst du nicht! Das finden wir auch so :smile:

Kurz dachte ich, alles wäre gut :stuck_out_tongue:

Das wird es auch :smile:

mfg joe

MfG Alex

Hallo Rainer,

Das verstehe ich noch nicht. Vertagen wir das? Mir platzt
gleich der Kopf. :smile:

Ja das koennen wir machen. Hab aber erst morgen Abend wieder Zeit :s

Doch, hast du überlesen. :smile:

Autsch da war ich blind :s

Ja, die Eigenschaft .Datasource gibt es, aber die ist zur
Laufzeit schreibgeschützt.

Geht nicht die Zuweisung

Set Grid1.Datasource = DeinRecordset

Wobei Grid das Flexgrid ist :smile:

Gruß, Rainer

MfG Alex

1 Like

Das geht auch wenn eine PErson zum mittal ausgeht und später wieder ins gebäude rennt ? (vorrausgesetzt er benutzt den ein/ausgangsleser)

ich überleg mir das mal, ich hatte Sql in der Berufsschule , schon nicht kappiert :confused: und dem Ausgebremsten Porsche kann ich gerade noch „verstehen“, mal schauen. Melde mich

Danke dir, mfg joe

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