Настройка списков в форме доступа MS - строка за строкой - PullRequest
0 голосов
/ 04 мая 2020

У меня есть требование в MS Access, где таблица отображается в виде нескольких строк в форме. Я создал одну запись детализации формы (несколько полей), которая будет повторяться для каждой строки в таблице1. Допустим, у меня есть пять столбцов в таблице1. Основываясь на значении Column3, я хотел бы иметь список значений для Column4 и Column5 во время form_load. Я также создал отдельную таблицу 2, чтобы установить sh связь между столбцами 3, 4 и 4. Я настроил процедуру Event для заполнения значений с помощью подфункции. Проблема, с которой я столкнулся, заключается в том, что я не могу установить разные списки значений для разных строк. Любые советы по заполнению полей формы IMRecomExIns и AmendReasonExIns при обработке каждой строки в Таблице 1 были бы очень полезны.

Private Sub IMRecomExIns_Click()

Dim CoverType As String
Dim ListRecomm As String
Dim ListAmend As String
Dim db As DAO.Database
Dim tablevar As Recordset

Set db = CurrentDb
Set tablevar = db.OpenRecordset("Table2")

CoverType = "*" & Me.CoverTypeExIns.Value & "*"

ListRecomm = ""
ListAmend = ""

If tablevar.EOF = False And tablevar.BOF = False Then
    tablevar.MoveFirst
    Do Until tablevar.EOF
        If tablevar!CoverType Like CoverType Then
            ListRecomm = tablevar!Recommendation
            ListAmend = tablevar!AmendReason
            tablevar.MoveLast
        End If
        tablevar.MoveNext
    Loop
End If

Me.IMRecomExIns.RowSourceType = "Value list"
Me.IMRecomExIns.RowSource = ListRecomm

Me.AmendReasonExIns.RowSourceType = "Value list"
Me.AmendReasonExIns.RowSource = ListAmend

End Sub

1) Я сохранил весь список значений в одной ячейке. Например, таблица! Рекомендация будет иметь все значения для Me.IMRecomExIns.RowSource, что означает, что вывод будет выглядеть как «Rec1»; «Rec2»; «Rec3»; et c ... То же самое относится и к tablevar! AmendReason "AR1"; "AR2"; "AR3"; ET C ... Поймите, это не нормализованная форма хранения данных. Я хочу, чтобы PO C работал, прежде чем создавать полное решение с нормализованными таблицами. 2) Отвечено ранее .. источник строк будет установлен со всеми возможными значениями при первом совпадении, поэтому нет смысла идти до конца таблицы 3) CoverTypeExIns - строка, таблица 2 имеет много различных возможностей, таких как «Ипотека» Income "и" Family Income ", однако Рекомендация и Amendreason одинаковы для всех категорий" Income ", полученных из Таблицы 1. Именно поэтому поиск по шаблону.

Моя проблема не в настройке RowSource для одной строки , но настройка RowSource для множественного вхождения в одной и той же IMRecommmendation и AmendReason на экране MS Access.

Здесь дизайн вид формы. Эта форма связана с таблицей MS Access. Для нескольких строк Детальная запись будет повторяться столько раз. MS Access Form Design

Пример двух строк, отображаемых на экране. Form Display view

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

На основе предоставленной новой информации ниже приведен код VBA, который открывает набор записей на основе информации, введенной в «Обложке», а затем устанавливает свойство .RowSource двух комбинированных полей в качестве списков значений. В моем примере не беспокойтесь о настройке .RowSourceType, поскольку это должно быть сделано во время разработки:

Private Sub IMRecomExIns_Click()
    Dim db As DAO.Database
    Dim rsData As DAO.Recordset
    Dim strSQL As String
    Set db = DBEngine(0)(0)
    strSQL = "SELECT Recommendation, AmendReason FROM Table2 WHERE CoverType LIKE '*" & Me!cboCover & "*';"
    Set rsData = db.OpenRecordset(strSQL)
    If Not (rsData.BOF And rsData.EOF) Then
        Me!IMRecomExIns.RowSource = rsData!Recommendation
        Me!AmendReasonExIns.RowSource = rsData!AmendReason
    End If
    rsData.Close
    Set rsData = Nothing
    Set db = Nothing
End Sub

Как я уже говорил ранее, вы должны действительно нормализовать дизайн вашей базы данных теперь , вместо того чтобы заходить так далеко, что это требует серьезной переписки.

С уважением,

0 голосов
/ 04 мая 2020

Я не совсем уверен, что именно вы просите / пытаетесь сделать здесь.

Я вижу несколько проблем с вашим кодом:

  • Вы используете tablevar.MoveLast в l oop, тогда как c автоматически приведет вас к концу набора записей.
  • Кроме того, вы не объединяете (объединяете) ListRecomm / ListAmend, вы просто устанавливаем их равными значению, поэтому каждый l oop, который соответствует, перезапишет любое предыдущее значение.
  • Наконец, я не уверен, что вы делаете, пытаясь найти CoverTypeExIns - вы используете LIKE, что указывает на то, что это текст, но не заключает значение в одинарные кавычки. Если это числовое значение c, то вы должны использовать «=».

Однако вместо того, чтобы открывать набор записей, делать его циклически и проверять совпадение, чтобы составить список значений , лучше просто установить RowSource списков, равный строке SQL (фактически, запросу).

Что-то вроде (при условии, что CoverType равен цифре c):

Private Sub IMRecomExIns_Click()
   Dim strSQL As String
   strSQL = "SELECT Recommendation FROM Table2 WHERE CoverType=" & Me!CoverTypeExIns
   Me!AmendReasonExIns.RowSource = strSQL
End Sub

Я предпочитаю объявлять строку для хранения оператора SQL, а не устанавливать .RowSource напрямую, поскольку это облегчает поиск неисправностей.

С уважением,

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