Hallo Leute,
ich möchte gern in einem ungebundenem Textfeld "SV" alle Werte
(alle Datensätze) einer Spalte aus einer Abfrage anzeigen.
Mit dem Code zeigt er mir immer nur den Wert von einem Datensatz an.
Da muss sicherlich noch eine Schleife rein. Aber wo und wie?
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim var
Set db = CurrentDb
strSQL = "SELECT * FROM qry_Filter_OrderSaison"
Set rs = db.OpenRecordset(strSQL)
If Not rs.EOF Then rs.MoveFirst
Do While Not rs.EOF
var = rs!OrderSaison
rs.MoveNext
Loop
SV = var
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
Es ist sicherlichganz einfach, aber ich habe leider keine Lösung gefunden.
Hat jemand eine Idee?
Mit Dank im Voraus
LG
jagger
Hallo,
ZitatEs ist sicherlichganz einfach,
nein, es ist nicht ganz einfach.
Siehe hierzu:
http://dbwiki.net/wiki/VBA_Tipp:_Liste_per_SQL_aufbauen
Du musst nur den Code bischen anpassen:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim var as String
Set db = CurrentDb
strSQL = "SELECT * FROM qry_Filter_OrderSaison"
Set rs = db.OpenRecordset(strSQL)
If Not rs.EOF Then rs.MoveFirst
var=""
Do While Not rs.EOF
var = var & rs!OrderSaison & vbcrlf
rs.MoveNext
Loop
SV = var
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
Frithjof
@Frithjiof,
Danke Dir.
Mit dem Code zeigt er leider nur den ersten Wert aus der Abfrage an.
@MzKlMu,
ich probier mal, ob ich da durchsteige.
LG
jagger
@MzKlMu,
Danke, klappt prima!
LG
jagger
Zitat von: jagger am Januar 06, 2018, 19:24:23
Mit dem Code zeigt er leider nur den ersten Wert aus der Abfrage an.
Im von mir angepassten Code müssten in der Variabeln
var alle Einträge der Spalte
rs!OrderSaison untereinander gelistet sein.
Frithjof
@Frithjiof,
Zitat
Im von mir angepassten Code müssten in der Variabeln var alle Einträge der Spalte rs!OrderSaison untereinander gelistet sein.
In dem Textfeld "SV"?
Hab ich da was falsch gemacht?
LG
jagger
Hallo jagger.
Zitat von: jagger am Januar 06, 2018, 20:07:22
In dem Textfeld "SV"?
In folgender Schleife wird in die Variabel "var" der Text geschrieben:
Do While Not rs.EOF
var = var & rs!OrderSaison & vbcrlf
rs.MoveNext
Loop
SV = var
Das geht auch direkt ins Textfeld "SV":
me.SV =""
Do While Not rs.EOF
me.SV = me.SV & rs!OrderSaison & vbcrlf
rs.MoveNext
Loop
Ich wüsste nicht warum das nicht gehen sollte.
Frithjof
ZitatIch wüsste nicht warum das nicht gehen sollte.
Ob etwas geht und ob man das Ergebnis sieht ist zweierlei. Wenn das anzeigende Textfeld in seiner Höhe die durch Zeilenumbrüche auftretenden mehrfachen Zeilen nicht berücksichtigt, hat der Ersteller ein selbstverursachtes Problem. Wenn er einen gezeigten Code nicht 1:1 umsetzen kann, dann auch.
Ansonsten: Codediskussion
ZitatstrSQL = "SELECT * FROM qry_Filter_OrderSaison"
Set rs = db.OpenRecordset(strSQL)
If Not rs.EOF Then rs.MoveFirst
Do While Not rs.EOF
...
Warum lädt man alle Felder der Abfrage, wenn man nur eines zum Zusammensetzen braucht? Selbst die eitelste Dame trägt nicht die Schränke mit allen ihren Schuhen mit sich herum, vermutlich weil es zum einen der Gesamtschönheit nicht dient und zum anderen schwere und unnütze Arbeit ist. Bei Daten ist es nicht anders als bei Schuhen.
Die Zeile mit MoveFirst ist unnütz. Bei einem neu geöffnetem Recordset liegt der Datensatzzeiger zwingend auf dem ersten Datensatz, sofern es Datensätze gibt, ansonsten gleich auf EOF. Die nachfolgende Schleife mit Bedingung NOT EOF deckt beide Fälle bereits überzeugend ab.
Neben Stilfragen dann noch Performancegedanken:
ZitatSet rs = db.OpenRecordset(strSQL, dbOpenDynaset)
Die Ergänzung ist der eingestellte Standard, der aber neben dem Lesen auch Schreibvorgänge verwalten muss - man denke an Sperrungen bei Mehrnutzerumgebungen sowie an Transaktionen, wo einiger Aufwand auftreten kann, der grundsätzlich verwaltet werden muss.
dbForwardOnly ... steht für einmaliges Vorwärts-Durchlaufen im Nur-Lese-Modus und wäre dieser Aufgabe angemessen.
An den meisten geht vorbei, dass es neben dem Tippeldappel-Zusammensetzen von Einzelwerten aus einer Abfrage per Schleife mit einigen systembedingten Schwächen die performante und gewaltige Methode Getstring des ADODB-Recordsets gibt.
Es könnte ja sein, dass man neben Funktionieren gutes Funktionieren (=> Performance) braucht ...
Gewohnheiten ergeben sich aus Tun, Üben, Verwenden ...
@Frithjof,
Du hast recht. Es funktioniert.
ebs17 hat es gut erkannt. Das Textfeld war
nicht hoch genug. Ich hatte die Werte hintereinander erwartet. Sorry.
@ebs17,
Danke für die weiteren Ausführungen. Sollte man natürlich immer berücksichtigen.
ZitatWarum lädt man alle Felder der Abfrage, wenn man nur eines zum Zusammensetzen braucht?
Wenn die Abfrage nur ein Feld hat? Ist es da nicht egal?
Ich habe mich für das Beispiel von
MzKlMu entschieden.
Die Funktion liefert die Werte nebeneinander und man kann die Texttrenner gut
anpassen.
Optional ByVal SepR As String = "; "Vielen Dank für eure Hilfe
LG
jagger
Hallo,
nur der Ordnung halber, das Beispiel ist nicht von mir, ich habe nur den Link gepostet.
ZitatDie Funktion liefert die Werte nebeneinander und man kann die Texttrenner gut anpassen.
Das geht auch mit dem Beispiel von Frithjiof völlig problemlos.
me.SV = me.SV & rs!OrderSaison & "; "ZitatWenn die Abfrage nur ein Feld hat? Ist es da nicht egal?
Um mal bei Eberhards bildhaften Beispielen zu bleiben (meistens gefallen sie mir ;D) :
Wenn Du ein Flasche Bier aus dem Keller brauchst, holst Du da jedes Mal den Kasten hoch um eine Flasche zu entnehmen und dann den Kasten wieder herunter zu tragen ?
Mit andern Worten jedes Feld das man nicht braucht ist Ballast.
@MzKlMu,
Zitat
ZitatWenn die Abfrage nur ein Feld hat? Ist es da nicht egal?
Um mal bei Eberhards bildhaften Beispielen zu bleiben (meistens gefallen sie mir ;D) :
Wenn Du ein Flasche Bier aus dem Keller brauchst, holst Du da jedes Mal den Kasten hoch um eine Flasche zu entnehmen und dann den Kasten wieder herunter zu tragen ?
Mit andern Worten jedes Feld das man nicht braucht ist Ballast.
Das ist schon klar, aber wie ist es, wenn die Abfrage nur ein Feld hat?
ZitatWenn Du ein Flasche Bier aus dem Keller brauchst, holst Du da jedes Mal den Kasten hoch um eine Flasche zu entnehmen...
Ja natürlich! Man weiss ja nie... ;-)
Zitat...und dann den Kasten wieder herunter zu tragen ?
Selbstverständlich nicht! :-)
LG
jagger
Hallo Jagger,
ZitatDas ist schon klar, aber wie ist es, wenn die Abfrage nur ein Feld hat?
Dann ist es eigentlich egal. Beim Lesen von "*" wird jedoch allgemein von
mehreren Feldern ausgegangen. Daher die Anmerkung von Eberhard.
gruss ekkehard
Zitataber wie ist es, wenn die Abfrage nur ein Feld hat?
Das wäre eine Momentsituation. Es soll vorkommen, dass Abfragen überarbeitet werden, um sie z.B. bei weiteren Verwendungen einzusetzen. Wenn da weitere Felder hinzukommen, übernimmt Deine aufbauende Abfrage stur alles wie geschrieben.
Wenn Du dagegen dieses eine Feld namentlich aufführst, kann da im Untergrund eine Menge passieren, und Deine Verarbeitungsschicht bleibt trotzdem unbeeinflusst.
Eine ordentliche Datenbank ist regelmäßig ein langfristiges Gut. Da soll keiner sagen, dass die Abfrage nicht mal durch Deinen Nachfolger oder durch Dich selber verändert wird. Ob dann noch das Bewusstsein dafür da ist, welche Folgen dadurch auftreten können, ist zu bezweifeln.
Und wie bereits gesagt: Das Sternchen irritiert beim Lesen der Anweisung, mindestens schon mal einen Dritten.
SELECT * FROM qry_Filter_OrderSaisonPersönlich würde ich statt dieser Anweisung mit recht wenig Informationsgehalt gleich die SQL-Anweisung von qry_Filter_OrderSaison verwenden. Da hätte man die Info zu dem nur einen Feld automatisch dabei.