5 строк кода

Как писать приложения на MS Access

Как преобразовать записи таблицы в строку

Комментариев нет

Я хочу предоставить Вам несколько очень полезных функций, которые позволяют собрать данные из таблицы в строку через разделитель:

  • CM_RecsInStr()
  • CM_RecsInStrExt()

Отличия между ними заключаются в параметрах. CM_RecsInStr() работает с Recordset, а CM_RecsInStrExt() с запросом или именем таблицы.

Эти функции я часто использую, что бы показать информацию о сложном объекте в сжатом виде. Например, для заказа можно показать выбранные товары через запятую, при этом можно ограничить вывод первыми 10 записями.

Пример использования:

Dim lK_OREDER As Long
Dim rst As DAO.Recordset
Dim stSQL As String

lK_OREDER = 123
stSQL = "SELECT TOP 25 T_ORDER_ITEM & '(' & N_COUNT & ')' As T_ITEM FROM K_ORDER = " & lK_OREDER

Set rst = CurrentDb.OpenRecordset(stSQL, dbOpenForwardOnly)

MsgBox CM_RecsInStr(rst, "T_ITEM", " | ")
MsgBox CM_RecsInStr(stSQL , "T_ITEM", " | ")

В результате работы примера получим примерно такую строку:

Товар А (1) | Товар Б (2) | Товар В (1)

Наиболее удачной получилось CM_RecsInStrExt(). Иногда для простоты я ее использую в качестве истоника данных полей на формах.

Текст функций:

Public Function CM_RecsInStr(ByRef rstTable As Recordset _
                            , ByVal stFieldName As String _
                            , Optional ByVal SimvRazd As String = ",") As String
' Скоков С.А.
' Формирует строку из записей таблицы, разделяя их запятыми
' rstTable - ссылка на открытый набор записей
' stFieldName - имя поле, из которого брать данные
' SimvRazd - символ разделитель значений

On Error GoTo Err_
    
    Dim stRet As String

    ' если есть записи то
    If rstTable.RecordCount > 0 Then
        ' это потому что эти значения разделяются запятыми и ставятся перед присваиванием 
        '    знач. из таблицы см. цикл ниже 
        '    а перед первым значением запятую ставить не нужно
        stRet = Nz(rstTable(stFieldName))
        rstTable.MoveNext
    End If
    
    Do While Not rstTable.EOF
        stRet = stRet & SimvRazd & Nz(rstTable(stFieldName))
        rstTable.MoveNext
    Loop
    
    CM_RecsInStr = stRet

Exit_:
    Exit Function

Err_:
    Err.Raise Err.Number, "CM_RecsInStr() ->" & Err.Description, Err.Description
    Resume Exit_
    Resume
End Function

Public Function CM_RecsInStrExt(ByVal stSQL As String _
                                , ByVal stFieldName As String _
                                , Optional ByVal SimvRazd As String = ", ") As String
' Скоков С.А.
' Формирует строку из записей таблицы, разделяя их разделителями (запятыми)
' stSQL - запрос (может быть и именем таблицы или сохраненного запроса)
' stFieldName - имя поле, из которого брать данные
' SimvRazd - символ разделитель значений
On Error GoTo Err_
    
    Dim stRet As String
    Dim rstTable As Recordset
    
    Set rstTable = CurrentDb.OpenRecordset(stSQL, dbOpenDynaset)
    ' если есть записи то
    If rstTable.RecordCount > 0 Then
        ' это потому что эти значения разделяются запятыми и ставятся перед присваиванием 
        '    знач-я из таблицы (см. цикл ниже), 
        '    а перед первым значением запятую ставить не нужно
        stRet = Nz(rstTable(stFieldName))
        rstTable.MoveNext
    End If
    
    Do While Not rstTable.EOF
        stRet = stRet & SimvRazd & Nz(rstTable(stFieldName))
        rstTable.MoveNext
    Loop
    
    rstTable.Close
    
    CM_RecsInStrExt = stRet

Exit_:
    Exit Function

Err_:
    Err.Raise Err.Number, "CM_RecsInStrExt() ->" & Err.Description, Err.Description
    Resume Exit_
End Function

До встречи!

(с) Скоков Сергей

Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.

Written by Сергей Скоков

Февраль 23rd, 2011 at 1:14 пп

Leave a Reply