Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Crystal Reports 2008 - Bericht einbinden/aufrufen

Begonnen von Alex_80, April 01, 2019, 13:46:12

⏪ vorheriges - nächstes ⏩

Alex_80

Hallo zusammen,

weiß hier jemand, wie ich einen Bericht von Crystal Reports mit Access aufrufen kann? Also ich will quasi in einem Formular auf eine Schaltfläche drücken können und der Crystal Report Bericht XY geht auf.

Vielen Dank!

Beaker s.a.

Hallo Alex,
Das sollte mit der "Shell-Funktion" (s. OH) zu machen sein.
Präzisere Hilfe kann ich allerdings mangels Erfahrung nicht anbieten.
Sollte aber im Netz auch Einiges dazu zu finden sein.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Alex_80

Hallo und danke für den Hinweis. Ich werden mal danach recherchieren (Shell-Funktion).

Zu dem Thema selber gibt es leider nichts im Internet, da hatte ich vorher schon nach gesucht. Jedenfalls konnte ich nichts dazu finden.

Beaker s.a.

Hallo Alex,
Wonach hast denn gesucht?
Eigene Nachforschungen haben inzwischen ergeben, das die API-Funktion
"ShellExecute" wohl die bessere Lösung ist. Eine Erklärung inkl. Beispielen
habe ich hier gefunden:
https://dbwiki.net/wiki/VBA_Tipp:_Anwendung_mit_ShellExecute_starten
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Alex_80

#4
Hallo,

also ich suche schon so etwas und hatte diese Seite auch gefunden, aber ich weiß nicht, wie hier einen Befehl aufbauen soll. Das ist für mich etwas undurchsichtig geschrieben.

Versucht habe ich folgendes:

Private Sub Befehl11_Click()

Option Explicit

'Konstanten für den Parameter "nshowcmd"
Public Const SW_HIDE            As Long = 0   ' Blendet das Fenster aus und aktiviert ein
                                              ' weiteres Fenster.
Public Const SW_SHOWNORMAL      As Long = 1   ' Aktiviert und zeigt ein Fenster an. Wenn
                                              ' das Fenster verkleinert oder maximiert wird,
                                              ' stellt Windows es auf seine ursprüngliche
                                              ' Größe und Position zurück.  Eine Anwendung
                                              ' sollte dieses Flag bei der ersten Anzeige
                                              ' des Fensters angeben.
Public Const SW_NORMAL          As Long = 1   ' dito
Public Const SW_SHOWMINIMIZED   As Long = 2   ' Aktiviert das Fenster und zeigt es als
                                              ' minimiertes Fenster an.
Public Const SW_SHOWMAXIMIZED   As Long = 3   ' Aktiviert das Fenster und zeigt es als
                                              ' maximiertes Fenster an.
Public Const SW_MAXIMIZE        As Long = 3   ' dito
Public Const SW_SHOWNOACTIVATE  As Long = 4   ' Zeigt ein Fenster in seiner jüngsten Größe
                                              ' und Position an. Das aktive Fenster bleibt
                                              ' aktiv.
Public Const SW_SHOW            As Long = 5   ' Aktiviert das Fenster und zeigt es in seiner
                                              ' aktuellen Größe und Position an.
Public Const SW_MINIMIZE        As Long = 6   ' Minimiert das angegebene Fenster und aktiviert
                                              ' das nächste Fenster der obersten Ebene in der
                                              ' z-Reihenfolge.
Public Const SW_SHOWMINNOACTIVE As Long = 7   ' Zeigt das Fenster als minimiertes Fenster an.
                                              ' Das aktive Fenster bleibt aktiv.
Public Const SW_SHOWNA          As Long = 8   ' Zeigt das Fenster in seinem aktuellen Zustand
                                              ' an.  Das aktive Fenster bleibt aktiv.
Public Const SW_RESTORE         As Long = 9   ' Aktiviert und zeigt das Fenster an. Wenn das
                                              ' Fenster verkleinert oder maximiert wird, stellt
                                              ' Windows es auf seine ursprüngliche Größe und
                                              ' Position zurück.  Eine Anwendung sollte dieses
                                              ' Flag beim Wiederherstellen eines minimierten
                                              ' Fensters angeben.
Public Const SW_SHOWDEFAULT     As Long = 10  ' Setzt den Show-Status basierend auf dem SW_Flag,
                                              ' das in der STARTUPINFO-Struktur angegeben ist,
                                              ' die von dem Programm, das die Anwendung gestar-
                                              ' tet hat, an die CreateProcess-Funktion über-
                                              ' geben wurde.  Eine Anwendung sollte ShowWindow
                                              ' mit diesem Flag aufrufen, um den anfänglichen
                                              ' Show-Status ihres Hauptfensters zu setzen.
Public Const SW_FORCEMINIMIZE   As Long = 11  ' Minimiertes anzeigen erzwingen.
Public Const SW_MAX             As Long = 11


Public Declare Function ShellExecute Lib "shell32.dll" _
   Alias "ShellExecuteA" ( _
   ByVal hWnd As Long, _
   ByVal lpOperation As String, _
   ByVal lpFile As String, _
   ByVal lpParameters As String, _
   ByVal lpDirectory As String, _
   ByVal nshowcmd As Long) As Long
   
Call ShellExecute(0, "open", "X:\Verwaltung\030 Crystal Reports\ACCESS.rpt", "", "", SW_SHOWNORMAL)

End Sub


Das funktioniert aber nicht. Da kommt eine Fehlermeldung (siehe Anhang)

Und der normale Shell klappt auch nicht, weil er die Datei nicht findet:
Private Sub Befehl10_Click()
Shell "C:\Program Files (x86)\Business Objects\BusinessObjects Enterprise 12.0\win32_x86\crw32.exe ACCESS.rpt", vbNormalFocus
End Sub


Da öffnet sich zwar das Programm aber findet die Datei bzw. den Dateipfad nicht.

Wie muss das denn der ShellExecute aufgebaut werden? Danke!

PhilS

Nur die eine Zeile mit  Call ShellExecute gehört in die Klick-Ereignisprozedur. Der ganze Rest gehört in den Deklarationsbereich (ganz oben) des Moduls.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Alex_80

Also muss ich ein neues Modul anlegen?

Option Explicit

'Konstanten für den Parameter "nshowcmd"
Public Const SW_HIDE            As Long = 0   ' Blendet das Fenster aus und aktiviert ein
                                              ' weiteres Fenster.
Public Const SW_SHOWNORMAL      As Long = 1   ' Aktiviert und zeigt ein Fenster an. Wenn
                                              ' das Fenster verkleinert oder maximiert wird,
                                              ' stellt Windows es auf seine ursprüngliche
                                              ' Größe und Position zurück.  Eine Anwendung
                                              ' sollte dieses Flag bei der ersten Anzeige
                                              ' des Fensters angeben.
Public Const SW_NORMAL          As Long = 1   ' dito
Public Const SW_SHOWMINIMIZED   As Long = 2   ' Aktiviert das Fenster und zeigt es als
                                              ' minimiertes Fenster an.
Public Const SW_SHOWMAXIMIZED   As Long = 3   ' Aktiviert das Fenster und zeigt es als
                                              ' maximiertes Fenster an.
Public Const SW_MAXIMIZE        As Long = 3   ' dito
Public Const SW_SHOWNOACTIVATE  As Long = 4   ' Zeigt ein Fenster in seiner jüngsten Größe
                                              ' und Position an. Das aktive Fenster bleibt
                                              ' aktiv.
Public Const SW_SHOW            As Long = 5   ' Aktiviert das Fenster und zeigt es in seiner
                                              ' aktuellen Größe und Position an.
Public Const SW_MINIMIZE        As Long = 6   ' Minimiert das angegebene Fenster und aktiviert
                                              ' das nächste Fenster der obersten Ebene in der
                                              ' z-Reihenfolge.
Public Const SW_SHOWMINNOACTIVE As Long = 7   ' Zeigt das Fenster als minimiertes Fenster an.
                                              ' Das aktive Fenster bleibt aktiv.
Public Const SW_SHOWNA          As Long = 8   ' Zeigt das Fenster in seinem aktuellen Zustand
                                              ' an.  Das aktive Fenster bleibt aktiv.
Public Const SW_RESTORE         As Long = 9   ' Aktiviert und zeigt das Fenster an. Wenn das
                                              ' Fenster verkleinert oder maximiert wird, stellt
                                              ' Windows es auf seine ursprüngliche Größe und
                                              ' Position zurück.  Eine Anwendung sollte dieses
                                              ' Flag beim Wiederherstellen eines minimierten
                                              ' Fensters angeben.
Public Const SW_SHOWDEFAULT     As Long = 10  ' Setzt den Show-Status basierend auf dem SW_Flag,
                                              ' das in der STARTUPINFO-Struktur angegeben ist,
                                              ' die von dem Programm, das die Anwendung gestar-
                                              ' tet hat, an die CreateProcess-Funktion über-
                                              ' geben wurde.  Eine Anwendung sollte ShowWindow
                                              ' mit diesem Flag aufrufen, um den anfänglichen
                                              ' Show-Status ihres Hauptfensters zu setzen.
Public Const SW_FORCEMINIMIZE   As Long = 11  ' Minimiertes anzeigen erzwingen.
Public Const SW_MAX             As Long = 11


Public Declare Function ShellExecute Lib "shell32.dll" _
   Alias "ShellExecuteA" ( _
   ByVal hWnd As Long, _
   ByVal lpOperation As String, _
   ByVal lpFile As String, _
   ByVal lpParameters As String, _
   ByVal lpDirectory As String, _
   ByVal nshowcmd As Long) As Long
--------------------------------------------------------------------------------------------------------------------------
Private Sub Befehl11_Click()

Call ShellExecute(0, "open", "X:\Verwaltung\030 Crystal Reports\ACCESS.rpt", "", "", SW_SHOWNORMAL)

End Sub


Wie binde ich das dann ein, dass es beim klicken der Schaltfläche aktiviert wird?

Alex_80

Ich lade mal die Datenbank hier hoch, vielleicht findet ihr so besser meinen Fehler?! Danke!

PhilS

Zitat von: Alex_80 am April 03, 2019, 10:23:35
Also muss ich ein neues Modul anlegen?
Nicht zwingend. Es sollte genauso funktionieren, wenn du die ganzen Deklarationen in dein bestehendes Modul einfügst.

Zitat von: Alex_80 am April 03, 2019, 10:23:35
Wie binde ich das dann ein, dass es beim klicken der Schaltfläche aktiviert wird?
Eigentlich genau so, wie du es in dem letzten Beispiel auch getan hast. - Gibt es damit ein konkretes Problem? Wenn ja, welches?

Übrigens müsste das Ganze auch schon funktionieren, wenn du einfach die Befehlszeile an die eingebaute Shell-Funktion übergibst:
Shell "C:\pfad\zu\crw32.exe C:\pfad\zu\report.rpt"
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Hallo Philip,
Zuerst vielen Dank für deine Hilfe, mir mangelt es da an Erfahrung.
Daran
Zitatwenn du einfach die Befehlszeile an die eingebaute Shell-Funktion übergibst:
hatte ich ja auch zuerst gedacht. Der Unterschied zu ShellExecute
besteht aber doch darin (wenn ich's bei meinen Recherchen richtig
verstanden habe), das dabei der Pfad zur Anwendung nicht bekannt
sein muss.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

PhilS

Zitat von: Beaker s.a. am April 03, 2019, 13:35:44
Daran
Zitatwenn du einfach die Befehlszeile an die eingebaute Shell-Funktion übergibst:
hatte ich ja auch zuerst gedacht. Der Unterschied zu ShellExecute
besteht aber doch darin (wenn ich's bei meinen Recherchen richtig
verstanden habe), das dabei der Pfad zur Anwendung nicht bekannt
sein muss.
Völlig richtig.

Dein Vorschlag mit ShellExecute sollte universell funktionieren und ist nicht vom Installationsort des Crystal Report Viewers abhängig. - Somit ist das die bessere Alternative. 


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Alex_80

Hallo,

also ich habe es nochmal mit dem ShellExecute probiert, aber es klappt nicht. Beim Betätigen der Schaltfläche kommt nun ein neuer Fehler (siehe Bild in der Anlage).

Beim normalen Shell, so wie Du es geschrieben hast, kommt ebenfalls der Fehler aus dem Bild

Also meine hochgeladene Datenbank hat keine Fehler?

PhilS

Zitat von: Alex_80 am April 04, 2019, 06:41:06
Also meine hochgeladene Datenbank hat keine Fehler?
Hochgeladene Datenbanken anzuschauen kostet meist mehr Zeit, als eine Beschreibung des Problem zu lesen, daher schaue ich dort nur extrem selten rein. - In diesem Fall hätte es allerdings vermutlich länger gedauert, die Probleme ohne die DB zu analysieren.

Erstmal ein generelle Hinweis. In der VBA-Umgebung gibt es den Menüpunkt Debug - Compile. Damit weist dich der VBA Compiler schon auf alle groben Syntax- und Strukturfehler hin. Solange es dort eine Fehlermeldung gibt, kann dein Code nicht vollständig funktionieren.

Zwei Wege, um deine DB dazu zu bringen fehlerfrei kompilierbar zu sein.
Entweder ...
1.)
- Lösche die API-Deklaration (inkl. der Konstanten) aus dem Formular
- Benenne das Modul ShellExecute um. Ein Modul darf nicht denselben Namen haben, wie eine Funktion. Du könntest einfach das Präfix "mod" davorsetzen.
- (Empfohlen, aber optional) lösche die Prozedur Befehl11_Click in dem allgemeinen Modul.

Oder ...
2.)
- Lösche das Modul ShellExecute komplett
- Ändere den Gültigkeitsbereich der API-Deklaration (inkl. der Konstanten) im Formular von Public auf Private.



Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Hallo,
ZitatÄndere den Gültigkeitsbereich der API-Deklaration (inkl. der Konstanten) im Formular von Public auf Private.
Würde ich nicht machen, wer weiss wo es nochmal zu gebrauchen ist.
Da ist ein allgem. Modul doch die bessere Wahl. Dort natürlich Public.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Alex_80

Hallo,

erstmal vielen Dank! Ich habe jetzt Variante 2 probiert und die hat auch funktioniert.

Allerdings würde ich gerne auch die Variante 1 mit dem Modul verstehen. Ich habe jetzt das Modul umbenannt in "ModShellExecute" und die Prozedur gelöscht. Allerdings weiß ich nicht, wie ich das Modul nun in den Befehl "Click" mit aufnehme. Er markiert mir immer den Modulnamen an.

Hier der Befehl, der nicht klappt:

Private Sub Befehl11_Click()
ModShellExecute
Call ShellExecute(0, "open", "C:\Users\Documents\Bedienungsanleitungen\Bedienungsanleitung_Anleitung_ÖKO_Lavamat_72700 update_Waschmaschiene", "", "", SW_SHOWNORMAL)

End Sub


Hier nochmal der Inhalt des Moduls:
Option Explicit

'Konstanten für den Parameter "nshowcmd"
Public Const SW_HIDE            As Long = 0   ' Blendet das Fenster aus und aktiviert ein
                                              ' weiteres Fenster.
Public Const SW_SHOWNORMAL      As Long = 1   ' Aktiviert und zeigt ein Fenster an. Wenn
                                              ' das Fenster verkleinert oder maximiert wird,
                                              ' stellt Windows es auf seine ursprüngliche
                                              ' Größe und Position zurück.  Eine Anwendung
                                              ' sollte dieses Flag bei der ersten Anzeige
                                              ' des Fensters angeben.
Public Const SW_NORMAL          As Long = 1   ' dito
Public Const SW_SHOWMINIMIZED   As Long = 2   ' Aktiviert das Fenster und zeigt es als
                                              ' minimiertes Fenster an.
Public Const SW_SHOWMAXIMIZED   As Long = 3   ' Aktiviert das Fenster und zeigt es als
                                              ' maximiertes Fenster an.
Public Const SW_MAXIMIZE        As Long = 3   ' dito
Public Const SW_SHOWNOACTIVATE  As Long = 4   ' Zeigt ein Fenster in seiner jüngsten Größe
                                              ' und Position an. Das aktive Fenster bleibt
                                              ' aktiv.
Public Const SW_SHOW            As Long = 5   ' Aktiviert das Fenster und zeigt es in seiner
                                              ' aktuellen Größe und Position an.
Public Const SW_MINIMIZE        As Long = 6   ' Minimiert das angegebene Fenster und aktiviert
                                              ' das nächste Fenster der obersten Ebene in der
                                              ' z-Reihenfolge.
Public Const SW_SHOWMINNOACTIVE As Long = 7   ' Zeigt das Fenster als minimiertes Fenster an.
                                              ' Das aktive Fenster bleibt aktiv.
Public Const SW_SHOWNA          As Long = 8   ' Zeigt das Fenster in seinem aktuellen Zustand
                                              ' an.  Das aktive Fenster bleibt aktiv.
Public Const SW_RESTORE         As Long = 9   ' Aktiviert und zeigt das Fenster an. Wenn das
                                              ' Fenster verkleinert oder maximiert wird, stellt
                                              ' Windows es auf seine ursprüngliche Größe und
                                              ' Position zurück.  Eine Anwendung sollte dieses
                                              ' Flag beim Wiederherstellen eines minimierten
                                              ' Fensters angeben.
Public Const SW_SHOWDEFAULT     As Long = 10  ' Setzt den Show-Status basierend auf dem SW_Flag,
                                              ' das in der STARTUPINFO-Struktur angegeben ist,
                                              ' die von dem Programm, das die Anwendung gestar-
                                              ' tet hat, an die CreateProcess-Funktion über-
                                              ' geben wurde.  Eine Anwendung sollte ShowWindow
                                              ' mit diesem Flag aufrufen, um den anfänglichen
                                              ' Show-Status ihres Hauptfensters zu setzen.
Public Const SW_FORCEMINIMIZE   As Long = 11  ' Minimiertes anzeigen erzwingen.
Public Const SW_MAX             As Long = 11


Public Declare Function ShellExecute Lib "shell32.dll" _
   Alias "ShellExecuteA" ( _
   ByVal hWnd As Long, _
   ByVal lpOperation As String, _
   ByVal lpFile As String, _
   ByVal lpParameters As String, _
   ByVal lpDirectory As String, _
   ByVal nshowcmd As Long) As Long


Vielen Dank!