none
Problem mit Aufruf von Daten aus gespeicherter Prozedur in einem Unterbericht

    Frage

  • Hallo zusammen,

    wie kann ich Daten aus einer gespeicherten Prozedur (SQL Server) an einen Unterbericht binden? Beim Unterformular ist das kein Problem, aber beim Bericht funktioniert das nicht.

    Ich bekomme immer diese Fehlermeldung.

    Sie können weder eine SQL-Pass-Through-Abfrage noch eine Kreuztabellenabfrage, für die keine Spaltenüberschriften festgelegt ist, als Datensatzquelle eines Unterberichts verwenden.
    Bevor Sie einen Unterbericht binden, müssen Sie die FixierteSpaltenüberschriften-Eigenschaft zur Abfrage festlegen.

    Wenn ich den Unterbericht allein aufrufe, bekomme ich die Daten angezeigt, aber als Unterbericht kommt eben der Fehler.

    Diese wäre der Scriptcode.

    Public Sub RequerySubformRg(foo As Long)
         Me.RecordSource = rSourceP("dbo.pb_SELECTRechnungsbetraegeUNION", foo)
    End Sub
    
    Private Sub Report_Open(Cancel As Integer)
    RequerySubformRg 1905
    End Sub

    Kann man eigentlich über Report_Open event auch ein Recordset-Objekt öffnen? Ich habe beim Googlen gelesen, dass das nicht für einen Bericht vorgesehen ist. Ist das so?

    Liebe Grüße, die Luzie!

    Montag, 21. November 2016 16:58

Antworten

  • Hallo!

    Deine Funktion rSourceP gibt doch irgenden einen Bezug (Namen oder Select-Anweisung) zu einer gespeicherten PT-Abfrage zurück, oder?

    Wenn du statt dem Zuweisen einer RecordSouce im Unterbericht den Namen einer PT-Abfrage fix als Datenquelle (in der Entwurfsansicht) einstellst und vor dem Öffnen des Berichts der PT-Abfrage die passende SQL-Anweisung übergibst, werden im Bericht die Daten angezeigt werden.

    Prinzip:

    currentdb.QueryDefs("PTabfrageVomBericht").SQL = "exec .... "
    docmd.OpenReport "DeinHauptBericht", ...
       

    "PTabfrageVomBericht" stellst du im Unterbericht als Datenquelle ein.

    Anm.:
    Die Einstellung der QueryDef mit der passenden SQL-Anweisung funktioniert vermutlich auch als Reaktion auf das Open-Ereignis des Hauptberichts, da der Unterbericht nach dem Hauptbericht geöffnet wird.

    mfg
    Josef


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


    • Bearbeitet Josef Pötzl Mittwoch, 23. November 2016 20:39
    • Als Antwort markiert Luzie Donnerstag, 24. November 2016 08:10
    Mittwoch, 23. November 2016 20:38

Alle Antworten

  • Am 21.11.2016 schrieb Luzie:

    Sie können weder eine SQL-Pass-Through-Abfrage noch eine Kreuztabellenabfrage, für die keine Spaltenüberschriften festgelegt ist, als Datensatzquelle eines Unterberichts verwenden.
    Bevor Sie einen Unterbericht binden, müssen Sie die FixierteSpaltenüberschriften-Eigenschaft zur Abfrage festlegen.

    Du könntest ein Recordset erstellen, der Inhalt ist deine Union
    Abfrage. Das Recordset dann an den Unterbericht binden.

    Wenn ich den Unterbericht allein aufrufe, bekomme ich die Daten angezeigt, aber als Unterbericht kommt eben der Fehler.

    Hast Du denn das Script von Bernd Jungbluth vollständig gelesen? Hat
    er nicht auch einen Bericht in seinem Beispiel? Alternativ kannst Du
    auch probieren, eine Abfrage zu erstellen, als Quelle in der Abfrage
    die Union Abfrage einbinden.

    Public Sub RequerySubformRg(foo As Long)
             Me.RecordSource = rSourceP("dbo.pb_SELECTRechnungsbetraegeUNION", foo)
    End Sub
    
    Private Sub Report_Open(Cancel As Integer)
    RequerySubformRg 1905
    End Sub

    Kann man eigentlich über Report_Open event auch ein Recordset-Objekt öffnen? Ich habe beim Googlen gelesen, dass das nicht für einen Bericht vorgesehen ist. Ist das so?

    Was spricht gegen das Ereignis Format_Detailbereich?

    Servus
    Winfried


    Access-FAQ: http://www.donkarl.com/AccessFAQ.htm Access-Stammtisch: http://www.access-muenchen.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
    vbeTwister: http://www.vbetwister.com/

    Montag, 21. November 2016 20:41
  • Hast Du denn das Script von Bernd Jungbluth vollständig gelesen? Hat

    er nicht auch einen Bericht in seinem Beispiel? Alternativ kannst Du
    auch probieren, eine Abfrage zu erstellen, als Quelle in der Abfrage
    die Union Abfrage einbinden.


    Hallo

    Danke für die Antwort.

    das Beispiel ist von Bernd Jungbluth bzw. aus dem Buch Access und SQL Server. Aber das funktioniert in den Übungsdateien des Buches auch nicht. :) Im Buch selbst wird, sowie ich das gelesen habe, Unterformular und Unterbericht im gleichen Kontext gesehen. Es kann aber auch sein, dass ich etwas überlesen habe.

    Klar kann ich eine Abfrage erstellen und diese einbinden. Aber die Prozedur enthält noch Ausschlüsse und Bedingungen, die ich leider in einer Abfrage so einfach nicht unterbringen kann. Ich müsste das dann wieder in den Steuerelementen des Frontends abfragen.

    Recordset im Detailbereich Format funktioniert. Das fiel mir heute Nacht ein, das ich das noch ausprobieren müsste.


    Liebe Grüße, die Luzie!

    Dienstag, 22. November 2016 06:16
  • Hallo!

    "Bevor Sie einen Unterbericht binden, .."

    Ist das Unterberichtsteuerelement an den Hauptbericht (LinkMaster/ChildFields) gebunden?

    Ansonsten:

    Hast du schon versucht, eine gespeicherte PT-Abfrage im Unterbericht fix einzustellen und beim Öffnen des Hauptberichts deren SQL-Anweisung zu setzen?

    mfg
    Josef


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


    Dienstag, 22. November 2016 11:58
  • Ist das Unterberichtsteuerelement an den Hauptbericht (LinkMaster/ChildFields) gebunden?

    Hallo

    nein, die habe ich entfernt.

    Hast du schon versucht, eine gespeicherte PT-Abfrage im Unterbericht fix einzustellen und beim Öffnen des Hauptberichts deren SQL-Anweisung zu setzen?

    Ja, das habe ich versucht, das mache ich bei den Unterformularen auch so. Ich setze ich jedes Formular eine Prozedur, in der die Verbindung steckt. Diese Prozedur kann ich dann über das Haupfformular steuern, auch für das Requery. Da ich ja den Filter über die Where-Condition nicht mehr verwenden kann, nutze ich die OpenArgs. Und so kann ich den Wert direkt im Hauptformular einfügen.

    Aber mit dem Bericht stehe ich da auf dem Kriegsfuss.

    Dies wäre dann die Prozedur im Unterbericht

    Public Sub RequerySubformRg(foo As Long)
     Me.RecordSource = rSourceP("dbo.pb_SELECTRechnungsbetraegeUNION", foo)
    End Sub

    Die könnte dann vom Hauptbericht direkt mit Daten gefüllt werden

    Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)
    
        If Not Len(Nz(Me.OpenArgs)) = 0 Then
            lngID = Me.OpenArgs
        End If
        
        RequeryHauptformRg lngID
    
        With Me!rptUFORg.Report
               .RequerySubformRg (lngID)
        End With
    
    End Sub

    Aber das macht er nicht. Ich habe lediglich Form durch Report ausgetauscht. Das wäre die beste Lösung.

    Aber jetzt muss ich mir den Wert für die Bedingung im Unterbrericht, der im Hauptbericht über die OpenArgs übergeben wird, über das noch geöffnete Formular reinholen.

    Private Sub Report_Open(Cancel As Integer)
        If IstFormularGeoeffnet("frmRgBetrieb") Then
            RequerySubformRg Forms("frmRgBetrieb").tfBetriebID
        End If
    End Sub


    Liebe Grüße, die Luzie!


    • Bearbeitet Luzie Dienstag, 22. November 2016 16:50
    Dienstag, 22. November 2016 16:48
  • Hallo!

    Im Unterbericht musst du gar keine Prozedur ausführen, wenn du im Hauptbericht bzw. vor dem Aufruf des Hauptberichts die Datenquelle (PT-Abfrage) des Unterberichts anpasst.

    mfg
    Josef


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

    Dienstag, 22. November 2016 21:20
  • Im Unterbericht musst du gar keine Prozedur ausführen, wenn du im Hauptbericht bzw. vor dem Aufruf des Hauptberichts die Datenquelle (PT-Abfrage) des Unterberichts anpasst.


    Hallo

    das verstehe ich jetzt nicht, was Du damit meinst.

    Gut, die Prozedur kann ich mir schenken, ich muss ja keinen Bericht aktualisieren können.

    Ich habe jetzt mal im Bereich Report_open des Hauptberichts versucht, Recordsource des Unterberichts zu binden

     Me!rptUFORg.Report.RecordSource = rSourceP("dbo.pb_SELECTRechnungsbetraegeUNION", 1980)

    Wo kann ich denn vor dem Aufruf des Hauptberichtes die Datenquelle des Unterformulars anpassen? In welchem Event? Oder schon beim Öffnen des Berichtes über das Click-Event im Formular? Letzteres habe ich probiert, das geht auch nicht.

    Hast Du vielleicht ein Beispiel für mich?


    Liebe Grüße, die Luzie!

    Mittwoch, 23. November 2016 16:47
  • Hallo!

    Deine Funktion rSourceP gibt doch irgenden einen Bezug (Namen oder Select-Anweisung) zu einer gespeicherten PT-Abfrage zurück, oder?

    Wenn du statt dem Zuweisen einer RecordSouce im Unterbericht den Namen einer PT-Abfrage fix als Datenquelle (in der Entwurfsansicht) einstellst und vor dem Öffnen des Berichts der PT-Abfrage die passende SQL-Anweisung übergibst, werden im Bericht die Daten angezeigt werden.

    Prinzip:

    currentdb.QueryDefs("PTabfrageVomBericht").SQL = "exec .... "
    docmd.OpenReport "DeinHauptBericht", ...
       

    "PTabfrageVomBericht" stellst du im Unterbericht als Datenquelle ein.

    Anm.:
    Die Einstellung der QueryDef mit der passenden SQL-Anweisung funktioniert vermutlich auch als Reaktion auf das Open-Ereignis des Hauptberichts, da der Unterbericht nach dem Hauptbericht geöffnet wird.

    mfg
    Josef


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


    • Bearbeitet Josef Pötzl Mittwoch, 23. November 2016 20:39
    • Als Antwort markiert Luzie Donnerstag, 24. November 2016 08:10
    Mittwoch, 23. November 2016 20:38
  • Wenn du statt dem Zuweisen einer RecordSouce im Unterbericht den Namen einer PT-Abfrage fix als Datenquelle (in der Entwurfsansicht) einstellst und vor dem Öffnen des Berichts der PT-Abfrage die passende SQL-Anweisung übergibst, werden im Bericht die Daten angezeigt werden.

    Die Einstellung der QueryDef mit der passenden SQL-Anweisung funktioniert vermutlich auch als Reaktion auf das Open-Ereignis des Hauptberichts, da der Unterbericht nach dem Hauptbericht geöffnet wird.

    Hallo Josef,

    ok, das habe ich jetzt verstanden und es funktioniert. Danke :)


    Liebe Grüße, die Luzie!

    Donnerstag, 24. November 2016 08:12
  • Hallo

    ich muss diesen Beitrag nochmals aus der Kiste kramen.

    Dies war für viele einfach Berichte die Lösung. Ich setze die PT direkt beim öffnen des Berichs aus dem Formular raus.

    Jetzt habe ich aber doch ein Problem. Ich habe jetzt einen Unterbericht in einem Endlosbericht.

    In dem Bericht werden alle Teilnehmer eines Seminars aufgelistet. In dem Unterbericht werden nochmals die letzten 3 Seminare zu jedem Teilnehmer gelistet.

    Die PT aus dem Forumular heraus zu starten, ist jetzt nicht mehr möglich, weil ich für den Unterberichte die Kunden-Nr. des jeweiligen Teilnehmers brauche.

    Hat noch jemand einen Tipp für mich?

    Vielen Dank.


    Liebe Grüße, die Luzie!

    Donnerstag, 23. November 2017 09:27