Access: Lücken in Pivot Chart darstellen

MrsDummy

Grünschnabel
Hi, ich bastele an einer Pivot Chart herum.

Folgende Felder:

Objekt (sind insgesamt 7)
Messwert
Messzeit

Die Messungen werden minütlich durchgeführt und als Excel-Tabelle bereitgestellt.

14.03.2014 00:01
14.03.2014 00:02
14.03.2014 00:03 usf. (insgesamt 7 x 24 x 60 = 10.080 Messwerte pro Tag)

Über eine Verknüpfung mit Access wird jeden Tag um dieselbe Uhrzeit eine Pivot Chart mit den Daten vom Vortag gedruckt. Soweit kein Problem.

Jetzt soll der Graph aber auch Lücken anzeigen. Sprich: wenn die Daten aus Excel Lücken haben (was manchmal vorkommt, wenn das Messgerät Aussetzer hat), zum Beispiel so:

14.03.2014 00:01
14.03.2014 00:02
14.03.2014 01:17
14.03.2014 01:18 usf.,

soll das in der Chart an der entsprechenden Stelle sofort erkennbar sein.

Ich habe versucht, es über mehrere Abfragen zu lösen - klappt aber nicht.
Ich dachte, ich erstelle eine Matrix mit den 3 Spalten, die ich dann täglich aktualisieren lasse.
Das scheint zu sehr um die Ecke gedacht****? Es klappt nicht, vielleicht auch, weil ich einen Fehler mit den Datentypen mache (aus Excel kommt Datum & Uhrzeit in einem Feld, aber ich brauche ja immer nur die Uhrzeit).

Oder geht das einfacher? Wie kann ich Access dazu überreden, die Lücken zu finden und jeder fehlenden Minute im Graphen den Messwert "0" zuzuordnen?

Könnt Ihr mir da helfen? Bin VBA-Laie, leider.
 
Zuletzt bearbeitet:
Mit SQL, vergiss es.
Aber so müsste es gehen.

Visual Basic:
Public Sub completeTimeList()
    'Tabellennamen und Spaltennamen definieren
    Const C_TABLE_NAME As String = "[my_table]"
    Const C_TIME_COLUMN As String = "[messzeit]"
        
    'SQL-Spezifische Dinge defineren
    Const C_SQL_DATETIME_FORMAT As String = "\#mm\/dd\/yyyy hh:nn:ss\#"
    Const C_SQL_PATTERN As String = "INSERT INTO " & C_TABLE_NAME & " (" & C_TIME_COLUMN & ") VALUES (%s)"
    
    'Erster und letzter Eintrag auslesen
    Dim startTime   As Date:    startTime = DMin(C_TIME_COLUMN, C_TABLE_NAME)
    Dim endTime     As Date:    endTime = DMax(C_TIME_COLUMN, C_TABLE_NAME)
    
    'Differenz in Minuten berechnen
    Dim cntMinutes  As Long:    cntMinutes = DateDiff("n", startTime, endTime)
    Dim actTimeS    As String
    Dim delta       As Long
    
    'Über alle Differezminuten iterieren. Erste und letzt können ausgelassen werden
    For delta = 1 To cntMinutes - 1 Step 1
        'Datum berechenen: startDate + delta Minuten
        'Das ganez in ein SQL-String formatieren: #mm/dd/yyyy hh:nn:ss#
        actTimeS = format(DateAdd("n", delta, startTime), C_SQL_DATETIME_FORMAT)
        'Prüfen ob diese Uhrzeit in der Tabelle vorhanden ist
        If DCount("*", C_TABLE_NAME, C_TIME_COLUMN & " = " & actTimeS) = 0 Then
            'Wenn nicht, einfügen
            CurrentDb.execute replace(C_SQL_PATTERN, "%s", actTimeS)
        End If
    Next delta
End Sub

Die Performance ist mässig. Es gibt sicher auch noch schnellere Varianten
Ideen dazu:
- Index auf die Messzeit legen
- Alle Messzeiten vorher in ein Dictionary cachen (Messwert als key) und dieses mit .exist() prüfen
 
Sorry, dass ioch so spät antworte, aber jetzt will mein Auftraggeber auf eimal etwas ganz anderes, grrrr. Ich werde das aber auf jeden Fall inspizieren - zugegebenermaßen nicht ganz einfach für mich SQL-Klaus :D
 

Neue Beiträge

Zurück