Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Lỗi khi kiểm tra điều kiện trong BeforUpdate bằng ADODB.
#21
1/ Không kiểm tra bằng Event BeforUpdate của cboMahangban mà kiểm tra qua Event AfterUpdate của txtSoluongban
2/ Nguyên tắc : Sau khi cập nhật txtSoluongban thì
2.1/ MainForm cập nhật số lượng bán vào txtSoluong
2.2/ Kiểm tra txtSoluong với số lượng tồn của cboMahangBan. Nếu txtSoLuong>Số lượng tồn thì ra cảnh báo và edit txtSoluongban = số lượng tồn
.....

Bạn thử theo hướng này giải quyết xem sao
Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên , Noname
#22
Đây là một đoạn code kiểm tra trực tiép. Bạn tham khảo nhé

Mã PHP:
Private Sub SoLuong_AfterUpdate()
    
Dim rs As ADODB.Recordset
    Set rs 
= New ADODB.Recordset
    rs
.ActiveConnection CurrentProject.Connection
    rs
.Open "tblHangHoaTam", , adOpenKeysetadLockOptimisticadCmdTable
    rs
.Find ("MaHang = '" MaHangX "'")
    If 
Me.SoLuong rs.Fields(4Then
        MsgBox 
"So Luong Ton Khong Du De Ban", , "Thong Bao"
        
Me.SoLuong rs.Fields(4)
    
End If
    
Me.ThanhTien Me.SoLuong Me.DonGia
    rs
.Close
End Sub 

Trong đó :
1/ tblHangHoaTam là table gồm MaHang, TenHang, DVT, DonGiaBan, SoLuongTon và làm RecordSource cho SubForm
2/ MaHangX là tên của textbox MaHang ở SubForm
3/ Đoạn code trên viết trong SubForm

Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên
#23
(25-11-13, 11:08 AM)tmtien261 Đã viết: Code của bạn ko chạy được bạn à.
1. Nhập mã hàng đầu tiên thì báo lỗi dòng: Me![SubForm].[Form]![txtMahang].SetFocus
2. Nếu bỏ dòng code này thì nhập lần đầu tiên là OK.
3. Nhập lần thứ 2:
- Nếu mã hàng đã có thì báo lỗi dòng: DoCmd.GoToRecord , , acNext (Lỗi 2105: You can't goto specified record. Bấm End thì số lượng vẫn được cộng vào);
- Nếu mã hàng chưa có thì báo lỗi dòng: DoCmd.GoToRecord , , acNewRec (Lỗi 2105) và không nhập được.

À bạn MTBQ à: Thủ tục After_Update thì mình là viết chạy OK rồi. Nhưng ở Before_Update, thì ngoài cách mình đã nói, còn cách so sánh số lượng tồn trong danh sách tồn kho với số lượng bán trực tiếp trên subform thì mình ko sao làm được.
Bạn có thể chỉ giúp mình code so sánh được không ? Cảm ơn nhiều !
Mình mới tải file của bạn từ một topic khác (file cũ) thì thấy:
Me![frmXuathangban_Chitiet].[Form]![Mahang] bạn set Enabled là No nên không nhận Focus
frmXuathangban_Chitiet Allow Additions là No nên code ko chạy dc

Theo như cách của bạn thì hình như SoLuong_AfterUpdate cũng không sử dụng dc (dùng On Change thì dc)

Mình có ý tưởng như sau đưa ra để tham khảo :

Bê cái Before_Update sang After_Update , nếu Ok thì Update, ngược lại thì Exit Sub
Mã PHP:
Private Sub cboMahangban_AfterUpdate()
        
    If 
KiemtraSoluong False Then
       
Exit Sub
    
Else      
    
' Code cua ban
    End If
End Sub 

Mã PHP:
Function KiemtraSoluong() As Boolean
On Error 
GoTo KiemtraSoluong_Err
    KiemtraSoluong 
True
    
    Dim StrMahang  
As String
    Dim IngSoluongton 
As Integer

    Call OpenMyConnection
        Dim rs 
As ADODB.Recordset
        Set rs 
= New ADODB.Recordset
    With rs
        Set 
.ActiveConnection MyConn
        
.Source "SELECT Donvitinh, Soluongton FROM tblHanghoa where Mahang='" Me.cboMahangban "'"
        
.LockType adLockOptimistic
        
.CursorType adOpenKeyset
        
.Open
    End With

    
If Not rs.EOF Then
            IngSoluongton 
rs!Soluongton
            StrMahang 
Me.cboMahangban.Column(0)
    Else   
            
MsgBox "Mã hàng này chua có !"
            
KiemtraSoluong False
            
Exit Function
     
End If  
     If 
IngSoluongton <= 0 Then
                MsgBox 
"Lo?i hàng này dã h?t !"
                
KiemtraSoluong False
                
Exit Function
      Else
                If 
TimsoluongDanhap(StrMahangIngSoluongton) = "Khongduhangban" Then
                    MsgBox 
"Lo?i hàng này ch? còn l?i: " IngSoluongton " " rs!Donvitinh
                    KiemtraSoluong 
False
                    
Exit Function
                
End If
            
    
End If
    
rs.Close
    Set rs 
Nothing
KiemtraSoluong_Exit
:
    Exit Function
KiemtraSoluong_Err:
    
MsgBox Err.Description
    Resume KiemtraSoluong_Exit
End 
Function 

Mã PHP:
Function TimsoluongDanhap(StrMahang As StringIngSoluongton As Integer) As String
 
 On Error 
GoTo TimsoluongDanhap_Err
    
    DoCmd
.GoToControl "[frmXuathangban_Chitiet]"
    
    
If Not IsNull(Me![frmXuathangban_Chitiet].[Form]![Mahang]) Then
        
If Me![frmXuathangban_Chitiet].[Form]![Mahang].Enabled False Then
            Me
![frmXuathangban_Chitiet].[Form]![Mahang].Enabled True
        End 
If
        
Me![frmXuathangban_Chitiet].[Form]![Mahang].SetFocus
        DoCmd
.FindRecord StrMahang
        
If Me![frmXuathangban_Chitiet].[Form]![Mahang] = StrMahang Then
            
'MsgBox Me![frmXuathangban_Chitiet].[Form]![Soluongban]
            If Me![frmXuathangban_Chitiet].[Form]![Soluongban] >= IngSoluongton Then
                TimsoluongDanhap = "Khongduhangban"
            End If
        End If
    End If
TimsoluongDanhap_Exit:
    Exit Function
TimsoluongDanhap_Err:
    If Err.Number <> 2105 Then
        MsgBox Err.Description
    End If
    Resume TimsoluongDanhap_Exit
End Function 
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#24
Cảm ơn 2 bạn nhiều ! Mình sẽ thử theo cách của 2 bạn.
Thân chào !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#25
Sory bạn tmtien261 nhiều. Do vội nên đưa nhầm đoạn code. Đoạn code này chỉ đúng khi có tblhangHoaTam trong CSDL DataEnd. Bạn sửa lại như sau :

Mã PHP:
Private Sub SoLuong_AfterUpdate()
   
Call KetNoi
'Mo Recordset HangHoa
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.CursorType = adOpenKeyset
    rs.LockType = adLockOptimistic
    rs.Open "tblHangHoa", cnnDaTa, , , adCmdTable
'
Tim va so sanh
    rs
.Find ("MaHang = '" MaHangX "'")
    If 
Me.SoLuong rs.Fields(4Then
        MsgBox 
"So Luong Ton Khong Du De Ban", , "Thong Bao"
        
Me.SoLuong rs.Fields(4)
    
End If
    
Me.ThanhTien Me.SoLuong Me.DonGia
    rs
.Close
End Sub 

cnnDaTa được mở trong Sub KetNoi
Thành thực xin lỗi bạn tmtien261 và các bạn khác đang quan tâm tới chủ đề này
Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên
#26
Sorry! mình cũng mới sửa code vòng lặp Do....loop bài #19 và lỗi EOF bài #23

Về vấn đề kiểm tra số lượng tồn mình thấy có một cách khác cũng đưa ra để tham khảo đó là dùng tempvars collection (tempvars collection có thể chứa tối đa 255 phần tử - TempVar objects)
(tempvars sử dụng bộ nhớ tạm (Ram) nên truy xuất nhanh )

-Sử dụng tempvars để lưu các mã hàng đã bán , mỗi mã hàng là một biến với giá trị khởi tạo là 1
-Lần nhập tiếp theo kiểm tra nếu mã hàng đã có trong tempvars thì tăng giá trị của biến lên 1, nếu chưa có thì khởi tạo biến mới...
-Sau khi sử dụng (kết thúc giao dịch) ta xóa các biến trong tempvars bằng câu: TempVars.RemoveAll

Mã PHP:
Private Sub cboMahangban_AfterUpdate()
    
Dim strMahang As String
    Dim strSoluongton 
As Integer
    
If Not IsNull(Me.cboMahangban.Column(0)) Then
        strMahang 
Me.cboMahangban.Column(0)
        
strSoluongton Me.cboMahangban.Column(5)
    Else
        
MsgBox "Ma hang nay chua co"
        
Exit Sub
    End 
If
    
    If 
IsNull(TempVars.Item(strMahang)) Then
        TempVars
(strMahang).Value 1
    
Else
        If 
TempVars(strMahang).Value strSoluongton Then
            TempVars
(strMahang).Value TempVars(strMahang).Value 1
        
Else
            
MsgBox "Het hang ban"
            
Exit Sub
        End 
If
    
End If
    
'Code của bạn
End Sub 

Ta có thể kiểm tra các biến đã tạo trong TempVars bằng thủ tục sau:

Mã PHP:
Function fcShowTempVarObjects()
    For 
Each tv In TempVars
        MsgBox tv
.Name " = " CStr(tv.Value)
    
Next tv
    
'TempVars.RemoveAll
End Function 

P/s: Mình cũng tự mày mò , mới làm quen AC chưa dc 1 năm nên kinh nghiệm còn ít hơn bạn, những gì mình góp ý cũng chỉ có giá trị tham khảo, Về ADO mình cũng mù mờ lắm, có gì cùng chia sẻ nha! 015
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#27
Cảm ơn bạn đã góp ý. Mình đã làm được rồi.
1. Mình dùng giá trị trong cbo khi load cùng load form để so sánh với SQL lấy từ danh sách hàng hóa, cụ thể: Trong Before_Update
...
If me.cboMahangban.column(5) <= rs!Soluongton then ..... (5 là cột số lượng tồn trong CboMahangban).
...
2. Hiện mình đã không nhập trực tiếp được số liệu vào Subform như mong muốn. Cụ thể:
Khi đã nhập được 2 mã hàng vào subform, mình muốn nhập thêm số lượng vào 1 mã hàng nào đó, thì ở mã hàng khác cũng nhãy số lượng như ở dòng mã hàng vừa nhập. Mình đang may mò tìm cách gỡ nhưng chưa được. Bạn có cách nào ko, giúp với nhé !
Thanks !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#28
Vẫn nhắc bạn không nên tự làm khó mình
Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên
#29
Đúng như câu nói của một bạn nào đó ở trên diễn đàn này: "Lập trình là lấy cái khó về cho mình, lấy cái dễ cho người dùng". Đúng là mình đang tự làm "Khó" mình.
Mình vẫn cứ muốn "User cứ quét (Nhập các loại hàng cần bán đi) sau đó muốn sửa Số lượng của Mã hàng nào thì nhảy vào dòng của mã hàng đó mà sửa cho nhanh".
Đối với lập trình trực tiếp trên Data thì vụ này dễ xử, nhưng bằng ADO thì tít tìn tịt ... 040
"Cứ làm khó mình, hy vọng ló ra tí khôn ... khà khà !"
1 lần nữa cảm ơn XT nhiều nhiều !
Thân chào !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#30
Chế lại cách khác đi cách này rối quá
Chữ ký của tt1212 Present Nhận viết phần mềm, hỗ trợ viết phần mềm, hợp tác viết phần mềm trên nên Microsoft Access mọi phiên bản Liên hệ: Mr Đức -989276236. Email: Tantriviet.vnn@gmail.com website:http://www.tantrivietsoft.com/
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Tạo Menu dạng TreeView bằng Query (không dùng ActiveX) ongke0711 4 264 06-12-16, 09:16 PM
Bài mới nhất: toancvp
  [Help] Cập nhật combobox 2 từ combobox 1 (dữ liệu ở nhiều bảng) votinh.tq 6 208 22-11-16, 11:34 PM
Bài mới nhất: votinh.tq
  Lọc có điều kiện ở listbox phiacuoiconduong 2 95 18-11-16, 06:40 PM
Bài mới nhất: ongke0711
  [Help] Giúp đỡ về cách xóa nội dung trong một field nam8384 2 117 17-10-16, 08:43 PM
Bài mới nhất: toancvp
  [Hỏi] Sử dụng chuột giữa trong subform là report. toancvp 10 359 12-10-16, 01:01 AM
Bài mới nhất: toancvp

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ