2013-10-02 2 views
2

데이터 입력 용으로 만 사용되는 일부 양식으로 액세스 데이터베이스를 개발 중입니다. 문제는이 형식 중 하나를 열면 액세스가 기본 테이블의 자동 기본 키를 늘리는 것을 포함하여 기본 테이블에 새로운 항목을 만들고 사용자가 레코드를 만들지 않기로 선택하더라도 자동 번호가 증가한다는 것입니다. 데이터베이스 즉, 사용자가 변경 사항을 열지 않고 양식을 열고 닫을 때마다 실제 테이블의 자 동 순서에 간격이 있음을 의미합니다. 나는 beforeupdate 방법에 다음 코드를 사용하고afterupdate가 기본 키에 갭을 남김

사용자가 잘못된 데이터를 폐기 할 수 있도록 :

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    'Provide the user with the option to save/undo 
    'changes made to the record in the form 
    If MsgBox("Data has been entered into this form." _ 
     & vbCrLf & vbCrLf & "Do you want to save this data?" _ 
     , vbYesNo, "Changes Made...") = vbYes Then 
      DoCmd.Save 
    Else 
     DoCmd.RunCommand acCmdUndo 
    End If 
End Sub 

나는 beforeinsert 이벤트를 사용하는 것으로 생각했지만, beforeinsert가 사용 된 경우 양식을 여는 데 문제가 있었다 .

사람들이 자동 짝수 값의 시퀀스에서 이러한 갭이 생성되지 않도록 설정하는 방법을 보여 줄 수 있습니까? 이 데이터베이스는 10 명의 동시 사용자가 사용합니다.

답변

6

자동 숫자 입력란의 값에 어떤 의미도 지정하지 않아야합니다. Autonumbers를 사용하면 각 행에 대해 고유 한 값을 정의 할 수 있으며 순차적으로 보장 할 수는 없습니다. I 강력하게은 카운터 또는 사람이 읽을 수있는 값이 아닌 고유 한 레코드를 식별하기 위해 자동 번호 필드 만 사용하는 것이 좋습니다. 당신이 정말로 순차적으로 값을 가지도록 각 레코드를 필요로하는 경우 그 길에서, 당신이해야 할 무엇으로

이제

  1. 는 하나 개의 컬럼을 하나 개의 행이 별도의 테이블을 만듭니다 시퀀스의 다음 값을 보유합니다.
  2. 데이터 입력 폼에서 레코드를 저장할 때마다 해당 카운터 테이블을 독점적으로 잠그기 때문에 다른 사용자가 읽거나 쓸 수 없습니다.
  3. 카운터 테이블에서 현재 값을 검색하고이를 새 데이터 레코드에 사용하십시오.
  4. 다음 값으로 증가하도록 카운터 테이블의 값을 업데이트하십시오.

마이크로 소프트는 here을 찾을 수있는 DAOOpenTableExclusive() 테이블을 독점적으로 잠글 수있는 기능을 제공합니다.

here 코드를 사용하여 카운터 테이블을 만들 수 있습니다.

2

양식 집합의 레코드 원본이있는 경우 바운드 컨트롤 항목을 입력하면 AutoNumber 필드가 채워집니다. 사용자가 포기하거나 필요한 모든 정보를 입력하지 않으면 해당 자동 번호는 건너 뜁니다.

이를 피하기 위해 직접 레코드를 저장할 수 있습니다.당신이 다음 표가 정의한 말할 수 :

enter image description here

그리고 생성 된 다음과 같은 형식 :

Private Sub cmdClose_Click() 
    DoCmd.Close 
End Sub 


Private Sub cmdSave_Click() 
    DoCmd.SetWarnings False 
    DoCmd.RunSQL "INSERT INTO z_TestTable (DueDate, " & _ 
             "DateReceived, " & _ 
             "Terms, " & _ 
             "ECOFee, " & _ 
             "Classification) " & _ 
           "VALUES (#" & txtDueDate & "#, " & _ 
             "#" & txtDateReceived & "#, " & _ 
             "'" & txtTerms & "', " & _ 
             txtECOFee & ", " & _ 
             "'" & txtClassification & "')" 
    MsgBox ("RECORD SAVED") 
End Sub 

Private Sub txtClassification_AfterUpdate() 
    funCheckForRequiredFields 
End Sub 


Private Sub txtDateReceived_AfterUpdate() 
    funCheckForRequiredFields 
End Sub 


Private Sub txtDueDate_AfterUpdate() 
    funCheckForRequiredFields 
End Sub 


Private Sub txtECOFee_AfterUpdate() 
    funCheckForRequiredFields 
End Sub 


Private Sub txtTerms_AfterUpdate() 
    funCheckForRequiredFields 
End Sub 


Function funCheckForRequiredFields() 
    Dim NotComplete As Boolean 
    NotComplete = False 

    If (IsNull(txtDueDate)) Then NotComplete = True 
    If (IsNull(txtDateReceived)) Then NotComplete = True 
    If (IsNull(txtECOFee)) Then NotComplete = True 
    If (IsNull(txtClassification)) Then NotComplete = True 
    If (IsNull(txtTerms)) Then NotComplete = True 

    If (NotComplete) Then _ 
    cmdSave.Enabled = False Else _ 
    cmdSave.Enabled = True 
End Function 

형태가 열립니다 : 뒤에 다음 코드와

enter image description here

레코드 저장 단추가 비활성화되었습니다. 레코드 저장 단추는 모든 필드를 입력 한 후에 만 ​​사용할 수 있습니다. 레코드 저장을 누르면 레코드가 DoCmd.RunSQL 명령을 통해 저장됩니다.

필요한 데이터와 일치하도록 양식의 컨트롤 형식을 설정했습니다. 이렇게하면 입력 된 데이터의 유효성이 검사됩니다.

이 방법을 사용하면 일련 번호 필드가 사용되고 INSERT SQL이 유효하지 않은 레코드가 저장된 유일한 방법이 없습니다. 그것은 미리 점검되기 때문에 일어나지 않아야합니다.

+0

OP가 찾고있는 것을 얻기 위해 언 바운드 형식을 사용할 필요는 없습니다. 예, 해결 방법 중 하나입니다.하지만 첫 번째 옵션이 아닌 최후의 수단으로 생각합니다. Constablebrew의 게시물은이 문제를 훨씬 더 나은 방법으로 해결합니다. Autonumbers의 틈새에 대해 걱정하지 마십시오. AutoNumber를 사용하지 마십시오. – HK1

2

max 함수를 사용하여 테이블의 열의 최대 값을 결정하고 저장하기 직전에 값을 추가 할 수 있습니다.

EDIT : 다중 사용자 환경에서이 작업을 수행하려면 '인덱싱 됨'필드를 'Yes (No Duplicates)'로 설정하십시오.

+1

한 번에 여러 사용자 또는 가능한 여러 레코드가 열리면 중복이 발생할 수 있습니다. – Constablebrew

+0

열을 고유 ID로 설정하면 발생하지 않습니다. – RHAD

+1

당신의 대답에 중요한 감독이 될 것입니다. 두 사람은 서로 가깝게 지냅니다. 그것을 당신의 대답에 추가하십시오, 그리고 나는 당신의 대답이 가장 간단한 해결책이라고 생각합니다. 또한 던져진 오류 (어떤 오류가 있습니까?)를 잡아서 저장해야 성공할 때까지 반복해야한다는 것을 언급하면 ​​도움이됩니다. – Constablebrew

관련 문제