2017-12-18 10 views
1

여러 가지 이유로 현재 양식을 저장하기 위해 양식에 사용자 지정 단추를 설정하고 싶습니다. 나는 네비게이션 폼을 사용하고 사용자가 "저장"버튼을 누르거나 다른 폼으로 전환 할 때마다 엔트리가 저장 될 때마다 동일한 프로세스 (무결성 검사, 사용자 입력 등)를 트리거하려고합니다. 사용자는 조건부로 프로세스를 확인하도록 요청할 것이므로 프로세스도 취소 할 수 있습니다.MS Access vba 저장 단추 오류 3021

모든 하나 개 정말 이상한 성가신 제외하고 원활하게 실행한다 : 나는이 "BeforeUpdate"이벤트 내에서 메시지를 새로운 기록에 버튼을 저장하라는 메시지를 클릭 할 때마다, 나는 3021

RTE를 (수신 "현재 기록 없음")

MsgBox가 없으면 모든 것이 정상입니다. 더 이상한 점 : 네비게이션 양식을 사용하여 다른 양식으로 전환하거나 (단순히 데이터 입력에 사용되는 양식의 "외부"를 누르면) 저장 프로세스를 시작하면 모든 것이 잘됩니다.

Private Sub vt_save_Click() 
Me.Dirty = False 
End Sub 

Private Form_BeforeUpdate(Cancel As Integer) 
Cancel = True 
MsgBox "Test" 
End Sub 

어떤 아이디어 :

여기에 최소한의 예 (DoCmd.Save, 다시 쿼리 또는 acCmdSaveRecord와 유사한 결과)입니까? 나는 그 실수에 대해 내 머리를 감쌀 수 없다.

+0

표시 할 * 최소의 예 *는 무엇입니까? 아마도 새로운 레코드에서 실행할 수없는 'BeforeUpdate'트리거 (즉, 무결성 검사, 사용자 입력)에서 호출 된 * 다른 * 코드에서 오류가 발생할 수 있습니다. 더 많은 코드를 게시하십시오. – Parfait

+0

BeforeUpdate 이벤트 양식을 사용한 적이 없습니다. 나는 단추 클릭 이벤트 내에서 데이터 유효성 검사를 수행합니다. – June7

+0

@Parfait 최소한의 예는 설명 된 것과 정확히 일치합니다. 새 데이터베이스, 하나의 테이블, 하나의 양식을 만듭니다. 레코드를 만들고 데이터를 입력 한 다음 버튼을 누릅니다. Et voilá - 오류가 발생합니다. –

답변

0

가장 직접적이고 합리적인 해결책은 오류 처리기를 사용하는 것입니다.이 처리기는 지금까지 간과하지 않았습니다.

Private Sub save_Click() 
On Error GoTo Err_Handler 

Me.Dirty = False 
Exit_Here: 
    Exit Sub 

Err_Handler: 
    If Err.Number = 2101 Then 
    'ignore or message 
Else 
    MsgBox Err.Description 
End If 

Resume Exit_Here 

End Sub 
0

아마도 레코드가 있는지 여부를 확인하면서 양식의 값을 사용하여 쿼리를 실행하려고 할 수 있습니다.

테이블에 기본 키가 있습니까? 그렇다면 기본 키가 핵심입니다.

Private Sub vt_Save_Click() 
dim rst  as DAO>Recordset 
Dim strSQL  as String 
Dim strID  as string 

strID = me.YourPrimaryKeyField 

strSQL = "SELECT * " & _ 
     "FROM YourTableName " & _ 
     "WHERE (((YourTableName.YourFieldName) =" & me.PrimaryKeyField & "));" 

set rst = currentdb.openrecordset(strsql) 
if rst.recordcount = 0 then 
    currentdb.execute "INSERT INTO YourTableName (List All Fields to Add) " & _ 
         "SELECT List All Field controls with values to add;" 
End IF 

'Anything else you want the code to do from here 

EndCode: 
If not rst is nothing then 
    rst.close 
    set rst = nothing 
End IF 
End Sub 

이 과정을 Form_LostFocus() 이벤트에 대해 반복합니다. 더 쉽게 만들고 싶다면이 코드를 모듈로 만들고 양식의 두 이벤트 트리거 내에서 호출하십시오.

그래도 작동하지 않으면 알려주세요. 기꺼이 도와 드리겠습니다.