Translate

Mittwoch, 24. April 2013

MS ACCESS: Alle Spalten einer Kreuztabellenabfrage summieren

Die Kreuztabellenabfrage hat die Aufgabe Daten nach Zeilen und Spalten zu gruppieren.

In der folgenden Abbildung werden Auftragsdaten nach Jahrgang zeilenweise gruppiert und nach Monat spaltenweise und der Umsatz summiert:

Der SQL-Code dazu sieht wie folgt aus:
TRANSFORM Sum([Einzelpreis]*[menge]) AS Umsatz
SELECT Year([ErstelltAm]) AS Jahrgang
FROM tblAuftragsdaten
GROUP BY Year([ErstelltAm])
PIVOT Month([ErstelltAm]);


An dieser Stelle besteht häufig der Wunsch die Monatsspalten 1 bis 12 zu summieren, um die Jahressumme zuzätzlich abzubilden.
Dies ist durchaus möglich und könnte so aussehen:
Erreicht wird dies ganz einfach mit folgender kleinen Erweiterung im SQL-Code:
TRANSFORM Sum([Einzelpreis]*[menge]) AS Umsatz
SELECT Year([ErstelltAm]) AS Jahrgang, Sum([Einzelpreis]*[menge]) AS Jahresumsatz
FROM tblAuftragsdaten
GROUP BY Year([ErstelltAm])
PIVOT Month([ErstelltAm]);


In der Entwursansicht wird dies folgendermaßen hinterlegt:

Eine Endsummenzeile läßt sich über eine Abfrage (SQL-Code) nicht erzeugen.
Ab der Version 2007 ist  Access zwar in der Lage eine solche Endberechnungszeile darzustellen, doch diese wird nicht aus dem SQL-Code erzeugt, sondern die Datenblattansicht von Access berechnet und stellt diese Endzeile dar.

Dienstag, 23. April 2013

MS EXCEL: Inhalt eines ADO- oder DAO-Recordset-Objekts in ein Arbeitsblatt kopieren

Mit der Methode CopyFromRecordset läßt sich sehr einfach und schnell den kompletten Inhalt eines ADO- oder DAO-Recordset-Objekts in einem Tabellenblatt ausgeben.

Hier ein Beispiel mit dem Objekt DAO (Verweis auf Microsoft DAO 3.6 erforderlich)
Public Sub HoleDaten()
    Dim db As DAO.Database, rs As DAO.Recordset
    Dim rgTarget As Range, anz As Long, iCols As Integer
   
    Set db = Dao.OpenDatabase("MeineDatenbankDatei.mdb")
    Set rs = db.OpenRecordset("MeineTabelle")
    Set rgTarget = Tabelle1.Range("A1")
    For iCols = 0 To rs.Fields.Count - 1
        rgTarget.Parent.Cells(rgTarget.Row, rgTarget.Column + iCols).Value = rs.Fields(iCols).Name
    Next
    Set rgTarget = rgTarget.Offset(1)
    anz = rgTarget.CopyFromRecordset(rs)
    MsgBox "Anzahl eingefügte Datensätze: " & anz
End Sub


Laut Tip aus meinem Post datenbankzugriff-per-vba-via-dao hier eine fertige Funktion mit Variante ohne erforderlichen Verweis auf Microsoft DAO 3.6: 
Public Function CopyFromRecordsetEX(DatenbankDatei As String, sql As String, Zielbereich As Object, Optional MitÜberschriften As Boolean = True _
                            , Optional MaxZeilen As Long, Optional MaxSpalten As Long _
                            , Optional ByRef AnzahlDatensätze As Long) As Boolean
    Dim oDAO As Object, db As Object, rs As Object, fld As Object
    Dim Klassenname As String
   
    On Error GoTo Err_Handle
    Klassenname = "DAO.DBEngine.36"
    If Application.Version > "11.0" Then Klassenname = "DAO.DBEngine.120"
    Set oDAO = CreateObject(Klassenname)
   
    Set db = oDAO.OpenDatabase(DatenbankDatei)
    Set rs = db.OpenRecordset(sql, dbOpenSnapshot)
   
    If Zielbereich Is Nothing Then Set Zielbereich = ActiveCell
    Set Zielbereich = Zielbereich(1)
    MaxZeilen = Zielbereich.Parent.Rows.Count - Zielbereich.Row
    MaxSpalten = Zielbereich.Parent.Columns.Count - Zielbereich.Column
    If MitÜberschriften Then
        For Each fld In rs.Fields
            Zielbereich = fld.Name
            Set Zielbereich = Zielbereich.Offset(, 1)
        Next
        Set Zielbereich = Zielbereich.Offset(1, -rs.Fields.Count)
    End If
    AnzahlDatensätze = Zielbereich.CopyFromRecordset(rs, MaxZeilen, MaxSpalten)
    CopyFromRecordsetEX = True

Exit_Proc:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    db.Close
    Set db = Nothing
    Set oDAO = Nothing
    Exit Function
   
Err_Handle:
    Beep
    MsgBox Err.description, vbCritical, "Error number: " & Err.Number
    Resume Exit_Proc
End Function

Montag, 22. April 2013

MS ACCESS: Verwenden von OK/Abbrechen/Übernehmen Schaltflächen in Formularen

Aufgabenstellung:
Der Wunsch ist die drei klassischen Befehlsschaltflächen OK / Abbrechen / Übernehmen in einem Access-Formular abzubilden mit entsprechenden Funktionalitäten:



OK - Befehlsschaltfläche:
Datensatz speichern (wenn nötig) und Fenster schliessen (wenn erfolgreich gespeichert)

Abbrechen - Befehlsschaltfläche:
Formular schliessen ohne aktuelle Änderungen im Datensatz zu speichern

Übernehmen - Befehlsschaltfläche:
Datensatz speichern und die Übernehmen - Befehlsschaltfläche deaktivieren
 
Mit dem Einsatz der richtigen Formular-Ereignisprozeduren, lassen sich die Anforderungen gut lösen. 
Die Prozeduren die sich im Formular frmProdukt in der datei 'SchaltflächenOkAbbrechenÜbernehmen.mdb' befinden, können in jedes Formular übertragen und genutzt werden. Anpassungen sind nur dann notwendig, wenn bereits die gleichen Ereignisprozeduren verwendet worden sind. Dann müssen die Befehle aus der Ereignissprozeduren in die bestehenden von Ihrem Projekt reinkopiert werden.


Die Beispiel-Datei kann unter folgenden Link heruntergeladen werden:
SchaltflächenOkAbbrechenÜbernehmen.zip 

Voraussetzung:
MS Access 2010, 2007, 2003, 2002 oder 2000