-
RE: Test phần mềm QUẢN LÝ TÀI SẢN
ongke0711 > 16-09-20, 10:04 AM
(15-09-20, 06:25 PM)AnNguyen Đã viết: Anh ơi cho em hỏi, trong hàm này là mình sẽ truyền theo từng thamg số tương đương với trong SP đã khai báo rồi, không cần phải khai báo tham số truyền vào là dạng gì nữa phải không ạ?
Và SP em viết trong SQL có nhiều tham số em để mặc định là null ý ạ thì trong cái hàm anh viết kia nếu giá trị nào null phải bỏ qua thì mình khai báo là gì ạ?
Ví dụ em có SP "list_nhanVien" có tham số maHS, nếu em truyền mã học sinh vào thì nó sẽ trả về danh sách của 1 học sinh, nếu em để là null (bỏ trống) thì nó trả về tất cả danh sách chưa học sinh ạ. Thì mình làm như nào ạ?
- Hàm đã bao gồm khai báo kiểu dữ liệu thông qua hàm GetType() rồi em, chỉ cần liệt kê tham số cách nhau dấu phẩy như anh demo code đó.
- Anh quên vụ Null. Em thêm trường hợp này vào hàm GetType () là được rồi. Tham số nào để trống em ghi "Null".
Vd:
Mã PHP:Set rst = ExecuteSPWithADOCommand("dbo.lst_dmTaiSan", Null, Null)
Mã PHP:Case "Null"
result.Type = adVarChar
result.Size = 1
result.value = Null -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 16-09-20, 10:37 AM
Vâng em cảm ơn anh, chỗ đó ok rồi ạ.
Còn 1 cái bị lỗi nữa anh xem giúp em với ạ
Chỗ này bị lỗi nếu em gán trực tiếp cho 1 subform hoặc 1 listbox thông qua .recordset anh ạ.Mã:Set rst = ExecuteSPWithADOCommand("lst_ThongTinNV", Me.txtManv)
Set lstBox1.Recordset = rst -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
ongke0711 > 16-09-20, 11:16 AM
(16-09-20, 10:37 AM)AnNguyen Đã viết: Vâng em cảm ơn anh, chỗ đó ok rồi ạ.
Còn 1 cái bị lỗi nữa anh xem giúp em với ạ
Chỗ này bị lỗi nếu em gán trực tiếp cho 1 subform hoặc 1 listbox thông qua .recordset anh ạ.Mã:Set rst = ExecuteSPWithADOCommand("lst_ThongTinNV", Me.txtManv)
Set lstBox1.Recordset = rst
Để anh xem lại.
Anh thấy em nên khai báo recordset riêng cho mấy cái subform, listbox... vì em dùng chung cái object rst khai báo toàn cục rồi khi có những xử lý khác làm thay đổi Rst này thì lại lỗi dữ liệu. -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 16-09-20, 12:49 PM
(16-09-20, 11:16 AM)ongke0711 Đã viết: Để anh xem lại.
Vâng anh xem lại cho em với ạ
Anh thấy em nên khai báo recordset riêng cho mấy cái subform, listbox... vì em dùng chung cái object rst khai báo toàn cục rồi khi có những xử lý khác làm thay đổi Rst này thì lại lỗi dữ liệu.
Nếu khai báo riêng cho mấy cái subform, listbox và viết 1 hàm tương tự như "ExecuteSPWithADOCommand" hàm này anh viết phải không ạ?
Nhưng em thử viết 1 hàm như này rồi cho thêm đoạnvào thì nó báo lỗi ạ.Mã:rst.CursorLocation = adUseClient
-
RE: Test phần mềm QUẢN LÝ TÀI SẢN
ongke0711 > 16-09-20, 01:57 PM
(16-09-20, 12:49 PM)AnNguyen Đã viết: Nếu khai báo riêng cho mấy cái subform, listbox và viết 1 hàm tương tự như "ExecuteSPWithADOCommand" hàm này anh viết phải không ạ?
Nhưng em thử viết 1 hàm như này rồi cho thêm đoạnvào thì nó báo lỗi ạ.Mã:rst.CursorLocation = adUseClient
Khai báo adUseClient cho đối tượng Connection.
Kiếm đoạn code bên dưới trong hàm ConnectDB(), thêm dòng màu xanh.
-------------------------------------------------------------------------------------------------
If blnNewConnect Then
Set oConn = New ADODB.Connection
oConn.CursorLocation = adUseClient
oConn.ConnectionString = mConnectionString
oConn.Open
End If
--------------------------------------------------------------------------------------------------
Còn gán ADO Recordset cho Subform hay Listbox thì tạo đối tượng RST mới hoặc dùng luôn hàm "ExecuteSPWithADOCommand"
Mã PHP:Dim rsLstNhanVien As ADODB.Recordset
Set rsLstNhanVien = ExecuteSPWithADOCommand("lst_ThongTinNV", Me.txtManv)
Set Me.ListBox1.Recordset = rsLstNhanVien
Me.ListBox1.Requery
Hoặc
Mã PHP:Set Me.ListBox1.Recordset = ExecuteSPWithADOCommand("lst_ThongTinNV", Me.txtManv)
Me.ListBox1.Requery -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 18-09-20, 11:07 AM
Anh Bảo ơi, giúp em thêm 1 bước nữa với ạ.
Em nếu em muốn trả về 1 tham số output từ SP thì phải làm như nào trong cái hàm " ExecuteSPWithADOCommand" ạ?
Em cảm ơn! -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
ongke0711 > 18-09-20, 11:34 AM
Hàm đó lúc trước có nhưng đã bỏ Output.
Cụ thể em chạy cái SP nào cần output -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 18-09-20, 12:38 PM
(18-09-20, 11:34 AM)ongke0711 Đã viết: Hàm đó lúc trước có nhưng đã bỏ Output.
Cụ thể em chạy cái SP nào cần output
Đây anh ạ, em muốn trả về kêt quả output ạ.Mã:Dim cnn As New ADODB.Connection
cnn.ConnectionString = Chuoi_Conn
cnn.Open
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cnn
With cmd
.CommandText = "dbo.Up_MatKhau"
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter("manv", adVarChar, adParamInput, 12, Manv_Log)
.Parameters.Append .CreateParameter("matKhau", adLongVarWChar, adParamInput, -1, matKhau)
.Parameters.Append .CreateParameter("matKhauMoi", adLongVarWChar, adParamInput, -1, MatKhauMoi)
.Parameters.Append .CreateParameter("@kq", adInteger, adParamOutput, 2)
.Execute
End With
Up_MatKhau = cmd.Parameters("@kq")
cnn.Close
Set cnn = Nothing -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
ongke0711 > 19-09-20, 10:05 AM
(18-09-20, 12:38 PM)AnNguyen Đã viết:
Đây anh ạ, em muốn trả về kêt quả output ạ.Mã:...
Up_MatKhau = cmd.Parameters("@kq")
cnn.Close
Set cnn = Nothing
Do cũng ít dùng Output value nên anh bỏ khỏi cái hàm ExecuteSPWithADOCommand().
Em sửa lại cái hàm cũ hoặc có thể tạo thành cái hàm mới đổi tên chút để khỏi rối khi khai báo Parameters.
Mã PHP:Public Function ExecuteSPWithADOCommand(StoredProcName As String, OutputParameter As String, OutPutValue As Variant, _
ParamArray InputParameters()) As ADODB.Recordset
Dim objCmd As ADODB.Command
Dim rsCmd As ADODB.Recordset
Dim intParam As Integer
Dim value As Variant
'Dim recordsAffected As Long
'On Error GoTo ESPError
If ConnectDB() Then
Set objCmd = New ADODB.Command
With objCmd
.ActiveConnection = oConn
.CommandText = StoredProcName
.CommandType = adCmdStoredProc
'Lay tham so
For intParam = LBound(InputParameters) To UBound(InputParameters)
value = InputParameters(intParam)
.Parameters.Append getType(value)
Next
'Khai bao Output neu co
If Len(Trim(OutputParameter)) > 0 Then
.Parameters.Append getTypeOut(OutputParameter, OutPutValue)
End If
Set ExecuteSPWithADOCommand = .Execute
If Len(Trim(OutputParameter)) > 0 Then
OutPutValue = .Parameters(OutputParameter).value
Else
OutPutValue = vbNullString
End If
End With
Else
'Khong ket noi
OutPutValue = vbNullString
End If
Exit Function
ESPResume:
On Error Resume Next
Set ExecuteSPWithADOCommand = Nothing
Set objCmd = Nothing
CloseConnectDB
Exit Function
ESPError:
ShowErrorMessages Err, "modKetNoiSQLSv", "ExecuteSPWithADOCommand"
Resume ESPResume
End Function
- Thêm cái hàm getTypeOut() dùng cho tham số OUTPUT.
Mã PHP:Private Function getTypeOut(ByVal OutputParaName As String, OutPutValue As Variant) As ADODB.Parameter
Dim result As New ADODB.Parameter
result.direction = adParamOutput
result.Name = CStr(OutputParaName)
Select Case TypeName(OutPutValue)
Case "Integer"
result.Type = adInteger
Case "Double"
result.Type = adDouble
Case "Date"
result.Type = adDBDate
Case "String"
result.Type = adVarWChar
result.Size = 255
End Select
Set getTypeOut = result
End Function
Cách dùng: (Em tự sửa hàm Up_MatKhau để nhận tham số)
Mã PHP:Function Up_MatKhau() As Integer
Dim kq As Integer
Call ExecuteSPWithADOCommand("Up_MatKhau", "@kq", kq, "annnn", "123456", "123")
Up_MatKhau = kq
End Function
Dùng hàm ExecuteSPWithADOCommand() tiết kiệm biết bao nhiêu dòng code, bỏ một đống module để khỏi tốn bộ nhớ cho ứng dụng của em rồi đó.