VBA - доступ 03 - перебор списка, с оператором if для оценки - PullRequest
1 голос
/ 31 мая 2010

Итак, у меня есть один список со значениями, такими как DeptA, DeptB, DeptC & DeptD. У меня есть метод, который заставляет их автоматически заполнять этот список, если они применимы. Другими словами, если они заполняются в этом списке, я хочу, чтобы полученная логика говорила, что они «Да» в логическом поле таблицы.

Итак, для достижения этой цели я пытаюсь использовать этот пример итерации для циклического перемещения по списку в первую очередь, и он прекрасно работает:

dim i as integer
dim myval as string

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

если я debug.print myval, я получаю список элементов данных, которые я хочу, из списка. так что теперь я пытаюсь оценить этот список, чтобы у меня была инструкция UPDATE SQL для обновления таблицы, когда мне это нужно.

Итак, я знаю, что это ошибка, но это то, что я пытался сделать (приведя в качестве примера, чтобы вы могли увидеть, что я пытаюсь здесь получить)

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 и т. Д.) Автоматически заполняются, являются динамическими .... в списке редко бывает одно значение и список значений изменения по идентификатору заказа (для чего я использую форму, в первую очередь заполняющую информацию; уникальный экземпляр).

Я ищу что-то, что будет оценивать этот список по одному (т. Е. Перебирать список значений и искать «DeptA», и, если он найден, добавить «да» в строку SQL, и если это не добавить) нет строке SQL, затем переходите к следующей итерации). Несмотря на то, что список заполняет значения динамически, они являются заданными значениями, что означает, что я знаю, что может в итоге в нем получиться.

Спасибо за любую помощь, Джастин

1 Ответ

1 голос
/ 01 июня 2010

Я не понимаю, чего вы пытаетесь достичь. Однако я подозреваю, что вашему выражению 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

Если это так, рассмотрите связанную таблицу для информации об отделе.

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

Практическое правило, гласящее: «столбцы дороги, строки дешевы».

Редактировать : Мне кажется, у вас есть два набора предметов: SetA - все возможные предметы; SetB является подмножеством SetA. Вы хотите создать True для каждого элемента в SetB и False для каждого элемента SetA, которого нет в SetB. Это правильно, когда вы заменяете dict (объект словаря) на SetA и lstResults на SetB?

То, что я пытался предложить, - это загрузить dict всеми возможными клавишами "DeptX" и назначить их как False. Затем выполните итерации lstResults и измените каждый из них (в dict ) на True. Затем создайте оператор SQL из dict .

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"
...