Как получить данные многозначного поля (MVF) из элемента управления ComboBox? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть (множественный выбор) поле со списком супервизоров, при выборе супервизора из поля со списком он заполняет текстовое поле с идентификатором работы супервизора.Теперь вот сложная часть, иногда есть два супервизора, которые нужно выбрать, когда я делаю, чтобы текстовое поле ничего не показывало.

Итак, вопрос в том, какой правильный код VBA имеет текстовое поле.отображать только ПЕРВЫЙ выбранный супервизор и игнорировать все остальное после, и отображать значение этого супервизора в текстовом поле.

Вот код, который у меня есть в vba на данный момент.(PS текстовое поле также захватывает некоторые другие данные)

Private Sub SUPERVISOR_AfterUpdate()

Me.WORK_ID = Right(Me.SUPERVISOR.Column(2), 3) & Format(Me.RECEIVED_DATE, "yymmd")

End Sub

Вот изображение того, что я имею в виду:

https://imgur.com/a/z982VjM

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

ОК, так что спасибо за выше приведенный здесь код на данный момент, НО все еще проблема.

Так что проблема в том, что он до сих пор не делает то, о чем говорилось в моем оригинальном сообщенииПросто для ясности.

Пример: я нажимаю, чтобы выбрать супервизора, я выбираю, например, SUKDEO, а затем я выбираю BISSO.SUKDEO является основным руководителем для этой работы (который, в свою очередь, мне нужен ТОЛЬКО его номер банды, чтобы заполнить).НО с этим кодом, когда я выбираю SUKDEO, а затем выбираю BISSO, номер банды Bissos - это тот, который заполняет не (обратно к моему OP) ПЕРВЫЙ ВЫБОР или (может быть, я должен был сказать первичный) SUPERVISOR.

ИСПРАВЛЕНИЕ: проблема возникает только с СЛЕДУЮЩИМ супервизором.Если я выберу любого другого руководителя, код работает.см. рис.

Надеюсь, что создаст сцену, вот код, а вот рис.

не работает со следующим супервизором

работает только с каждым другим супервизором

Private Sub SUPERVISOR_AfterUpdate()
 Dim supe1Data As String

  Dim va As Variant
  va = Me.SUPERVISOR.Value '* Multi-valued Field (MVF)

  Debug.Print "==============================="

  If IsNull(va) Then
    'Value is NULL if NO MVF list items are selected

    supe1Data = ""
  Else
    '* A Multi-valued Field (MVF) ComboBox will
    '*   return a variant array of variants.  The
    '*   array-element variants will be of a type
    '*   that is compatible with the underlying field value.

    '*** Question-specific code ***
    Dim iLower As Integer
    Dim iUpper As Integer

    iLower = LBound(va)
    iUpper = UBound(va)

    '* Get first selected supervisor code

    If iUpper = 0 Then
      '* Only ONE value selected, so
      '*    .Column(2) contains valid data
      '*    .Recordset property is NOTHING

      '* Contrary to online docs, for MVF...
      '*   Column(0) is bound data value
      '*   Column(i) is column i from 1 to .ColumnCount
      supe1Data = Me.SUPERVISOR.Column(2)
    Else
      '* MULTIPLE value selected, so
      '*    .Column(2) is NULL
      '*    .Recordset property is valid and open

      Dim rs As Recordset2
      Set rs = Me.SUPERVISOR.Recordset.Clone

      '* Since data is already available, lookup can be
      '*   more efficient than new query (i.e. using DLookup)
      rs.FindFirst "[LAST NAME] = '" & va(0) & "'"
      If Not rs.NoMatch Then
        '* Here, column indices start at 0
        supe1Data = rs.Fields(1).Value 'Second column
      Else
        supe1Data = "ERROR" 'Unexpected
      End If

      rs.Close
    End If
  End If

  Me.WORK_ID = Right(supe1Data, 3) & Format(Me.RECEIVED_DATE, "yymmdd")
End Sub

Я думаю, это так же ясно, как я могу получить LOL Спасибо, ребята, еще раз, похоже, что мы почти там:)

-S

0 голосов
/ 24 октября 2018

Следующий код демонстрирует, как получить выбранные значения из поля со множеством значений (MVF) ComboBox.Я включил подробные строки отладки, чтобы продемонстрировать, как эта информация могла быть выведена, даже когда она незнакома с MVF или почему она не работает так, как вы ожидали.

Я согласен с комментариями от 7 июня, что создание идентификатора только из одного измножественные значения сомнительны, но это дизайнерское решение выходит за рамки вопроса.Однако, по крайней мере, код предоставляет достаточно информации для циклического прохождения всех выбранных значений, чтобы генерировать любые детали, которые вы пожелаете.

Обновлен код, более специфичный для вопроса (и без подробной отладки):

  Dim supe1Data As String

  Dim va As Variant
  va = Me.SUPERVISOR.Value '* Multi-valued Field (MVF)

  Debug.Print "==============================="

  If IsNull(va) Then
    'Value is NULL if NO MVF list items are selected

    supe1Data = ""
  Else
    '* A Multi-valued Field (MVF) ComboBox will
    '*   return a variant array of variants.  The
    '*   array-element variants will be of a type
    '*   that is compatible with the underlying field value.

    '*** Question-specific code ***
    Dim iLower As Integer
    Dim iUpper As Integer

    iLower = LBound(va)
    iUpper = UBound(va)

    '* Get first selected supervisor code

    If iUpper = 0 Then
      '* Only ONE value selected, so
      '*    .Column(2) contains valid data
      '*    .Recordset property is NOTHING

      '* Contrary to online docs, for MVF...
      '*   Column(0) is bound data value
      '*   Column(i) is column i from 1 to .ColumnCount
      supe1Data = Me.MVF.Column(2)
    Else
      '* MULTIPLE value selected, so
      '*    .Column(2) is NULL
      '*    .Recordset property is valid and open

      Dim rs As Recordset2
      Set rs = Me.SUPERVISOR.Recordset.Clone

      '* Since data is already available, lookup can be 
      '*   more efficient than new query (i.e. using DLookup)
      rs.FindFirst "[LAST NAME] = '" & va(0) & "'"
      If Not rs.NoMatch Then
        '* Here, column indices start at 0
        supe1Data = rs.Fields(1).Value 'Second column
      Else
        supe1Data = "ERROR" 'Unexpected
      End If

      rs.Close
    End If
  End If

  Me.WORK_ID = Right(supe1Data, 3) & Format(Me.RECEIVED_DATE, "yymmdd")  

Оригинальный код:

  Dim supe1 As String

  Dim va As Variant
  va = Me.SUPERVISOR.Value '* Multi-valued Field (MVF)

  If IsNull(va) Then
    'Value is Null if no MVF list items are selected
    Debug.Print "No Supervisor selected"

    supe1 = ""
  Else
    '* A Multi-valued Field (MVF) ComboBox will
    '*   return a variant array of variants.  The
    '*   array-element variants will be of a type
    '*   that is compatible with the underlying field value.

    'Discover details of the control value by inspecting
    '  the types of the returned values.
    Debug.Print "Field type: " & TypeName(va)

    Debug.Print "Variant array type: " & VarType(va)
    Debug.Print "   vbArray OR vbVariant = " & (VarType(va) Or vbArray)
    Debug.Print "   vbArray   = 8192"
    Debug.Print "   VbVariant = 12"

    'Inspect the first element
    Debug.Print "Element type: " & VarType(va(0))
    Debug.Print "   VbString = 8"

    Debug.Print "Array upper-bound: " & UBound(va)

    '*** Question-specific code ***
    Dim iLower As Integer
    Dim iUpper As Integer

    iLower = LBound(va)
    iUpper = UBound(va)

    supe1 = va(iLower)
    Debug.Print "First selected Supervisor: " & supe1
  End If

  Me.WORK_ID = Right(supe1, 3) & Format(Me.RECEIVED_DATE, "yymmdd")        

См. Документы Microsoft для получения дополнительной информации о VarType().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...