Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Bild dynamisch im Unterbericht anzeigen

Begonnen von a0053, Juli 12, 2026, 22:54:32

⏪ vorheriges - nächstes ⏩

a0053

Hallo,

folgendens Problem plagt mich:

Ich habe einen Bericht erstellt mit einem (ungebundenen) Image-Control.
In der Ereignis-Prozedur zu "Beim Laden" des Berichts schreibe ich in die PictureData-Eigenschaft des Image-Controls meine Bilddaten, die ich mir zuvor aus meiner SQL-Server-Datenbank geholt habe.
Das funktioniert gut.

Jetzt binde ich den obigen Bericht als Unterbericht im Bereich Seitenkopf (oder Berichtkopf) in einen anderen Bericht ein und das Bild wird nicht mehr geladen.

Wie kann ich das lösen?

Warum das Ganze? Ich habe etliche Berichte die alle den gleichen Briefkopf (mit Logo aus der Datenbank) erhalten sollen. Füge ich meine Briefkopf-Controls (inkl. dem Bild) in den Seitenkopf eines Berichts ein, funktioniert es wie erwartet. Aber anstelle immer dieselben Controls in jeden Bericht einzufügen will ich mir das Leben mit einem Unterbericht leichter machen...


Herzliches Dankeschön für alle Tipps.

Gruß, Carsten


Doming

Moin Carsten,

kannst Du mal kurz zeigen, wie Du die Bilddaten derzeit versuchst einzufügen?

Gruß
 Doming

Bitsqueezer

Hallo,

wenn es nur um ein Logo geht, würde ich den Aufwand nicht betreiben.
Access kann schon seit einiger Zeit Bilder als "Shared" einfügen. Dazu fügst Du das Bild einmalig über "Insert Image" ein, ein Button im Ribbon, und wenn Du dort das Menü aufklappst, siehst Du auch alle Bilder, die Du bereits geladen hast.

Dann auf den betreffenden Seiten ein Image Control, dessen Bildtyp Du auf "Shared" setzt, dann findest Du in der Kombobox für die Auswahl des Bildes Dein geladenes Bild.

Im Gegensatz zu alten Access-Versionen, wo für jedes Image Control je ein Bild hinterlegt wurde, greifen hiermit alle auf das gleiche Bild zu, die Bilddaten sind dann nur einmal in der Datenbankdatei (und Du mußt dazu auch nichts von einem Server laden). Tauschst Du das Bild aus, ist es überall ausgetauscht.

Du kannst ein Template-Formular erstellen und das Image Control dort einfügen (und auch viele andere, die Du immer wieder brauchst) und dann einfach für neue Formulare von dort kopieren. Das kann man von dort natürlich auch in einen Bericht einfügen.

Von der Datenbank zu laden, würde nur Sinn machen, wenn Du das Bild häufig austauschen willst. Für ein eher statisches Bild wie ein Logo lohnt der Aufwand nicht. Die Bilder findest Du in der internen Tabelle MSysResources, wenn Du direkt darauf zugreifen willst.

Gruß

Christian

a0053

#3
@Doming
Im Bercht, den ich als Unterbericht verwenden will:
Private Sub Report_Load()
    Me.Logo.PictureData = Null
    LoadPictureFromTblBilderToImageControl Me.Logo, "Briefbogen_Logo"
End Sub

Und die aufgerufene Prozedur ist (getDBConnection darin liefert eine aktive Connection zum SQL-Server)

Public Sub LoadPictureFromDatabaseToImageControl(ByVal ctlImage As Access.Image, _
    ByVal strBildID As String)
    If Not ctlImage Is Nothing Then
        ' Bildsteuerelement zunächst leeren
        ctlImage.PictureData = Null
        If strBildID <> vbNullString Then
            Dim bytBild() As Byte
            ' SQL-Abfrage für das gewünschte Bild
            Dim strSql As String
            strSql = "SELECT TOP 1 Bilddaten FROM  tblBilder WHERE BildID='" & strBildID & "'"
            ' Daten abrufen
            Dim rst As New ADODB.Recordset
            rst.Open strSql, getDbConnection, adOpenForwardOnly, adLockReadOnly
            ' Prüfen, ob Daten vorhanden sind
            If Not rst.EOF Then
                If Not IsNull(rst.fields.Item("Bilddaten")) Then
                    ' Binärdaten auslesen
                    bytBild = rst.fields.Item("Bilddaten").Value
                    ' Binärdaten direkt in das Image-Steuerelement laden
                    ctlImage.PictureData = bytBild
                End If
            End If
            ' Objekte freigeben
            rst.Close
            Set rst = Nothing
        End If
    End If
End Sub

@Bitsqueezer:
Mit obiger Prozedur lade ich auch andere Bilder wie Produktabbildungen etc. aus der SQL-Server-Datenbank in Formulare und Berichte (und nicht nur ein Logo für den Briefkopf).
Da meine Anwendnung mandantenfähig ist passt Deine Idee der Logospeicherung Shared im (Access-)Frontend leider nicht - es sei denn ich würde beim Anwendungsstart die Server-Tabelle mit den Bildern zumindest teilweise in die lokale Tabelle MSysResources syncen (auch ganz schön aufwändig....).

Grüße, Carsten


a0053

#4
Habe den Fehler selber gefunden:

Ich hatte den Event "Beim Laden" benutzt um die Bilddaten zu holen. Öffne ich den Bericht, den ich als Unterbericht einbinden will, direkt dann funktioniert das damit auch.  Wird der Berichst hingegen als Unterbericht verwendet dann funktioniert "Beim Laden" aber eben leider nicht.

Verwende ich aber den Event "Beim Öffnen" um die Bilddaten zu holen dann funktioniert es sowohl beim direkten Öffnen des Berichts als auch bei der Einbindung als Unterbericht.

Ich hatte also nur den falschen Event benutzt... ::)

Bitsqueezer

Hallo,

sagte ich ja: Lohnt sich nur, wenn man die Bilder öfters austauschen will, was bei verschiedenen Logos ja der Fall wäre.

Bedenke auch, daß ein Unterformular/-bericht immer vor dem Hauptformular/-bericht geladen wird. Du kannst also z.B. nicht auf Ressourcen des übergeordneten Objektes zugreifen, weil es beim Laden noch nicht existiert.

Bei Berichten mußt Du generell möglichst immer Report_Open verwenden, um Dinge zu erledigen, die vor dem Rendern des Berichtes passieren sollen. Immer im Hinterkopf halten: Die Ausgabe eines Berichtes funktioniert wie das Drucken selbst: Was schon begonnen hat, ist Geschichte, kann nicht mehr verändert werden. Im Gegensatz zu Formularen, auf deren Elemente Du zu (fast) jeder Zeit beliebig zugreifen kannst.

Gruß

Christian