habe da was gebastelt
bei DaveS version muss man die tabelle wissen, da ich aber immer nur an ne Funktion einen SQLString übergebe, wäre diese möglichkeit fast flachgefallen, fast aber nur
habe ne funktion geschreiben die mir den CountString liefert, egal wie der SQLString aussieht, unterSelects und IIF-Kompatible
der restliche teil fehlt aber noch, da ich jetzt mein system ein bisschen umbauen muss, damit ich da nen progressbar drin habe
falls jemand meint das sei nicht sauber programmiert, gebe ich ihm recht
Private Shared Function GetPrimaryField(ByVal SQLString As String) As String
Return SQLString.Remove(0, 7).Split(" ")(0).Replace(",", "")
End Function
Private Shared Function Del_GROUP_ORDER(ByVal SQLString As String) As String
Dim pos As Integer
pos = SQLString.IndexOf("GROUP BY")
If pos <> -1 Then
SQLString = SQLString.Remove(pos, SQLString.Length - pos)
End If
pos = SQLString.IndexOf("ORDER BY")
If pos <> -1 Then
SQLString = SQLString.Remove(pos, SQLString.Length - pos)
End If
Return SQLString
End Function
Private Shared Function Replace_FieldList_to_Count(ByVal SQLString As _
String, ByVal PrimaryField As String) As String
' die feld liste durch COUNT() austauschen
' ich
Dim pos As Integer
Dim posKlAuf As Integer
Dim posKlZu As Integer
Dim posFrom As Integer
Dim anzKl As Integer
Dim aktPos As Integer
Dim uSelBeg As Integer
Do While 1
posKlAuf = SQLString.IndexOf("(")
posFrom = SQLString.IndexOf("FROM")
If posKlAuf <> -1 Then
If posKlAuf < posFrom Then
' es gibt einen unterselect im Fieldstring
uSelBeg = posKlAuf
anzKl = 1
Else
Exit Do
End If
Else
Exit Do
End If
' unterselect entfernen
aktPos = uSelBeg + 1
Do While anzKl <> 0
posKlAuf = SQLString.IndexOf("(", aktPos)
posKlZu = SQLString.IndexOf(")", aktPos)
If posKlAuf = -1 Then posKlAuf = posKlZu + 1
If posKlAuf < posKlZu Then
anzKl += 1
aktPos = posKlAuf + 1
Else
anzKl -= 1
aktPos = posKlZu + 1
End If
Loop
SQLString = SQLString.Remove(uSelBeg - 1, posKlZu - uSelBeg + 2)
Loop
pos = SQLString.IndexOf(" FROM")
Return SQLString.Replace(SQLString.Substring(6, pos), " COUNT(" & _
PrimaryField & ") ")
End Function
Public Shared Function CreateDataTable(ByVal SELECTString As String) As _
DataTable
Try
' beim SELECTString die felder rausschneiden und die anzahl der
' datensätze herausfinden die geladen werden soll
'SELECT LfdNr FROM Personen
Dim PrimaryField As String
Dim CountString As String, tmpString As String
' bei meiner datenbank heissen die ID felder z.b. LfdNr_Pers
' funktioniert nicht bei Select * FROM
' das PrimaryFeld muss an erster stelle stehen
If SELECTString.StartsWith("SELECT LfdNr_") = True Then
tmpString = SELECTString
' LfdNr_ feld auslesen
PrimaryField = GetPrimaryField(tmpString)
' GROUP BY und ORDER BY rausschneiden
tmpString = Del_GROUP_ORDER(tmpString)
CountString = Replace_FieldList_to_Count(tmpString, _
PrimaryField)
End If0 |