2010-05-31 2 views
1

그래서 DeptA, DeptB, DeptC & DeptD와 같은 값을 가진 하나의 목록 상자가 있습니다. 적용 가능한 경우 자동으로이 목록 상자에 채워지도록하는 메서드가 있습니다. 즉,이 목록 상자에 값이 채워지는 경우 결과 논리가 테이블의 부울 필드에서 "예"라고 말하고 싶습니다. 그래서 VBA - 액세스 03 - 목록 상자를 반복하면서 평가할 if 문을 사용합니다.

내가 먼저 목록 상자를 통해 순환 반복이 예제를 사용하는 것을 시도하고이를 달성하기 위해, 그리고 그것을 잘 작동합니다 :

dim i as integer 
dim myval as string 

For i = o to me.lstResults.listcount - 1 
    myVal = lstResults.itemdata(i) 
Next i 

내가 myval을 Debug.Print 경우, 내가 목록을 가져 목록 상자에서 원하는 데이터 항목을 가져옵니다. 그래서 지금은 그 일을해야 테이블을 업데이 트하는 SQL 문을 UPDATE 할 수 있도록 그 목록을 평가하려고합니다.

그래서, 나는이 잘못 알고 있지만, 내가 (당신은 내가 여기에 도착하기 위해 노력하고 볼 수 있도록 예제로 제공) 그래서

dim sql as string 
dim i as integer 
dim myval as string 
dim db as database 

sql = "UPDATE tblMain SET " 

for i = 0 to me.lstResults.listcount - 1 
    myval = lstResults.itemdata(i) 

    If MyVal = "DeptA" Then 
     sql = sql & "DeptA = Yes" 
    ElseIF myval = "DeptB" Then 
     sql = sql & "DeptB = Yes" 
    ElseIf MyVal = "DeptC" Then 
     sql = sql & "DeptC = Yes" 
    ElseIf MyVal = "DeptD" Then 
     sql = sql & "DeptD = Yes" 
    End If 
Next i 

    debug.print (sql) 

    sql = sql & ";" 
    set db= currentdb 
    db.execute(sql) 

    msgbox "Good Luck!" 

을하려고 노력 무엇인가 이 값 (DeptA, DeptB 등)이 자동으로 채워지는 목록 상자가 동적이기 때문에 이것이 왜 문제를 일으키는 지 알 수 있습니다 .... 목록 상자에는 값이 거의없고 OrderID 당 값 목록이 변경됩니다 나는 이것을 사용하여 처음에 정보를 채 웁니다. 고유 한 인스턴스).

나는 한 번에 하나씩이 목록을 평가할 (즉, 값 목록을 반복하고 "DeptA"를 찾고, 발견되면 SQL 문자열에 yes를 추가 할 항목을 찾고있다. SQL 문자열에 no를 추가 한 후 다음 반복을 실행합니다.) 비록 목록 상자가 값을 동적으로 채우지 만, 그 값은 설정된 값입니다. 결국 그 값으로 끝날 수 있습니다. 어떤 도움

감사합니다, 저스틴

+0

목록 상자의 행 원본 및 행 원본 유형은 무엇입니까? – Fionnuala

+0

당신이이 질문에 주어진 조언을 따르지 못하는 것 같습니다. http://stackoverflow.com/questions/2921454/access-2007-vba-building-a-listbox-with-selection-choices-from- another-list-box - 대답을 받아 들였지만, 서브 폼을 사용할 때 목록 상자를 사용하려고합니다. –

+0

@Remou : Type = ValueList 및 Row Source = "" – Justin

답변

1

당신이 달성하려고하는지 이해가 안 돼요. 그러나 귀하의 UPDATE 문에 WHERE 절이 필요하다고 생각합니다. ('WHERE OrderID = X', X는 편집중인 행의 OrderID로 바뀜)

처음에는 값을 False로 설정하여 사전 개체를 만들 수 있다고 가정합니다.

Dim dict As Object 
Set dict = CreateObject("Scripting.Dictionary") 
dict.Add "DeptA", False 
dict.Add "DeptB", False 
' .. etc. ' 

그런 다음 목록 상자의 항목을 검토하여 dict 값을 True로 변경하십시오.

dict(myval) = True 

마지막으로 사전 값을 기반으로 UPDATE 문을 작성하십시오.

하지만 모든 것이 저에게는 너무 많은 일처럼 보입니다. 그래서 지금 당신의 테이블 구조에 대해 궁금합니다. tblMain이 이와 유사하게 설정되어 있습니까? :

OrderID DeptA DeptB DeptC DeptD 
------- ----- ----- ----- ----- 
127  True False False True 

그렇다면 Dept 정보에 대한 관련 테이블을 고려하십시오.

OrderID Which_Department 
------- ---------------- 
127  DeptA 
127  DeptD 

이 지배하는 엄지 손가락의 규칙은 "; 행이 저렴 열이 비싸다"입니다.

: 두 세트의 아이템이 나에게있는 것 같습니다. SetA는 가능한 모든 아이템입니다. SetB는 SetA의 하위 집합입니다.SetB에있는 각 항목에 대해 True를 생성하고 SetB에없는 각 SetA 항목에 대해 False를 생성하려고합니다. SetA에 대해 dict (사전 객체)를 대체하고 SetB에 대해 lstResults을 대체 할 때 맞습니까?

나는 가능한 모든 "DeptX"키와 함께 dict을로드하고이를 False로 지정합니다. 그런 다음 lstResults을 반복하고 각각을 (dict) True로 변경하십시오. 그런 다음 dict에서 SQL 문을 작성하십시오.

Dim varKeys As Variant 
Dim i As Integer 
Dim strFragment As String 

varKeys = dict.keys() 
For i = LBound(varKeys) To UBound(varKeys) 
    strFragment = strFragment & ", " & varKeys(i) & " = " & dict(varKeys(i)) 
Next i 
strFragment = Mid(strFragment, 3) 
sql = sql & strFragment & "WHERECLAUSE" 
+0

내가 행 소스를 요청한 이유는 이전 질문에서이 목록 상자가 값을 사용하여 작성되었다고 의심하기 때문에 쉽습니다. 특히 dept 테이블이 예제와 같은 경우에는 행 소스를 간단하게 캡처 할 수 있습니다. WHERE where_department IN ("Replace & Replace (x.RowSource,"; ",", ")," "", " '") & ")"또는 거기에 대해 – Fionnuala

+0

@Remou AFAICT 목록 상자에 True로 업데이트 할 부서가 들어 있습니다 .DeptA가 True이지만 목록 상자에 없으면 False로 설정해야합니다. 어쨌든 나는 너무 많은 일이 필요하다고 생각합니다. 오우 토, 나는 저스틴이 염두에 두었던 것을 이해하지 못한다고 생각합니다 ... – HansUp

+0

@ 두 남자 ... .... 나는 당신이 가지고 있다고 생각하지 않습니다. 마지막 질문에서 그 기술을,하지만 내가이 방법을 배우고 싶습니다. 왜냐하면 나는 그것이 최선의 접근이라고 생각하지 않기 때문에 (나는 정말로 모르겠다.) ... 그래서 나는 당신이 나에게 이것을 말할 때 너희들을 믿는다, 나는 아직도 그것을하는 방법을 알고 싶다. (나는 그것을 생산에서 사용하지 않는다.) @ 한스 ... 나는 비싼 열과 열이 싸다는 것을 마지막으로 알지 못했다. 그러나 일단 그것에 대해 생각하면 좋은 생각이 들게된다. – Justin

관련 문제