Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Zeitstempel / Transaction Logs abfragen

Begonnen von streetfox, Januar 01, 2011, 23:42:20

⏪ vorheriges - nächstes ⏩

streetfox

Hallo!

ich suche nun schon einige Zeit rum und werde nicht wirklich fündig. Ich habe das Problem dass ich Statistiken über ein Transaction Log machen muss, also hier als minimalbeispiel

AnfragenummerKategoriePersonZeitstempel
1AuftragserteilungHerr A1.1.2011
1AuthorisierungHerr B2.1.2011
1BestellabwicklungFrau A3.1.2011
2AuftragserteilungHerr A3.1.2011
1AbschlussFrau B4.1.2011
2AuthorisierungFrau B4.1.2011
3Nur AnfrageFrau B4.1.2011
1RücksendungFrau B4.2.2011

Bemerkung: Auch wenn es so aussieht, es ist keine Reihenfolge vorgeschrieben. D.h. Es kann
auch "Nur Anfragen" geben die für sich alleine stehen und keine Bestellabwicklung haben (aber eine andere Anfragenummer haben)..

Nun möchte ich z.B. wissen:

  • Wieviele Anfragen (generell) sind von --- bis --- sind eingegangen?
  • Wie lange dauerte es zwischen dem ersten Eintrag der Anfrage bis zum letzten Eintrag der Anfrage?
  • Wie lange dauerte es zwischen Authorisierung bis zur Bestellabwicklung im Durchschnitt?

Kennt jemand gute Online Ressourcen für derartige Probleme, Bücher? Oder weiss jemand selbst gerade guten Rat?

Mit freundlichen Grüssen
streetfox

DF6GL

#1
Hallo,


das Ganze ist mit normalen Abfragen, bzw. mit den Aggregatfunktionen DCount, DFirst, DLast, Davg  zu lösen.


z. B.  für den ersten Punkt:

(Abfrage-SQL-String)
Select count (*) from tblTabelle where
(mit Dcount)

Dim Anz as Long, datStartdatum as Date, datEnddatum as Date
datStartdatum =#1/1/2011#
datEnddatum =  #1/4/2011#
Anz=DCount("*","tblTabelle" ,"Zeitstempel between " & Format (datStartdatum,"\#yyyy-mm-dd\#") & " and "  & Format(datEnddatum ,"\#yyyy-mm-dd\#")
Msgbox Anz




Punkt 2:

Zunächst Abfrage ("abfZeitAsc") erstellen, die nach Zeitstempel aufsteigend sortiert. Diese Abfrage für DFirst und DLast benutzen:

Dim Dauer as Long, lngAbfNr as long
lngAbfNr =1
Dauer = Dlast ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr) - DFirst ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr)


Punkt 3:

Wie oben mit Kombination aus den Dcount, Dfirst und Dlast-Funktionen und mit angepassten/erweiterten Kriterien.



PS: Im Fall, dass die Abfragen/Funktionen keine Datensätze/Werte liefern, sind die Dxxx-Funktionen mit der nz()-FUnktion auf "NULL" zu prüfen:

Dauer = NZ(  Dlast ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr) ,0 )  -   NZ(   DFirst ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr),0 )


Desgleichen muß  bei der evtl. vorkommenden Divison durch 0 bei der Durchschnittsberechnung dieser Fall gesondert behandelt werden.



accessundich

Da hat Dir der Franz bereits die Lösung geliefert.

Du solltest Dich mit SQL beschäftigen und mein erster Tipp hierzu wäre eine URL:
http://www.sql-und-xml.de/sql-tutorial/group-by-zum-aggregieren-auswerten-von-daten.html
Mit Aggregat-Funktionen und GROUP BY Daten auswerten und aggregieren

Als Buch-Tipp:
John-Harry Wieken: SQL - Einstieg für Anspruchsvolle. Inkl. Lösungen und Lerntest, Beispiele, mit CD. Addison-Wesley. ISBN 978-3-8273-2485-6. 29,95 Euro.

Für das iPad:
SQL Reference for iPad.
Schöne App, die direkt (nach Download auch Offline) sowohl den VBA-Befehlssatz für Access 2003 und 2007 als auch eine passende SQL Reference liefert. Dazu DB2, MySQL, Oracle, PostgreSWL, SQL Server und SQLite.

Brauchbar auch die App "iSQL".

Viel Erfolg
Andreas
---
Ich stelle keine komischen Fragen: Ich bin komisch.

streetfox

Hallo

vielen Dank schonmal!

die Datensätze sortieren hatte ich tatsächlich schon gemacht, nur erschien mir meine Lösung (aufgrund fehlender Erfahrung) etwas handbacken, die Frage dazu kommt grad. Freut mich aber, dass man es tatsächlich so in Angriff nehmen muss. Generell etwas SQL kenne ich schon, nur die Problematik mit Zeitstempeln habe ich nirgends gefunden.  Das Buch habe ich soeben gekauft ;-)- Die iPad App klingt klasse, besten Dank, werd ich mir auch gerade beschaffen!

Trotzdem noch eine Frage
Bei Beispiel 1 muss ich ja eine Abfrage erstellen und die danach zählen. Nur: Wie kriege ich eine Abfrage hin die
a) keine Dubletten in der "Anfragenummer" hat (wär ja eig. Distinct) UND
b) jeweils den ersten Eintrag einer "Anfragenummer" bringt?
Zuerst nach Anfragenummer sortieren, dann nach Datum und jeweils den ersten Eintrag nehmen? Da weiss SQL doch nicht welchen Eintrag ich meine, es sei denn ich sage: Nimm immer den frühesten. Wäre das korrekt?

Hierzu auch folgender Eintrag in der MS KB zu DFirst / DLast der mich verunsichert:
Zitat von: http://support.microsoft.com/default.aspx?scid=kb%3Bde%3BD39205Konstruktionsbedingt melden die Funktionen DFirst() (DomErsterWert) und DLast() (DomLetzterWert) den ersten und den letzten Datensatz, den Sie in die zugrundeliegende Tabelle eingegeben haben, und nicht den ersten und letzten Datensatz gemäß Tabellenindex oder der Sortierreihenfolge der Abfrage. Die Funktionen DFirst() und DLast() ignorieren alle Formen von Indizes, auch Primärschlüssel und Sortierreihenfolgen.

In diesem Artikel wird beschrieben, wie Sie benutzerdefinierte Domänenfunktionen schreiben können, die den Funktionen DFirst() und DLast() ähneln. Die benutzerdefinierten Domänenfunktionen DStart() und DEnd() aus diesem Artikel melden den ersten und den letzten Datensatz gemäß der Auflistung in einer sortierten Abfrage.

Vielen Dank für Eure Hilfe

DF6GL

Hallo,

in der Tat machen Dfirst und DLast nicht das, was man erwartet...

Hier zwei Ersatzfunktionen:

Public Function DStart(ColName As String, Tablename As String, krit As String, Sortfield As String)
Dim rs As DAO.Recordset
   On Error GoTo DStart_Error

If Len(ColName) = 0 Then Exit Function
If Len(Tablename) = 0 Then Exit Function
If Len(Sortfield) = 0 Then Exit Function


If Len(krit) = 0 Then
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "]", dbOpenSnapshot)
Debug.Print ("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "]")
Else
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] where " & krit & " order by [" & Sortfield & "]", dbOpenSnapshot)
End If

If rs.RecordCount > 0 Then
rs.MoveFirst
DStart = rs(0)
End If



rs.Close: Set rs = Nothing

exit_Function:
   Exit Function

DStart_Error:

    MsgBox Err.Number & " " & Err.Description
    Resume exit_Function
End Function

Public Function DEnd(ColName As String, Tablename As String, krit As String, Sortfield As String)
Dim rs As DAO.Recordset
   On Error GoTo DEnd_Error

If Len(ColName) = 0 Then Exit Function
If Len(Tablename) = 0 Then Exit Function
If Len(Sortfield) = 0 Then Exit Function



If Len(krit) = 0 Then
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "] desc", dbOpenSnapshot)
Debug.Print ("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "]")
Else
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] where " & krit & " order by [" & Sortfield & "] desc", dbOpenSnapshot)
End If

If rs.RecordCount > 0 Then
rs.MoveFirst
DEnd = rs(0)
End If



rs.Close
Set rs = Nothing
exit_Function:
   
   Exit Function

DEnd_Error:

    MsgBox Err.Number & " " & Err.Description
    Resume exit_Function
End Function



Die "Dupletten" sind keine solchen, weil die Abfragenummer als Kriterium auftaucht, d. h. auftauchen muß.



streetfox

Danke, ich tu mir das mal an ;-)

Aus Eurer Erfahrung raus, lohnt es sich die normalisierten Daten zu rekonstruieren und in Tabellen zwischenzuspeichern?

Tabelle 1 (Anfragen) [Mit DISTINCT rekonstruieren)
AnfragenrWeitere
1...
2...
3...


Tabelle 2 (Ereignisse)
ZeitstempelKategorieAnfragenrPerson
1.1.2011Auftragserteilung1Herr A
2.1.2011Authorisierung1Herr B
3.1.2011Bestellabwicklung1Frau A
3.1.2011Auftragserteilung2Herr A

accessundich

Zur Laufzeit der DB reicht es vielleicht mit "Disconnected Recordsets" zu arbeiten. Dann brauchst Du keine Tabellen. Ansonsten, ich trau mich hier fast nicht es zu sagen, meine geliebten Arrays eignen sich auch wunderbar zum arbeiten, anstelle temporärer Tabellen.

Viele Grüße
Andreas
---
Ich stelle keine komischen Fragen: Ich bin komisch.

DF6GL

Hallo,

ich denke, hier steht (ausnahmsweise   ;D  )  mal nicht die Normalisierung im Vordergrund, die sich eh nur auf die "Kategorie" und die "Person" auswirkte. (Ich denke mal, die Anfragenummer ist eh schon in einer weiteren Tabelle näher definiert).




Der Lösungsweg liegt darin, nach der Abfragenummer  (und ggfls. nach einem Zeitbereich) zu filtern  und nach dem Zeitstempel zu sortieren, um eben Anfangswert und Endwert zu erhalten und die Berechnungen unter Verwendung der gelieferten Werte der besagten Funktionen durchzuführen.


streetfox

nuja, wahrscheinlich ist die Anfragenummer in einer anderen Tabelle. Nur ist der Datensatz (wie im Minimalbeispiel) das einzige was mir zur Verfügung steht  :-\