2017-12-29 7 views
0

나는 해결할 수없는 매우 까다로운 문제가 있습니다.목록 상자에서 선택된 여러 레코드를 업데이트/편집합니다.

웨어 하우스에 저장된 도구의 액세스 데이터베이스가 프로덕션 사이트로 빌려 왔습니다. 나는 창고에 물건을 빌려주거나 돌려 보내는 날짜의 데이터를 저장하는 테이블을 가지고있다. (노동자 ID와 같은 다른 데이터와 함께). item이웨어 하우스 외부에있는 동안 테이블의 returning_date 필드는 비어 있습니다.

그래서 returning_date 필드가 비어있는 레코드 만 표시하고 쿼리의 데이터와 날짜 서식이 지정된 텍스트 상자를 표시하는 (다중 선택) 목록 상자가있는 폼을 만들었습니다. 이제는 목록 상자에서 여러 레코드를 선택하고 선택한 필드를 날짜 필드로 반환하는 텍스트 상자의 날짜를 업데이트 할 수 있습니다. 내가 가지고있는 문제는 데이터를 삽입하기 위해 선택된 레코드의 특정 필드를 리콜하는 방법을 모른다는 것입니다. 이게 가능했던거야? 그렇지 않다면이 문제를 어떻게 해결할 수 있습니까?

편집 :

For Each varItm In Me.Listbox.ItemsSelected 
'update statement should go here 
Next varItm 

을하고 두 번째 : 반복 프로세스 내가 두 반복의 유형을 사용하려고

For i = 0 to Listbox.ItemsSelected.Count - 1 
'update statement 
Next i 

을 내가했다 변수 누락 된 개체를 몇 가지 문제 (실행 시간 오류 424)하지만 주요 문제는 선택한 행의 특정 필드에 데이터를 삽입하는 방법을 모르겠다는 것입니다.

+0

VBA를 사용하십시오. 선택한 항목 (ItemsSelected)을 반복하고 선택한 각 항목에 대한 업데이트 문을 실행합니다. 문을 반환 데이터를 나타내는 양식 필드로 참조하십시오. 폼의 헤더에 반환 데이터 텍스트 상자를 넣습니다. 너 자신을 먼저 내라. – Rene

+0

답변 해 주셔서 감사합니다. 모든 선택된 항목에 대해 반복해야한다는 것을 알고 있지만 어떤 업데이트 문을 사용해야합니까? 레코드 세트 사용에 대해 생각해 보았지만 선택한 항목을 참조하는 방법을 모르겠습니다. –

+0

반복 코드가 있습니까? 질문을 편집하여 보여주십시오. – June7

답변

1

목록 상자에는 원본 쿼리의 데이터를 제공하는 열이 두 개 이상 있어야합니다. 첫 번째는 ToolID이고 두 번째는 ToolName (또는 툴 이름이 들어있는 필드가 호출되는 곳)이어야합니다. 근처에있는 버튼은 위에 나열된 루틴을 실행하여 모든 항목이 올바르게 선택 될 때까지 실행되지 않도록합니다. 그런 다음 쿼리 속성을 식별하여 쿼리를 실행할 ID 번호를 가져옵니다. 염두에 두어야하지만 Access에서 첫 번째 열은 0입니다. 첫 번째 레코드가 목록 상자에서 0 인 것과 같습니다 (따라서 목록 개수 끝에 -1이있는 이유). 그러나

Dim ToolID as Long 
Dim strSQL as String 
For i = 0 To Me.lsbTools.ListCount - 1 
    If Me.lsbTools.Selected(i) Then 
     ToolID = Me.lsbTools.Column(0, i) 
     strSQL = "UPDATE tblTool SET ReturnDate=#" & me.txbDateReturned & "# WHERE ToolID=" & ToolID 
     DoCmd.RunSQL strSQL 
    End If 
Next 

당신은 또한 한 번 실행이 같은 포함 된 모든 사람들을 업데이트 할 SQL을 구성 할 수 있습니다 : 당신이 개별적으로 각 ID에 대한 업데이트 루틴을 호출 할 경우 다음

는 하나의 방법입니다 :

Dim ToolID as Long 
Dim strSQL as String 
'The hashtags around the dates ONLY work in MS ACCESS and will not work in T-SQL. you will have to edit the syntax to use this on a SQL-server linked table 
strSQL = "UPDATE tblTool SET ReturnDate=#" & me.txbDateReturned & "# WHERE ToolID IS IN(" 

For i = 0 To Me.lsbTools.ListCount - 1 
    If Me.lsbTools.Selected(i) Then 
     ToolID = Me.lsbTools.Column(0, i) 
     strSQL = strSQL & ToolID &", " 
    End If 
Next 
'This checks to make sure the last two characters are a comma and space, and removes them 
If Right(strSQL,2) = ", " Then     
    strSQL = Left$(strSQL, Len(strSQL)-2) & ")" 
    DoCmd.RunSQL strSQL     'This runs the SQL statement 
End if 
+0

도움 주셔서 감사합니다. 나는 한 가지를 이해하지 못합니다. 첫 번째 방법을 사용하고 있었는데 제 컴퓨터 중 하나에서 작동하지 않지만 두 번째 방법에서는 작동합니다. 유일한 차이점은 Access의 한 버전은 폴란드어로되어 있고 두 번째 버전은 영어로되어 있다는 점입니다. 폴란드어 버전에서 구문 오류가 발생합니다 (런타임 오류 3075, 쿼리 식 '# 31.12.2017'의 구문 오류 - 해시 태그가 날짜 텍스트 상자에 입력 한 날짜 이후의 날짜). 이 문제의 원인은 무엇입니까? –

+0

자, Windows에서 날짜 설정을 변경하여 짧은 날짜가 점으로 표시되지 않고 대시로 표시되어야했습니다. 첫 번째 방법은 매력처럼 작동합니다. 감사합니다! 어쨌든, 두번째 방법에서, 무엇이 'IS IN'표현식 뒤에 있어야합니까? strSQL = "UPDATE tblTool SET ReturnDate = #"& me.txbDateReturned & "# ToolID가 IN입니까?" 이 방법도 –

관련 문제