Mỗi tuần một chuyên đề

Các câu hỏi về MS Access

  • Thread starter BachVe
  • Ngày gửi
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
Xây dựng hệ thống Quản lý hàng tồn kho

Dear NNC (":biggrin: "),
------------------
Thành viên mới thì phải đón tiếp nồng hậu chứ em. Theo anh thì chỉ cần nhẹ nhàng, tình củm thế này:
"QuangVinh193 ơi, tên bạn là Quang Vinh hay là Quẳng (xuống) Vịnh thế! Lần sau post bài tiếng Việt thì phải có dấu nghe! Đọc kỹ hướng dẫn sử dụng trước khi dùng!":banana:

Dear QuangVinh193,
-------------------
Có lẽ cần nói thêm cho bạn hiểu. MS Access (MSA) bản thân nó là một chương trình quản lý. Vì vậy sử dụng thành thạo MSA chỉ là một vấn đề nhỏ trong việc ứng dụng phần mềm này vào các lĩnh vực quản lý khác nhau.
Nói cách khác để làm việc với MSA, ngoài kỹ năng sử dụng thành thạo phần mềm này, bạn cần có những kiến thức nhất định về quản lý, kỹ năng phân tích bài toán. Tôi cho rằng để học cách làm việc với MSA không khó và không lâu mà mất nhiều thời gian nhất là công việc biến một bài toán thực tế thành cơ sở dữ liệu của MSA.
Về vấn đề kỹ thuật thì bạn khỏi lo, rất nhiều chuyên gia giỏi mà lại nhiệt tình nữa sẽ giúp bạn. Tôi chỉ có một lời khuyên với bạn nếu bạn đang bắt đầu tiếp cận với MSA, bạn hãy học cách phân tích thông tin từ các báo cáo có sẵn. Để có thông tin trên báo cáo như vậy, bạn cần bao nhiêu thông tin đầu vào. Dĩ nhiên học về cách tổ chức bảng cơ sở dữ liệu trong MSA là cần thiết và quan trọng. Kiến thức sẽ giúp bạn xây dựng một CSDL tối ưu nhất.
Thay vì tìm hiểu các xử lý của phần mềm có sãn, bạn hãy tìm hiểu MSA có thể làm được gì, làm như thế nào. Cái mà bạn nói là "đơn giản mà hay" đó chính là bài toán được giải quyết và đáp ứng yêu cầu cho bạn!
Rất mừng nếu được cùng bạn trao đổi về vấn đề này. Chúng ta sẽ bắt đầu từ cái CCGC (Chưa Có Gì Cả)!:dzo:
Lưu ý: Nếu vấn đề này tiếp tục được thảo luận, ban quản trị sẽ rời mục này thành một chuyên mục riêng!
 
Sửa lần cuối:
Khóa học Quản trị dòng tiền
S

saigonpho

Guest
21/12/05
8
0
0
tp HCM
3 câu hỏi về MS Access

1. Mình muốn khi mở 1 form (gồm có: SoBD, Ten, Ho, ...)
và khi form thì SoBD phải được gán sẵn bằng 008

Mình đã làm được, nhưng khi form được mở thay vì SoBD hiện là 008 thì nó chỉ hiện là 8 thôi. Vậy có cách nào cho nó thể hiện đầy đủ 3 chữ số là 008 ko các bạn.

2. Mình muốn hỏi về module dùng chung. Theo mình nghĩ là tất cả những hàm được viết trong module dùng chung là có thể gọi lại thoải mái ở mọi nơi trong access (ví dụ như trong form) có phải ko ?? Mình cũng đã thử tạo module dùng chung như khi gọi lại trong hàm choMaNganh_click, thì nó lại báo lỗi

3. Trong các câu lệnh iif, Dsum, ... trong phần điều kiện. ví dụ như thế này:
=Dsum("DiemThi","DSTS","SoBD = txtSoBD") (1)

=Dsum("DiemThi","DSTS"," ' " & SoBD = txtSoBD & " ' ") (2)

thì mình thấy cái nào nó cũng chạy được, nhưng mình muốn biết khi nào thì dùng câu lệnh nào và tốt nhất thì nên dùng câu lệnh nào ( 1 hay 2 )

Bạn nào có thể giúp mình ko. Mình cám ơn nhiều lắm
 
T

TrungDuong

Guest
10/1/06
24
0
0
Iraq
1. đối với 008 bạn thử dùng kiểu chuỗi xem.

2. module có nhiều hàm, nhiều thủ tục. Khi bạn viết lệnh cho form hoặc viết
thủ tục hay hàm khác bạn có thể gọi những hàm, và thủ tục mà bạn đã tạo
trước đó.

3. Câu nào cũng 20 năm vẫn chạy tốt thì câu nào cũng được.
 
Sửa lần cuối:
paulsteigel

paulsteigel

Trung cấp
13/11/05
103
0
16
48
Hoà Bình
www.sfdp.net
Mình xin trả lời thế này:
1.
saigonpho nói:
1. Mình muốn khi mở 1 form (gồm có: SoBD, Ten, Ho, ...)
và khi form thì SoBD phải được gán sẵn bằng 008

Mình đã làm được, nhưng khi form được mở thay vì SoBD hiện là 008 thì nó chỉ hiện là 8 thôi. Vậy có cách nào cho nó thể hiện đầy đủ 3 chữ số là 008 ko các bạn.
Ta so sánh 2 số 8 và 008, giá trị sẽ là giống nhau nếu cả hai đều là số vì đều có giá trị là 8 (hệ thập phân). Khi xử lý dữ liệu máy tính sẽ căn cứ vào kiểu dữ liệu để biết được giá trị, trong trường hợp này, dữ liệu có kiểu là số thì nó hiểu cả hai trường hợp là 8.
Nếu dữ liệu là chữ thì 8 và 008 sẽ khác nhau, máy tính coi dữ liệu kiểu chữ là kiểu ký tự, nếu bạn nhập vào là 8 thì sẽ là 8, nếu nhập vào là 008 thì máy tính sẽ hiểu là 008.
Vì vậy khi bạn truyền tham số bạn cần lưu ý kiểu dữ liệu của biến định truyền.
Trong trường hợp của bạn, bạn cần nói rõ SBD của bạn là kiểu số hay ký tự, nếu là kiểu số, để hiển thị được số 8 là 008, bạn phải dùng đến input mask và format (định dạng dữ liệu) - về cái này, bạn nên tìm kiếm trong forrum, có một số bài đã nói về định dạng dữ liệu rồi nhé.

2.
saigonpho nói:
2. Mình muốn hỏi về module dùng chung. Theo mình nghĩ là tất cả những hàm được viết trong module dùng chung là có thể gọi lại thoải mái ở mọi nơi trong access (ví dụ như trong form) có phải ko ?? Mình cũng đã thử tạo module dùng chung như khi gọi lại trong hàm choMaNganh_click, thì nó lại báo lỗi
Chúng ta cần phân biệt - trong một dự án VBA của access, có một số đối tượng bạn có thể quan sát thấy được khi làm việc với Project Explorer đó là:
[Module] [Form/ Report] [Classmodule]
Module là nơi chứa các hàm và thủ tục dùng chung.
Class module và form, report đóng vai trò như nhau ở cấp Project và chúng đều được coi là các module lớp (class). Với các module này, muốn dùng đến các thủ tục bên trong của nó, chúng ta phải tham chiếu đến tên forrm và thủ tục cần dùng. Tuy nhiên, cần lưu ý đến từ khoá khai báo trước các hàm và thủ tục.
Public đặc tả hàm hoặc thủ tục có thể truy nhập ở mức toàn cục trong dự án, nếu không đưa từ khoá này, thủ tục hoặc hàm sẽ mặc định được coi là public.
Private đặc tả hàm và thủ tục là nội bộ trong đối tượng Module , form, báo cáo ... nếu có từ khoá này, ta không thể truy cập chúng được.
đối với thủ tục choMaNganh_click() trong ví dụ của bạn, tôi tin rằng bạn đang có từ khoá private ở trước. Nếu muốn truy cập vào nó, bạn phải đổi từ khoá từ private sang public và khi gọi đến bạn phải tham chiếu đến tên đối tượng chứa thủ tục này.

3.
saigonpho nói:
3. Trong các câu lệnh iif, Dsum, ... trong phần điều kiện. ví dụ như thế này:
=Dsum("DiemThi","DSTS","SoBD = txtSoBD") (1)

=Dsum("DiemThi","DSTS"," ' " & SoBD = txtSoBD & " ' ") (2)

thì mình thấy cái nào nó cũng chạy được, nhưng mình muốn biết khi nào thì dùng câu lệnh nào và tốt nhất thì nên dùng câu lệnh nào ( 1 hay 2 )

Bạn nào có thể giúp mình ko. Mình cám ơn nhiều lắm
Câu nay tôi sẽ trả lời sau, vì đang có tí việc...
 
S

saigonpho

Guest
21/12/05
8
0
0
tp HCM
cám ơn paulsteigel và các bạn đã trả lời.
Mình đã tìm bài biết về input mask và thấy có 1 bài viết của paulsteigel trả lời là điền vào input mask như thề này:
"ABC-"0###;0;
bạn có thể giải thích cho mình hiểu hơn giá trị ở trên ko??? ### là gì, 0; là gì ??

Mình muốn khi lưu xuống table thì nó vẫn là 008 thì làm thế nào?? Mình thử điển vào input mask là "00"0###;0; như bạn nói thì nó hiện ra được là 008, nhưng khi lưu xuống table thỉ nó lưu là 8.
có cách nào ko. Giúp mình với, cám ơn nhiều lắm.
 
M

mysterious_girl

Guest
saigonpho nói:
bạn có thể giải thích cho mình hiểu hơn giá trị ở trên ko??? ### là gì, 0; là gì ??

#: đại diện cho một ký số không bắt buộc.
0: đại diện cho một ký số bắt buộc.

Vd:
  • Hiển thị số________ Thành_______ Định dạng
  • 1234.59 __________1234.6_______ ####.#
  • 8.9_______________8.900________#.000
  • .631______________0.6__________0.#
Để định dạng SBD bắt đầu bằng "008" bạn cũng có thể format tại table, định dạng như sau: "008"#
 
Sửa lần cuối:
paulsteigel

paulsteigel

Trung cấp
13/11/05
103
0
16
48
Hoà Bình
www.sfdp.net
Giờ tôi trả lời tiếp câu 3 hôm qua nhé:
==>Bạn có thể sử dụng hàm DSum để tính tổng nhóm giá trị của một bộ bản ghi (vùng tính). DSUM có thể dùng trong VBA (nhớ là chỉ trong VBA vì hàm này làm nội bộ của VBA), Macro, trong câu lệnh truy vấn hay điều khiển của form, báo cáo.
Dsum có 2 dạng thức -
1 dạng thức tính toán như một hàm - trả về giá trị
Cách thức viết lệnh là:
DSum([biểu thức], (vùng tính), [điều kiện])
2. Dạng thức thủ tục của một đối tượng
[Đối tượng].DSum(biểu thức, vùng tính, [điều kiện])
==> Cấu trúc iif làm việc giống như một lệnh cấu trúc if then nhưng đây là cấu trúc của VB nên có thể dùng lẫn trong VB và VBA cũng như viết trực tiếp cho điều khiển trên form.
[=Dsum("DiemThi","DSTS","SoBD = txtSoBD") ] đây là dạng bạn dùng Dsum như một hàm và thường là bạn đặt đoạn này trong phần controlsource của textbox chứ không thể viết trực tiếp để tính toán trong VBA được.
nhưng bạn có thể dùng VBA theo dạng thức
atextbox.controlsource="=Dsum('DiemThi','DSTS','SoBD = txtSoBD') "
Còn đây:
Biến số=Dsum("DiemThi","DSTS"," ' " & SoBD = txtSoBD & " ' ")
Sẽ được viết trong VBA vì bạn có thấy là SoBD và TxtSoBD sẽ đóng vai trò trả về một phép so sánh nào đó liên quan đến điều kiện. Lưu ý lúc này SOBD và TxtSoBD phải là các toán tử của một phép so sánh vì VB sẽ trả về giá trị so sánh mà cả 2 đối tượng này nắm giữ. Nếu SBD=10 và TxtSOBD=11 thì cụm trên sẽ là Biến số=Dsum("DiemThi","DSTS"," ' 10=11 ' ")...

Mình đã tìm bài biết về input mask và thấy có 1 bài viết của paulsteigel trả lời là điền vào input mask như thề này:
"ABC-"0###;0;
bạn có thể giải thích cho mình hiểu hơn giá trị ở trên ko??? ### là gì, 0; là gì ??

Mình muốn khi lưu xuống table thì nó vẫn là 008 thì làm thế nào?? Mình thử điển vào input mask là "00"0###;0; như bạn nói thì nó hiện ra được là 008, nhưng khi lưu xuống table thỉ nó lưu là 8.
có cách nào ko. Giúp mình với, cám ơn nhiều lắm.
Về câu hỏi này, phiền bạn đọc kỹ lại phần đầu bài viết trong thread này, tôi đã trình bày về kiểu dữ liệu.
Nhấn mạnh là - máy tính rất máy móc - nếu với kiểu dữ liệu bạn đặc tả là kiểu số - nó sẽ chọn cách ghi lại ngắn nhất để phản ánh giá trị dữ liệu - tức là nếu bạn có nhập vào là 008 hoặc làm cách nào đó để thấy là trên form nó hiển thị là 008 thì khi lưu vào bảng nó chỉ lưu lạiu là 8. Đó là lý do tại sao họ lại đặt tên thuộc tính định dạng nhập liệu là input mask - cái mà tôi đã giới thiệu đâu đó - mask là: mặt nạ hihì.
Quay lại chủ đề của bạn - vậy muốn nhập gì máy ghi thế - bạn cần phải xác lập kiểu dữ liệu là Text.
Bây giờ tôi giải thích một chút về input mask:
[Nếu bạn có thể đọc hướng dẫn trong Access thì tốt quá - vì nó đã hướng dẫn bạn chi tiết và cụ thể lắm rồi]. Nhưng để tiện theo dõi, tôi xin tạm ngắn gọn trình bày về thuộc tính inputmask:
Thuộc tính InputMask có thể chứa đến 3 phần được phân cách bằng dấu (;).
Phần 1: Đặc tả chính input mask; ví dụ !(999) 999-9999. đây là danh sách các ký tự bạn có thể sử dụng để định nghĩa input mask, phần trích dẫn cuối bài có giải thích khá rõ.
Phần 2: Đặc tả việc Microsoft Access có lưu lại các ký tự phân các vào bảng khi bạn nhập liệu. Nếu bạn chọn 0, tất cả các ký tự đặc tả sẽ được lưu giữ vào bảng (dấu ngoặc trong ví dụ trên cũng được lưu). Nếu bạn chọn 1 hay để phần này trống, chỉ có ký tự sẽ được lưu vào bảng.
Phần 3: đặc tả ký tự mà Microsoft Access sẽ hiển thị đối với khoảng trống nơi bạn sẽ gõ vào. Với phần này, bạn có thể đặc tả bất kỳ ký tự nào để hiển thị chuỗi trống bằng cách dùng dấu cách trong cặp nháy kép (" ").
Bảng các định dạng:
0 Số (0 đến 9, đòi hỏi phải nhập liệu, dấu +, - không được.
9 Số hay dấu cách (Không bắt buộc phải nhập liệu, dấu +,- có thể nhập được).
# Số hay dấu cách (Không bắt buộc nhập liệu; các dấu cách sẽ được hiển thị là dấu trống khi đang trong chế độ sửa, khi lưu trữ, dấu trắng sẽ bị loại bỏ, dấu +,- được phép nhập).
L Ký tự (A đến Z, bắt buộc).
? Ký tự (A đến Z, không bắt buộc).
A Ký tự hay số (bắt buộc).
a Ký tự hay số (không bắt buộc).
& Bất kỳ ký tự nào hay dấu cách (Bắt buộc).
C Bất kỳ ký tự nào hay dấu cách (không bắt buộc).
. , : ; - / Dấu phân cách thập phân và phân cách hàng ngàn, ngày tháng, giờ giấc. (Ký tự thực tế phụ thuộc vào cách bạn thiết lập trong hộp thoại Regional Settings Properties của Windows Control Panel).
< Ép chuyển đổi mọi ký tự sang chữ thường.
> Ép chuyển đổi mọi ký tự sang chữ hoa.
! Ép input mask hiển thị từ phải sang trái thay vì từ trái sang phải. Ký tự nhập vào Input mask luôn được điền từ trái qua phải. Bạn có thể bao gồm dấu chấm than bất kỳ chỗ nào trong input mask.
\ Làm cho các ký tự gõ đằng sau hiển thị là ký tự đặc tả đại diện (ví dụ khi đặc tả là \A thì tất cả các ký tự sau nó sẽ hiển thị là A).
Hi vọng là bạn hiểu được nhỉ....
có gì cứ hỏi tiếp nhé
 
Sửa lần cuối:
S

saigonpho

Guest
21/12/05
8
0
0
tp HCM
Cám ơn paulsteigel và mysterious_girl đã trả lời mình. Mình lại có thắc mắc làm phiền bạn đây:
1. Lại vẫn là input mask
- Làm như vậy thì 8 sẽ hiển thị là 008, nhưng khi SoBD lên đến 10 thì nó hiện thị là 0010 -> mình muốn nó chỉ hiển thị là 010 thì làm thế nào ??
2. Module dùng chung:
Thí dụ mình muốn tạo 1 module dùng chung cho các nút di chuyển đầu, trước, sau, cuối, trong module đó, mình khai báo hàm di chuyển như sau:

Public sub DiChuyen()
............
end sub

Sau đó, trong Form, mình viết hàm cho các sự kiện on click các conmand Đầu, Trước, Sau, Cuối như sau:

Public Sub cmdDau_Click()
Call DiChuyen
End Sub

Hàm di chuyển mình đã test thử và chạy được, nhưng sao trong trường hợp này, khai báo trong module dùng chung mà nó vẫn ko chạy (mặc dù ko báo lỗi nhưng nhấn nút Đầu, nó vẫn ko di chuyển về đầu)

Giúp mình với nhé. Cám ơn nhiều lắm
 
M

mysterious_girl

Guest
saigonpho nói:
Cám ơn paulsteigel và mysterious_girl đã trả lời mình. Mình lại có thắc mắc làm phiền bạn đây:
1. Lại vẫn là input mask
- Làm như vậy thì 8 sẽ hiển thị là 008, nhưng khi SoBD lên đến 10 thì nó hiện thị là 0010 -> mình muốn nó chỉ hiển thị là 010 thì làm thế nào ??

Lúc này mình nghĩ là bạn nên dùng hàm để dịnh dạng.
2. Module dùng chung:
Thí dụ mình muốn tạo 1 module dùng chung cho các nút di chuyển đầu, trước, sau, cuối, trong module đó, mình khai báo hàm di chuyển như sau:

Public sub DiChuyen()
............
end sub

Sau đó, trong Form, mình viết hàm cho các sự kiện on click các conmand Đầu, Trước, Sau, Cuối như sau:

Public Sub cmdDau_Click()
Call DiChuyen
End Sub

Hàm di chuyển mình đã test thử và chạy được, nhưng sao trong trường hợp này, khai báo trong module dùng chung mà nó vẫn ko chạy (mặc dù ko báo lỗi nhưng nhấn nút Đầu, nó vẫn ko di chuyển về đầu)

Bạn sửa lại thành private sub nhé.
 
paulsteigel

paulsteigel

Trung cấp
13/11/05
103
0
16
48
Hoà Bình
www.sfdp.net
Hờ hờ...
Thế này nhé - câu 1 - có lẽ bạn không cần phải hỏi đâu - bạn cứ thử rồi sẽ thấy là nó hiển thị đúng như cách bạn muốn.
Câu 2.
Bạn cần ngâm cứu sự khác nhau giữa form/báo cáo/ Class với Module.
Nếu bạn muốn viết một thủ tục để dùng chung cho các form, bạn phải truyền đối tượng cho thủ tục dùng chung đó - nếu không thì các thủ tục làm sao biết được là bạn đang làm việc với form nào, báo cáo nào, lớp nào.
Vậy nếu bạn viết thủ tục để dùng chung cho nhiều form thì phải dùng cái đại loại như thế này:

Sub MoveNext(tObject As Form)
On Error GoTo MoveNext_Err
tObject.Recordset.MoveNext
Exit_MoveNext_Err:
Exit Sub

MoveNext_Err:
MsgBox Err.Description
Resume Exit_MoveNext_Err
End Sub

Và gọi thủ tục trên như thế này/ Mặc định là private - nhưng bạn cũng có thể sửa thành public nếu bạn muốn điều khiển form này từ một form hay module khác
Private [Public] Sub Command4_Click()
MoveNext Me
End Sub

....
Bạn mysterous ơi..
Bạn sửa lại thành private sub nhé.
Cái này không quan trọng là để ở private hay public đâu, vấn đề là ở đoạn thủ tục xử lý di chuyển cơ.
 
Sửa lần cuối:
S

saigonpho

Guest
21/12/05
8
0
0
tp HCM
vậy là hàm dichuyen trong module phải có tham số đầu vào là kiểu form (???).
Để mình thử xem. Cám ơn 2 bạn nhiều nhé.
 
Q

quyettoan

Sơ cấp
31/7/08
3
0
0
TPHCM
Ðề: Các câu hỏi về MS Access

Tình cờ search trên mạng thì thấy câu hỏi này.
Xin trả lời như sau: Tôi đang phát triển phần mềm ứng dụng bằng Access 2003 và khi đóng gói chỉ cần giao file Install.exe cho khách hàng là xong. File chỉ có size trong khoảng 40MB thôi. Bộ setup tôi đang phân phối chạy tốt trên Win 2000, Win XP, Win Vista, Win 7 (32 và 64 bit). Bạn nào hứng thú chủ đề này thì PM cho tôi.
 

Xem nhiều

Webketoan Zalo OA