none
Form.RecordsetClone nicht als Quelle für Bericht nutzbar?

    Frage

  • Hallo  Allseits,

    ein rs aus einem SQL-String ist ja ohne Probleme als Quelle für einen Bericht nutzbar.
    Ist ein rs aus einem Form.RecordsetClone ein 'anderer' rs-Typ? Es kommt dann immer Fehlermeldung 'Typen passen nicht zusammen'.
    Hintergrund ist Euch sicher bekannt: So kann bzw.könnte im Fo beliebig gefiltert werden.
    Gibt es da eine Lösung?
    Meine Code:

    Set rsReport = Forms![Fo_Tab01_LV-3_00a].Form.RecordsetClone

    rsReport.MoveLast
    anzahl = rsReport.RecordCount
    MsgBox anzahl 'Anzahl wird korrekt angezeigt

    DoCmd.OpenReport "Be01_GA-RTF", acViewPreview
    rsReport.Close
    Set rsReport = Nothing

    Und dann im OpenBericht:

    Me.RecordSource = rsReport

    Ich danke für Euren Tipp - Gruß Steffen

    Sonntag, 26. Februar 2012 09:01

Antworten

  • Hallo!

    Wenn du zuvor den Bericht (z. B. unsichtbar) öffnest, sollte nur der gefilterte Datensatz verwendet werden.

    OutputReportTo "repPersonen", "idPerson=" & Me!idPerson, "RichTextFormat(*.rtf)", "", False, "", 0, acExportQualityScreen

    Mit:

    Private Function OutputReportTo(ByVal ReportName As String, ByVal WhereCondition As String, _
                                                  Optional ByVal OutPutFormat As Variant, Optional OutputFile As Variant, _
                                                  Optional ByVal AutoStart As Variant, Optional ByVal TemplateFile As Variant, _
                                                  Optional ByVal Encoding As Variant, Optional ByVal OutputQuality As AcExportQuality)
    
       DoCmd.OpenReport ReportName, acViewPreview, , WhereCondition, acHidden
       DoCmd.OutputTo acOutputReport, ReportName, OutPutFormat, OutputFile, AutoStart, TemplateFile, Encoding, OutputQuality
       DoCmd.Close acReport, ReportName
    
    End Function

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    • Bearbeitet Josef Pötzl Dienstag, 28. Februar 2012 17:23
    • Als Antwort markiert Steffen Brose Donnerstag, 1. März 2012 11:33
    Dienstag, 28. Februar 2012 17:11

Alle Antworten

  • Hallo!

    Grund für Fehlermeldung:
    Recordsource ist ein String. RecordsetClone ist entweder ein DAO.Recordset oder ADODB.Recordset.
    Du müsstest im Report Me.Recordset verweden. Das hilft allerdings auch nicht, da das nur ein einem ADP verfügbar ist.

    Du könntest den Filter aus dem Formular an den Bericht (über Docmd.Openreport) übergeben.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Sonntag, 26. Februar 2012 15:29
  • Hallo Steffen

    Steffen Brose wrote:

    Set rsReport = Forms![Fo_Tab01_LV-3_00a].Form.RecordsetClone

    Versuch' mal folgenden Ansatz:
    Me.RecordSource = rsReport.Name

    Falls Du auch noch Filter und Sortier Kriterien gesetzt hast, musst Du auch diese aus dem Form übernehmen.

    HTH
    Henry

    Montag, 27. Februar 2012 03:05
  • Hallo Henry,

    mit Me.RecordSource = rsReport.Name -> dann kommen alle Sätze im Bericht an.

    Zu Deinem: "Falls Du auch noch Filter und Sortier Kriterien gesetzt hast, musst Du auch diese aus dem Form übernehmen."

    Genau dies wollte ich mit dem clone vermeiden, weil ja im Fo auch benutzerdefiniert gefiltert werden kann und diese Filter dann nicht in Me.Filter drin stehen. Weißt Du wie ich meine?

    Gruß Steffen

    Montag, 27. Februar 2012 10:32
  • Hallo Steffen

    Wieso steht der Filter nicht in Me.Filter drin? Wenn das Formular gefiltert wird, selbst über den formularbasierenden Filter, wird dieser Filter immer in Me.Filter abgelegt und kann von dort ausgelesen werden.

    In Deinem Fall müsstest Du dann einfach diesen Filter dem Report ebenfalls übergeben, falls Me.FilterOn True ist.

    Aber aufgepasst: rsReport.Name beinhaltet nur die ersten 255 Zeichen des SQL Statements, das dem Recordset zu Grunde liegt. Du müsstest hier also noch ein bisschen was einbauen, falls da mal eine längere Query als Basis für das Formular verwendet wird, damit hier eine Fehlermeldung kommt.

    Gruss

    Henry

    Dienstag, 28. Februar 2012 02:28
  • Hallo Henry,

    ich habe es jetzt so (wohl "klassisch") gemacht:

    Dim filterReport As String
    filterReport = Forms![Fo_Tab01_LV-3_00a].Filter
    DoCmd.OpenReport "Be01_GA-RTF", acViewPreview, , filterReport

    und im Report:
    Me.FilterOn = True

    Schade zwar, dass der Report nicht eine rsclone annehmen kann und ich da jetzt wieder die Quelle im Report angeben muss (sollte für weitere Reportplanungen ohne Quelle sein), egal: Hauptsache es funktioniert erst mal.

    Ich danke Dir und Josef. Gruß Steffen

    Dienstag, 28. Februar 2012 09:30
  • Hallo!

    Falls du den Bericht mit unterschiedlichen Quellen (nicht nur unterschiedliche Filter) verwenden willst, könntest du überlegen, ob du den Bericht fix auf eine Abfrage einstellst und diese Abfrage vor dem Aufruf anpasst.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Dienstag, 28. Februar 2012 12:47
  • Josef, danke für Deinen Tipp zur Abfrage.

    Noch kurz, weil es dazu passt:
    OpenReport funktioniert mit dem Fo-Filter.
    Ist es möglich auch OutputReport diesen Fo-Filter 'irgendwie' mitzugeben?

    DoCmd.OutputTo acOutputReport, "Be01_GA-RTF", "RichTextFormat(*.rtf)", "", False, "", 0, acExportQualityScreen

    Danke Euch - Gruß Steffen

    Dienstag, 28. Februar 2012 16:19
  • Hallo!

    Wenn du zuvor den Bericht (z. B. unsichtbar) öffnest, sollte nur der gefilterte Datensatz verwendet werden.

    OutputReportTo "repPersonen", "idPerson=" & Me!idPerson, "RichTextFormat(*.rtf)", "", False, "", 0, acExportQualityScreen

    Mit:

    Private Function OutputReportTo(ByVal ReportName As String, ByVal WhereCondition As String, _
                                                  Optional ByVal OutPutFormat As Variant, Optional OutputFile As Variant, _
                                                  Optional ByVal AutoStart As Variant, Optional ByVal TemplateFile As Variant, _
                                                  Optional ByVal Encoding As Variant, Optional ByVal OutputQuality As AcExportQuality)
    
       DoCmd.OpenReport ReportName, acViewPreview, , WhereCondition, acHidden
       DoCmd.OutputTo acOutputReport, ReportName, OutPutFormat, OutputFile, AutoStart, TemplateFile, Encoding, OutputQuality
       DoCmd.Close acReport, ReportName
    
    End Function

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    • Bearbeitet Josef Pötzl Dienstag, 28. Februar 2012 17:23
    • Als Antwort markiert Steffen Brose Donnerstag, 1. März 2012 11:33
    Dienstag, 28. Februar 2012 17:11
  • Hallo Josef,

    so:

    filterReport = Forms![Fo_Tab01_LV-3_00a].Filter
    DoCmd.OpenReport "Be01_GA-RTF", acViewPreview, "Ab01_LV", filterReport, acHidden
    DoCmd.OutputTo acOutputReport, "Be01_GA-RTF", "RichTextFormat(*.rtf)", "", False, "", 0, acExportQualityScreen
    DoCmd.Close acReport, "Be01_GA-RTF"

    funktioniert es. Ich danke Dir - Gruß Steffen

    Donnerstag, 1. März 2012 11:25
  • [OT]

    Hallo!

    Ich würde mir solche wiederverwendbaren Code-Abläufe in einer Hilfsprozedur ablegen.

    OutputReportTo "repPersonen", "idPerson=" & Me!idPerson, "RichTextFormat(*.rtf)", "", False, "", 0, acExportQualityScreen

    im restlichen Code ist für mich übersichtlicher als

    filterReport = Forms![Fo_Tab01_LV-3_00a].Filter
    DoCmd.OpenReport "Be01_GA-RTF", acViewPreview, "Ab01_LV", filterReport, acHidden
    DoCmd.OutputTo acOutputReport, "Be01_GA-RTF", "RichTextFormat(*.rtf)", "", False, "", 0, acExportQualityScreen
    DoCmd.Close acReport, "Be01_GA-RTF"

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    Donnerstag, 1. März 2012 13:36
  • Hallo Josef, ich probier mal ob ich Deine OutputReportTo - Funktion hinbekomme.

    Gruß Steffen


    Donnerstag, 1. März 2012 15:33
  • Hallo Josef, mit:

    filterReport = Forms![Fo_Tab01_LV-3_00a].Filter
    OutputReportTo "Be01_GA-RTF", filterReport, "RichTextFormat(*.rtf)", "", False, "", 0, acExportQualityScreen

    funktioniert es 1A. Jetzt brauche ich anderer Stelle nur auswechseln und fertig ist. Funktionen müsste man 'könnnen'...

    Danke Dir - Gruß Steffen

    Donnerstag, 1. März 2012 16:00
  • Hallo!

    Noch etwas:

    filterReport = Forms![Fo_Tab01_LV-3_00a].Filter

    Wenn du das im Formular Fo_Tab01_LV-3_00a verwendest, würde ich Me.Filter schreiben, damit du das Formular auch einmal umbenennen oder als Unterformular verwenden kannst und dann nicht auch noch den Code umgestalten musst. Außerdem wäre es mit Me.Filter auch Mehr-Instanzen-fähig.

    mfg
    Josef

    PS: Bitte nicht meine Vorschläge zur Codeänderung nicht als Nörgelei von funktionierenden Code verstehen. Ich bin nur ein Freund von Code, der keine Kommentare benötigt, weil der Code selbst alles zeigt, was man zum Verstehen benötigt.
    ... Nicht umsonst freue ich mich immer wieder, wenn beim Live-Meeting das Thema "Code-Optimierung" - oder wie beim nächsten LM eventuell das Thema "VBA-Code-Inspector" (Tool von Thomas Möller) am Programm steht. ... diese Schleichwerbung musste einfach sein. :-)


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Donnerstag, 1. März 2012 16:09
  • Hallo Josef,

    mit dem Teil - steht jetzt im Fo -:

    Private Sub Befehl67_Click()
    filterReport = Me.Filter
    OutputReportTo "Be01_GA-RTF", filterReport, "RichTextFormat(*.rtf)", "", True, "", 0, acExportQualityScreen
    End Sub

    - funktioniert es wie gewünscht. Ich danke Dir.

    Der Hintergrund der ganzen Aktion ist:
    Für die Weitergabe von Ergebnissen aus einer A-DB ist sehr praktisch, zusätzlich zum pdf-Report ein Wordfile mitzugeben. So kann der Empfänger - wenn er denn muss/möchte - hier noch etwas einfügen (Überschriften, Kommentare etc.)... oder was immer er noch gedenkt zu tun.
    In der selbigen Art für zahlenlastige Reports - je nach Bedarf - dann auch neben dem pdf-Report ein Excelfile (mittels rs-Export a'la AEK9 von Michael).
    Zurück zu Word: Das nächste Thema ist da eben noch (meine Anfrage hast Du ja mit Sicherheit auch gelesen), dass das rtf-Teil zum Beispiel Seitenumbrüche einsetzt und jede Textzeile (in Access ist die Quelle ein Memo ohne Zeilenumbrüche) mit einem Zeilenumbruch bestückt.
    Dies lässt sich wohl auch nicht so einfach umgehen. Mein nächster Ansatz: Nach der rtf-Fertigstellung aus Access heraus das rtf 'bereinigen'. Deine Meinung zu diesem 'Ansatz'?

    Gruß Steffen
    Dein P.S.: Josef, ich  und Andere - die dieses Thema evtl. auch interessiert - haben zu danken -, nicht umgekehrt...

    Samstag, 3. März 2012 11:52
  • Hallo!

    Beim letzten Code-Beispiel fehlt mir die Variablendeklaration von filterReport. Ich würde in den VBA-Optionen die Einstellung "Variablendeklaration erforderlich" verwenden, damit bei neuen Code-Modulen automatisch "Option Explictit" im Modulkopf eingefügt wird.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    Samstag, 3. März 2012 12:21