2013-01-10 2 views
1

나는 Microsoft Access 2010으로 작성된 데이터베이스 응용 프로그램을 가지고 있습니다. 다른 것들 중에서도 두 개의 관련 테이블이 있습니다. "주문"에는 주문에 대한 일반 정보에 대한 항목이 있고 "FrameOrder"에는 특정 유형의 주문에 대한 정보가 있습니다. '주문'테이블의 기본 키인 '주문 ID'로 연결됩니다.MS Access VBA Addnew가 기존 레코드를 반환합니까?

데이터베이스는 프론트 엔드와 백엔드로 분리되어 있으므로 링크 된 테이블입니다. 나는 새로운 "주문"항목을 만들 그래서 일단

Private Sub FramingQuoteButton_Click() 
    ' Create a new Order of type Framing, then create a Framing Order linking back to it 
    Dim rs As DAO.Recordset 
    Dim frs As DAO.Recordset 
    Dim ThisOrderID As Long 
    Dim ThisFrameOrderID As Long 

    Set rs = CurrentDb.OpenRecordset("Orders") 
    rs.AddNew 
    rs!OrderType = "FRAME" 
    rs!CustomerID = DefaultCustomerID() 
    rs.Update 
    rs.Bookmark = rs.LastModified 
    ThisOrderID = rs!OrderID 
    rs.Close 

    Set frs = CurrentDb.OpenRecordset("FrameOrder") 
    frs.AddNew 
    frs!OrderID = ThisOrderID 
    frs.Update <<<< This is where the problem shows up 
    frs.Bookmark = frs.LastModified 
    ThisFrameOrderID = frs!FrameOrderID 
    frs.Close 

    DoCmd.OpenForm "FrameOrder", , , "OrderID = " & ThisOrderID, , , "NEW" 

    Set rs = Nothing 
    Set frs = Nothing 
End Sub 

:

는 여기 FrameOrder가 다시 연결하여 새로운 주문을 연상하는 데 사용되는 코드입니다. 그런 다음 "FrameOrder"항목을 만들고 방금 만든 "Order"의 기본 키로 "OrderID"를 설정합니다.

여기에 문제가 있습니다. 가끔 이렇게하면 업데이트 라인에 키 오류가 발생합니다. 디버거에서 볼 때, frs.AddNew 호출이 테이블의 중간에있는 기존 레코드의 키를 가진 레코드를 생성 한 것처럼 보입니다! 백엔드에서 "Compact And Repair Database"를 수행하면 문제가 사라집니다.

이 응용 프로그램은 아직 개발 중이므로 전 프론트 엔드 및 백엔드 파일을 개발 시스템에 복사하고 작업 한 다음 다시 프로덕션 시스템으로 복사합니다. 이러한 복사본을 작성한 후에이 문제가 가장 자주 나타납니다 (예, 복사하기 전에 데이터베이스가 닫혀 있는지 확인합니다).

어떤 아이디어가 계속 될 수 있습니까?

감사합니다.

+1

Access에서 양식 및 하위 형식 설정으로 처리 할 때 왜 이런 모든 문제가 발생합니까? – Fionnuala

답변

0

링크 된 테이블을 새로 고치는 것이 좋습니다. 데이터 구조가 변경되면 변경 사항이 프런트 엔드에 전파되지 않으며 이와 같은 문제가 발생할 수 있습니다. 나는 이것이 효과가 있기를 바란다.

관련 문제