Sử dụng hàm Dlookup tra Đơn giá từ bảng

ngocchung89

Member
Hội viên mới
Tại chỗ mà txtDonGia mình không phải đánh mà mình muốn là sau khi chọn Mã hàng, thì nó tra từ bảng DMH(Danh mục hàng) nó sẽ cho ra Đơn giá, chứ nhiều khi gõ Đơn giá nó không chính xác.

anh.jpg


Mình làm như thế này trong Control Soure của txtDon giá mà nó báo lỗi:
=DLookUp([DonGia],[DMH],[DonGia]=[txtMaHang].[Value])

http://www.mediafire.com/file/wajdhyjlclh/XDCSDL In hoa don.mdb
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Tại chỗ mà txtDonGia mình không phải đánh mà mình muốn là sau khi chọn Mã hàng, thì nó tra từ bảng DMH(Danh mục hàng) nó sẽ cho ra Đơn giá, chứ nhiều khi gõ Đơn giá nó không chính xác.

anh.jpg


Mình làm như thế này trong Control Soure của txtDon giá mà nó báo lỗi:
=DLookUp([DonGia],[DMH],[DonGia]=[txtMaHang].[Value])

http://www.mediafire.com/file/wajdhyjlclh/XDCSDL In hoa don.mdb

Sửa lại như sau:

=DLookUp("[DonGia]","[DMH]","[DonGia]=" & [txtMaHang].[Value])
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Tại chỗ mà txtDonGia mình không phải đánh mà mình muốn là sau khi chọn Mã hàng, thì nó tra từ bảng DMH(Danh mục hàng) nó sẽ cho ra Đơn giá, chứ nhiều khi gõ Đơn giá nó không chính xác.

anh.jpg


Mình làm như thế này trong Control Soure của txtDon giá mà nó báo lỗi:
=DLookUp([DonGia],[DMH],[DonGia]=[txtMaHang].[Value])

http://www.mediafire.com/file/wajdhyjlclh/XDCSDL In hoa don.mdb

1/ Bạn sử dụng sai cú pháp hàm Dllokup
2/ Nên sử dụng hết tính năng của combobox mahang trong trường hợp này
- Column Count=4
- Column Widths =0.9";0";0";1.1"
- List Width=2"
3/ Bắt sự kiện AfterUpdate của combo mahang
DonGia=txtMahang.Column(3)
4/ Bắt sự kiện AfterUpdate của DonGia
ThanhTien=DonGia*SoLuong
5/ Bắt sự kiện AfterUpdate của Soluong
ThanhTien=DonGia*SoLuong

Chúc vui
Thân
 

Đính kèm

  • XDCSDL In hoa don.rar
    38.9 KB · Lượt xem: 688
Sửa lần cuối:
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

1/ Bạn sử dụng sai cú pháp hàm Dllokup
2/ Nên sử dụng hết tính năng của combobox mahang trong trường hợp này
- Column Count=4
- Column Widths =0.9";0";0";1.1"
- List Width=2"
3/ Bắt sự kiện AfterUpdate của combo mahang
DonGia=txtMahang.Column(3)
4/ Bắt sự kiện AfterUpdate của DonGia
ThanhTien=DonGia*SoLuong
5/ Bắt sự kiện AfterUpdate của Soluong
ThanhTien=DonGia*SoLuong

Chúc vui
Thân
bổ sung thêm phần bác xuân thành viết:

trong cột Mã Hàng bạn viết như sau

select Mahang, tenhang, DonGia,dvt) from DMH;
đặt thuộc lostforcus cho ô mã hàng như sau
me.dongia=mahang.column(2)
khi bạn chọn mã hàng xong máy sẽ tự điền đơn giá cho bạn
ko lên sử dụng DLookup, vì tính phức tạp và thao tác sử lý số liệu hơi chậm, nếu bảng danh mục của bạn nhiều mã hàng.
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

bổ sung thêm phần bác xuân thành viết:

trong cột Mã Hàng bạn viết như sau

select Mahang, tenhang, DonGia,dvt) from DMH;
đặt thuộc lostforcus cho ô mã hàng như sau
me.dongia=mahang.column(2)
khi bạn chọn mã hàng xong máy sẽ tự điền đơn giá cho bạn
ko lên sử dụng DLookup, vì tính phức tạp và thao tác sử lý số liệu hơi chậm, nếu bảng danh mục của bạn nhiều mã hàng.

1/ Đã chọn nguyên cả table làm dữ liệu nguồn nên chọn 4 cột như tôi đã làm. Nếu dùng query làm dữ liệu nguồn cho combo thì làm như bạn đã nói
2/ Bạn xem lại cái gạch đỏ ý. Dùng Lostforcus không đúng đâu

Thân
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

dùng lostforcus, hoặc afferupdate hoặc onchange, đều được hết, mục đích là sau khi con trỏ chuột ra khỏi hô mã hàng thì lập tức giá trị được điền luôn vào ô dvt, và giá bán
tuy nhiên khi bạn làm bạn lưu ý ở Property của mã hàng, tại mục bound column bạn phải điền là 4 - số lượng field bạn đã chọn, khi đó các column bạn gán nó mới hiểu
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

dùng lostforcus, hoặc afferupdate hoặc onchange, đều được hết, mục đích là sau khi con trỏ chuột ra khỏi hô mã hàng thì lập tức giá trị được điền luôn vào ô dvt, và giá bán
tuy nhiên khi bạn làm bạn lưu ý ở Property của mã hàng, tại mục bound column bạn phải điền là 4 - số lượng field bạn đã chọn, khi đó các column bạn gán nó mới hiểu

Xin lỗi vì xem không kỹ
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

dùng lostforcus, hoặc afferupdate hoặc onchange, đều được hết, mục đích là sau khi con trỏ chuột ra khỏi hô mã hàng thì lập tức giá trị được điền luôn vào ô dvt, và giá bán
tuy nhiên khi bạn làm bạn lưu ý ở Property của mã hàng, tại mục bound column bạn phải điền là 4 - số lượng field bạn đã chọn, khi đó các column bạn gán nó mới hiểu

Nếu xét ở một khía cạnh nào đó thì bẫy các sự kiện trên đều được.

Tuy nhiên nếu xét kỹ các sự kiện thì nó có khác nhau đôi chút.

Nếu bẫy LostFocus thì sẽ có khả năng là người sử dụng không chọn hoặc không nhập gì vào trong control được bẫy sự kiện thì lúc đó sẽ ra sao? Lúc đó giá trị trong control là Null, và như thế cái statement trong thủ tục sẽ có khả năng trả về giá trị không thích hợp.

Nếu bẫy OnChange thì cứ mỗi khi có sự thay đổi giá trị trong control thì statement trong thủ tục sẽ thực thi! Gõ vào bao nhiêu lần thì chạy thủ tục bấy nhiêu lần.

Cho nên bẫy AfterUpdate là thích hợp nhất, vì chỉ khi nào giá trị trong control thật sự thay đổi thì mới co chạy statement trong thủ tục.
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Nếu xét ở một khía cạnh nào đó thì bẫy các sự kiện trên đều được.

Tuy nhiên nếu xét kỹ các sự kiện thì nó có khác nhau đôi chút.

Nếu bẫy LostFocus thì sẽ có khả năng là người sử dụng không chọn hoặc không nhập gì vào trong control được bẫy sự kiện thì lúc đó sẽ ra sao? Lúc đó giá trị trong control là Null, và như thế cái statement trong thủ tục sẽ có khả năng trả về giá trị không thích hợp.

Nếu bẫy OnChange thì cứ mỗi khi có sự thay đổi giá trị trong control thì statement trong thủ tục sẽ thực thi! Gõ vào bao nhiêu lần thì chạy thủ tục bấy nhiêu lần.

Cho nên bẫy AfterUpdate là thích hợp nhất, vì chỉ khi nào giá trị trong control thật sự thay đổi thì mới co chạy statement trong thủ tục.

Em vẫn thường dùng bẫy AfterUpdate :runcamcap:
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Dùng After là chuẩn nhất .
Bác Phat ơi cho em hỏi chút trong trường hợp của em. Để chặn tình huống có 2 người cùng sửa 1 bản ghi sẽ xuất hiện thông báo của Access, em cho vào Onchange để xử lý .
Đầu tiên nó kiểm tra cái mã ID này có trong bảng Log chưa nếu chưa thì sẽ chạy 1 Query append cái mã ID và tên người đó vào 1 table Log ,nếu có rồi thì sẽ undo và khóa form không cho update bản ghi đó.
Cho vào Onchange để bắt ngay khi người dùng nhập chứ không để họ nhập hết cái Textbox đó rồi mới báo.
Bác có cách xử lý nào hay hơn không ,vì Onchange đúng như bác nói nó sẽ chạy bấy nhiêu lần tương ứng với số lần gõ. Mà mục đích của em chỉ cần bắt khi ký tự đầu tiên được nhập vào textbox thôi.
Thanks
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Dùng After là chuẩn nhất .
Bác Phat ơi cho em hỏi chút trong trường hợp của em. Để chặn tình huống có 2 người cùng sửa 1 bản ghi sẽ xuất hiện thông báo của Access, em cho vào Onchange để xử lý .
Đầu tiên nó kiểm tra cái mã ID này có trong bảng Log chưa nếu chưa thì sẽ chạy 1 Query append cái mã ID và tên người đó vào 1 table Log ,nếu có rồi thì sẽ undo và khóa form không cho update bản ghi đó.
Cho vào Onchange để bắt ngay khi người dùng nhập chứ không để họ nhập hết cái Textbox đó rồi mới báo.
Bác có cách xử lý nào hay hơn không ,vì Onchange đúng như bác nói nó sẽ chạy bấy nhiêu lần tương ứng với số lần gõ. Mà mục đích của em chỉ cần bắt khi ký tự đầu tiên được nhập vào textbox thôi.
Thanks

Cho cái kiểm đó vào BeforeInsert của Form.
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Cái này hình như không được bác ơi, vì hình như sự kiện BeforeInsert của Form chỉ xảy ra khi thêm bản ghi mới phải không. Còn em chỉnh sửa dữ liệu trên bản ghi đã tồn tại rồi mà.
Chứ nếu bản ghi mới thì làm sao có 2 người cùng sửa được vi nó chưa được lưu.
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Cái này hình như không được bác ơi, vì hình như sự kiện BeforeInsert của Form chỉ xảy ra khi thêm bản ghi mới phải không. Còn em chỉnh sửa dữ liệu trên bản ghi đã tồn tại rồi mà.
Chứ nếu bản ghi mới thì làm sao có 2 người cùng sửa được vi nó chưa được lưu.

Vậy thì vào thuộc tính của Database mà chỉnh. Chọn Record Lock.
Chọn cái này thì em nào vào sửa sau thì sẽ có thông báo không cho sửa.
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Dùng After là chuẩn nhất .
Bác Phat ơi cho em hỏi chút trong trường hợp của em. Để chặn tình huống có 2 người cùng sửa 1 bản ghi sẽ xuất hiện thông báo của Access, em cho vào Onchange để xử lý .
Đầu tiên nó kiểm tra cái mã ID này có trong bảng Log chưa nếu chưa thì sẽ chạy 1 Query append cái mã ID và tên người đó vào 1 table Log ,nếu có rồi thì sẽ undo và khóa form không cho update bản ghi đó.
Cho vào Onchange để bắt ngay khi người dùng nhập chứ không để họ nhập hết cái Textbox đó rồi mới báo.
Bác có cách xử lý nào hay hơn không ,vì Onchange đúng như bác nói nó sẽ chạy bấy nhiêu lần tương ứng với số lần gõ. Mà mục đích của em chỉ cần bắt khi ký tự đầu tiên được nhập vào textbox thôi.
Thanks

Khai báo biến flag kiểu boolean, gán thuộc tính này = false trong sự kiện Form_SelectionChange.

Khi bạn kích hoạt sự kiện change:
If flag = false Then
kiểm tra record lock, nếu có người đang sửa thì cảnh báo.
flag = true
End If.

Như vậy lần gõ thứ 2 flag đang mang giá trị true nên sẽ ko cần kiểm tra nữa, khi bạn chọn record khác thì kích hoạt sự kiện SelectionChange làm cho biến flag = false trở lại.
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Thanks 2 bác lắm lắm !
@ bác Phật : Cách của bác cũng hay nhưng hơi quân chủ chuyên chế một chút, bé nào nhanh bé ấy thắng. Các bé sau cứ gọi là ngồi ngáp vặt với nhau nếu bé đầu tiên edit xong mà không chịu next bản ghi khác.
@ bác Chip2006 : Ý tưởng của bác tuyệt,khá hay nhưng có điều cái sự kiện Form_SelectionChange không xảy ra khi next bản ghi đâu. Em đọc phần help như sau :
Occurs whenever the user makes a new selection in a PivotChart view or PivotTable view. . Vậy là trong Form View sự kiện này không xảy ra rùi.
Vậy em cho vào sự kiện Affter Update của Form được không bác .
 
Sửa lần cuối:
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Thanks 2 bác lắm lắm !
@ bác Chip2006 : Ý tưởng của bác tuyệt,khá hay nhưng có điều cái sự kiện Form_SelectionChange không xảy ra khi next bản ghi đâu. Em đọc phần help như sau :
Occurs whenever the user makes a new selection in a PivotChart view or PivotTable view. . Vậy là trong Form View sự kiện này không xảy ra rùi.

Vậy ah`??? Hem để ý, vậy thì kiếm cái sự kiện nào mà nó kiểm soát được việc Change rerord rùi bốc đoạn code bỏ vào. :xinloinhe:

Thử On Current xem sao
 
Sửa lần cuối:
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Thanks 2 bác lắm lắm !
@ bác Phật : Cách của bác cũng hay nhưng hơi quân chủ chuyên chế một chút, bé nào nhanh bé ấy thắng. Các bé sau cứ gọi là ngồi ngáp vặt với nhau nếu bé đầu tiên edit xong mà không chịu next bản ghi khác.
@ bác Chip2006 : Ý tưởng của bác tuyệt,khá hay nhưng có điều cái sự kiện Form_SelectionChange không xảy ra khi next bản ghi đâu. Em đọc phần help như sau :
Occurs whenever the user makes a new selection in a PivotChart view or PivotTable view. . Vậy là trong Form View sự kiện này không xảy ra rùi.
Vậy em cho vào sự kiện Affter Update của Form được không bác .

Vậy ah`??? Hem để ý, vậy thì kiếm cái sự kiện nào mà nó kiểm soát được việc Change rerord rùi bốc đoạn code bỏ vào. :xinloinhe:

Thử On Current xem sao

Đọc kỹ cái On Dirty của Form đi rồi sẽ biết.
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Thanks 2 bác lắm lắm !
@ bác Phật : Cách của bác cũng hay nhưng hơi quân chủ chuyên chế một chút, bé nào nhanh bé ấy thắng. Các bé sau cứ gọi là ngồi ngáp vặt với nhau nếu bé đầu tiên edit xong mà không chịu next bản ghi khác.
.

Vậy là phải rồi. Sao biết bé ấy sửa xong hay chưa? Phải gọi điện hoặc Yahoo!chat mà nhắc nhở thôi.

Bạn có thể làm 1 cái ToggleControl để bé ấy click vào khi bắt đầu sửa và click vào để xác nhận đã sửa xong (sau khi update thì gán lại thuộc tính AllowEdits - vì Recordset sẽ tự động lock hay unlock)
 
Ðề: Sử dụng hàm Dlookup tra Đơn giá từ bảng

Vậy là phải rồi. Sao biết bé ấy sửa xong hay chưa? Phải gọi điện hoặc Yahoo!chat mà nhắc nhở thôi.

Bạn có thể làm 1 cái ToggleControl để bé ấy click vào khi bắt đầu sửa và click vào để xác nhận đã sửa xong (sau khi update thì gán lại thuộc tính AllowEdits - vì Recordset sẽ tự động lock hay unlock)

Thanks bạn nhưng mình muốn auto cho nó tiện, chứ dùng nút nhấn thì đôi khi người dùng họ quên mất thì sao. 1 phần mềm cho 10 bé dùng chẳng hạn,thể nào chả có 1 bé quên,mà nếu có 1 bé quên thì sẽ có 1 cái thông báo bằng tiếng Tây xuất hiện của Access, bé nào hiểu được.
:xinloinhe:
-----------------------------------------------------------------------------------------
Đọc kỹ cái On Dirty của Form đi rồi sẽ biết.

Lại phải thanks bác lần nữa :xinloinhe:
Trước nay em không để ý đến cái này,vì nghĩ nó tên là Dirty ,nên nghĩ nó chỉ xảy ra khi Form có lỗi gì đó.
Nay thấy dùng nó là tối ưu nhất cho vấn đề này của em.
:imlanglun:
 
Sửa lần cuối:

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Kỹ thuật giải trình thanh tra BHXH

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top