Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage Umkreissuche

Begonnen von grauer Wolf, März 13, 2015, 13:55:53

⏪ vorheriges - nächstes ⏩

grauer Wolf

Hallo, versuche verzweifelt die Abfrage zum Laufen zu bringen. Manuell läuft die Abfrage. Nur automatisch nicht. Hier der Quellcode:
strUmkreis = sPlz & "," & Left(strUmkreis, Len(strUmkreis) - 1)

        sSQL = "SELECT Patienten.P_id, Patienten.P_Name, Patienten.P_Vorname, Patienten.P_Gebdat, Adresse.Strasse,
                     Adresse.PLZ, Adresse.Wohnort " & _
                    "FROM Patienten INNER JOIN Adresse ON Patienten.P_id = Adresse.id_adresse where PLZ in (" &
                    (strUmkreis) & ");"
        Set db = CurrentDb
        Set rs = db.OpenRecordset(sSQL, dbOpenDynaset)
        If Not rs.EOF Then rs.MoveLast
        rc = rs.RecordCount
        If rc > 0 Then
            rs.MoveFirst
            Do Until rs.EOF
                strUmkr = strUmkr & Format(rs!P_Name, "!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") & "  " & _
                                          Format(rs!P_Vorname, "!@@@@@@@@@@@@@@@@@@@@@@@@@@") & "  " & _
                                          Format(rs!Strasse, "!@@@@@@@@@@@@@@@@@@@@@@@@@@") & "  " & _
                                          Format(rs!PLZ, "00000") & "  " & _
                                          Format(rs!Wohnort, "!@@@@@@@@@@@@@@@@@@@@@@@@@@") & vbCrLf
     
                rs.MoveNext
Zur Erläuterung: die Variable strUmkreis ist ein stringarray und soll dynamisch die PLZ enthalten (z.B. 30159,30161,30163...). Diese soll dann an den string der Variable sSQL angehängt werden, die ebenfalls ein String ist. Beim testen wird immer wieder der Fehler 3464 erzeugt, Datentypenkonflikt. Wenn man die Zahlen manuel so eingibt where PLZ in ('30159','30161',30163') funktioniert das Ganze. WIe erzeuge ich nun aus dem stringarray mit 30159,30161,30163 die Änderung, dass es so übergeben wird '30159','30161','30163'. Über jede Hilfe bin ich dankbar. Hinzu muss ich sagen, dass der Programmcode für die Ermittlung der Daten nicht von mir ist. Ich weiß nur, in der DEMO funktioniert es, mit den Daten von meiner Datenbank so nicht. Die PLZ in meiner Datenbank sind als text gespeichert. Wenn noch Fragen sind, bitte um Rückmeldung, wenn noch was unklar ist. Wie gesagt der Debugger bleibt in der Zeile stehen set rs= db.openRecourdSet(sSQL, dbOpenDynaset) was mir ja klar ist, da heir kein Datensatz erzeugt wird. Ich weiß aber nicht, wie ich den SQL String zusammenbauen kann ohen dass dieser Fehler auftritt. Über jede Hilfe bin ich dankbar.

Wurliwurm

Schreibe Dir eine Function, die als Argument ein StringArray übernimmt und als Rückgabewert einen String zurückgibt. Im Code der Function über die Array-Einträge loopen und mit Hochkommas und Klammern verketten.

Einmal geschrieben, immer wieder verwendbar.

grauer Wolf

Danke für die schnelle Antwort. Habe dazu aber ein Problem. Die Anzahl variiert ja mit zunehmender entfernung. Wenn ich jetzt eine Funktion vortselle, die hier die umwandlung vornimmt, wie ist da die abfragezeit. Kannst du mal ansatzweise erläutern wie du die funktion aufbauen würdest. Ich möchte hier keine fertige Funktion, nur den ungefähren Aufbau. Wenn ich hier mit Do while loop strUmkreis einlessen und ändern muss, wie soll hier die Umwandlung vorgenommen werden. Mit Hilfe von Konvertierungsbefehlen von access oder SQL.

Wurliwurm

Private Sub A_Test()

Dim arrV() As String
ReDim arrV(4)

arrV(0) = "A"
arrV(1) = "B"
arrV(2) = "C"
arrV(3) = "D"

Dim strSQL As String
strSQL = "SELECT * FROM TABELLE WHERE ATTRIBUT IN " & SQL_FROM_Array(arrV) & ";"

MsgBox strSQL

End Sub


Public Function SQL_FROM_Array(ByVal arrInput As Variant) As String

    Dim i As Integer
    Dim strSQL As String
   
    For i = LBound(arrInput) To UBound(arrInput) - 1
      strSQL = strSQL & "'" & arrInput(i) & "', "
    Next i
   
    SQL_FROM_Array = "(" & Left(strSQL, Len(strSQL) - 2) & ")"

End Function

grauer Wolf

Super, danke, hatte ich nicht erwartet. Werde das morgen gleich ausprobieren.