none
DAO Recordset | Datenblatt Formular keine Sortierung| Trennung Applikation Datenbank | RRS feed

  • Frage

  • Hallo zusammen,

    ich versuche gerade eine Access Datenbank in eine Applikationsebene (eigene Access Datei) und Datenbankebene (eigene Accessdatei) zu splitten. Ich habe alle Formulare, Reports, Programmcodes in die Access Applikationsebene gepackt in der Datenbankebene existiert kein Quellcode. Nur die reinen Tabellen mit Ihren Beziehungen. Das ist mir auch gelungen.

    Nun habe ich Formulare als Datenblätter definiert und möchte diese mit den Daten der nun externen  Datenbankebene befüllen. Auch das hat über das DAO.Recordset geklappt. Ich nutze die Form.Recordset Eigenschaft zum Binden des gefüllten recordsets an das Formular (Quellcode unten) Innerhalb des Datenblattes möchte ich nun ganz normal die Datensätze über die Kopfzeile oder Rechtsklick "von A-Z sortieren".  

    Hier stoße ich an (meine) Grenzen. Folgende Effekte erziele ich mit meinem Quellcode:

    1. Das Formular wird normal (einmalig) befüllt und zeigt die Datensätze wie gewünscht an

    2. Die RecordSource Eigenschaft des Formulars wird mit dem Namen (erste 256 Zeichen SWL Statement des Recordset) gefüllt

    3. Möchte ich nun sortieren (Klick auf Kopfzeile "Nach A-Z Sortieren") zieht er die gefüllte RecordSource Eigenschaft. Dort verlangt er von mir einen Parameter. Interessanterweise ist es genau der letzte Teil des Namens des Recordsets, der nach 256 Zeichen abgeschnitten ist und in RecordSource steht. Gebe ich den ein scheint er auch zu sortieren. Danach kann ich normal sortieren. Bis ich das Formular schließe und wieder neu instanziiere. Während das Formular in der Applikationsebene offen ist, ist auch die Datenbankebene geöffnet, so das die Verbindung scheinbar zwischen recordset und Datenbank besteht. Ich habe keine Idee mehr. Wer hat dazu eine ?

    Folgenden Quellcode verwende ich:

    Microsoft Klassenobjekte (Formulare)

    Form_frm_issuelist_all

         

     Private Sub Form_Load()
        Call fillFormular
    End Sub

    Public Function fillForm(o_Form As Form, str_SQLString As String) As DAO.Recordset
        Dim rs_data As DAO.Recordset2
        Set rs_data = MDL_DB.getRecordset(MDL_DB.connectDataBase(), str_SQLString)

        With o_Form
            Set .Recordset = Nothing
            Set .Recordset = rs_data
        End With

    End Function

    Modul Formulare MDL_FORMS       

    Public Function fillForm(o_Form As Form, str_SQLString As String) As DAO.Recordset
        Dim rs_data As DAO.Recordset2
        Set rs_data = MDL_DB.getRecordset(MDL_DB.connectDataBase(), str_SQLString)

        With o_Form
            Set .Recordset = Nothing
            Set .Recordset = rs_data
        End With

    End Function

    Modul Datenbank: MDL_DB

    Public Function connectDataBase() As DAO.Database
        Dim db As DAO.Database
        Set db = DBEngine.OpenDatabase(CurrentProject.Path & "\14_Arbeitsaufgaben_DB.accdb")
        Set connectDataBase = db
    End Function

    Public Function getRecordset(o_DAODatabase As DAO.Database, v_StatementOrTable As String) As DAO.Recordset
        Dim o_DAORecordset As DAO.Recordset
        Set o_DAORecordset = o_DAODatabase.OpenRecordset(v_StatementOrTable)
        Set getRecordset = o_DAORecordset
    End Function

    Dienstag, 6. August 2019 13:34

Alle Antworten

  • Hallo,

    Gibt es einen Grund für die Vorgehensweise (Recordset statt RecordSource)?

    Ansonsten würde folgendes reichen:

    Private Sub Form_Open(Cancel As Integer)
      Me.RecordSource = str_SQLString
    End Sub

    Verknüpfte Tabellen vorausgesetzt. Ansonsten könntest du wahlweise vorher alle Tabellen verknüpfen oder im SQLString den Pfad zum Backend bei jeder Tabelle angeben. 

    Außerdem:

    • Zum Splitten einer DB in Front- und Backend gibt es den Menüpunkt Database Tools => Move Data.
    • Verwendest du Multi-Value- bzw. Attachment-Fields? Wenn nicht, ist Recordset2 nicht nötig.

    Gruss - Peter


    Freitag, 9. August 2019 12:13
    Moderator