Hỏi cách làm query như sau: nối các hàng lại thành 1

Liên hệ QC

transongngocquan

Thành viên hoạt động
Tham gia
10/5/07
Bài viết
180
Được thích
99
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

Xin các cao thủ chỉ giúp.
Cám ơn nhiều.
 

File đính kèm

  • Database2.rar
    11.8 KB · Đọc: 29
Lần chỉnh sửa cuối:
Ghép nội dung nhiều record thành 1 record theo trường (field) được định nghĩa trước

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

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;
Bạn xem thêm file đính kèm nha.
 

File đính kèm

  • TestCombine.rar
    19.3 KB · Đọc: 50
Lần chỉnh sửa cuối:
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
Ngoài thuật toán quét từng record, mình chưa tìm thấy cách nào tối ưu hơn!
 
Có ai có cách khác không. Xin giúp đỡ.
Cám ơn nhiều
 
Web KT
Back
Top Bottom