2013-02-15 2 views
3

새 레코드에 ActivityTracker 액세스 폼을 열면 * start_time * 필드를 현재 시간 (now)으로 자동 채우고 싶습니다.새 레코드로 액세스 양식의 필드 값을 설정할 수 없습니다

Private Sub Form_Open(Cancel As Integer) 
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then 
     Form_ActivityEntry.Start_time = Now() 
    End If 
End Sub 

"이 개체에 값을 할당 할 수 없습니다."오류가 발생하고 실행이 중지됩니다.

내가

Private Sub Form_Open(Cancel As Integer) 
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then 
     DoCmd.RunCommand acCmdRecordsGoToNew 
     Form_ActivityEntry.Start_time = Now() 
    End If 
End Sub 

또는

Private Sub Form_Open(Cancel As Integer) 
    If IsNull(Form_ActivityEntry.Start_time) And IsNull(Form_ActivityEntry.id) Then 
     Me.Recordset.AddNew 
     Form_ActivityEntry.Start_time = Now() 
    End If 
End Sub 

하지만 이러한 원인 중 하나 팝업 경고가 새 레코드로 명시 적으로 이동하여 오류를 수정할 수있다 "당신은 지정에 갈 수 기록."

나는이

DoCmd.SetWarnings False 
    DoCmd.RunCommand acCmdRecordsGoToNew 
    DoCmd.SetWarnings True 

또는 오류 처리를 설정하여 경고를 억제하는

On Error GoTo Err_SomeName 

을 시도했지만 난 여전히 경고를 얻을.

AllowAdditions가 True로 설정됩니다. 레코드 집합 형식은 다이너 셋입니다.

그렇지 않으면이 양식으로 모든 것이 잘 작동합니다.

내가 뭘 잘못하고 있니? "열린 형태"와 반대되는 "새로운 기록 열기"라는 사건이 있습니까?

도움 주셔서 감사합니다.

답변

3

컨트롤의 기본값을 Now() 또는 Date()로 설정하는 것이 좋습니다. 기본값은 새 레코드에만 적용되며 다른 필드를 완료하면 값이 할당됩니다.

이 경우 테이블의 필드 기본값을 설정하는 인수가 있습니다.

설정 경고를 사용하지 마십시오 : What's the difference between DoCmd.SetWarnings and CurrentDB.Execute

+0

호머가 말했듯이 "D' oh!" 그것은 너무 명백했다. :-) 나는 폼을 만들 때 그것을 생각했지만, 사용자가 시작하기를 원했기 때문에 폼을 만들지 않았다. – MrMoxy

-1

나는 폼에 새 레코드로 이동의 팬이 아니다. 발생할 수있는 데이터 홀이 너무 많아서 자신과 같은 문제가 발생합니다.

추가하려는 각 입력란에 텍스트 상자, 캘린더 컨트롤, 번호 아래로 등등과 같은 공백의 언 바운드 형식을 사용하는 것이 좋습니다. 이렇게하면 각 필드를 직접 입력하거나 원하는 것에 대해 다른 검사를 수행 할 수 있습니다. 그런 다음 사용자가 만족할 경우 삽입 쿼리가있는 레코드를 추가하십시오.

그러나 질문에 대한 질문. 바운드 필드에 값을 지정하려고하는 것 같습니다. 필드가 바인드 된 객체에 값을 할당 해보십시오.

5

게시 된 코드가 작동하지 않는 이유는 아직 아무도 올바르게 답변되지 않은 문제입니다.

왜 그런 이유로 온 - 오픈 이벤트를 사용하고 있습니까?

와는 다릅니다.net 및 대부분의 시스템 액세스에는 열린 양식 이벤트 (취소 가능)와 부하 이벤트가 발생할 때 두 가지 이벤트가 발생하는 훌륭한 디자인이 있습니다.

이 멋진 디자인은 조건을 테스트하고 양식로드가 온에어 이벤트에 적용되지 않도록하는 코드를 의미합니다. CLOSE를 보면 열어 본 곳에서도 취소가 있음을 알 수 있습니다. cancel = true로 설정하면 FORM이로드되지 않고 표시되지 않습니다.

그래서 데이터가 없거나 사용자 권한 등을 테스트 할 수 있으며 오두막 양식로드를 취소 할 수 있습니다. 폼로드를 취소 할 수 있다면 바인딩 된 컨트롤의 값을 수정하는 것이 거의 불가능합니다. 모든 바인딩 된 컨트롤은 읽기 전용이므로

온 - 오픈 이벤트에서 BOUND 컨트롤의 값을 변경하는 것은 허용되지 않습니다. 이것은 곧 TOO이며 DESIGN 및 제품 의도에 의한 것입니다.

따라서 양식로드를 방지하기위한 조건을 테스트하면 열리게됩니다.

이렇게하면 변수 설정, 컨트롤 설정, 컨트롤 값 설정 및 기본 폼 시작 코드가 ON-LOAD 이벤트에 속하는 것이 좋습니다. 열 때 너무 빨리.

코드가 양식로드를 취소하려는 경우 양식 시작 및 설정 코드를 모두 사용하지 않아도되고 실행하지 않아도된다는 것은 논리적입니다.

사실 코드는로드에서 양식을 방지하기 위해 사용자가 볼되고 원하는 경우 테스트 간다 = 취소 설정할 수 있습니다에 오픈 이벤트 요약

.

온로드 이벤트 :

모든 시동 코드, 변수의 설정 등 컨트롤의 설정은 지금 추천 가능합니다.

Access ALSO의이 간단한 디자인은 개발자가 양식로드를 방지하고 취소 할 코드를 찾는 위치를 알 수 있음을 의미합니다. 물론 차이점에 대한 기본적인 이해가 없으며 두 이벤트가 Access에 존재하는 이유는 포스터와 응답의 혼란이 분명해진다는 것입니다.

관련 문제