Adfrageergebnis nicht untereinander sondern nebeneinander

wocoba

Benutzer
Beiträge
7
Hallo Experten
Eine Abfrage ergibt als Ergebnis Zahlen, wie:
74
99
101
156
189
Wie kann ich in einem Bericht die Darstellung nebeneinander mit Komma getrennt hinbekommen? Also so:
74, 99, 101, 156, 189
Vielen Dank für eure Antworten.
wocoba
 
Werbung:
Hallo wocoba,

schau Dir unter Access Hilfe mal das Thema Kreuztabellenabfrage an.
Danke andyfau für die Antwort. Allerdings ist das nicht, was ich möchte. Also:
Ich habe eine tblRedner und eine tblvortraege. Jeder Redner hat x Vorträge, die mit einer Nummer identifiziert werden. Pro Redner möchte ich nun in einem Bericht in einer Zeile den Namen, den Wohnort und seine Vortragsnummern mit Komma getrennt haben. Ich hoffe mein Problem verständlich gemacht zu haben. Danke.
 
Ich sehe das vorrangig als Formatieringsproblem. Eine entsprechende Kreuztabelle lässt sich zwar erstellen, enthält aber dann alle Vortragsnummern als Spaltenüberschriften und, wenn man z.B. die Funktion Anzahl nutzt, an den Kreuzungspunkten in den Zeilen mit Name und Wohnort eine 1, wenn der Vortrag beim dem Redner hinterlegt ist.

Eine Möglichkeit bietet Excel mit dem Transform-Befehl (Zeilen zu Spalten machen).
(Abfrage nach Excel exportieren und dort den Transform ausführen)

Ich würde aber eine Lösung in VBA bevorzugen.
- Nach Namen sortierte Abfrage mit Name, Wohnort und Vortragsnummer sequentiell lesen
- Solange nicht EOF oder neuer Name kommt, einen entspechenden String aufbauen
- Bei Gruppenwechsel Name, Wohnort und String in eine neue, temporäre Tabelle schreiben.
Die temporäre Tabelle dann als Datenquelle für den Report nutzen. (Sie muss natürlich bei jedem Lauf geleert und frisch neu aufgebaut werden.
 
Ich sehe das vorrangig als Formatieringsproblem. Eine entsprechende Kreuztabelle lässt sich zwar erstellen, enthält aber dann alle Vortragsnummern als Spaltenüberschriften und, wenn man z.B. die Funktion Anzahl nutzt, an den Kreuzungspunkten in den Zeilen mit Name und Wohnort eine 1, wenn der Vortrag beim dem Redner hinterlegt ist.

Eine Möglichkeit bietet Excel mit dem Transform-Befehl (Zeilen zu Spalten machen).
(Abfrage nach Excel exportieren und dort den Transform ausführen)

Ich würde aber eine Lösung in VBA bevorzugen.
- Nach Namen sortierte Abfrage mit Name, Wohnort und Vortragsnummer sequentiell lesen
- Solange nicht EOF oder neuer Name kommt, einen entspechenden String aufbauen
- Bei Gruppenwechsel Name, Wohnort und String in eine neue, temporäre Tabelle schreiben.
Die temporäre Tabelle dann als Datenquelle für den Report nutzen. (Sie muss natürlich bei jedem Lauf geleert und frisch neu aufgebaut werden.
Vielen Dank Andreas für die Lösungsansätze. Da habe ich ja wohl was zu tun. Ich melde mich, wenn ich Hilfe brauche.
 
Ich habe es mal in einer MiniDB umgesetzt.
Schau es Dir mal an. Öffne das Modul Funktionen, gehe mit dem Curor auf die erste Zeile der Sub-Prozedur und drücke F5. Dann aktualisiert sich jeweils die Zwischentabelle. Den Bericht kannst Du dann per Doppelklick öffnen.
 

Anhänge

Ich habe es mal in einer MiniDB umgesetzt.
Schau es Dir mal an. Öffne das Modul Funktionen, gehe mit dem Curor auf die erste Zeile der Sub-Prozedur und drücke F5. Dann aktualisiert sich jeweils die Zwischentabelle. Den Bericht kannst Du dann per Doppelklick öffnen.
Vielen Dank für die Beispieldatei. Sieht so aus, als wenn es das ist was ich möchte. Die Kreuztabelle habe ich in meiner DB umgesetzt und hat funktioniert. Jetzt muss ich nur noch die Funktion integrieren. Da tue ich mich ein wenig schwer.
 
Die Kreuztabelle habe ich nur zur Verdeutlichung drin gelassen. Sie ist für die Funktion unbedeutend.
Wesentlich ist, dass Du Dir zuerst die Beziehungen der Tabellen anschaust. Zwischen die Tabellen Redner und Vortraege ist eine Kombitabelle geschaltet, in der die Kombinationen gepflegt werden. (Zwei 1:n Beziehungen, jeweils mit referentieller Integrität, ergeben dann die m:n-Beziehung
für die Kombinationen aus Redner und Vorträgen.)

Weiterhin habe ich die Tabellen zwar mit Primärindizes (Autowert-IDs) angelegt, was die Verknüpfung in der m:n Tabelle vereinfacht.
Dazu sind für die Tabellen weitere eindeutige Indizes angelegt:
Name bei den Rednern, Vortragsnummer bei den Vorträgen und für die Kombinationstabelle ein kombinierter Schlüssel namens "RVKombi". (Nachzusehen, wenn Du in der Entwurfansicht der Tabelle tblRednerVortraege unter dem Reiter Entwurf "Indizes" anwählst.)
So verhindert Access perse die versehentliche Erfassung von doppelten Datensätzen und deren Kombinationen.
Normalerweise würde man nun ein Formular (Datenquelle dieselbe wie beim Report) anlegen um die Kombinationen zu pflegen.
Das hab ich mir gespart, weil ich davon ausgegangen bin, dass Du das bereits erledigt hast. Es ging Dir ja hauptsächlich um die Transformierung von Spalten nach Zeilen im Report.

Jetzt muss ich nur noch die Funktion integrieren. Da tue ich mich ein wenig schwer.
Was ist da nicht klar?
Du baust Dir einen Button für den Start des Reports in ein Formular. In diesem Fall brichtst Du aber nach dem ersten Schritt im Assistenten ab, öffnest die Eigenschaften des Buttons. Im Ereignis "Bei Klick" wählst du "Ereignisprozedur" und es öffnet sich der VBA Editor mit dem Prozedurrumpf. Dort hinein schreibst Du dann den Funktionsaufruf:

Code:
Private sub Mybutton_Click()

  VortraegeinString() 'zuerst die Temptabelle füllen

  DoCmd.OpenReport "rep_tblRednerVortraegestring"   'Report starten

End Sub
 
Die Kreuztabelle habe ich nur zur Verdeutlichung drin gelassen. Sie ist für die Funktion unbedeutend.
Wesentlich ist, dass Du Dir zuerst die Beziehungen der Tabellen anschaust. Zwischen die Tabellen Redner und Vortraege ist eine Kombitabelle geschaltet, in der die Kombinationen gepflegt werden. (Zwei 1:n Beziehungen, jeweils mit referentieller Integrität, ergeben dann die m:n-Beziehung
für die Kombinationen aus Redner und Vorträgen.)

OK Beziehngen sollten alle gesetzt sein. Die DB ist natürlich viel umfangreicher als hier erwähnt. Es funktioniert auxch alles. Nur halt der unschöne Report.
Weiterhin habe ich die Tabellen zwar mit Primärindizes (Autowert-IDs) angelegt, was die Verknüpfung in der m:n Tabelle vereinfacht.
Dazu sind für die Tabellen weitere eindeutige Indizes angelegt:
Name bei den Rednern, Vortragsnummer bei den Vorträgen und für die Kombinationstabelle ein kombinierter Schlüssel namens "RVKombi". (Nachzusehen, wenn Du in der Entwurfansicht der Tabelle tblRednerVortraege unter dem Reiter Entwurf "Indizes" anwählst.)
So verhindert Access perse die versehentliche Erfassung von doppelten Datensätzen und deren Kombinationen.
Normalerweise würde man nun ein Formular (Datenquelle dieselbe wie beim Report) anlegen um die Kombinationen zu pflegen.
Das hab ich mir gespart, weil ich davon ausgegangen bin, dass Du das bereits erledigt hast. Es ging Dir ja hauptsächlich um die Transformierung von Spalten nach Zeilen im Report.
Auch das ist aus meiner Sicht klar und gegeben.
Was ist da nicht klar?

Na ja die Namen meiner Abfragen und Tabellen muss ich ja wohl in der Funktion anpassen, da sie ja anders heißen. Trotzdem kommt nach Aufruf Vortraeginstring die Meldung °Fehler in der Routine Vortraegeinstring 3265 Element in dieser Auflistung nicht gefunden".
Du baust Dir einen Button für den Start des Reports in ein Formular. In diesem Fall brichtst Du aber nach dem ersten Schritt im Assistenten ab, öffnest die Eigenschaften des Buttons. Im Ereignis "Bei Klick" wählst du "Ereignisprozedur" und es öffnet sich der VBA Editor mit dem Prozedurrumpf. Dort hinein schreibst Du dann den Funktionsaufruf:

Code:
Private sub Mybutton_Click()

  VortraegeinString() 'zuerst die Temptabelle füllen

  DoCmd.OpenReport "rep_tblRednerVortraegestring"   'Report starten

End Sub
Der Aufruf über ein Button ist auch klar.

PS Alles was ich in Access gebaut habe und das war schon einiges, habe ich mir selbst und durch Hilfe beigebracht.
 
Kannst Du mal den Code Deiner Funktion zeigen, dann kann ich mal schauen. Oder, Du kannst mal einen Stop am Anfang der Prozedur einbauen. Dann mit F8 im Einzelschritt debuggen. Dann siehst Du ja bei welcher Zeile er in den Error-Zweig abbiegt.
 
Kannst Du mal den Code Deiner Funktion zeigen, dann kann ich mal schauen. Oder, Du kannst mal einen Stop am Anfang der Prozedur einbauen. Dann mit F8 im Einzelschritt debuggen. Dann siehst Du ja bei welcher Zeile er in den Error-Zweig abbiegt.
Sub VortraegeinString()
Dim rv As Recordset
Dim rvstring As Recordset
Dim db As Database
Dim vortraegestring As String
Dim RednernameMerker As String
Dim RednerWohnortMerker As String
On Error GoTo Fehler

Set db = CurrentDb
Set rv = db.OpenRecordset("qrySiegurgerRedner_mit_Vorträge")
Set rvstring = db.OpenRecordset("tblRednerVortraegeString", dbOpenDynaset)

With rvstring 'Temporäre Tabelle leeren
On Error Resume Next
.MoveFirst
Do Until .EOF
.Delete
.MoveNext
Loop
End With

On Error GoTo Fehler
With rv
.MoveFirst
RednernameMerker = !RednerName
RednerWohnortMerker = !Rednerwohnort
vortraegestring = ""

Do Until rv.EOF
If !RednerName = RednernameMerker Then 'gleicher Name, nur String bauen
vortraegestring = vortraegestring & !Vortragsnummer & ", "
.MoveNext
Else ' sonst Satz in temp-Tabelle schreiben
rvstring.AddNew
rvstring!RednerName = RednernameMerker
rvstring!Rednerwohnort = RednerWohnortMerker
vortraegestring = Left(vortraegestring, Len(vortraegestring) - 2)
rvstring!Rednerstring = vortraegestring
rvstring.Update

RednernameMerker = !RednerName
RednerWohnortMerker = !Rednerwohnort
vortraegestring = ""

End If

Loop

rvstring.AddNew 'letzten Datensatz verarbeiten
rvstring!RednerName = RednernameMerker
rvstring!Rednerwohnort = RednerWohnortMerker
vortraegestring = Left(vortraegestring, Len(vortraegestring) - 2) 'letztes Komma entfernen
rvstring!Rednerstring = vortraegestring
rvstring.Update
End With
GoTo AllesOK

Fehler:
msgbox "Fehler in Routine VortraegeinString: " & Err.Number & " " & Err.Description
Exit Sub

AllesOK:
msgbox "Alles OK"
End Sub

xxxxxxxxxxxx

Beim Debuggen springt er gleich zu GoTo Fehler
 
Werbung:
Hast Du die Tabelle tblRednerVortraegeString auch in deiner Datenbank angelegt. Ich prüfe in der Routine nicht ob es sie gibt. Wenn sie nicht (leer) angelegt ist um geleert zu werden, sorgt der resume next dafür, dass es bis zum on error goto fehler weiter geht und dann der Sprung zur Fehlermeldung folgt. Kann man sicher besser machen. War halt quick and dirty....
 
Zurück
Oben