2017-10-11 6 views
0

내 데이터베이스는 스키 대회 용으로 만들어졌습니다. 아이디어는 사람들이 스키를 타는 시대를 채울 수 있다는 것입니다. 그리고 데이터베이스는 시간을 먼저 정한 사람, 성별, 연령에 따라 얻은 메달 종류를 자동으로 계산합니다. 나는 그것을 등록하고 모든 결과를 줄 수있는 양식을 만들었습니다.액세스 : 자동 번호 매기기를 재설정하는 쿼리

내가 지금 가지고있는 유일한 문제는 누군가를 서명 할 때 나이에 주문해야한다는 것입니다. 나는 그것을했다. 그러나 지금 자동 넘버링은 모두 엉망이다.

필자가 원하는 것은 경쟁자의 모든 이름을 넣을 수 있고, 그 후에 모든 시작 번호를 할당 할 수있는 쿼리를 갖고 싶습니다. 이미 할당 된 번호가있는 경우에도 최근에 누군가가 합류하면 다시 설정하고 다시 할당하려고합니다. 나는 자동 번호 매기기 필드를 지우고 그것을 다시 만들어야하고 싶지 않다. 왜냐하면 대부분의 시간에 내가 직접 사용하지는 않을 것이고 다른 사람들은 그렇게 할 것이기 때문에 그것을 할당하는 버튼을 누르기 만하면된다.

미리 감사드립니다.

Example how my database and a competition looks like

+0

정규화 된 환경에서 tijd는 별도의 테이블에 저장됩니다 – Strawberry

+1

이 문제를 해결하기 위해 시도한 것을 보여줍니다. –

+0

나는 액세스 할 수있는 익숙하지가 않아서 나는 봤지만 많이 찾지 못했습니다. 내가 시도한 것 : UPDATE를 사용하여 쿼리를 만들고 모든 사람이 서명 한 후 숫자를 할당하는 쿼리를 만든다. 그러나 내가 바라는대로 두 가지 방법 모두 효과가 없었습니다. –

답변

0

일련 번호 필드는 레코드를 식별하기위한 것이다. 그 이상도 이하도 아닌.

우선 순위 (또는 순위)입니다. 해당 필드에 대해 다음과 같은 코드를 실행하면 레코드를 표시 양식에서는

:

Private Sub Priority_AfterUpdate() 

    Dim rst    As DAO.Recordset 
    Dim lngId   As Long 
    Dim lngPriorityNew As Long 
    Dim lngPriorityFix As Long 

    ' Save record. 
    Me.Dirty = False 

    ' Prepare form. 
    DoCmd.Hourglass True 
    Me.Repaint 
    Me.Painting = False 

    ' Current Id and priority. 
    lngId = Me!Id.Value 
    lngPriorityFix = Nz(Me!Priority.Value, 0) 
    If lngPriorityFix <= 0 Then 
     lngPriorityFix = 1 
     Me!Priority.Value = lngPriorityFix 
     Me.Dirty = False 
    End If 

    ' Rebuild priority list. 
    Set rst = Me.RecordsetClone 
    rst.MoveFirst 
    While rst.EOF = False 
     If rst!Id.Value <> lngId Then 
      lngPriorityNew = lngPriorityNew + 1 
      If lngPriorityNew = lngPriorityFix Then 
       ' Move this record to next lower priority. 
       lngPriorityNew = lngPriorityNew + 1 
      End If 
      If Nz(rst!Priority.Value, 0) = lngPriorityNew Then 
       ' Priority hasn't changed for this record. 
      Else 
       ' Assign new priority. 
       rst.Edit 
        rst!Priority.Value = lngPriorityNew 
       rst.Update 
      End If 
     End If 
     rst.MoveNext 
    Wend 

    ' Reorder form and relocate record. 
    Me.Requery 
    Set rst = Me.RecordsetClone 
    rst.FindFirst "Id = " & lngId & "" 
    Me.Bookmark = rst.Bookmark 

    ' Present form. 
    Me.Painting = True 
    DoCmd.Hourglass False 

    Set rst = Nothing 

End Sub 

그냥 모든 레코드에 순위를 할당하고, 기록으로 필요한 경우 번호가 다시 지정됩니다.

+0

답장을 보내 주셔서 감사합니다. 위에서 말했듯이, 나는 익숙하지 않아서 ...이 코드를 어디에서 어떻게 구현할 수 있습니까? –

+0

나는이 링크에서 허용되는 대답이 상당히 적절하다는 것을 발견했다. 그것은 넥타이 휴식으로 무엇을 할 것인가 확실하지 않습니다. https://stackoverflow.com/questions/4463116/use-access-sql-to-do-a-grouped-ranking –

+0

사용하는 양식의 _code-behind_입니다. 테이블에 Integer 데이터 형식의 _Priority_라는 필드를 추가하고 폼에 포함시킨 다음 코드를 필드에 바인딩 된 텍스트 상자의 _AfterUpdate_ 이벤트로 삽입합니다. – Gustav