Einführung "VBA mit Microsoft Office"

Code Snippet "VBA Access"

Gibt die Felder einer DB-Tabelle nach ihrer natürlichen Reihenfolge aus

Schema gibt Felder normalerweise alphabetisch zurück, deshalb braucht es noch eine Sortierung

'Parameter dieser Prozedur
' - arrvar: ein zweidimensionaler Array, wobei erste Dimension
'     den Datensätzen und zweite Dimension den Spalten entspricht
' - intl: Hilfsvariable für linke Position
' - intr: Hilfsvariable für rechte Position
' - intsortcolumn: Spalte, nach der sortiert wird (beginnt bei 0!)
Sub procarrquicksort(ByRef arrvar, ByVal intl, ByVal intr, ByVal intsortcolumn)
  Dim inti, intj, intpivot, intinnercounter ', vartemp
  Dim arrhelp
  
  ReDim arrhelp(Ubound(arrvar, 2)) 'für jede Spalte 1 Zelle
  
  inti = intl
  intj = intr
  
  intpivot = arrvar((intl + intr) \ 2, intsortcolumn)

  Do
    Do While arrvar(inti, intsortcolumn) < intpivot
      inti = inti + 1
    Loop
    Do While intpivot < arrvar(intj, intsortcolumn)
      intj = intj - 1
    Loop
    
    If inti <= intj Then
      'Response.Write("inti: " & inti & " intj: " & intj & "<br />" & vbCrLf)
      For intinnercounter = 0 To Ubound(arrhelp)
        arrhelp(intinnercounter) = arrvar(intj, intinnercounter)
        arrvar(intj, intinnercounter) = arrvar(inti, intinnercounter)
        arrvar(inti, intinnercounter) = arrhelp(intinnercounter)
      Next
      inti = inti + 1
      intj = intj - 1
    End If
  Loop While inti <= intj
  
  If intl <= intj Then
    Call procarrquicksort(arrvar, intl, intj, intsortcolumn)
  End If
  If inti <= intr Then
    Call procarrquicksort(arrvar, inti, intr, intsortcolumn)
  End If
End Sub

'liefert einen String mit den Feldnamen ohne Felder .._alt zurück
'nicht verwendet, da langsamer als funStrFields
'Funktioniert im Gegensatz zu funStrFields auch, wenn alle Daten einer Tabelle gelöscht sind
'Problem: Cursor für Schema ist statisch -> kein RecordCount, Sort, GetRows möglich
'Manuell in Array abfüllen und mit Quicksort sortieren
Function funStrFieldsWithSchema(ByVal objCon, ByVal strTablename As String, Optional ByVal strTblVorspann As String) As String
  Dim intRow As Integer
  Dim varArrRS()
  Dim strFields As String
  Dim objRsSchema As New ADODB.Recordset
  Dim objRs As New ADODB.Recordset
  
  'objRsSchema.CursorLocation = adUseClient
  objRsSchema.CursorLocation = adUseClient
  Set objRsSchema = objCon.OpenSchema(4)

  If Not Err.Number = 3251 Then
    'Anzahl Felder in Tabelle zählen
    intRow = 0
    Do Until objRsSchema.EOF
      If Lcase(objRsSchema("TABLE_NAME")) = Lcase(strTablename) Then
        intRow = intRow + 1
      End If
      objRsSchema.MoveNext
    Loop
    'Array für diese Anzahl Felder redimensionieren
    ReDim varArrRS(intRow, 2)
    
    'Felder in Array abfüllen
    objRsSchema.MoveFirst
    intRow = 0
    Do Until objRsSchema.EOF
      If Lcase(objRsSchema("TABLE_NAME")) = Lcase(strTablename) Then
        'ReDim geht nicht direkt, weil nur letzte Dimension vergrössert werden kann
        varArrRS(intRow, 0) = objRsSchema("ORDINAL_POSITION")
        varArrRS(intRow, 1) = objRsSchema("COLUMN_NAME")
        intRow = intRow + 1
      End If
      objRsSchema.MoveNext
    Loop
    
    'Sortieren nach Feldposition (normal alphabetisch nach Feldname)
    Call procarrquicksort(varArrRS, 0, Ubound(varArrRS, 1) - 1, 0)
    
    For intRow = 0 To Ubound(varArrRS) - 1
      If Right(varArrRS(intRow, 1), 4) <> "_alt" Then
        If strTblVorspann <> "" Then
          strFields = strFields & "[" & strTblVorspann & "].[" & varArrRS(intRow, 1) & "], "
        Else
          strFields = strFields & "[" & varArrRS(intRow, 1) & "], "
        End If
      End If
    Next
  End If

  objRsSchema.Close
  Set objRsSchema = Nothing
  strFields = Left(strFields, Len(strFields) - 2)
  funStrFieldsWithSchema = strFields
End Function

Sub procTestFunStrFields()
  Set objCon = CurrentProject.Connection
  strDatasource = objCon.Properties("Data Source")
  Debug.Print (funStrFieldsWithSchema(objCon, "tbl_AB_Verarbeitet""tbl_AB_Verarbeitet"))
End Sub