2017-11-27 1 views
1

내 수업 데이터베이스에 대한 마지막 질문이 하나 있습니다. 사용자가 데이터를 볼 수있는 특정 양식의 경우 양식을 닫고 변경하지 않은 경우 메시지를 표시하지 못하게 할 수 있습니다. 그러나 양식의 일부 데이터를 변경하고 레코드를 편집한다고 선택하면 변경 사항을 저장할지 묻는 팝업 상자가 표시되기를 원합니다. 그들이 예를 선택하면 이전 레코드를 덮어 쓰고 변경 사항을 레코드에 저장하지만, 아니오를 선택하면 레코드가 전혀 변경되지 않고 양식이 닫힙니다.사용자가 양식을 저장하라는 메시지가 표시됩니다.

어떻게하면됩니까? Access 2016을 사용하고 있으며 지금까지 시도한 결과 오류가 발생합니다. 다음은 VBA의 BeforeUpdate 이벤트 양식에서 시도한 두 가지 방법입니다.

방법 1 :

Private Sub Form_BeforeUpdate(Cancel As Integer) 

    Dim strMsg As String 
    Dim iResponse As Integer 

    ' Specify the message to display. 
    strMsg = "Do you wish to save the changes?" & Chr(10) 
    strMsg = strMsg & "Click Yes to Save or No to Discard changes." 

    ' Display the message box. 
    iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "Save Record?") 

    ' Check the user's response. 
    If iResponse = vbNo Then 

     ' Undo the change. 
     DoCmd.RunCommand acCmdUndo 

     ' Cancel the update. 
     Cancel = True 
    End If 
End Sub 

Error - "The expression Before Update you entered as the event property setting produced the following error: A problem occured while Microsoft Access was communicated with the OLE server or ActiveX Control."

방법 2 :

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("Changes have been made to this record." _ 
     & vbCrLf & vbCrLf & "Do you want to save these changes?" _ 
     , vbYesNo, "Changes Made...") = vbYes Then 
      DoCmd.Save 
     Else 
      DoCmd.RunCommand acCmdUndo 
    End If 
End Sub 

오류 - 위와 동일합니다.

도움을 주시면 대단히 감사하겠습니다.

감사합니다.

답변

0

이 문제는 비 유니 코드 프로그램의 언어 설정이 작성한 컴퓨터와 실행중인 컴퓨터에서 다르기 때문에 언어 설정이 변경되어 발생할 수 있습니다. 이 방법으로 문제가 해결되지 않으면

검토 this Microsoft support page

, 당신은 또한 this answer을 검토 할 수 있습니다. 매우 철저하고 일부 단계가 적용되지 않을 수도 있지만 + 다시 컴파일 및 재 컴파일을 디 컴파일하면이 오류가 해결 될 수 있습니다.

참고 사항 : 귀하의 코드는 귀하가 생각한대로 작동하지 않습니다. 현재 레코드를 저장하려면 DoCmd.RunCommand acCmdSaveRecord을 사용하십시오. DoCmd.Save은 레코드가 아닌 폼 개체에 대한 모든 변경 내용을 저장합니다. 그러나 BeforeUpdate 이벤트의 레코드를 저장할 필요는 없습니다.이 이벤트가 끝날 때 저장하기 때문에이 이벤트는 끝날 때까지 저장됩니다. Cancel = False

+0

감사 하위 Exit_BeforeUpdate 끝을 다시 시작 . 저는 Access에서 더 공부해야 할 것입니다. – Adam

0

DoCmd 메서드가 전혀 의미가 없습니다. 또한 응답이 아니오인지 확인해야합니다. 이 시도 : 사용자가 데이터를 볼 수있는 특정 양식에 대한

If Me.Dirty Then 'has existing data been changed? 
    If MsgBox("Changes have been made to this record." _ 
     & vbCrLf & vbCrLf & "Do you want to save these changes?", _ 
     vbYesNo, "Changes Made...") = vbNo Then 
     Cancel = True 
     Me.Undo 
    End If 
End If 
+0

감사합니다. Rene, 나는이 코드 예제를 온라인에서 찾았으므로 이해가되지 않았다. 귀하의 예를 들어, 내가 어디에 그 코드를 삽입까요? OnUpdate 또는 OnDirty? 업데이트 전에서는 아무 작업도 수행하지 않습니다. – Adam

0
  1. 을, 나는 그들이 변경하지 않은 경우 메시지가 표시 양식을 닫고하지 할 수 있어야합니다. ** 액세스 표준 동작입니다. 아무 것도 할 필요가 없습니다.

  2. 그러나 양식의 일부 데이터를 변경하고 레코드를 편집하기로 결정한 경우 팝업 메시지가 나타나기를 원합니다. 사용자가 변경 사항을 저장하려는 경우 **이 작업은 표준이 아니며 일반적으로 권장되는 개념이 아닙니다. 오버 헤드가 추가되기 때문입니다.이 트리거 및 많은 필드가있는 화면/양식에 대한 올바른 시점을 결정해야합니다. 변경 또는 기록 변경시에만 수행 할 수 있습니다.이 경우 Dirty 일 경우 메시지 상자가 트리거됩니다 (이러한 용어를 찾을 수 있음).)

  3. 예를 선택하면 이전 레코드를 덮어 쓰고 변경 내용을 레코드에 저장하지만 아니오를 선택하면 레코드가 전혀 변경되지 않고 양식이 닫힙니다. ** 실행 취소 방법

**를 보이지만 일반적으로 제품의 표준 디자인은 당신이 어떤 프롬프트없이 가서 모두 저장된다는 점이다. 이것은 그것이 있어야하는 방법입니다. 프롬프트 저장시 대 데이터 입력 중 오류 발생 확률이 동일하다는 점에서 저장 프롬프트에 실제 값이 추가되지 않습니다.

0

이 코드는 Microsoft의 웹 사이트에서 발견 할 수 있으며 의도 한대로 작동합니다.

개인 서브 Form_BeforeUpdate (정수로 취소)

변경 '이 절차는 검사 폼 데이터 가 있는지'. 데이터가 변경된 경우 절차는 '사용자에게 저장 작업을 계속하거나 취소하도록 요청합니다. 그런 다음 'BeforeUpdate 이벤트를 트리거 한 작업이 완료되었습니다. 레코드가 변경된 경우 오류 고토 Err_BeforeUpdate

'음란 한 재산에 제어

으로

희미한 CTL은 True입니다. Me.Dirty Then '저장 작업을 확인하는 메시지가 표시됩니다. 만약있는 MsgBox = vbNo 그런 Me.Undo 종료하면 끝

하면 Exit_BeforeUpdate (vbYesNo + vbQuestion, _ "레코드 저장" "당신이 저장 하시겠습니까?") : 하위 종료

을 Err_BeforeUpdate : 있는 MsgBox 오지 Err.Number & ""& 프로그램 Err.Description는

관련 문제