Tôi có bảng PhepNam như sau:
MSNV HoTen NgayNghi
00001 Nguyen Van A Ngay 1, Ngay 2
00002 Nguyen Văn B Ngay 1, Ngay 2
00001 Nguyen Van A Ngay 3
00002 Nguyen Văn B Ngay 3
Hỏi cách tạo Query như sau:
MSNV HoTen NgayNghi
00001 Nguyen Van A Ngay 1, Ngay 2, Ngay 3
00002 Nguyen Văn B Ngay 1, Ngay 2, Ngay 3
MSNV
|
HoTen
|
NgayNghi
00001 |Nguyen Van A |Ngay 1, Ngay 2
00002 |Nguyen Văn B |Ngay 1, Ngay 2
00001 |Nguyen Van A |Ngay 3
00002 |Nguyen Văn B |Ngay 3
Hỏi cách tạo Query như sau:
MSNV
|
HoTen
|
NgayNghi
00001 |Nguyen Van A |Ngay 1, Ngay 2, Ngay 3
00002 |Nguyen Văn B |Ngay 1, Ngay 2, Ngay 3
Bước 1: Viết một hàm tự tạo User Defined Function như sau (Viết trong Module chính nha bạn)
(Nguồn: http://support.microsoft.com/kb/318642)
[highlight=vb]
Option Compare Database
'strTblQryIn: Tên của Table chứa dữ liệu cần ghép lại
'strFieldNameIn: Tên của field cần ghép lại
'strLinkChildFieldNameIn: Khóa chính để link giữa bảng Danh mục duy nhất và bảng dữ liệu chi tiết
'varPKVvalue: Giá trị field hiện hành sẽ được quét khi chạy query
'strDelimiter: Kí tự ngăn cách giữa các nhóm dữ liệu khi ghép lại, nếu để trống thì sẽ mặc định
'là dấu chấm phẩy (semicolon --> ";")
Function CombineRecords(strTblQryIn As String, _
strFieldNameIn As String, strLinkChildFieldNameIn As String, _
varPKVvalue As Variant, Optional strDelimiter) As Variant
Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim rs As DAO.Recordset
Dim strSQL As String
Dim varResult As Variant
'--------------------------------------------
Set db = CurrentDb
Set qd = db.CreateQueryDef("")
'--------------------------------------------
If IsMissing(strDelimiter) Then strDelimiter = "; "
strSQL = "SELECT [" & strFieldNameIn & "] FROM [" & strTblQryIn & "]"
qd.SQL = strSQL & " WHERE [" & strLinkChildFieldNameIn & "] = [ParamIn]"
qd.Parameters("ParamIn").Value = varPKVvalue
Set rs = qd.OpenRecordset()
Do Until rs.EOF
varResult = varResult & rs.Fields(strFieldNameIn).Value & strDelimiter
rs.MoveNext
Loop
rs.Close
If Len(varResult) > 0 Then varResult = Left$(varResult, _
Len(varResult) - 2)
CombineRecords = varResult
Set rs = Nothing
Set qd = Nothing
Set db = Nothing
End Function
[/highlight]
Bước 2: tạo 1 query với các mã số Nhân viên và họ tên duy nhất như sau:
qryDMNV:
PHP:
SELECT DISTINCT PhepNam.MSNV, PhepNam.HoTen
FROM PhepNam;
Bước 3: Tạo query theo yêu cầu của bạn như sau:
qryPhepNam:
PHP:
SELECT MSNV, HoTen, CombineRecords("PhepNam","NgayNghi","MSNV",[MSNV],", ") AS NgayNghi
FROM qryDMNV;
Cách này tốc độ rất chậm, tôi cũng đã biết rồi,với dữ liệu lớn cỡ 1000 dòng tức là sẽ chạy khoảng 1000 cái query nên vì vậy tốc độ sẽ chậm đi rất nhiều.
Có cách nào khác nhanh hơn không
Cách này tốc độ rất chậm, tôi cũng đã biết rồi,với dữ liệu lớn cỡ 1000 dòng tức là sẽ chạy khoảng 1000 cái query nên vì vậy tốc độ sẽ chậm đi rất nhiều.
Có cách nào khác nhanh hơn không