2016-12-27 7 views
-2

Ich habe eine MS Access 2010-Anwendung, die zurück auf (Back-End) sql-Server schreibt. Die Tabelle hat Studenten-ID, Testergebnis und Rang als Spalten. Die Anwendung hat ein Formular, das Eingaben von Benutzern nimmt. Wenn ein neuer Schüler seine ID, seinen Punktestand und seinen Rang eingibt, muss der Rest der Ränge basierend auf dem eingefügten Rang aktualisiert werden.Wie aktualisiert man eine Spalte mit einem vordefinierten Rang basierend auf dem Rang eines neuen Datensatzes?

Für zB, wenn ein neuer Schüler eine Punktzahl 79 hat, und Rang 5, die aktuelle Student an der 5 muss bis 6, sechsten Rang auf den siebten und so weiter, in der SQL-Tabelle geändert werden

Vorher:

Student_ID Score Rank 
1   89 1 
16   88 2 
25   84 3 
3   81 4 
7   78 5 
15   75 6 
12   72 7 
17   70 8 
56   65 9 
9   64 10 

Nach:

Student_ID Score Rank 
1   89 1 
16   88 2 
25   84 3 
3   81 4 
7   78 6 
15   75 7 
12   72 8 
17   70 9 
56   65 10 
9   64 11 
10   75 5 

Antwort

0

den Rang Feld entfernen und eine Abfrage erstellen, die den Rang (Zeilennummer) on the fly berechnet. Um dies zu beschleunigen, verwenden Sie eine Sammlung wie hier gezeigt:

Public Function RowCounter(_ 
    ByVal strKey As String, _ 
    ByVal booReset As Boolean, _ 
    Optional ByVal strGroupKey As String) _ 
    As Long 

' Builds consecutive RowIDs in select, append or create query 
' with the possibility of automatic reset. 
' Optionally a grouping key can be passed to reset the row count 
' for every group key. 
' 
' Usage (typical select query): 
' SELECT RowCounter(CStr([ID]),False) AS RowID, * 
' FROM tblSomeTable 
' WHERE (RowCounter(CStr([ID]),False) <> RowCounter("",True)); 
' 
' Usage (with group key): 
' SELECT RowCounter(CStr([ID]),False,CStr[GroupID])) AS RowID, * 
' FROM tblSomeTable 
' WHERE (RowCounter(CStr([ID]),False) <> RowCounter("",True)); 
' 
' The Where statement resets the counter when the query is run 
' and is needed for browsing a select query. 
' 
' Usage (typical append query, manual reset): 
' 1. Reset counter manually: 
' Call RowCounter(vbNullString, False) 
' 2. Run query: 
' INSERT INTO tblTemp (RowID) 
' SELECT RowCounter(CStr([ID]),False) AS RowID, * 
' FROM tblSomeTable; 
' 
' Usage (typical append query, automatic reset): 
' INSERT INTO tblTemp (RowID) 
' SELECT RowCounter(CStr([ID]),False) AS RowID, * 
' FROM tblSomeTable 
' WHERE (RowCounter("",True)=0); 
' 
' 2002-04-13. Cactus Data ApS. CPH 
' 2002-09-09. Str() sometimes fails. Replaced with CStr(). 
' 2005-10-21. Str(col.Count + 1) reduced to col.Count + 1. 
' 2008-02-27. Optional group parameter added. 
' 2010-08-04. Corrected that group key missed first row in group. 

    Static col  As New Collection 
    Static strGroup As String 

    On Error GoTo Err_RowCounter 

    If booReset = True Then 
    Set col = Nothing 
    ElseIf strGroup <> strGroupKey Then 
    Set col = Nothing 
    strGroup = strGroupKey 
    col.Add 1, strKey 
    Else 
    col.Add col.Count + 1, strKey 
    End If 

    RowCounter = col(strKey) 

Exit_RowCounter: 
    Exit Function 

Err_RowCounter: 
    Select Case Err 
    Case 457 
     ' Key is present. 
     Resume Next 
    Case Else 
     ' Some other error. 
     Resume Exit_RowCounter 
    End Select 

End Function 

Studie der Inline-Kommentare für typische Verwendung.

+0

Danke für die Hilfe. Anstatt 1,2,3 zu verwenden ... habe ich 10,20,30 .. so als Rang verwendet. Dies hat dazu beigetragen, dass zwischenzeitlich neue Studentenränge hinzukamen. Angesichts der Tatsache, dass diese Tabelle selten aktualisiert wird, hat diese Methode gut funktioniert. –