-
RE: Test phần mềm QUẢN LÝ TÀI SẢN
thuyyeu99 > 04-09-20, 05:49 PM
(04-09-20, 08:56 AM)AnNguyen Đã viết:
Mình chỉ xem giao diện của bạn để học hỏi thôi, Code thì có các anh trên đây rồi, mình Pó tay(03-09-20, 10:10 PM)thuyyeu99 Đã viết: hôm nay mới rảnh vào diễn đàn, cám ơn bạn nhiều nhé, để mình test thử
Rồi bác nhé, rảnh xem code xem các thử cho em và góp ý bổ sung cho em nữa nhé, hì
bạn cấp quyền cho mình nhé -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
thuyyeu99 > 04-09-20, 06:01 PM
Nhìn Code thấy chuyên nghiệp quá -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 04-09-20, 06:27 PM
-
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 07-09-20, 03:53 PM
Cháu cảm ơn sự góp ý của chú.
(01-09-20, 01:08 PM)Xuân Thanh Đã viết: 2/ Đưa cái định nghĩa rst ra ngoài định nghĩa cmd (Tạo cmd xong mới tạo rst )
Cái này cháu chưa hiểu đưa ra ngoài khỏi cmd như nào ạ? chú có thể demo cho cháu xem được không ạ
Xuân Thanh Đã viết:
Mới chỉ xem sơ qua còn chi tiết không hiểu ý chủ thớt nên không tham gia trao đổi
Dạ cháu muốn được góp ý về cách bố trí hoặc xây dựng giao diện cũng như code cần phải cải thiện gì ạ?
Vì để nó có thể càng ngày càng chuyên nghiệp hơn vì cháu xây dựng theo kiểu của cháu nghĩ gì ra làm đó nên sợ nhiều lúc nó không được ổn ạ.
Xuân Thanh Đã viết:
Cháu có 1 form check key bản quyền ạ, nhưng khi đưa file lên cháu bỏ form đó đi ạ.
Nói thêm về mã hóa
Không hiểu bạn mã hóa là mã hóa Key bản quyền hay mật khẩu sử dụng cho từng User? Nếu là Key bản quyền thì cần cả Mã Hóa và Giải Mã. Còn nếu chỉ dùng cho mật khẩu truy cập thì đâu cần phải mã hóa làm chi cho cực. Mật khẩu là do người quản trị cung cấp nên người quản trị có quyền xóa và cấp mới. Chỉ cần đặt Input Mask cho ô Textbox mật khẩu là được. Nếu muốn thì cho phép User thay đổi mật khẩu truy cập của cá nhân mình khi thấy bảo mật không an toàn. Tât nhiên User muốn đổi kiểu gì thì người quản trị cũng đêu biết hêt
Còn về mã hóa mật khẩu user đúng là cháu nghĩ theo nếu bị lộ data khi họ lấy được thì họ không thể giải mã và biết được đó là mã gì (chứ quản trị viên thì mã gì cũng biết được ạ) -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
ongke0711 > 10-09-20, 03:11 PM
Rảnh xem lại cái ứng dụng này của em thấy có mấy ý sau: về cái cách ứng dụng hoạt động.
- Tại sao em phải convertLinkedTable to local? Dùng SQL Sv làm CSDL thì đã muốn dữ liệu lưu về một mối, làm kiểu này thì file FE cũng phải lưu một lượng lớn CSDL, làm ứng dụng Access phình lên, xẹp xuống thường xuyên, dễ bị phân mảnh dữ liệu. Nếu CSDL lớn cách làm này làm cho file FE nặng nề. Thường chuẩn thì file FE chỉ lưu những table tạm, không muốn SQL SV phải làm thêm việc tạo table tạm.
- Việc cập nhật dữ liệu thì em vừa cập nhật lên Server vừa cập nhật vô Local table -> mất thêm thời gian, tài nguyên. Có thể việc cập nhật này không đáng kể nhưng cũng là sự lãng phí code.
- Em tạo các hàm xử lý (In, UP...) chạy các Stored proc. một cách riêng lẻ như: InUp_SuDung_TaiSan, InUp_DanhMuc_Chung... Chi bằng tạo một hàm dùng chung, chỉ cần gọi SP và cung cấp mảng tham số là được rồi.
- Tạo Connection: nên viết một cái hàm tạo Connection riêng rồi gọi, chứ mỗi sub, mỗi hàm lại viết lại code tạo Connection làm nó rườm ra, không kế thừa, sử dụng lại được code. Tôi lại không thấy code đóng Connection sau mỗi lần thực hiện một tác vụ gì đó, không biết tôi có bỏ sót đoạn code đó không? Mỗi tác vụ em mở một connection mới, chứ không thấy đóng. Nếu vậy SQL SV sẽ phải quản lý một đống Connection tới nó đó, nếu SQL SV có thiết lập giới hạn connection thì những người sau sẽ không kết nối được.
Anh thấy ứng dụng của em không sử dụng Query vậy thì nên bỏ luôn các local table, giao tiếp trực tiếp với SQL Sv thì hay hơn và dữ liệu sẽ được cập nhật tức thì khi có thay đổi do nhiều người nhập liệu. -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 10-09-20, 04:40 PM
ongke0711 Đã viết:
- Tại sao em phải convertLinkedTable to local? Dùng SQL Sv làm CSDL thì đã muốn dữ liệu lưu về một mối, làm kiểu này thì file FE cũng phải lưu một lượng lớn CSDL, làm ứng dụng Access phình lên, xẹp xuống thường xuyên, dễ bị phân mảnh dữ liệu. Nếu CSDL lớn cách làm này làm cho file FE nặng nề. Thường chuẩn thì file FE chỉ lưu những table tạm, không muốn SQL SV phải làm thêm việc tạo table tạm.
Vâng em cảm ơn anh ạ.
convertLinkedTable là lúc ban đầu em dùng để lấy các bảng như Cơ sở, Danh mục (Data it) múc địch em lấy nó là vì muốn khi đăng nhập thì lấy nó về 1 lần sau đó thao tách thì nó không làm phiền SQL SV nhiều lần nữa ạ, (vì trong đó em lại hay dùng lệnh tìm kiếm gõ ký tự sẽ hiển thị tên phù hợp, vd: gõ A thì ra hàng loạt cơ sở có chữ A ạ) -> Nhưng em đã đổi thành là load data từ SQL về sau đó APPEND vào table local ->Như vậy có ổn hơn không hả anh?
ongke0711 Đã viết:
- Việc cập nhật dữ liệu thì em vừa cập nhật lên Server vừa cập nhật vô Local table -> mất thêm thời gian, tài nguyên. Có thể việc cập nhật này không đáng kể nhưng cũng là sự lãng phí code.
Vâng đúng là chỗ này thì do em ngại mỗi lần cập nhật lên server muốn cập nhật local table luôn để đỡ mất công refresh lại bước APPEND data từ sv về local ạ
ongke0711 Đã viết:
- Em tạo các hàm xử lý (In, UP...) chạy các Stored proc. một cách riêng lẻ như: InUp_SuDung_TaiSan, InUp_DanhMuc_Chung... Chi bằng tạo một hàm dùng chung, chỉ cần gọi SP và cung cấp mảng tham số là được rồi.
Nhưng chỗ thì có 1 tham số, chỗ thì có 2 tham số, nó không đồng nhất nên nhiều lúc em cũng phải tách riêng ạ, còn khi làm cái nào tương đồng nhau cùng tham số thì em gọi chung, nhưng nhiều lúc viết ra xong không nhớ chỗ nào có cùng tham số nên lại phải viết tiếp 1 cái mới ạ
ongke0711 Đã viết:
- Tạo Connection: nên viết một cái hàm tạo Connection riêng rồi gọi, chứ mỗi sub, mỗi hàm lại viết lại code tạo Connection làm nó rườm ra, không kế thừa, sử dụng lại được code. Tôi lại không thấy code đóng Connection sau mỗi lần thực hiện một tác vụ gì đó, không biết tôi có bỏ sót đoạn code đó không? Mỗi tác vụ em mở một connection mới, chứ không thấy đóng. Nếu vậy SQL SV sẽ phải quản lý một đống Connection tới nó đó, nếu SQL SV có thiết lập giới hạn connection thì những người sau sẽ không kết nối được.
Cái này thì đúng là em chưa biết cách viết 1 hàm kết nối sau đó lại đóng kết nối ạ, anh có thể hướng dẫn hoặc demo giúp em chỗ này được không ạ? nên em vẫn làm thủ công thế ạ.
Và có 1 điều nữa là cái rst trong đó ý ạ, khi gán giá trị vị dụ là
Em biết chỗ này để giải phóng nhưng nhiều chỗ em cần bấm vào 1 dòng nào đó của subform để lấy giá trị thì lúc này rst của em bị đóng nó bị lỗi em không thao tác được nữa ạ.Mã:Set subform.form.recordset=rst
rst.close
set rst=nothing
Cảm ơn anh đã góp ý để em có thể thay đổi cho nó phù hợp và hoàn thiện hơn ạ. -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
ongke0711 > 15-09-20, 01:42 PM
* Nói về Connection:
Tôi chia sẻ đoạn code mở đóng Connection để gọi trong các Sub/Function.
Hiện tại mỗi thủ tục em đều dùng code mở connection riêng nhưng lại không có bẫy lỗi việc kết nối có thành công hay không trước khi chạy tới các code kế tiếp thao tác dữ liệu.
Mã PHP:Option Explicit
Private Const adUseClient As Long = 3
Private Const adLockReadOnly As Long = 1
Private Const adStateOpen As Long = 1
Private Const adCmdStoredProc As Long = 4
Private Const adParamOutput As Long = 2
Private Const adOpenDynamic As Long = 2
Private Const adOpenStatic As Long = 3
Public Enum DBaseType
dbSQLServer = 1
dbAccess = 2
End Enum
Public mServerName As String
Public mDatabaseName As String
Public mUserName As String
Public mPassword As String
Public mConnectionString As String
Global oConn As Object
Function ConnectDB(Optional ByVal DBType As DBaseType = 1) As Boolean
On Error GoTo ConnectDBError
Dim strConnectSQL As String
Dim blnNewConnect As Boolean
Dim blnReturn As Boolean
blnReturn = True
blnNewConnect = True
Call BuildConnectionString(DBType)
If Not oConn Is Nothing Then 'Kiem tra xem có Connection chua, có rôi thi dung ket noi cu
If oConn.State And adStateOpen = adStateOpen Then '-> Da có ket noi
blnNewConnect = False
End If
End If
If blnNewConnect Then
Set oConn = New ADODB.Connection
oConn.ConnectionString = mConnectionString
oConn.Open
End If
ConnectDBResume:
ConnectDB = blnReturn
Exit Function
ConnectDBError:
blnReturn = False
Select Case Err.Number
Case -2147467259
MsgBox "Thong so ket noi Database khong dúng.", vbCritical, "Thông báo"
Case -2147217843
MsgBox "Sai ten dang nhap hoac mat khau.", vbCritical, "Thông báo"
Case Else
MsgBox "Có loi phat sinh." & vbCrLf & "Ma loi: " & Err.Number _
& "Noi dung: " & Err.Description, vbCritical, "ConnectDB"
End Select
Resume ConnectDBResume
End Function
Sub CloseConnectDB()
On Error GoTo HandleError
'Dong ket noi toi Database
If Not oConn Is Nothing Then
If (oConn.State And adStateOpen) = adStateOpen Then
oConn.Close
Set oConn = Nothing
End If
End If
Exit Sub
HandleError:
If Err > 0 Then
MsgBox "Có loi phat sinh." & vbCrLf & "Ma loi: " & Err.Number _
& "Noi dung: " & Err.Description, vbCritical, "CloseConnectDB"
Exit Sub
End If
End Sub
Sub BuildConnectionString(ByVal DataBaseType As DBaseType)
Select Case DataBaseType
Case 1 'SQLServer
If Len(mUserName) Then 'Có Username/Pass dang nhap
mConnectionString = "Network Library=DBMSSOCN;" & _
"PROVIDER=SQLOLEDB;DATA SOURCE=" & mServerName & _
";INITIAL CATALOG=" & mDatabaseName & _
";User Id=" & mUserName & ";Password=" & mPassword & ";"
Else
'"Provider=SQLNCLI10;"
mConnectionString = "Network Library=DBMSSOCN;Provider=SQLOLEDB;" & _
"Server=" & mServerName & ";" & _
"Database=" & mDatabaseName & ";" & _
"Trusted_Connection=Yes;"
End If
Case 2 'MS Access
If Len(mPassword) Then
mConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & mDatabaseName & ";" & _
"Jet OLEDB:Database Password=" & mPassword & ";"
Else
mConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & mDatabaseName & _
";Persist Security Info=False;"
End If
Case Else
'Not yet set
End Select
End Sub
* Nói về chạy các Stored procedure:
Hàm dưới đây dùng để chạy tất cả các SP mà em thiết kế, không cần phải mỗi SP lại viết cái hàm riêng. Anh thấy em viết cả chục hàm chạy SP.
Mã PHP:Public Function ExecuteSPWithADOCommand(StoredProcName As String, _
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
Set ExecuteSPWithADOCommand = .Execute
End With
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
Em xem file bên dưới. Anh đã sửa và áp dụng các hàm trên vào file của em ở 2 form:
- f_HOME: sự kiện Form_Load - demo chạy stored proc có 1 tham số
- f_TaoDanhMucTS: nút btnSaveCoSo - sp có 3 tham số.
Link demo: https://drive.google.com/file/d/1Wv0VGq2...sp=sharing -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 15-09-20, 05:28 PM
Vâng em cảm ơn anh nhiều ạ.
Để em học theo ngâm cứu và học theo ạ.
Đúng là cái SP cứ sinh ra cái gì là e phải tạo riêng 1 cái em cũng thấy mệt ạ @@! -
RE: Test phần mềm QUẢN LÝ TÀI SẢN
AnNguyen > 15-09-20, 06:25 PM
(15-09-20, 01:42 PM)ongke0711 Đã viết: Hàm dưới đây dùng để chạy tất cả các SP mà em thiết kế, không cần phải mỗi SP lại viết cái hàm riêng. Anh thấy em viết cả chục hàm chạy SP.
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 ạ?