Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

in VBA Recordsource eines Unterberichts vom Hauptbericht aus verän

562 views
Skip to first unread message

martin

unread,
Sep 20, 2007, 6:10:03 AM9/20/07
to
Hallo,
ich möchte in Access 2003 aus einem Hauptbericht dynamisch (in Abhängigkeit
von Formularfeldern) die Recourdsource eines Unterberichrts ansteuern bzw.
verändern (Bsp: report_unterbericht.recourdsource=variable). Ich bekomme als
Fehlermeldung, dass ich das nach Druckbeginn nicht mehr darf.
wer weiss Rat?
Martin

Klaus Oberdalhoff

unread,
Sep 20, 2007, 7:15:37 AM9/20/07
to
Hi,

bei Berichten man kann, wenn man die Recourdsource leer gelassen hat,
_E_I_N_M_A_L_I_G_ beim Start die Recordsource eines Berichtes bzw.
Unterberichtes setzen -- wenn sie denn einmal gesetzt wurde, nicht mehr.

Das daraus entstehende Problem, dass - da automatisch die Öffnungsroutine
intern mehrmals durchlaufen wird - beim zweiten bis n. Durchlauf ein Fehler
auftritt, habe ich einfach ganz brutal (ich weiss, schlechter
Programmierstil) mittels eines "On Error Resume Next" abgewürgt. Das hat bei
mir eigentlich bisher immer gut funktioniert. <achselzuck>

--
mit freundlichen Grüßen aus Nürnberg

Klaus Oberdalhoff KO...@gmx.de

Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb und andere Beispiele: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99

Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Nächstes Treffen in Nürnberg am 23.10.2007

Peter Doering

unread,
Sep 20, 2007, 9:54:53 AM9/20/07
to
Hallo,

martin wrote:

Abgesehen von Klaus' Variante geht das bei Unterberichten offiziell nur
ueber eine gespeicherte Abfrage.

Wenn der Unterbericht die Abfrage qryUB als Datenherkunft hat, kannst du in
Report_Open des HAUPTberichts die Recordsource so aendern:

Set Db = CurrentDb
Set strSQL = "SELECT ... FROM ..." 'Neue Recordsource
Db.QueryDefs("qryUB").SQL = strSQL

Gruss - Peter

--
Ich beantworte keine Fragen per Email.
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com

martin

unread,
Sep 21, 2007, 3:44:00 AM9/21/07
to
Vielen Dank Peter
den Tip von Klaus habe ich leider nicht hingekriegt
Der String mit dem SQL Statement darf allerdibgs eine gewisse Länge nicht
überschreiten.(> Set strSQL = "SELECT ... FROM ..." 'Neue Recordsource)

Danke
Martin


Peter Doering

unread,
Sep 21, 2007, 4:53:06 AM9/21/07
to
Hallo,

martin wrote:

> Der String mit dem SQL Statement darf allerdibgs eine gewisse Länge nicht
> überschreiten.(> Set strSQL = "SELECT ... FROM ..." 'Neue Recordsource)

Welche Version setzt du denn ein? Seit A02(?) sind es lt. OH "approximately
64,000" Zeichen.

Zeig mal deinen Code, einschl. Deklarationen.

Klaus Oberdalhoff

unread,
Sep 21, 2007, 3:20:07 PM9/21/07
to
Hi,

> den Tip von Klaus habe ich leider nicht hingekriegt

OK, dann hier ein zweiter Tipp:

Stelle die Recordsource fix auf eine Abfrage mit einem bestimmten Namen und
erstelle/ändere vor dem Öffnen des Berichtes diese Abfrage nach dem
folgenden Prinzip (DAO)

Function CreateQuery(strSQL As String, Optional Queryname As String =
"qrySorting") As Boolean

Dim dbs As Database
Dim qdf As QueryDef

On Error GoTo CreateQuery_Error

Set dbs = CurrentDb
If ObjectExists("Query", Queryname) Then
DoCmd.DeleteObject acQuery, Queryname
End If
Set qdf = dbs.CreateQueryDef(Queryname, strSQL)

DoEvents

CreateQuery = True
On Error GoTo 0
Exit Function

CreateQuery_Error:

' MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure
CreateQuery of Modul DataFunctions"
CreateQuery = False

End Function

Gunter Avenius

unread,
Sep 21, 2007, 3:30:06 PM9/21/07
to
Hallo Klaus,

Klaus Oberdalhoff schrieb folgendes:


> OK, dann hier ein zweiter Tipp:
>
> Stelle die Recordsource fix auf eine Abfrage mit einem bestimmten
> Namen und erstelle/ändere vor dem Öffnen des Berichtes diese
> Abfrage nach dem folgenden Prinzip (DAO)
>
> Function CreateQuery(strSQL As String, Optional Queryname As String
> = "qrySorting") As Boolean

...

warum nicht nur ein:

dbs.QueryDefs(Queryname).SQL = strSQL

Gruß
Gunter
--
__________________________________________________________
Access FAQ: http://www.donkarl.com
home: http://www.avenius.com - http://www.AccessRibbon.de

10. Access-Entwickler-Konferenz (AEK)
Nürnberg 6./7.10.2007 und 20./21.10.2007
http://www.donkarl.com/?AEK

Thomas Pomper

unread,
Oct 17, 2007, 7:07:00 AM10/17/07
to
Hi,

ich habe ein ähnliches Problem wie martin, komme aber gar nicht so weit
(Access 97). Ich erhalte die Fehlermeldung Nr. 2455 "Sie haben einen Ausdruck
eingegeben, der einen unzulässigen Verweis auf die Eigenschaft Form/Report
enthält. Die Eigenschaft existiert eventuell nicht oder glit nicht für das
von Ihnen angegebene Objekt." Ist meine Syntax falsch??? Ich schreibe (in
Report_Open des Hauptberichts):

Unterbericht.Report.Recordsource = "SELECT ..."

und wende dies auf einen Bericht mit einer leeren recordsource an.

Thomas

Peter Doering

unread,
Oct 17, 2007, 9:11:12 AM10/17/07
to
Hallo,

Thomas Pomper wrote:

Hast du meine Antwort auf das OP gelesen?

Du kannst zur Laufzeit die RecordSource-Eigenschaft eines Unterberichts
*nicht* aendern.

Klaus Oberdalhoff

unread,
Oct 17, 2007, 5:17:34 PM10/17/07
to
Hi Peter,

> Du kannst zur Laufzeit die RecordSource-Eigenschaft eines
> Unterberichts *nicht* aendern.

Tut mit ja leid, dir widersprechen zu müssen, aber das stimmt so nicht ganz.

Es ist wie bei Radio Eriwan:

Du kannst sie beim Öffnen ändern - ABER NUR EINMALIG - und nur dann, wenn
der die Recordsource <leer> d.h. nicht gesetzt ist.

Du kannst (ich glaube aber erst ab Access 97 <g>) beim Öffnen auch die
RecordSource eines Unterberichtes ändern, aber nur solange sie leer / nicht
zugeordnet ist.

D.h. das wichtigste in einem solchen Programm, da die Öffnen-Routine u.U.
intern mehrfach durchlaufen wird, ist vor dem Setzen ein
On Error Resume Next
damit der Fehler, wenn die Routine intern ein zweites/drittes mal
durchlaufen wird, ignoriert wird. In diesem ganz speziellen Falle ist On
Error Resume Next IMHO nicht nur "ausnahmsweise geduldet" sondern fast
"zwingend erforderlich".

--
mit freundlichen Grüßen aus Nürnberg

Klaus Oberdalhoff KO...@gmx.de

Peter Doering

unread,
Oct 18, 2007, 7:20:01 AM10/18/07
to
Hallo Klaus,

Klaus Oberdalhoff wrote:
>
>> Du kannst zur Laufzeit die RecordSource-Eigenschaft eines
>> Unterberichts *nicht* aendern.
>

> Du kannst sie beim Öffnen ändern - ABER NUR EINMALIG - und nur dann, wenn
> der die Recordsource <leer> d.h. nicht gesetzt ist.

Also mit meiner Access-Version (A03 SP2 ;-) geht das nicht, auch nicht,
wenn sie leer ist. Nicht mal dann, wenn der UR weder Recordsource noch
gebundene Steuerelemente enthaelt.

Karl Donaubauer

unread,
Oct 18, 2007, 7:40:16 AM10/18/07
to
Hallo, Peter!

Peter Doering wrote:
>
> Klaus Oberdalhoff wrote:
>>
>>> Du kannst zur Laufzeit die RecordSource-Eigenschaft eines
>>> Unterberichts *nicht* aendern.
>>
>> Du kannst sie beim Öffnen ändern - ABER NUR EINMALIG - und nur dann,
>> wenn der die Recordsource <leer> d.h. nicht gesetzt ist.
>
> Also mit meiner Access-Version (A03 SP2 ;-) geht das nicht, auch
> nicht, wenn sie leer ist. Nicht mal dann, wenn der UR weder
> Recordsource noch gebundene Steuerelemente enthaelt.

Vom Hauptbericht aus wird das IMO auch nix.
Das einzige, was in der Hinsicht geht, ist das Ändern der Recordsource
im Öffnen-Ereignis des Unterberichtes unter zwei Voraussetzungen:
1. Seine Eigenschaft Recordsource ist leer.
2. Der Unterbericht darf nicht mit dem Hauptbericht verknüpft sein.

Da v.a. letzteres in der Praxis eher selten vorkommt, empfehle
ich in bei solchem Begehe meistens, den Unterbericht auf einer
gespeicherten (evtl. Dummy-) Abfrage basieren zu lassen.
Deren SQL-Eigenschaft kann man im Öffnen-Ereignis des
Hauptberichtes noch problemlos und mit sofortiger Wirkung
umschreiben.

--
cu
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com + Info zur
Access-Entwickler-Konferenz (AEK10) im Oktober in Nürnberg


Peter Doering

unread,
Oct 18, 2007, 9:54:23 AM10/18/07
to
Hallo Karl,

Karl Donaubauer wrote:
> Peter Doering wrote:
>> Klaus Oberdalhoff wrote:
>>>
>>>> Du kannst zur Laufzeit die RecordSource-Eigenschaft eines
>>>> Unterberichts *nicht* aendern.
>>>
>>> Du kannst sie beim Öffnen ändern - ABER NUR EINMALIG - und nur dann,
>>> wenn der die Recordsource <leer> d.h. nicht gesetzt ist.
>>
>> Also mit meiner Access-Version (A03 SP2 ;-) geht das nicht, auch
>> nicht, wenn sie leer ist. Nicht mal dann, wenn der UR weder
>> Recordsource noch gebundene Steuerelemente enthaelt.
>
> Vom Hauptbericht aus wird das IMO auch nix.
> Das einzige, was in der Hinsicht geht, ist das Ändern der Recordsource
> im Öffnen-Ereignis des Unterberichtes unter zwei Voraussetzungen:

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ein nicht zu unterschaetzendes Detail ;-)

> 1. Seine Eigenschaft Recordsource ist leer.
> 2. Der Unterbericht darf nicht mit dem Hauptbericht verknüpft sein.
>
> Da v.a. letzteres in der Praxis eher selten vorkommt, empfehle
> ich in bei solchem Begehe meistens, den Unterbericht auf einer
> gespeicherten (evtl. Dummy-) Abfrage basieren zu lassen.
> Deren SQL-Eigenschaft kann man im Öffnen-Ereignis des
> Hauptberichtes noch problemlos und mit sofortiger Wirkung
> umschreiben.

Genau, so aehnlich hatte ich das weiter oben auch empfohlen.

0 new messages