گاهی شما یک جدول با یک ستون حاوی اسامی (اسامی بازیگران در این نمونه) دارید. شبیه این یکی:
نمونه اسکرین شات از جدول
و می خواهید نام بازیگران از این جدول در یک خط نمایش داده شود، مانند این:
نمونه اسکرین شات از نتیجه
با کمی تجربه برنامه نویسی Access و VBA می توانید این مشکل را به راحتی حل کنید. شما یک مجموعه رکورد را با یک پرس و جو در ستون جدول (یا پرس و جو) خود باز می کنید. سپس، در حالی که در تمام رکوردها حلقه می زنید، مقادیر را با جداکننده مورد نظر در یک رشته به هم متصل می کنید و در نهایت رشته الحاقی منهای آخرین جداکننده اضافه شده را برمی گردانید.
راه حل می تواند چیزی شبیه به این باشد:
Public Function QueryFieldAsSeparatedString(ByVal fieldName As String, _
ByVal tableOrQueryName As String, _
Optional ByVal criteria As String = "", _
Optional ByVal sortBy As String = "", _
Optional ByVal delimiter As String = ", " _
) As String
' Paramter description
' fieldName = Is the name of the field containing the values
' we want in our comma separated string
' tableOrQueryName = Is the name of table or query containing the column
' criteria = The criteria to filter the data
' sortBy = An optional sort expression to sort the data
' delimiter = The delimiter used to separate the values. It defaults
' to a comma and a blank, but you can use anything you
' like there
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String
Dim whereCondition As String
Dim sortExpression As String
Dim retVal As String
Set db = CurrentDb
' If there where any criteria passed to the function, we build a WHERE-condition for SQL
If Len(criteria) > 0 Then
whereCondition = " WHERE " & criteria
End If
' If there was a sort expression passed to the function, we build a ORDER BY for SQL
If Len(sortBy) > 0 Then
sortExpression = " ORDER BY " & sortBy
End If
' building the complete SQL string
sql = "SELECT " & fieldName & " FROM " & tableOrQueryName & whereCondition & sortExpression
' opening a recordset
Set rs = db.OpenRecordset(sql, dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
' here we are looping through the records and, if the value is not NULL,
' concatenate the field value of each record with the delimiter
If Not IsNull(rs.Fields(0).Value) Then
retVal = retVal & Nz(rs.Fields(0).Value, "") & delimiter
End If
rs.MoveNext
Loop
' we cut away the last delimiter
retVal = Left(retVal, Len(retVal) - Len(delimiter))
' setting the return value of the function
QueryFieldAsSeparatedString = retVal
' cleaning up our objects
rs.Close
Set rs = Nothing
Set db = Nothing
End Function
شما می توانید این تابع را از پنجره فوری ویرایشگر VBA فراخوانی کنید و خروجی درست در زیر چاپ می شود.
خروجی دمو از نتیجه در پنجره فوری
این تابع از فیلتر کردن و مرتبسازی نیز پشتیبانی میکند. اسکرین شات زیر فقط بازیگرانی را با امتیاز 4 یا بیشتر نشان می دهد و آن را بر اساس حروف الفبا مرتب می کند. علاوه بر آن، به جای کاما از یک خط تیره به عنوان جداکننده استفاده می کنیم.
خروجی نمایشی نتیجه در پنجره فوری با تمام پارامترهای ارائه شده
اگر فراخوانی تابع را در ControlSource-Property یک کنترل جعبه متنی قرار دهید، خروجی نشان داده شده در تصویر در ابتدای این مقاله را ایجاد می کند.
برگه ویژگی اسکرین شات، استفاده از تابع در ControlSource یک جعبه متن
اگر از DAO برای دسترسی به داده ها استفاده می کنید، چیزی برای اضافه کردن به این وجود ندارد. با این حال، اگر با یک SQL Server کار می کنید و از ADO برای دسترسی به داده ها استفاده می کنید، ممکن است عوامل دیگری را در نظر بگیرید. من با آنها در این مقاله توضیح می دهم که چگونه می توان یک رشته جدا شده با کاما از یک ADO-Recordset را در سناریوی کلاینت-سرور با استفاده از روش Clone-, Filter- and Sort- Method/Properties ADO-Recordset ایجاد کرد.