anten0
Goto Top

Ausgeben aller zugehörigen Fields (ganze Zeile) mit dem Eintrag Japan im Field Land aus der Tabelle Lieferanten Zeile für Zeile in MsgBox.

Hallo erst einmal,

seit einer kurzen Weile beschäftige ich mich mit Programmier Grundkenntnissen im Bereich Access VBA. Das lesen der Codes ist bis auf Kleinigkeiten kein Prob aber für das entwerfen frei Schnauze fehlt mir leider noch Einiges an Praxis und Erfahrung.

Ich habe eine Aufgabe die folgendes aus einer Datenbanktabelle auslesen und ausführen soll:

Der Access VBA Code soll aus der Tabelle Lieferanten alle Einträge mit der Bezeichnung Japan im Feld Land, ganze Zeilen nacheinder in einer Message Box ausgeben. Zudem soll mit dem Objekt Recordset die Tabelle geöffnet, Inhalte der Felder mit Semicollon getrennt in eine Datei eingetragen und die Tabelle Lieferanten wieder geschlossen werden. Eine Schleife ist Vorzugsweise zu verwenden.

Ich habe erst einmal Folgenden Code geschrieben der allerdings so modifiziert werden soll (oder neuen Code) so das man eventuell per Syntax noch eine Spalte in die Tabelle hinzufügen kann.

Sub BetimmteSaetzeAusTabelleZiehen1()
Dim rst As ADODB.Recordset

Set rst = CurrentProject.Connection.Execute("SELECT * FROM Lieferanten WHERE Land = 'Japan'")


Do Until rst.EOF

MsgBox rst.Fields("Kontaktperson") & ";" & rst.Fields("Position") & ";" & rst.Fields("Straße") & ";" & rst.Fields("Ort") _
& ";" & rst.Fields("Region") & ";" & rst.Fields("Plz") & ";" & rst.Fields("Land") & ";" & rst.Fields("Telefon") _
& ";" & rst.Fields("Telefax") & ";" & rst.Fields("Homepage")

rst.MoveNext

Loop

rst.Close
Set rst = Nothing


End Sub



Gibt es hier eine kürzere/schnellere Lösung?

Über Codebeispiele freue ich mich sehr.

MfG
anten0


eDiT:

Also mein Chef war da schneller und die Lösung sieht wie folgt aus, für mich noch ein bisschen zu sehr Japanisch aber wenigstens verstehe ich jetzt wie der code abläuft, nur woher soll man sowas wissen wenn man keinen professionellen Übersetzer neben sich sitzen hat. Wie dem auch sei hier die Lösung:

Function LieferantenJapan()
Dim RS As Recordset
Dim DB As Database
Dim fld As Field
Dim merkstring, merk As String

Set DB = Application.CurrentDb
Set RS = DB.OpenRecordset("SELECT * FROM Lieferanten WHERE land='Japan'", dbOpenDynaset)
Do

For Each fld In RS.fields

If merkstring <> "" Then

merkstring = merkstring & ";" & fld

Else

merkstring = fld

End If

Next fld

RS.MoveNext

MsgBox merkstring

merkstring = ""

Loop Until RS.EOF = True


RS.Close
Set RS = Nothing
Set DB = Nothing

End Function

Hoffe das bringt anderen Anwendern etwas um nicht wie Ich (E...) in so einer Situation blöd dazustehen.

Viele Grüße
anten0

Content-Key: 100536

Url: https://administrator.de/contentid/100536

Printed on: April 18, 2024 at 19:04 o'clock

Member: Biber
Biber Oct 29, 2008 at 17:57:18 (UTC)
Goto Top
Moin anten0,

Anmerkung eines interessierten Laien:
Alle Befehle, die innerhalb einer "For each"- oder sonstigen Loop-Konstruktion stehen, werden natürlich auch "For each"-mal ausgeführt.
Was bei einer Massendatenverarbeitung eben auch n-mal die eine oder andere Millisekunde mehr Laufzeit bedeutet.

Deshalb würde ich auch in diesem Winzschnipsel schon aus Prinzip versuchen, diese 'if merkstring=""-Mimik aus den beinen Schleifen ( der Schleife über alle Datensätze und der Schleife über alle Felder) rauszuhalten.

Function LieferantenJapan()
Dim RS As Recordset
Dim DB As Database
Dim fld As Field
Dim merkstring As String
' Anmerkung 'den zweiten String 'merk' aus Deinem Beispiel hab ich weggelassen.  

Set DB = Application.CurrentDb
Set RS = DB.OpenRecordset("SELECT * FROM Lieferanten WHERE land='Japan'", dbOpenDynaset)  
merkstring=";"  
Do

    For Each fld In RS.fields
          merkstring = merkstring & ";" & fld  
    Next fld

    RS.MoveNext

    merkstring = mid(merkstring, 2, len(merkstring)-1)
    ' Erstes Zeichen = ";" entsorgen  
    MsgBox merkstring

    merkstring = ";"  
    ' Vorbelegung für nächste Runde ist wieder ";"  
Loop Until RS.EOF = True

RS.Close
Set RS = Nothing
Set DB = Nothing

End Function

Grüße
Biber
Member: anten0
anten0 Oct 31, 2008 at 09:07:08 (UTC)
Goto Top
Hallo Biber!

Danke für die Anmerkung! Ja, das mit der Laufzeit stimmt aber durch die If Konstruktion wird das Sonderzeichen/Trennzeichen Semikolon am Anfang des Strings vermieden. Dein Beispiel zeigt mir immer eines am Anfang der Ausgabe(MsgBox) vom String.

Ich als Totallaie habe da noch zu wenig Wissen für mid und len oder die Positionierung stimmt nicht, behaupte ich mal einfach so als Totallaie.

Wenn ich das erste merkstring = ";" auskommentiere, funktionierts in der ersten MsgBox, allerdings nicht in den nächsten.

Hast du ne Idee?

Grüße
an10zero
Member: Biber
Biber Oct 31, 2008 at 10:07:37 (UTC)
Goto Top
Moin anten0,

sorry, da hatte ich zu flüchtig draufgeguckt.
Richtig rum natürlich so:
Dim RS As Recordset
Dim DB As Database
Dim fld As Field
Dim merkstring As String
' Anmerkung 'den zweiten String 'merk' aus Deinem Beispiel hab ich weggelassen.  

Set DB = Application.CurrentDb
Set RS = DB.OpenRecordset("SELECT * FROM Lieferanten WHERE land='Japan'", dbOpenDynaset)   
merkstring = ""  
Do

    For Each fld In RS.Fields
          merkstring = merkstring & fld & ";"  
    Next fld

    RS.MoveNext

    merkstring = Mid(merkstring, 1, Len(merkstring) - 1)
    ' Letztes Zeichen = ";" entsorgen  
    MsgBox merkstring

    merkstring = ""  
    ' Vorbelegung für nächste Runde ist wieder "" (Leerstring)  
Loop Until RS.EOF = True

RS.Close
Set RS = Nothing
Set DB = Nothing

End Function

Grüße
Biber
Member: anten0
anten0 Oct 31, 2008 at 10:20:03 (UTC)
Goto Top
Moinsen Biber,

hätte mir eigentlich auch einfallen können face-smile... funktioniert einwandfrei!

Schönen Tag noch!
Grüße
an10zero
Member: bastla
bastla Oct 31, 2008 at 10:30:12 (UTC)
Goto Top
... oder, um noch ein Len() einzusparen:
...
Do
    merkstring = ""  
    ' Vorbelegung mit Leerstring  

    For Each fld In RS.Fields
          merkstring = merkstring & ";" & fld  
    Next fld

    RS.MoveNext

    merkstring = Mid(merkstring, 2)
    ' Erstes Zeichen = ";" entsorgen  
    MsgBox merkstring

Loop Until RS.EOF = True
...
Grüße
bastla