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
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 mal schauen wie es weitergeht
mfg joe
Hi Alex,
nagut dann schauen wir mal was sich da machen laesst
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
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. 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
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.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. 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.
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.Auswertbare Daten sind der
Glücksfall.Das ist doch alles Mist oder
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.
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 :sFü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 allaAlle Mitarbeiter
WO Access = Hintergang istSehe 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
Mit dem verbugten Ding? Dann bau ich mir lieber selbst was.
Du hast ja kein VB6 mehr, sonst würde ich Dir jetzt einen hübschen Bug zeigen.
Hat das Felxgrid eine Eigenschaft DataSource ?
Ja, aber zur Laufzeit schreibgeschützt.
Das wäre der Wunsch gewesen.
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
Mit DAO ging es nicht, mit ADO geht es jetzt. 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
So kompliziert hört sich das
nicht an
Ja, OK.
Das Problem ist ja gelöst und ich habe jetzt einen schönen Code zum Abschreiben.
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.
Wenn ich nicht schon ‚Zeus‘ hätte, würde ich nach dem Namen fragen um zu wissen, was ich nicht will.
Gruß, Rainer
Hi Alex,
und da ist mir doch glatt ein Fehler unterlaufen :s
Richtig muss es heissenIf not IsNull(rs(i)) then
MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs(i)
das war klar, das habe ich natürlich so eingebaut.
Gruß, Rainer
sooooo
ADODB.Connection bekomme ich über ADODC Steuerelement wo ich als Database Connection auf mein dbf File verweise ? richtig ?
MSHFlexGrid1 ist ein MSFlexGrid welches umbenannt wurde ?
sPath = „c:“ ??
bis gleich mfg Joe
Hallo Joe,
das ist doch aber wie Porsche fahren mit angezogener Handbremse
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
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
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
MfG Alex
Hallo Rainer,
und klappt das nun mit „Null Abfrage“ ?
MfG Alex
Hi Joe,
- 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‘.
- 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.
- sPath = „c:“ ??
Da habe ich das File ‚perslog.dbf‘ abgelegt, dann werden die zu tippenden Pfade kurz. 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.
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
mfg joe
-> .Open
Hallo Rainer,
kürzer, uebersichtlicher und Flexibler
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
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
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
klar.
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
Das verstehe ich noch nicht. Vertagen wir das? Mir platzt gleich der Kopf.
Aber meine eine Frage hast du mir noch net beantwortet :s
Hat das Flexgrid eine Eigenschaft DataSource oder bind etc. ?
Doch, hast du überlesen.
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
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
Kurz dachte ich, alles wäre gut
Das wird es auch
mfg joe
MfG Alex
Hallo Rainer,
Das verstehe ich noch nicht. Vertagen wir das? Mir platzt
gleich der Kopf.
Ja das koennen wir machen. Hab aber erst morgen Abend wieder Zeit :s
Doch, hast du überlesen.
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
Gruß, Rainer
MfG Alex
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 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]