2016-05-15 6 views
0

Ich versuche, ein Recordset zu erstellen, das nach einer Tabelle und der aktuellen Orderby-Eigenschaft eines bestimmten Formulars sortiert ist. Da sich die Orderby-Eigenschaft ändert, wenn die Benutzer sie ändern, habe ich eine Funktion erstellt, die nur das erste Feld in der Orderby-Eigenschaft erhält (und es mit mehr als 1 Feld anordnen kann) und damit ein geordnetes Recordset zu erstellen. Der Name des Feldes gegeben von der Funktion getField ist korrekt angegeben, aber ich nehme an, dass die Syntax von "Set rsAll = ..." ist falsch, was ist, was ich denke, verursacht den Code zu stoppen.Instanziieren Sie Recordset mit ORDER BY Access VBA

Erstellen eines Recordsets in geordneter Weise.

Dim rsAll As DAO.Recordset 
If Len(Forms("All Patient Sub").OrderBy) > 0 Then 
Set rsAll = CurrentDb.OpenRecordset("SELECT * FROM [All Patient Info] ORDER BY " & getField(Forms("All Patient Sub").OrderBy)) 'code stops here 
Else 
Set rsAll = CurrentDb.OpenRecordset("All Patient Info") 
End If 

Die Funktion, die den Feldnamen aus der Eigenschaft SortiertNach gehört Form

Public Function getField(ByVal sorter As String) As String 
Debug.Print "Started" 
'i = 21 hence [All Patient Info].[ is skipped and starts from the field's name 
    For i = 21 To Len(sorter) 
     If Mid(sorter, i, 1) = "]" Then 
      getField = Mid(sorter, 21, i - 21) 
      Exit For 
     End If 
    Next i 
Debug.Print getField 
End Function 
+1

Wenn Sie sagen * "Code stoppt hier" *, nehme ich an, Sie meinen, dass es einen Fehler gibt. Wenn ja, was sagt die Fehlermeldung? Wenn Sie etwas anderes als einen Fehler meinten, was dann? Ich vermute, dass es nützlich sein könnte, zu sehen, was Ihnen das zeigt: 'Debug.Print" SELECT * FROM [Alle Patienteninformationen] ORDER BY "& getField (Formulare (" All Patient Sub "). OrderBy))' – HansUp

+0

Auch was ist das? Ausgabe von 'Debug.Print getField'? – Andre

+0

Sorry für das mehrdeutige Vokabular, ich meinte einen Fehler ist aufgetreten. Ich habe versucht 'Debug.Print" SELECT * FROM [Alle Patienten Info] ORDER BY "& getField (Formulare (" Alle Patienten Sub "). OrderBy))' und es hat nichts gedruckt und die Ausgabe von 'Debug.Print getField' kann abweichen von Zeit zu Zeit, aber lassen Sie uns seinen DOB sagen. – Kozero

Antwort

0

ich nicht wirklich folgen Sie Ihren Code wird; aber da Sie wollen einfach nur die erste Spalte in der orderBy, wie über diese:

Diese Funktion in einem Modul gestellt werden muss:

'this returns either " ORDER BY [column name]" or an empty string, if there is no column name to order by 
public function OrderByClause(propValue as string) as string 
    dim cols as string() 

    if propValue = "" then 
     OrderByClause = "" 
    else 
     cols = split(propValue, ",") 
     dim junk as string: junk = cols(0) 
     if instr(junk, ".") > 0 then 
      junk = mid(junk, instr(junk, ".") + 1) 
     end if 
     OrderByClause = " ORDER BY " & junk 
    end if 
end function 

Dann in Ihrer Form:

Dim rsAll As DAO.Recordset 
Dim src as string 
src = OrderByClause(Forms("All Patient Sub").OrderBy & "") 
src = "SELECT * FROM [All Patient Info]" & src 

Set rsAll = CurrentDb.OpenRecordset(src) 

Seit Die OrderByClause-Funktion gibt immer einen Wert zurück, den Sie einfach in Ihrem Formular aufrufen können, unabhängig davon, auf was die Eigenschaft eingestellt ist. Der Aufruf verwendet ... & "", um einen Fehler zu verhindern, wenn die Eigenschaft tatsächlich null ist.