Hi Blockus,
erstmal kannst Du mich natürlich gerne duzen (mach ich Dir gegenüber ja schließlich auch ;o).
Aber zurück zu Deinem Problem: Okay, sechzig Unions auf einmal, da kann ich mir vorstellen, dass das Probleme gibt.
Leider fällt mir aber nichts anderes ein, was ich als „schöne“ Lösung bezeichnen würde. Na ja, angenommen, die Daten aus der Excel-Datei werden bei jeder größeren Änderung neu importiert: Hier ist es sicher sinnvoll sie gleich in so 'ne Tabellenform zu bringen, wie ich’s im letzten Artikel beschrieben hab (dazu die Tabelle ein einziges Mal ohne Daten erstellen und beim Importieren in einer Prozedur dafür sorgen, dass zuerst alle eventuellen alten Daten gelöscht werden und dann in 'ner For-Schleife sechzig Mal 'ne Insert-Query aufrufen - irgendwie so…). Aber da es ja eher wahrscheinlich ist, dass die Excel-Tabelle verknüpft ist (also nicht explizit importiert wird) muß man sich irgendwas anderes überlegen.
Meine Idee: Im Detailbereich des Berichts (Datenherkunft ist die Originaltablle, also die mit 61 Spalten) gibt es ein Textfeld mit der LV-Nummer und eines, das die gesamten Abrechnungsdaten enthält. Bei letzterem ist die Eigenschaft „Vergrößerbar“ auf „Ja“ zu setzen.
Nun könnte man sich vorstellen, in das besagte vergrößerbare Textfeld einfach 'nen langen Ausdruck etwa der Form
=Wenn(Nicht IstNull([Abrechnung1]);"Abrechnung 1:" & ([Abrechnung1]) & " Stück" & Zchn(13) & Zchn(10)) & Wenn(Nicht IstNull([Abrechnung2]);"Abrechnung 2:" & ([Abrechnung2]) & " Stück " & Zchn(13) & Zchn(10)) ...
reinzuschreiben. Leider meckert dann aber das doofe Access rum, dass man nur 2048 Zeichen zur Verfügung hätte.
Na ja, 'n Ausweg wäre ein Ausdruck der Form
=Ausgabe(array([Abrechnung1]; [Abrechnung2]; ... ; [Abrechnung60]))
wobei „Ausgabe“ 'ne Funktion sein soll, die irgendwo noch genauers definiert werden muss und halt einen entsprechenden String zurückgeben sollte.
Allerdings mag Access auch dieses nicht: Fehlermeldung lautet irgendwas mit „Ausdruck zu komplex“.
Na ja, das einzige was mir dann noch so eingefallen ist, ist, das zweite für die Abrechnungen bestimmte Textfeld (nennen wir es mal „Textfeld“) zuerst ungebunden zu lassen, stattdessen aber im Detailbereich „beim Formatieren“ folgende Ereignisprozedur zu
hinterlegen:
Private Sub Detailbereich\_Format(Cancel As Integer, FormatCount As Integer)
Dim s As String, a As Variant, i As Integer
s = ""
a = Array([Abrechnung1], ... , [Abrechnung60])
For i = LBound(a) To UBound(a)
If Not IsNull(a(i)) Then
If i \> 1 Then s = s & vbCr & vbLf
s = s & "Abrechnung " & i & ": " & a(i) & " Stück"
End If
Next
Me.Textfeld = s
End Sub
Soweit so gut, nur dass das Access jetzt meint, es wisse nicht, was [AbrechnungX] bedeute. Echt toll, ich hab zwar keine Ahnung warum das so ist (ich hasse VB!!!), aber jedenfalls kann man das verhindern, indem man dem Bericht ein unsichtbares Textfeld mit dem Steuerelementeinhalt „=[Abrechnung1] & [Abrechnung2] & … & [Abrechnung60]“ hinzufügt.
Jetzt klappt das soweit, obwohl ich das allerdings für 'ne ziemlich umständliche Lösung halte, aber vielleicht fällt Dir - oder irgendjemandem der den Artikel hier sonst noch liest - 'ja noch was besseres ein.
Bei Fragen kannste Dich gerne melden.
Liebe Grüße
Lala
PS: Mir ist grad noch was anderes eingefallen: Du kannst auch folgende Query erstellen:
select Nummer, Abrechnungen(Nummer) as Abrechnungen from Tabelle
um sie dann ganz einfach in 'nen Bericht mit zumindest einem Textfeld für die LV-Nummer und einem (größenveränderbaren) für
den (mehrzeiligen) String, der die Abrechnungen erhält, zu verwenden.
Die Funktion Abrechnungen muss natürlich zuerst noch separat definiert werden, sie bekommt die LV-Nummer übergeben und liefert ‚nen (wohl „mehrzeiligen“) String zurück, der die Abrechnungen beinhaltet. Dazu wird für jede einzelne Nummer ‚ne extra Query gestartet ("… where Nummer=‘…‘") und aus den 60 Ergebnisspalten der Rückgabestring gebildet.
Aber mir persönlich gefällt die obere Lösung besser, u. a. weil sie wohl auch schneller ist.
Übrigens kann man 'ne Query der Form: select Nummer, Abrechnung(array(Abrechnung1, … , Abrechnung60)) as Abrechnungen from Tabellen bzw. select Nummer, Abrechnungen(Abrechnung1, … , Abrechnung60) as Abrechnung from Tabelle vergessen, da Access das auch für zu komplex (?!?) hält.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]