Đá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.
#11
Cảm ơn XT và MTNQ nhiều nhé !
1. Hiện trên subform có nguồn tblXuathangban_Chitiet_Tam của mình mỗi mặt hàng chỉ có 1 mà thôi, nên không cần phải sum làm gì (Nếu nhập trùng thì được cộng dồn trong thủ tục After_Update rồi.).
2. Thủ tục Before_Update này mục đích là: Lấy số lượng đang bán ở Subform (Đang nhập) so sánh với số lượng tồn kho (Danh sách hàng hóa) để đưa ra cảnh báo !
Trên subform có thể có nhiều mặt hàng khác nhau nên không thể dùng điều kiện: If rs!Soluongban <= Me.txtSoluongban .. hoặc (If rs!Soluongban <= Form!subform!txtSoluongban ...) được.

Trước đây khi lập trình trực tiếp trên data thì mình dùng code: if Dlookup("[Soluongton]","tblhanghoa","[Mahang]='" & me.cboMahangban & "'") <= Dlookup("[Soluongban]","tblXuathangban_Chitiet_Tam","[Mahang]='" & me.cboMahangban & "'") để so sánh thì chạy OK.
Nhưng nay "mày mò" sang ADODB như bạn "XT" giới thiệu thì mình ko biết cách nào so sánh nên mới có cách so sánh amater như trên.
Ko biết có cách nào ổn định hơn ko, nhờ các ACE chỉ giúp. Cảm ơn nhiều !
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
#12
(24-11-13, 11:28 AM)tmtien261 Đã viết: Cảm ơn XT và MTNQ nhiều nhé !
1. Hiện trên subform có nguồn tblXuathangban_Chitiet_Tam của mình mỗi mặt hàng chỉ có 1 mà thôi, nên không cần phải sum làm gì (Nếu nhập trùng thì được cộng dồn trong thủ tục After_Update rồi.).
2. Thủ tục Before_Update này mục đích là: Lấy số lượng đang bán ở Subform (Đang nhập) so sánh với số lượng tồn kho (Danh sách hàng hóa) để đưa ra cảnh báo !
Trên subform có thể có nhiều mặt hàng khác nhau nên không thể dùng điều kiện: If rs!Soluongban <= Me.txtSoluongban .. hoặc (If rs!Soluongban <= Form!subform!txtSoluongban ...) được.

Trước đây khi lập trình trực tiếp trên data thì mình dùng code: if Dlookup("[Soluongton]","tblhanghoa","[Mahang]='" & me.cboMahangban & "'") <= Dlookup("[Soluongban]","tblXuathangban_Chitiet_Tam","[Mahang]='" & me.cboMahangban & "'") để so sánh thì chạy OK.
Nhưng nay "mày mò" sang ADODB như bạn "XT" giới thiệu thì mình ko biết cách nào so sánh nên mới có cách so sánh amater như trên.
Ko biết có cách nào ổn định hơn ko, nhờ các ACE chỉ giúp. Cảm ơn nhiều !

Tại sao không được nhỉ? Bạn cứ tiếp tục suy nghĩ đi. Có nhiều cách, cách đơn giản nhất(nếu bạn không so sánh được ở subform) là tạo một textbox ở mainform, cứ mỗi lần cập nhật txtSoluong ỡ sub thì gán giá trị này vào txtSL ở main rồi so sánh chứ có sao đâu?
Cách tốt nhất là so sánh trực tiếp
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
#13
Đúng là cách tốt nhất nên so sánh trực tiếp. Như thế đỡ phải Reconnection nguồn dữ liệu gốc, mất thời gian.
Mình cũng đã đã tạo 1 txtSoluongbanX trên Subform để gán giá trị. Xong như thế thì mỗi lần Update cũng phải lấy giá trị từ subform lên Mainform. Tức cũng phải chạy SQL lấy dữ liệu trong table ở Subform. Chi bằng chạy thẳng luôn.
XT có thể "Chỉ dẫn" mình cách lấy trực tiếp dữ liệu từ sub để so sánh không ? Cảm ơn nhiều !
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
#14
Mình nghĩ mãi không ra được cách nào để so sánh trực tiếp số liệu đã bán trên Subform được.
Hình thiết kế Form của mình như sau:
[Hình: 3M6PLCJtBKG4c8epMg-4t-79sz30mfYfmVUz048C...-h160-p-no]
Hình
1. Khi nhập hàng vào cboMahangban thì sẽ kiểm tra xem loại hàng đó với loại hàng đã nhập ở Subform. Nếu Loại hàng đã nhập > số hàng có ở danh sách tồn kho (Có thể dùng me.cboMahangban.column(5)) thì thông báo hết hàng !
2. Mình không tài nào nghĩ ra cách lấy Soluongban trong subform lên để so sánh với cboMahangban ngoài cách phải chạy SQL như đã nêu.

Các Pro chỉ giáo giúp với, cảm ơn nhiều !
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
#15
1/ Textbox ở subform : txtSoluongban
2/ Tên subform(nhớ là tên đặt trong Propertysheet của subform nhé) : SubChiTiet
3/ Textbox ở mainform : txtSoLuong, ControlSource : =[SubChiTiet].[Form]!txtSoLuongBan

Bài này nói nhiều trên 4rum rồi 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
#16
-Thường thì đi từ Main xuống Sub chứ ko đi ngược từ sub lên main
tức là sau khi chọn mã hàng thì các thông tin của mã hàng đó sẽ được cập nhật xuống sub hàng bán (cập nhật trực tiếp chứ không nên cập nhật vào table rồi mới lấy từ table lên sub) sau đó mới xuống sub nhập số lượng bán
-Như vậy trong sự kiện của cboMahangban chỉ nện kiểm tra hàng còn hay hết thui, giao cái việc kiểm tra số bán có vượt quá số tồn hay không cho BeforUpdate của txtSoluongban có phải dễ hơn ko

Có một điều mình phân vân là bạn nói "subform có nguồn tblXuathangban_Chitiet_Tam " và soluongban lại "cộng dồn trong thủ tục After_Update" theo mỗi mã hàng thì làm sao ràng buộc với khách hàng được nhỉ, vì mỗi khách hàng có thể có nhiều đơn hàng và mỗi đơn hàng phải có soluongban mỗi mặt hàng khác nhau chứ 027
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
#17
cboMaHangban và txtSoluongban nằm chung trong subform đó. Mục đích để chọn "bán" được nhiều hàng hơn
Thâ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
#18
Cảm ơn XT và MTNQ nhiều, xong 2 bạn vẫn chưa hiểu hết ý của mình. Mình trình bày cụ thể thế này nhé !
Như hình trên.
1. Mình có MaiForm bán hàng có các thông tin chi tiết:
- Thông tin về khách hàng: Mã, tên, địa chỉ, Điện thoại.
- Thông tin phiếu xuất: Số phiếu xuất, ngày xuất, người xuất, Tiền hàng, Tiền chiết khấu, Tiền khách trả, Tiền còn nợ, Tiền thối lại.
- cboMahangban (Mã hàng bán).
2. Subform có: Stt, mã hàng, tên hàng, ĐVT, số lượng bán, đơn giá bán, tiền chiết khấu, thành tiền phiếu.

- Khi quét lần 1 thông tin mã vạch đưa vào cboMahangban, nếu có mặt hàng đó, số lượng tồn còn thì cập nhật vào subform (Update vào table rồi mới Load lên subform (Số lượng bán mặt định là 1), mình ko biết Up thẳng vào bằng cách nào "MatTroiNguQuen" chỉ giúp với.)
- Khi quét lần 2: Nếu mã hàng đó đã có ở SubForm thì được cộng dồn lại (Tức 1+1). Nếu trong sub chưa có mà trong cboMahangban có, SLton còn thì thêm mới vào subform (Có thể nhập trực tiếp soluongban vào subform) và số tiền hàng, ... sẽ được lấy lên MainForm vào các txtbox tương ứng (Mình ko biết có cách nào lấy số tiền lên Mainform thuận lợi hơn không !).
- Nếu số lượng tồn <= số lượng bán (ở subform) thì sẽ thông báo hết hàng. (Mình đang vướng thủ tục kiểm tra điều kiện này !)
- Cứ như thế .. nên mới giao việc Cộng dồn cho After_Update của cboMahangban. Còn Before_Update kiểm tra số lượng tồn trong danh sách với số lượng đang xuất bán ở subform.
- tblXuathangban_Chitiet_Tam chỉ là table tạm khi xuất hàng bán cho 1 khách hàng. Sau khi lưu, cấp phiếu mới thì xóa dữ liệu ở tbl này nên k ảnh hưởng gì đến nhiều khách hàng ...
- Với cách làm như trên, theo như XT "Hướng dẫn" mình tạo thêm txtSoluongban trên Mainform lấy nguồn từ subform, mình không hiểu làm sao txtSoluongban có thể lấy được số lượng bán (Đang bán) trong Subform tương ứng với Mã hàng đang quét ?
Vì khi quét mặt hàng a rồi b, rồi c rồi có khi quay lại a, c chẳng hạn ... thì txtSoluongban trên Mainform làm sao hiểu được nếu không có điều kiện đính kèm như Dloopup chẳn hạn !
Mình đã thử mọi cách như bạn XT"Hướng dẫn" nhưng vẫn No OK. Các ACE có thể chỉ rõ hơn cho mình được không ? ADO thật phức tạp !
Cảm ơn nhiều !
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
#19
À thì ra là vậy
Bạn thử cách sau xem nhé:

Mã:
Private Sub cboMahangban_AfterUpdate()
    DoCmd.GoToControl "[Subform]"
    Me![SubForm].[Form]![txtMahang].SetFocus
    DoCmd.GoToRecord , , acFirst
    
    If IsNull(Me![SubForm].[Form]![txtMahang]) Then
        ThemMahangban
    Else
        Do Until IsNull(Me![SubForm].[Form]![txtMahang]) = True
          
            If Me![SubForm].[Form]![txtMahang] = Me.cboMahangban.Column(0) Then
                 if  Me![SubForm].[Form]![txtSoluongban]  <  rs!Soluongton then
                      Me![SubForm].[Form]![txtSoluongban] = Me![SubForm].[Form]![txtSoluongban] + 1
                Else
                      MsgBox "het hang "
                End If
                
                Exit Sub
            Else
                DoCmd.GoToRecord , , acNext
            End If
        Loop
                DoCmd.GoToRecord , , acNewRec
                ThemMahangban
     End If
    DoCmd.GoToControl "[cboMahangban]"
    Me!cboMahangban.SetFocus
End Sub

Không nên ngắt kết nối ở cboMahangban_BeforeUpdate và Set rs = Nothing vì ta còn tiếp tục sử dụng nó ở sự kiện này
Mã:
Sub ThemMahangban()

        If Not rs.EOF Then
             Me![SubForm].[Form]![txtMahang] = rs.Fields("Mahang")
            Me![SubForm].[Form]![txtTenhang] = rs.Fields("Tenhang")
           ...
        Else
        MsgBox "ma hang nay chua co"
    End If
        rs.CLOSE
        Set rs = Nothing
    .....
End Sub

Với rs là biến đối tượng (ADODB.Recordset) khai báo ở đấu trang code và dùng chung cho các thủ tục trong form
Bạn tùy biến nhé! 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
#20
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 !
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


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Help] Cập nhật combobox 2 từ combobox 1 (dữ liệu ở nhiều bảng) votinh.tq 6 199 22-11-16, 11:34 PM
Bài mới nhất: votinh.tq
  Lọc có điều kiện ở listbox phiacuoiconduong 2 91 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 355 12-10-16, 01:01 AM
Bài mới nhất: toancvp
  Lọc theo điều kiện trong listbox Ranju 3 177 06-10-16, 05:26 PM
Bài mới nhất: Ranju

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ơ