PDA

Vollständige Version anzeigen : Array mit Split-Funktion in unterschiedlicher Formatierung zum Löschen von Datensätz


MHildebrandt
28.10.2011, 12:07
Hallo, bin neu in diesem Forum und benutze meine Datenbank nur für meine eigene Firma. Ich habe mir die letzten Einträge zu meiner Frage angesehen und habe nichts Ähnliches finden können. Ich hoffe ich habe nichts übersehen.
Das Löschen von Datensätzen realisiere ich durch Aufruf eines PopUps und Eingabe der Id bzw. ID’s in ein Textfeld. Ich möchte diesen Vorgang etwas verbessern.
Tabelle in der Datensätze gelöscht werden sollen: tblAblage
Popup für Auswahl/Eintrag der zu löschenden ID’s: frmMsgBoxDeleteAblage
Textfeld im PopUp in dem die zu löschenden ID’s eingetragen werden: txtDeleteAblage
Die aktuelle IDAblage ist beim Öffnen des PopUps bereits eingetragen, weitere zu löschende können durch Komma getrennt eingegeben werden. Alles kein Problem. Nun möchte ich aber nicht nur in dem Format z.Bsp. „3,4,5,6“ eingeben können, sondern „3-6“ oder „1, 3-5“. Wie muss ich mein Array mit der Split-Funktion umstellen?
Mein bisheriger Code:

Private Sub cmdRecDelete_Click()
Dim I As Long
Dim varArray As Variant

DoCmd.OpenForm "frmMsgBoxDeleteAblage", , , , , acDialog, Forms!frmAblage.Form!IDAbLage
If IsLoaded("frmMsgBoxDeleteAblage") = True Then

varArray = Split(Forms!frmMsgBoxDeleteAblage.Form!txtDeleteAblage, ",")
For I = LBound(varArray) To UBound(varArray)
CurrentDbC.Execute ("Delete from tblAblage WHERE IDAblage = " & varArray(I))
Next I

DoCmd.Close acForm, "frmMsgBoxDeleteAblage"
End If
…..
End Sub

Klassenmodul:
Public Property Get CurrentDbC() As DAO.Database
If (m_DaoDB Is Nothing) Then
Set m_DaoDB = CurrentDb
End If
Set CurrentDbC = m_DaoDB
End Property

Vielen Dank für Eure Hilfe
Marion

Atrus2711
28.10.2011, 12:15
Hi,

wenn das Komma die Werte trennt, müsste auch weiterhin nach Kommas gesplittet werden.

Kritischer wird die 3-5-Bereichsgeschichte. SQL kann das so gar nicht deuten. Das SQL-Äquivalent dazu wäre Feld >= 3 AND Feld <=5 oder auch Feld Between 3 and 5.

Am einfachsten wird sein, immer von Bereichen (Between) auszugehen und auch eine einzelne 1 als "Between 1 and 1" anzusehen. Dann bräuchtest du nur noch die einzelnen Arrayelemente ihrerseits anhand von "-" zu splitten und die Arrayeinträge (1 oder 2 sind nur möglich) als Grenzen des Between anzusetzen.

MHildebrandt
28.10.2011, 12:32
Hallo Martin,
danke für die schnelle Antwort. Muss ich zuvor also das Feld auf "," bzw. "-" prüfen und dann entsprechend splitten?

ebs17
28.10.2011, 12:44
Aus "2,3, 5- 8" soll "2,3,5,6,7,8" entstehen:
Sub test_ce()
' Debug.Print ChangeExpression("2,3, 5- 8")
CurrentDbC.Execute "Delete from tblAblage" & _
" WHERE IDAblage IN (" & _
ChangeExpression(Forms!frmMsgBoxDeleteAblage.Form!txtDeleteAblage) & ")", _
dbFailOnError
End Sub

Function ChangeExpression(ByVal Inputstring As String) As String
Dim Temp As String
Dim vArr As Variant
Dim i As Long
ChangeExpression = Inputstring
vArr = Split(Inputstring, ",")
For i = 0 To UBound(vArr)
If InStr(1, vArr(i), "-") > 0 Then
Temp = Temp & "," & ChangeExpressionU(Trim$(vArr(i)))
Else
Temp = Temp & "," & Trim$(vArr(i))
End If
Next
If Len(Temp) > 0 Then ChangeExpression = Mid$(Temp, 2)
End Function

Function ChangeExpressionU(ByVal Inputstring As String) As String
Dim Temp As String
Dim vArr As Variant
Dim i As Long
vArr = Split(Inputstring, "-")
For i = CLng(Trim(vArr(0))) To CLng(Trim(vArr(1)))
Temp = Temp & "," & i
Next
ChangeExpressionU = Mid$(Temp, 2)
End Function

MHildebrandt
28.10.2011, 13:12
HuHu, es funktioniert!! Vielen Dank an euch alle!! Ich brauche diese "Form" noch an einigen anderen Stellen.

Vielen Dank und viele Grüße aus Hamburg
Marion