Huyhoang > 09-12-13, 11:59 AM
paulsteigel > 09-12-13, 12:18 PM
Option Compare Database
Sub Test()
BreakCol2Row "Dong", "New_Dong", "[So]", "[Giatri]", "[TenTruong]"
End Sub
Sub BreakCol2Row(SourceTableName As String, _
DestTableName As String, StaticField As String, _
NewValueFieldName As String, NewValueColumnName As String)
'IN: TableName = Ten bang
'@SourceTableName = Ten bang
'@DestTableName = Ten bang
'@StaticField = Ten cot co dinh, co the khai bao dang ten cot, phan cach bang dau phay "[a1],[a2],..."
'@NewValueFieldName = Ten Cot chua gia tri tu cot sang dong
'@NewValueColumnName = Ten cot chua gia tri chuyen tu ten cot
'======================================================================
'De su dung doan code nay thi phai su dung bo thu vien DAO,
'neu muon su dung ADODB thi sua doan code sau
'======================================================================
' Buoc 1: Tao bang chua so lieu
Dim SqlText As String, rs As Object, cn As Object
Dim i As Long, NewSQL As String, j As Long
' Dung DAO
Set cn = CurrentDb
Set rs = CurrentDb.OpenRecordset("Select * from " & SourceTableName & ";")
' Dung ADODB, bo comment
'Set rs = New adodb.recorset
'Set cn = CurrentProject.Connection
'rs.Open "Select * from " & SourceTableName & ";", cn
SqlText = "SELECT " & StaticField
' Kiem tra xem bang co ton tai hay khong?
If TableExist(DestTableName, cn) Then
' New co thi chi chen them so lieu
' Xoa het du lieu hien tai
cn.Execute "Delete * from " & DestTableName
GoTo StepInsert
End If
For i = 0 To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
' Thuc hien Query tao bang va chen so lieu
cn.Execute SqlText & ", " & NewSQL & " INTO " & DestTableName & " FROM " & SourceTableName & ";"
' Thoat ra khoi vong lap
Exit For
End If
Next i
j = i
StepInsert:
' Cau lenh Query moi chen so lieu
SqlText = "INSERT INTO " & DestTableName & "(" & StaticField & "," & NewValueFieldName & "," & NewValueColumnName & ") " & _
"SELECT " & StaticField
For i = j To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
'Debug.Print SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
cn.Execute SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
End If
Next i
' Dong CSDL
rs.Close
End Sub
Function TableExist(TblName As String, cn As Object) As Boolean
Dim rs As Object
On Error GoTo ErrHandler
' Dung DAO
Set rs = cn.OpenRecordset(TblName)
' Dung ADODB, bo mot so comment
'Set rs = New adodb.Recordset
'rs.Open (TblName), cn
rs.Close
TableExist = True
Exit Function
ErrHandler:
End Function
Huyhoang > 09-12-13, 12:55 PM
Huyhoang > 12-12-13, 10:54 AM
(09-12-13, 12:18 PM)paulsteigel Đã viết: Đáng tiếc là trong Access không có lệnh UnPivot như trong SQL và cũng không thể viết các thủ tục dạng StoreProcedure để làm việc đưa giá trị từ cột sang dòng.
Cách duy nhất để bạn làm việc này đó là lần lượt đi hết các cột và đưa vào một Query dạng như thế này với từ khóa UNION ALL.
SELECT Dong.SO, Dong.S01 AS VALUEFILED, "S01" AS FIELDNAME
FROM Dong;
UNION ALL
SELECT Dong.SO, Dong.S02 AS VALUEFILED, "S02" AS FIELDNAME
FROM Dong;
UNION ALL
....
Với cách này bạn có thể chuyển từ cột sang dòng.
Hoặc đơn giản là viết một thủ tục VBA, đọc danh sách các cột sau đó tạo và thực thi các Query để đưa giá trị cột vào dòng.
Bạn xem thử đoạn code này!
Mã PHP:Option Compare Database
Sub Test()
BreakCol2Row "Dong", "New_Dong", "[So]", "[Giatri]", "[TenTruong]"
End Sub
Sub BreakCol2Row(SourceTableName As String, _
DestTableName As String, StaticField As String, _
NewValueFieldName As String, NewValueColumnName As String)
'IN: TableName = Ten bang
'@SourceTableName = Ten bang
'@DestTableName = Ten bang
'@StaticField = Ten cot co dinh, co the khai bao dang ten cot, phan cach bang dau phay "[a1],[a2],..."
'@NewValueFieldName = Ten Cot chua gia tri tu cot sang dong
'@NewValueColumnName = Ten cot chua gia tri chuyen tu ten cot
'======================================================================
'De su dung doan code nay thi phai su dung bo thu vien DAO,
'neu muon su dung ADODB thi sua doan code sau
'======================================================================
' Buoc 1: Tao bang chua so lieu
Dim SqlText As String, rs As Object, cn As Object
Dim i As Long, NewSQL As String, j As Long
' Dung DAO
Set cn = CurrentDb
Set rs = CurrentDb.OpenRecordset("Select * from " & SourceTableName & ";")
' Dung ADODB, bo comment
'Set rs = New adodb.recorset
'Set cn = CurrentProject.Connection
'rs.Open "Select * from " & SourceTableName & ";", cn
SqlText = "SELECT " & StaticField
' Kiem tra xem bang co ton tai hay khong?
If TableExist(DestTableName, cn) Then
' New co thi chi chen them so lieu
' Xoa het du lieu hien tai
cn.Execute "Delete * from " & DestTableName
GoTo StepInsert
End If
For i = 0 To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
' Thuc hien Query tao bang va chen so lieu
cn.Execute SqlText & ", " & NewSQL & " INTO " & DestTableName & " FROM " & SourceTableName & ";"
' Thoat ra khoi vong lap
Exit For
End If
Next i
j = i
StepInsert:
' Cau lenh Query moi chen so lieu
SqlText = "INSERT INTO " & DestTableName & "(" & StaticField & "," & NewValueFieldName & "," & NewValueColumnName & ") " & _
"SELECT " & StaticField
For i = j To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
'Debug.Print SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
cn.Execute SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
End If
Next i
' Dong CSDL
rs.Close
End Sub
Function TableExist(TblName As String, cn As Object) As Boolean
Dim rs As Object
On Error GoTo ErrHandler
' Dung DAO
Set rs = cn.OpenRecordset(TblName)
' Dung ADODB, bo mot so comment
'Set rs = New adodb.Recordset
'rs.Open (TblName), cn
rs.Close
TableExist = True
Exit Function
ErrHandler:
End Function
Huyhoang > 12-12-13, 10:56 AM
(09-12-13, 12:18 PM)paulsteigel Đã viết: Đáng tiếc là trong Access không có lệnh UnPivot như trong SQL và cũng không thể viết các thủ tục dạng StoreProcedure để làm việc đưa giá trị từ cột sang dòng.
Cách duy nhất để bạn làm việc này đó là lần lượt đi hết các cột và đưa vào một Query dạng như thế này với từ khóa UNION ALL.
SELECT Dong.SO, Dong.S01 AS VALUEFILED, "S01" AS FIELDNAME
FROM Dong;
UNION ALL
SELECT Dong.SO, Dong.S02 AS VALUEFILED, "S02" AS FIELDNAME
FROM Dong;
UNION ALL
....
Với cách này bạn có thể chuyển từ cột sang dòng.
Hoặc đơn giản là viết một thủ tục VBA, đọc danh sách các cột sau đó tạo và thực thi các Query để đưa giá trị cột vào dòng.
Bạn xem thử đoạn code này!
Mã PHP:Option Compare Database
Sub Test()
BreakCol2Row "Dong", "New_Dong", "[So]", "[Giatri]", "[TenTruong]"
End Sub
Sub BreakCol2Row(SourceTableName As String, _
DestTableName As String, StaticField As String, _
NewValueFieldName As String, NewValueColumnName As String)
'IN: TableName = Ten bang
'@SourceTableName = Ten bang
'@DestTableName = Ten bang
'@StaticField = Ten cot co dinh, co the khai bao dang ten cot, phan cach bang dau phay "[a1],[a2],..."
'@NewValueFieldName = Ten Cot chua gia tri tu cot sang dong
'@NewValueColumnName = Ten cot chua gia tri chuyen tu ten cot
'======================================================================
'De su dung doan code nay thi phai su dung bo thu vien DAO,
'neu muon su dung ADODB thi sua doan code sau
'======================================================================
' Buoc 1: Tao bang chua so lieu
Dim SqlText As String, rs As Object, cn As Object
Dim i As Long, NewSQL As String, j As Long
' Dung DAO
Set cn = CurrentDb
Set rs = CurrentDb.OpenRecordset("Select * from " & SourceTableName & ";")
' Dung ADODB, bo comment
'Set rs = New adodb.recorset
'Set cn = CurrentProject.Connection
'rs.Open "Select * from " & SourceTableName & ";", cn
SqlText = "SELECT " & StaticField
' Kiem tra xem bang co ton tai hay khong?
If TableExist(DestTableName, cn) Then
' New co thi chi chen them so lieu
' Xoa het du lieu hien tai
cn.Execute "Delete * from " & DestTableName
GoTo StepInsert
End If
For i = 0 To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
' Thuc hien Query tao bang va chen so lieu
cn.Execute SqlText & ", " & NewSQL & " INTO " & DestTableName & " FROM " & SourceTableName & ";"
' Thoat ra khoi vong lap
Exit For
End If
Next i
j = i
StepInsert:
' Cau lenh Query moi chen so lieu
SqlText = "INSERT INTO " & DestTableName & "(" & StaticField & "," & NewValueFieldName & "," & NewValueColumnName & ") " & _
"SELECT " & StaticField
For i = j To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
'Debug.Print SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
cn.Execute SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
End If
Next i
' Dong CSDL
rs.Close
End Sub
Function TableExist(TblName As String, cn As Object) As Boolean
Dim rs As Object
On Error GoTo ErrHandler
' Dung DAO
Set rs = cn.OpenRecordset(TblName)
' Dung ADODB, bo mot so comment
'Set rs = New adodb.Recordset
'rs.Open (TblName), cn
rs.Close
TableExist = True
Exit Function
ErrHandler:
End Function
(09-12-13, 12:18 PM)paulsteigel Đã viết: Đáng tiếc là trong Access không có lệnh UnPivot như trong SQL và cũng không thể viết các thủ tục dạng StoreProcedure để làm việc đưa giá trị từ cột sang dòng.
Cách duy nhất để bạn làm việc này đó là lần lượt đi hết các cột và đưa vào một Query dạng như thế này với từ khóa UNION ALL.
SELECT Dong.SO, Dong.S01 AS VALUEFILED, "S01" AS FIELDNAME
FROM Dong;
UNION ALL
SELECT Dong.SO, Dong.S02 AS VALUEFILED, "S02" AS FIELDNAME
FROM Dong;
UNION ALL
....
Với cách này bạn có thể chuyển từ cột sang dòng.
Hoặc đơn giản là viết một thủ tục VBA, đọc danh sách các cột sau đó tạo và thực thi các Query để đưa giá trị cột vào dòng.
Bạn xem thử đoạn code này!
Mã PHP:Option Compare Database
Sub Test()
BreakCol2Row "Dong", "New_Dong", "[So]", "[Giatri]", "[TenTruong]"
End Sub
Sub BreakCol2Row(SourceTableName As String, _
DestTableName As String, StaticField As String, _
NewValueFieldName As String, NewValueColumnName As String)
'IN: TableName = Ten bang
'@SourceTableName = Ten bang
'@DestTableName = Ten bang
'@StaticField = Ten cot co dinh, co the khai bao dang ten cot, phan cach bang dau phay "[a1],[a2],..."
'@NewValueFieldName = Ten Cot chua gia tri tu cot sang dong
'@NewValueColumnName = Ten cot chua gia tri chuyen tu ten cot
'======================================================================
'De su dung doan code nay thi phai su dung bo thu vien DAO,
'neu muon su dung ADODB thi sua doan code sau
'======================================================================
' Buoc 1: Tao bang chua so lieu
Dim SqlText As String, rs As Object, cn As Object
Dim i As Long, NewSQL As String, j As Long
' Dung DAO
Set cn = CurrentDb
Set rs = CurrentDb.OpenRecordset("Select * from " & SourceTableName & ";")
' Dung ADODB, bo comment
'Set rs = New adodb.recorset
'Set cn = CurrentProject.Connection
'rs.Open "Select * from " & SourceTableName & ";", cn
SqlText = "SELECT " & StaticField
' Kiem tra xem bang co ton tai hay khong?
If TableExist(DestTableName, cn) Then
' New co thi chi chen them so lieu
' Xoa het du lieu hien tai
cn.Execute "Delete * from " & DestTableName
GoTo StepInsert
End If
For i = 0 To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
' Thuc hien Query tao bang va chen so lieu
cn.Execute SqlText & ", " & NewSQL & " INTO " & DestTableName & " FROM " & SourceTableName & ";"
' Thoat ra khoi vong lap
Exit For
End If
Next i
j = i
StepInsert:
' Cau lenh Query moi chen so lieu
SqlText = "INSERT INTO " & DestTableName & "(" & StaticField & "," & NewValueFieldName & "," & NewValueColumnName & ") " & _
"SELECT " & StaticField
For i = j To rs.Fields.Count - 1
If InStr(LCase(StaticField), "[" & LCase(rs.Fields(i).Name) & "]") = 0 Then
' Tao SQL va thuc hien
NewSQL = "[" & rs.Fields(i).Name & "] AS " & NewValueFieldName & ", '" & rs.Fields(i).Name & "' AS " & NewValueColumnName
'Debug.Print SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
cn.Execute SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
End If
Next i
' Dong CSDL
rs.Close
End Sub
Function TableExist(TblName As String, cn As Object) As Boolean
Dim rs As Object
On Error GoTo ErrHandler
' Dung DAO
Set rs = cn.OpenRecordset(TblName)
' Dung ADODB, bo mot so comment
'Set rs = New adodb.Recordset
'rs.Open (TblName), cn
rs.Close
TableExist = True
Exit Function
ErrHandler:
End Function
paulsteigel > 12-12-13, 02:00 PM
Huyhoang > 12-12-13, 03:26 PM
Huyhoang > 12-12-13, 04:09 PM
(12-12-13, 03:26 PM)Huyhoang Đã viết: Cảm ơn bạn đã giúp mình. mình chưa hiểu rõ về vbe mình sẽ học thêm nhưng tại vì cần gấp quá mà làm query theo bài đầu của bạn thì dài dòng quá ví dụ mình thêm nhiều cột nữa thì phải làm biết bao nhiêu query thì hơi bất tiện.
bạn có thể làm file VBE để mình học lỏm được không?
Tks bạn trước nhé!
paulsteigel > 13-12-13, 09:24 AM
cn.Execute SqlText & ", " & NewSQL & " INTO " & DestTableName & " FROM " & SourceTableName & ";"
cn.Execute SqlText & ", " & NewSQL & " FROM " & SourceTableName & ";"
cn.Execute SqlText & ", " & NewSQL & " INTO " & DestTableName & " FROM " & SourceTableName & _
" WHERE [" & rs.Fields(i).Name & "] IS NOT NULL;"
cn.Execute SqlText & ", " & NewSQL & " FROM " & SourceTableName & _
" WHERE [" & rs.Fields(i).Name & "] IS NOT NULL;"