Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Jimmy89 am Mai 27, 2015, 17:08:26

Titel: String mit Array dynamisch erweitern
Beitrag von: Jimmy89 am Mai 27, 2015, 17:08:26
Hallo,

aus einer ListView lese ich mehrere Werte aus und speichere sie in einem Array.
Diesen Array übergebe ich an eine Funktion die einen String zusammenbaut.
Der String soll zum Schluss eine SQL Abfrage werden.
strKommission = " WHERE C.Kommission IN('" & arrKommission(1) & "'"

Wie schaffe ich es, auch wenn mehrere Werte in arrKommission sind, diese
dynamisch an den String strKommission anzufügen?
Es kann auch mal vorkommen, dass es 20 oder 30 Werte sind.
Wie der Code momentan ist, greife ich nur auf den ersten Array Wert zu und setze ihn in den String ein.

Viele Grüße
Jimmy
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: daolix am Mai 27, 2015, 17:17:27
hallo
mit dem befehl join könnte es gehen
strKommission = " WHERE C.Kommission IN('" & join(arrKommission(), "';'" & "'"


Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Wurliwurm am Mai 27, 2015, 17:49:46
Private Sub AAATest()

Dim strKommission As String
Dim arr() As String
Dim i As Integer
Dim j As Integer
ReDim arr(25)

For i = 65 To 90
    arr(j) = Chr(i)
    j = j + 1
Next i

strKommission = " WHERE C.Kommission IN " & SQLString_Array(arr)
MsgBox strKommission

End Sub



Public Function SQLString_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
   
    SQLString_Array = "(" & Left(strSQL, Len(strSQL) - 2) & ")"

End Function
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: markusxy am Mai 27, 2015, 18:25:01
"aus einer ListView lese ich mehrere Werte aus und speichere sie in einem Array."

warum erstellst Du ein Array, wenn Du einen String brauchst, oder wird das Array noch wo anders eingesetzt?
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Jimmy89 am Mai 28, 2015, 09:57:20
Vielen Dank schonmal für das gewaltige Feedback.
;)
Ja den Array lese ich nur aus, weil ich diesen an einen String anfügen will.
Und das zwar dynamisch der Array hat immer eine unterschiedliche Größe.

Grüße Jimmy
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Jimmy89 am Mai 28, 2015, 11:58:16
Hallo nochmal,

eine Kleinigkeit hätte ich noch.
Ich habe desweiteren Listviews mit Checkboxen.
Er durchläuft nun diese und speichert alle angehackten in einem Array.
Die SQLString_Array Funktion gibt mir nun folgendes aus.
('...','...','...','','','','','','','')
Wie schaffe ich es, dass im String nur noch die Hochkomma stehen die ein Zeichen enthalten?

schöne Grüße
Jimmy
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Wurliwurm am Mai 28, 2015, 12:49:26
Du übergibst an die Funktion ein Array, das leere Einträge hat und solche, wo "..." drin steht.

Hier gehört bei Auslesen der Listviews noch ein Check auf ungültige Werte dazu. Nachdem die Größe eines Arrays fix ist und Du beim Initialisieren im Code noch nicht wissen kannst, wie viele Einträge er später haben wird, mußt Du ihn anschließend noch "zuschneiden".

Das geht so:
Dim arr() as string
Redim arr(100)

arr(0) = "A"
arr(1) = "B"
arr(2) = "C"

Redim preserve arr(3)

Das "PRESERVE" verändert die Größe und läßt gleichzeitig die Einträge stehen. Du mußt nur beim Durchlaufen der Listviews Dir in einer Variable merken, wo der letzte Eintrag steht bzw. wie lang das Array später wirklich sein soll und dann redim preserve machen. Beachte, daß der Array-Index immer bei 0 beginnt und redim immer die Anzahl der Inhalte hat. Sprich ein Array mit 10 Einträgen wird von 0 bis 9 durchlaufen, aber mit redim(10) abgekürzt.
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Hondo am Mai 28, 2015, 14:03:10
Wobei...
Ein Array mit 3 Elementen mit dem Index 2 deklariert wird  ::)
Redim preserve arr(2) kann 3 Elemente aufnehmen, 0, 1 und 2

Ausnahme:
Im Deklarationsteil wurde die Basis verändert, z.B. Option Base 1 um 1-Basierte Arrays zu haben.
Dann hat ein mit dem Index 2 deklarierte Arrays auch wirklich nur 2 Werte. 8)

Gruß Andreas
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Wurliwurm am Mai 28, 2015, 14:11:48
Zitat von: Hondo am Mai 28, 2015, 14:03:10
Redim preserve arr(2) kann 3 Elemente aufnehmen, 0, 1 und 2

Ja, stimmt. :-)
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Jimmy89 am Mai 28, 2015, 16:03:00
Ok hab das Thema abgeschlossen.
Vielen Dank.
Folgendermaßen sieht die Function nun aus.
Public Function ListArray(ByVal listView As listView) As Variant
    Dim iCount              As Integer
    Dim items()             As String
    Dim anzahl
   
    ReDim items(50)
    anzahl = 0
    With listView
        For iCount = 1 To .ListItems.Count
        If .ListItems(iCount).Checked Then
                items(iCount) = .ListItems.Item(iCount).Text
                anzahl = anzahl + 1
                End If
         Next iCount
    End With
    ReDim Preserve items(anzahl)
    ListArray = items
End Function


Gruß
Jimmy
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Wurliwurm am Mai 28, 2015, 16:45:26
Das sieht schon sehr sauber aus.

Jetzt bin ich aber nicht ganz sicher, ob
For iCount = 1 To .ListItems.Count
nicht doch
For iCount = 0 To .ListItems.Count - 1
heissen muß?

Kannst Du ausprobieren, wenn er den ersten Listeneintrag nie bringt, müßtest Du bei 0 anfangen.

Ich meine, da kriegst Du Lücken, wenn Du mit items(iCount) statt items(anzahl) in das Array schreibst.

   With listView
        For iCount = 0 To .ListItems.Count -1
        If .ListItems(iCount).Checked Then
                items(anzahl) = .ListItems.Item(iCount).Text
                anzahl = anzahl + 1
                End If
         Next iCount
    End With


Und schau das Array nach dem redim preserve im Debugging Überwachungsmodus an, ob die letzte Zeile leer ist, wegen dem letztem inkrementieren von anzahl.

Mit der Initialgröße von 50 beim Array würde bei einer Liste mit mehr als angekreuzten 50 Einträgen ein Laufzeitfehler kommen.
Titel: Re: String mit Array dynamisch erweitern
Beitrag von: Hondo am Mai 28, 2015, 17:16:26
Hallo,
ja muss definitiv For iCount = 0 To .ListItems.Count -1 heißen,
weil sonst lbound(items) auf ein Element zeigt das nicht vorhanden ist bzw. mit vbNullString als Inhalt.

Weist du definitiv ob es nicht mehr als 50 Listeneinträge gibt?
Es sollte wohl so aussehen:

    anzahl = 0
    With listView
        Redim items(.ListItems.Count-1)
        For iCount = 0 To .ListItems.Count-1


Andreas