2017-03-07 1 views
1

나는 다중 사용자 Db가 백엔드가 암호화되어 있고 비관적 인 잠금을 허용하지 않는 분할 된 사용자가 있습니다. 백엔드의 테이블에있는 작업은 매일 할당되지 않은 채 자동으로 채워진 할당 된 필드로 미리로드됩니다. 직원이 작업 시작을 클릭하거나 다음 작업으로 이동하려면 dlookup은 dlookup을 통해 다음 "할당 해제 된"작업을 식별하고 필드를 해당 이름으로 업데이트합니다.스플릿 다중 사용자 MS 액세스 Db. 테이블 덮어 쓰기 문제

내가 겪고있는 문제는 테이블이 업데이트되어 충분히 똑같은 레코드를 덮어 쓰는 것을 인식하지 못하여 여러 사람의 프런트 엔드 (accde 사용)가 발생하여 테이블이 충분히 빠르게 업데이트되지 않는 것입니다. 60에서 2 초까지 자동 새로 고침을 업데이트했지만 원하는 결과를 얻지 못하고 있습니다.

각 명령 단추에서 실제 연결된 테이블을 새로 고칠 수있는 방법이 있습니까? VBA를 보려면 실시간으로 이동할 레코드를 확인하십시오.

다음은 "시작"버튼의 코드입니다. "제출/다음 작업"버튼은 동일한 종류의 코딩을 사용하여 다음 작업을 찾습니다.

Private Sub butagingicoms202_begin_Click() 
Dim strsql As String 
Dim AuditCheck As String 
Dim NYPhone As String 
Dim CAPhone As String 
Dim LastTask As String 
DoCmd.SetWarnings False 
    If IsNull(DLookup("[Sys]", "Aging_ICOMSWorkable", "assigned = 'unassigned'")) Then 
LastTask = True 
Else 
LastTask = False 
End If 
If LastTask = True Then 
MsgBox "All tasks have been assigned. Please move on to your next assigned project" 
DoCmd.SetWarnings True 
DoCmd.Close acForm, "Aging_ICOMS202DailyWorkable_frm" 
Else 
Call RandomTime 
butagingicoms202_submit.Visible = True 
Me.butagingicoms202_submit.SetFocus 
butagingicoms202_queue.Visible = True 
butagingicoms202_begin.Visible = False 
txtagingicoms202_sysacct = DLookup("[sysacct]", "Aging_ICOMSWorkable", "[SYS]=202 AND [Assigned] = 'unassigned' AND [SecondaryTask]<>'50 Day' AND [SecondaryTask]<>'Spec Review' AND [SecondaryTask]<>'Low Bal Rpt'") 
DoCmd.RunSQL "UPDATE Aging_ICOMSWorkable SET assigned = '" & Me.txtagingicoms202_assigned & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
txtagingicoms202_acct = DLookup("[AccountNumber]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_sys = DLookup("[Sys]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_name = DLookup("[Name]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
'txtagingicoms202_fn = DLookup("[FirstName]", "Aging_ICOMSWorkable", "[Assigned] = 'unassigned'") 
'txtagingicoms202_ln = DLookup("[LastName]", "Aging_ICOMSWorkable", "[Assigned] = 'unassigned'") 
txtagingicoms202_task = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_tt = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_assignment = DLookup("[SecondaryTask]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
'NYPhone = DLookup("[NYSTATE]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & me.txtagingicoms202_assigned &"'") 
'CAPhone = DLookup("[PW CAL PHONE?]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & me.txtagingicoms202_assigned &"'") 
txtagingicoms202_TotalAR = "$" & Format(DLookup("[Total A/R Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 
txtagingicoms202_PDbal = "$" & Format(DLookup("[Delinquent Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 

'txtagingicoms202_secassign = DLookup("[Secondary Task]", "Aging_ICOMSWorkable", "[Assigned] = 'unassigned'") 
txtagingicoms202_starttime = Now() 
strsql = "UPDATE Aging_ICOMSWorkable SET Start_Time = '" & Me.txtagingicoms202_starttime & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
DoCmd.RunSQL strsql 
Me.comagingicoms202_res.RowSource = "SELECT [ResolutionCodes] FROM [Resolutions]" & "WHERE [tasktype] = '" & Me.txtagingicoms202_tt & "'" 
Me.comagingicoms202_res.Requery 
DoCmd.SetWarnings True 
End If 
End Sub 

답변

0

이 코드는 테스트되지 않았지만 트릭을 수행해야합니다.

  • 난 당신이 주석했던 줄을 제거 :
    Private Sub butagingicoms202_begin_Click() 
        Dim strsql As String 
        Dim AuditCheck As String 
        Dim NYPhone As String 
        Dim CAPhone As String 
        doCmd.SetWarnings False 
        If IsNull(DLookup("[Sys]", "Aging_ICOMSWorkable", "assigned = 'unassigned'")) Then 
        MsgBox "All tasks have been assigned. Please move on to your next assigned project" 
        doCmd.SetWarnings True 
        doCmd.Close acForm, "Aging_ICOMS202DailyWorkable_frm" 
        Else 
        Call RandomTime 
        butagingicoms202_submit.Visible = True 
        Me.butagingicoms202_submit.SetFocus 
        butagingicoms202_queue.Visible = True 
        butagingicoms202_begin.Visible = False 
    ' txtagingicoms202_sysacct = DLookup("[sysacct]", "Aging_ICOMSWorkable", "[SYS]=202 AND [Assigned] = 'unassigned' AND [SecondaryTask]<>'50 Day' AND [SecondaryTask]<>'Spec Review' AND [SecondaryTask]<>'Low Bal Rpt'") 
    ' doCmd.RunSQL "UPDATE Aging_ICOMSWorkable SET assigned = '" & Me.txtagingicoms202_assigned & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
        doCmd.RunSQL "UPDATE Aging_ICOMSWorkable SET assigned = '" & Me.txtagingicoms202_assigned & "' WHERE sysacct = " & _ 
           DLookup("[sysacct]", "Aging_ICOMSWorkable", "[SYS]=202 AND [Assigned] = 'unassigned' AND [SecondaryTask]<>'50 Day' " & _ 
                 "AND [SecondaryTask]<>'Spec Review' AND [SecondaryTask]<>'Low Bal Rpt'") 
        txtagingicoms202_acct = DLookup("[AccountNumber]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_sys = DLookup("[Sys]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_name = DLookup("[Name]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_task = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_tt = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_assignment = DLookup("[SecondaryTask]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_TotalAR = "$" & Format(DLookup("[Total A/R Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 
        txtagingicoms202_PDbal = "$" & Format(DLookup("[Delinquent Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 
    
        txtagingicoms202_starttime = Now() 
        strsql = "UPDATE Aging_ICOMSWorkable SET Start_Time = '" & Me.txtagingicoms202_starttime & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
        doCmd.RunSQL strsql 
        Me.comagingicoms202_res.RowSource = "SELECT [ResolutionCodes] FROM [Resolutions]" & "WHERE [tasktype] = '" & Me.txtagingicoms202_tt & "'" 
        Me.comagingicoms202_res.Requery 
        doCmd.SetWarnings True 
        End If 
    End Sub 
    

    나는 3 명 변경했습니다. 만약 당신이 정말로 필요하다면 다시 넣으십시오.
  • LastTask 변수와 그것을 설정 한 If 문을 삭제했습니다. IsNull 상태를 확인하는 문 하나에 If 문을 병합하고 작업 대기열의 끝에 있거나 그렇지 않은 경우 할당 논리에 속하면 경고 메시지가 나타납니다. 이것은 2 명의 사람들이 마지막 임무를 부여하려고 할 때 경쟁 조건을 유발할 수있는 지연의 일부를 감소시킬 것입니다.
  • A) 다음 사용 가능한 작업을 식별하고 B) 현재 사용자에게 할당하려면 2 개의 명령문을 사용했습니다. 이것들을 하나의 명령문에 결합하여 하나의 원자 UPDATE 문을 식별하고 할당합니다. 나는 누군가가 그렇게하지 못하도록 당신이 업데이트하고있는 순간에 당신이 업데이트하려고 시도하고있는 기록을 잠글 것이라고 믿습니다.
    • 테스트되지 않은 부분입니다. 코드를 디버그 한 다음 .RunSQL에 전달 된 내용이 올바른 코드인지 확인하십시오. 그렇지 않다면 Access가 구문 분석 할 수있는 것을 얻을 때까지 약간 조정하십시오.
    • 당신은이 기록에 대한 경주에서 끝나기 때문에 우리 둘 중 하나만 이길 수 있습니다. 오류 처리를 통해이 기록을 재 시도 할 수 있습니다. 느슨하게 - 그는 다음 작업을 얻기 위해 다시 실행할 수 있습니다.
    • 이제는 처리 할 작업이 더 이상 없다면 누군가를 무한 루프에 넣지 않도록 오류 처리에 LastTask 코드를 넣을 수 있습니다. DLookup() 대신 If SELECT COUNT(*)... > 0을 테스트하면 LastTask이 더 빨리 실행될 수 있습니다. 수작업으로 사용할 설명서가 없지만 다소 느린 것으로 알려진 DLookup() 함수가 있다는 것을 상기합니다.

추가 코드의 몇 가지 제안을 정리 :

  • Call가 사용되지 않는 용어입니다 만 이전 버전과의 호환성을 위해 포함되어 있습니다. 귀하의 Call RandomTimeRandomTime으로 변경하면 정상적으로 작동합니다.
  • 양식 컨트롤의 설명 이름이 우수하지만 "구두점"또는 대문자가 없어 읽기가 어려울 수 있습니다. 예를 들어 butagingicoms202butAgingIcoms202 (내 권장 사항) 또는 but_aging_icoms_202으로 변경하는 것이 고려해 볼 수 있습니다. 사람들이 분석하기가 쉽기 때문입니다.
+0

감사합니다. FreeMan - 감사의 말 :이 업데이트를 사용하고 결과가 돌아옵니다. 여기에 정말 감사드립니다. – Matt

+0

도와 드리겠습니다! 이 정보가 유용하다고 생각되면 위쪽 화살표를 클릭하는 것을 잊지 마세요. 이것이 대답을 제공했다고 생각되면 준비가되면 체크 표시를 클릭하십시오. – FreeMan

+0

나는이 일을하는 동안 내 생각에 또 다른 생각이 들었다. acc로 변환하기 전에 FE를 통해 레코드 잠금을 설정할 수 있습니다. 초기 업데이트 후 '잠긴'기록을 유지 한 다음 작업을 제출 한 후 '해제'할 수있는 방법이 있습니까? 나는 수정 된 코드로 생각하고 오류 처리를 추가했다. 이것은 덮어 쓰기 문제를 제거하기위한 마지막 단계일지도 모른다. – Matt