2011-08-18 5 views
0

새 레코드를 만들거나 다른 레코드를 업데이트하는 데 사용할 수있는 폼을 사용하려고합니다. 현재는 텍스트 상자 (new 또는 edit)의 값을 통해이를 수행합니다. 구조가 잘 작동하지만 어떤 이유로 편집 기능을 수행 할 때 잘못된 레코드의 변경 사항을 저장하고 있습니다. 예를 들어, 레코드 1027을 편집 할 때 레코드를 제출하면 레코드 1073이 업데이트됩니다. 일관성 있고 항상 동일하고 잘못된 레코드를 업데이트합니다. 1000을 편집하면 1073이 업데이트됩니다. 1081을 업데이트하면 1073이 업데이트됩니다. 편집 할 레코드를 지정하는 방법이 있습니까? 예, 레코드 번호는 기본 키/ID입니다. Heres 코드 :dao 레코드 집합이 잘못된 레코드를 업데이트합니다.

Private Sub btnSubmit_Click() 

Dim db As DAO.Database 
    Dim rs As DAO.Recordset 
    Dim strTable As String 
    Dim strField As String 
    Dim ID As Long 
    Dim newID As Long 

    strTable = "record_holdData" 
    Set db = CurrentDb 
    Set rs = db.OpenRecordset(strTable) 

'button has 2 modes 
If txtMode.Value = "NEW" Then 

    With rs 
     .AddNew 
     .Fields("PO_no") = txtPONum 
     .Fields("prodSupervisor") = cboProdSup 
     .Fields("qaSupervisor") = cboQASup 
     .Fields("labTech") = cboLabTech 
     .Fields("flavor") = cboFlavor 
     .Fields("lineNumber") = cboLineNumber 
     .Fields("container") = cboContainer 
     .Fields("package") = cboPackage 
     .Fields("holdQty") = txtQty 
     .Fields("productionDate") = txtProdDate 
     .Fields("dateCode") = txtDatecode 
     .Fields("component") = cboComponent 
     .Fields("nonconformance") = cboDiscrepancy 
     .Fields("foundDuring") = cboFoundAt 
     .Fields("responsibility") = cboRespCode 
     .Fields("comments") = txtDescription 
     .Fields("rootCause") = txtRootCause 
     .Fields("holdStatus") = 1 
     .Fields("dateOpened") = Now() 
     .Update 
     .Bookmark = .LastModified 
     newID = !ID 
    End With 

     MsgBox ("Hold information saved!") 
     btnPrintTag.Enabled = True 
     DoCmd.OpenReport "Holdtag", acViewPreview, , "[ID] = " & newID 
     DoCmd.Close 

ElseIf txtMode.Value = "EDIT" Then 
    'do editing stuff 
    With rs 
     .Edit 
     .Fields("PO_no") = txtPONum 
     .Fields("prodSupervisor") = cboProdSup 
     .Fields("qaSupervisor") = cboQASup 
     .Fields("labTech") = cboLabTech 
     .Fields("flavor") = cboFlavor 
     .Fields("lineNumber") = cboLineNumber 
     .Fields("container") = cboContainer 
     .Fields("package") = cboPackage 
     .Fields("holdQty") = txtQty 
     .Fields("productionDate") = txtProdDate 
     .Fields("dateCode") = txtDatecode 
     .Fields("component") = cboComponent 
     .Fields("nonconformance") = cboDiscrepancy 
     .Fields("foundDuring") = cboFoundAt 
     .Fields("responsibility") = cboRespCode 
     .Fields("comments") = txtDescription 
     .Fields("rootCause") = txtRootCause 
     .Fields("lastEditDate") = Now() 
     .Update 
    End With 

    MsgBox ("Information Updated") 

End If 

End Sub 

답변

0

죄송합니다. 문제는 기본적으로 서브 루틴이 호출 될 때마다 레코드 세트를 재정의했다는 것입니다. 두 번째 블록을 다음과 같이 변경했습니다.

ElseIf txtMode.Value = "EDIT" Then 
    'do editing stuff 
    Set rs = db.OpenRecordset("SELECT * FROM record_holdData WHERE ID=" & txtID) 
    With rs 
     .Edit 
     .Fields("PO_no") = txtPONum 
     .Fields("prodSupervisor") = cboProdSup 
     .Fields("qaSupervisor") = cboQASup 
     .Fields("labTech") = cboLabTech 
     .Fields("flavor") = cboFlavor 
     .Fields("lineNumber") = cboLineNumber 
     .Fields("container") = cboContainer 
     .Fields("package") = cboPackage 
     .Fields("holdQty") = txtQty 
     .Fields("productionDate") = txtProdDate 
     .Fields("dateCode") = txtDatecode 
     .Fields("component") = cboComponent 
     .Fields("nonconformance") = cboDiscrepancy 
     .Fields("foundDuring") = cboFoundAt 
     .Fields("responsibility") = cboRespCode 
     .Fields("comments") = txtDescription 
     .Fields("rootCause") = txtRootCause 
     .Fields("lastEditDate") = Now() 
     .Update 
    End With