Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Thủ Thuật] Demo Tổng hợp: Thảo luận về các kiểu Vòng lặp trong Access
#1
Kính thưa: Ban quản trị diễn đàn, các bạn thành viên của 4rum thủ thuật Access

Hôm nay xin phép Ban quản trị diễn đàn cho mình lập chuyên mục này mục đích để tổng hợp tất cả các demo về các kiểu vòng lặp trong Access nhằm tìm hiểu, trao đổi, góp nhặt những cú pháp được các anh/chị chế biến ra từ những cú pháp vòng lặp.

Mình cũng biết trên diễn đàn mình cũng có nhiều về vấn đề này nhưng nó cũng hơi rời rạc để có thể tìm hiểu và thảo luận hoặc chia sẽ.

Lý do hôm nay mình làm như vậy: Đó là
1. Khi mới tập tành về Access mình rất khó khăn khi đọc cú pháp của vòng lặp ( đến nay cũng thế)
2. Muốn nhận được sự quan tâm, đóng góp của các Anh/chị, các bạn có cùng đam mê Access trong ứng dụng thực tiễn về các kiểu vòng lặp. Để bạn mới, bạn củ cùng nhau học tập, thảo luận...phát triển.
3. Tổng hợp thành một khu vực riêng, để dễ thảo luận, tìm kiếm.
4. Để tôi luyên bản thân mình khi nhìn vào kiểu vòng lặp nào cũng có thể giải thích ngay.


Để bắt đầu mình xin liệt kê:
Cấu trúc lặp Là cấu trúc cho phép điều khiển thi hành lập đi lập lại nhiều lần một hoặc nhiều câu lệnh. Số lần lặp lại tùy thuộc vào kết quả kiểm định 1 điều kiện trong cấu trúc lặp. Các cấu trúc lặp gồm có:

_______________________________________________________________________________________

1. Vòng lặp For
Mã PHP:
For <biến đếm> = <giá trị đầuTo <giá trị cuối> [Step <bước nhảy>]
<
Các câu lệnh>
Next <biến đếm

Giải thích cú pháp:
Lần tương ứng <biến đếm> chạy từ <giá trị đầu> đến <giá trị cuối>. Sau mỗi lần lặp <biến đếm> tăng <bước nhảy> đơn vị, giá trị mặc định của <bước nhảy> là 1, phần nằm trong cặp [ ] là phần tuỳ chọn.
Vòng lặp For là vòng lặp có số lần lặp xác định, người ta thường gọi tắt là vòng lặp xác định. Nếu muốn kết thúc vòng lặp For vào bất cứ thời điểm nào ta chỉ cần dùng câu lệnh Exit For.

Ví dụ:
1) Tính tổng: S = 1 + 2 + ... + n (sử dụng vòng lặp For)
Mã PHP:
0    ‘ biến S dùng để chứa tổng ban đầu phải đặt bằng không'
For i = 1 To n     ‘ i là biến đếm chạy từ 1 đến n'
i      ‘ tổng S mới tổng S cũ số i'
Next i 
2) Bài toán vừa gà vừa chó bó lại cho tròn, tổng cộng 36 con và có 100 chân. Hỏi có bao nhiêu gà, bao nhiêu chó?
Mã PHP:
For 1 To 36         ‘ vòng lặp cho số gà'
For j = 1 To 36 ‘ vòng lặp cho số chó (2 vòng lặp lồng nhau)'
If (36) And (100Then
‘ nếu số gà 
số chó =36 và tổng số chân là 100 thì'
Soga = i   ‘ số gà = i'
Socho j ‘ số chó =j'
End If
Next j ‘ của vòng lặp For trong'
Next i ‘ của vòng lặp For ngoài
3) Tìm tất cả các phương án có thể để đổi 200000 đồng ra các loại tiền 1000 đồng, 2000 đồng và 5000 đồng:
Mã PHP:
For x=0 To 200         ‘ Số tờ 1000 đồng'
    For y=0 To 100    ‘ Số tờ 2000 đồng    '
         
For z=0 To 40     ‘ Số tờ 5000 đồng'
        If (x*1000+y*2000+z*5000=200000) Then
             Msgbox “Số tờ 1000 là: ” & x & “ 2000 là:” & y & “và 5000 là:” & z
        End If
         Next z
    Next y
Next x 

2. Vòng lặp While
Mã PHP:
Do While <điều kiện>
<
Các câu lệnh>
Loop 

Giải thích cú pháp:
1) Kiểm tra <điều kiện>, nhảy sang bước 2.
2) Nếu <điều kiện> đúng máy thực hiện <Các câu lệnh> rồi quay lại bước 1. Nếu <điều kiện> sai máy nhảy sang bước 3.
3) Kết thúc vòng lặp.
Khác với vòng lặp For, số lần lặp của vòng lặp Do While có thể không xác định được. Do While hoàn toàn có thể thay thế cho For nhưng ngược lại For không thể thay thế cho Do While trong một số trường hợp. Vòng lặp Do While có thể không được thực hiện lần nào nếu ngay từ đầu <điều kiện> đã bị sai.


Ví dụ:
1) Tính tổng: S = 1 + 2 + ... + n (sử dụng Do While)
Mã PHP:
0 ‘ biến S chứa tổng'
i = 1  ‘ khởi động biến đếm vòng lặp i'
Do While <= n ‘ chừng nào i <= n thì:'
S = S + i ‘ cộng thêm vào S giá trị i'
1  ‘ tăng giá trị của biến đếm vòng lặp lên 1 đơn vị'
Loop 
(Chú ý: Câu lệnh i = i + 1 là rất quan trọng bởi không có nó giá trị của biến i không thay đổi làm điều kiện luôn đúng và dẫn tới vòng lặp vô tận - không kết thúc).
2) Cho n là một số nguyên dương hãy tính tổng tất cả các chữ số của n. Ví dụ: n=2110 thì tổng các chữ số là: 2+1+1+0=4.
Mã PHP:
0     ‘ Biến S dùng để chứa tổng'
Do While n <> 0     ‘ chừng nào n khác không thì:'
n Mod 10     ‘ n Mod 10 là phép chia cho 10 lấy phần dư'
n = n \ 10              ‘ n\10 là phép chia n cho 10 lấy phần nguyên'
Loop 
(Chú ý: Bài toán này chỉ có thể được thực hiện bởi Do While, không thực hiện được với For bởi số các chữ số của n là không xác định)

3. Vòng lặp Do Until
Mã PHP:
Do Until <điều kiện>
<
Các câu lệnh>
Loop 

Giải thích cú pháp:
1) Kiểm tra <điều kiện>, nhảy sang bước 2
2) Nếu <điều kiện> đúng thì sang bước 3, ngược lại máy thực hiện <Các câu lệnh> rồi quay lại bước 1.
3) Kết thúc vòng lặp.
Vòng lặp Do Until chỉ khác Do While ở chỗ: <điều kiện> trong Do While là điều kiện để lặp còn trong Do Until là điều kiện để kết thúc.


Ví dụ:
1) Tính tổng: S = 1 + 2 + ... + n (sử dụng Do Until)
Mã PHP:
0     ‘ biến S chứa tổng'
i = 1      ‘ khởi động biến đếm vòng lặp i'
Do Until i n ‘ thực hiện cho đến khi i n'
S = S + i   ‘ cộng thêm vào S giá trị i'
1    ‘ tăng giá trị của biến đếm vòng lặp lên 1 đơn vị'
Loop 
2) Cho n là một số nguyên dương hãy kiểm tra n có phải là số đối xứng hay không. Ví dụ số 92529 là sô đối xứng.
Mã PHP:
n  ‘ m là biến tạm ban đầu nhận giá trị bằng n'
S = 0   ‘ biến S dùng để chứa giá trị số đảo ngược của n'
Do Until 0 ‘ thực hiện cho đến khi n=0'
S = S*10 + n Mod 10     ‘ lấy S trước * 10 cộng với số dư của n chia cho 10'
10                    ‘ m\10 là phép chia m cho 10 lấy phần nguyên'
Loop
If S = n Then 
‘ n là số đối xứng!'
Else
‘ n không phải là số đối xứng!'
End If 

Xin sửa lại bài cho gọn...những phần bỏ sẽ được tiếp tục trong những ngày tới phía dưới....và kèm cả demo minh họa.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Xuân Thanh , Noname , Minh Tiên , MatTroiNguQuen
#2
@maidinhdan :
1/ Bài viết hay. Cố gắng tổng hợp và viết gọn lại theo từng chủ đề riêng biệt
2/ Các câu lệnh nếu viết chung trên một dòng, lưu ý phải cách nhau bằng dấu hai chấm ( : ) nhé
3/Đã Set Frm =...., sao còn dùng vòng lặp For i = 0 To Frm.Count - 1. Giải thích giùm
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
#3
(02-04-15, 04:23 PM)Xuân Thanh Đã viết: @maidinhdan :
1/ Bài viết hay. Cố gắng tổng hợp và viết gọn lại theo từng chủ đề riêng biệt
2/ Các câu lệnh nếu viết chung trên một dòng, lưu ý phải cách nhau bằng dấu hai chấm ( : ) nhé
3/Đã Set Frm =...., sao còn dùng vòng lặp For i = 0 To Frm.Count - 1. Giải thích giùm
Thân mến

Cảm ơn anh Thanh.


Minh họa: Hàm Kiểm tra sự tồn tại của một cột trong table
Mã PHP:
Function Kiemtracot(tableName As StringfieldName As String) As Boolean
Dim db 
As DAO.Database
Dim tdf 
As DAO.TableDef
Dim i 
As Integer

Set db 
CurrentDb
Set tdf 
db.TableDefs(tableName)

For 
0 To tdf.Fields.Count 1

If fieldName tdf.Fields(i).Name Then
Kiemtracot 
True
Exit Function
End If
Next
End 
Function 
Lưu ý : Phải bổ sung thư viện DAO.

Khi cần thì Alo:
Mã PHP:
Kiemtracot(“Tên table”,”Tên cái cột đó”

Để khi nào rãnh em  làm từng Demo theo bài phía trên gửi kèm rồi chú thích cặn kẻ.

Thân chào Anh.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , Minh Tiên
#4
Trả lời anh rồi em xin tiếp tục nửa...

Hỏi: Tôi có thể mở bất kỳ mẫu biểu nào trong CSDL bằng cách chọn tên mẫu biểu từ combo box (list box) trong mẫu biểu khác không?.

Đáp: Tạo một combo box từ mẫu biểu nào mà bạn muốn chọn để mở mẫu biểu đầu tiên. Combo box được thiết lập các thuộc tính sau:

Name: cblist
Data: Value list (để cài đặt thuộc tính Row Suorce type)

Chèn code vào Event của list: [On Enter]
Mã PHP:
Private Sub cbmoformbanglist_enter()
Dim db as Database
Dim cr 
as Container
Dim I 
as integer
Dim 
list as string
Set db 
DBEngine.Workspace(0).Database(0)
Set My Container db.Containers(“Forms”)
List = 
” ”
For I=0 to cr.Documents.count – 1
List = List & cr.Documents(I).name ;
Next I
me
.cblist.Row Source Left(List, Len(list)-1)
End sub 

* Nhập tiếp thuộc tính After Update của Combo box
Mã PHP:
Private Sub cbmoformbanglist_AfterUpdate()
Docmd.OpenForm (me![cbmoformbanglist])
End Sub 

Các Anh/Chị có chỗ nào sai dùm chỉnh sửa, góp ý bổ sung.
Xin cảm ơn.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , Minh Tiên
#5
Hình như chú Dân hơi bị nhầm lẫn một tý
1/ Hàm xác định Field có tồn tại trong table không thì đúng nhưng thiếu và sẽ gây lỗi. Thử Demo đi biết liền lỗi ở đâu
2/ Đã set form sao còn cho vòng lặp duyệt qua tất cả các form. Nhầm là ở chỗ này. Giống như hàm xác định sự tồn tại của field, ta duyệt qua tất cả các trường của một table được chỉ định trước. Còn ở dây thì khác. Dân xem lại nhé. Có gì cùng trao đổi
3/ Nói thêm về mở form từ combobox hoặc listbox của form khác : Cần thêm hàm If để kiểm tra giá trị được chọn có phải là form đang mở hay không. Nếu không có If chắc chắn sẽ lỗi
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 Noname , maidinhdan
#6
Mình xin lỗi vì viết bài này ở đây có lẽ hơi lạc đề 038
Để kiểm tra sự tồn tại của một đối tượng (table, field, form,...) ta có thể lợi dụng hàm IsObject mà không dùng tới vòng lặp:

Mã PHP:
Public Function fTableExists(strTableName As String) As Boolean
    On Error Resume Next
    fTableExists 
IsObject(CurrentDb.TableDefs(strTableName))
End Function

Public Function 
fFieldExists(strTblName As StringstrFldName As String) As Boolean
    On Error Resume Next
    fFieldExists 
IsObject(CurrentDb.TableDefs(strTblName).Fields(strFldName))
End Function

Public Function 
fFormExists(strFormName As String) As Boolean
    On Error Resume Next
    fFormExists 
IsObject(CurrentProject.AllForms(strFormName))
End Function 

Link tham khảo hàm IsObject:
https://msdn.microsoft.com/en-us/library...51535.aspx
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 maidinhdan , Minh Tiên
#7
Chủ thread thì nhiệt tình mà không thấy các cao thủ khác chia sẻ cho rôm rả nhỉ!
Chữ ký của thiennamlong Xin chào, mình là thiennamlong, Tham gia http://thuthuataccess.com/forum từ ngày 22-06 -14.
Reply
Những người đã cảm ơn maidinhdan
#8
(03-04-15, 01:13 PM)MatTroiNguQuen Đã viết: Mình xin lỗi vì viết bài này ở đây có lẽ hơi lạc đề 038
Để kiểm tra sự tồn tại của một đối tượng (table, field, form,...) ta có thể lợi dụng hàm IsObject mà không dùng tới vòng lặp:

Mã PHP:
Public Function fTableExists(strTableName As String) As Boolean
    On Error Resume Next
    fTableExists 
IsObject(CurrentDb.TableDefs(strTableName))
End Function

Public Function 
fFieldExists(strTblName As StringstrFldName As String) As Boolean
    On Error Resume Next
    fFieldExists 
IsObject(CurrentDb.TableDefs(strTblName).Fields(strFldName))
End Function

Public Function 
fFormExists(strFormName As String) As Boolean
    On Error Resume Next
    fFormExists 
IsObject(CurrentProject.AllForms(strFormName))
End Function 

Link tham khảo hàm IsObject:
https://msdn.microsoft.com/en-us/library...51535.aspx

Chào MTNQ !
Khi bỏ dòng On Error Resume Next thì báo lỗi 3265 (Item not found in this colection" là sao hả bạn ?
Mình chưa hiểu lỗi này ! Bạn có thể giải thích giúp ko ?
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
Question [Help] Link tất các table trong một file.mdb bằng VBA MinhnHang 6 145 29-11-16, 05:18 PM
Bài mới nhất: MinhnHang
  Tránh xung đột dữ liệu trong access quocdung9999 16 1,688 23-11-16, 11:13 AM
Bài mới nhất: quocdung9999
  [Hỏi] Kết nối nhiều lần hay kết nối 1 lần trong ADO ưu điểm hơn Minh Tiên 1 115 10-11-16, 10:41 AM
Bài mới nhất: maidinhdan
  Summary bằng VBA trong MS Access. MinhnHang 6 315 08-11-16, 08:36 AM
Bài mới nhất: MinhnHang
  [Hỏi] Số Thứ Tự Theo Nhóm Hàng Hóa Trong Access pherotao 2 141 02-11-16, 03:05 PM
Bài mới nhất: pherotao

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ơ