Neuigkeiten:

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

Mobiles Hauptmenü

alle Werte eine Spalte aus Abfrage in ungebundenen Textfeld anzeigen

Begonnen von jagger, Januar 06, 2018, 18:56:08

⏪ vorheriges - nächstes ⏩

jagger

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


MzKlMu

Gruß Klaus

Frithjiof

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

jagger

@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

jagger


Frithjiof


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


jagger

@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

Frithjiof

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

ebs17

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 ...
Mit freundlichem Glück Auf!

Eberhard

jagger

@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


MzKlMu

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.

Gruß Klaus

jagger

@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

Beaker s.a.

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
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)

ebs17

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_OrderSaison
Persö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.
Mit freundlichem Glück Auf!

Eberhard