Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hướng dẫn] Chuẩn hóa chương trình!
#1
Information 
Hi các bạn!

Topic này Bợm lập ra để cùng bàn về vấn đề chuẩn hóa 1 số chức năng khi lập trình, cụ thể thế nào sẽ được bàn qua từng bài viết. Thân! 007

1. Tạo công cụ chọn khoảng thời gian:

vấn đề chọn thời gian phát sinh khi người sử dụng chọn xuất báo cáo:

ví dụ: chọn khoảng thời gian để xuất bảng kê hóa đơn bán hàng, chọn khoảng thời gian để xuất báo cáo quá trình làm việc của nhân viên, chọn khoảng thời gian để biết chi tiết nhập xuất tồn kho hàng hóa...

cách giải quyết của đa số các bạn là cho người dùng nhập Từ ngày-Đến ngày ngay trên form, như vậy vẫn không khả dụng khi chương trình có nhiều chổ cần phải chọn ngày thì phải thiết kế nhiều chổ, khi cần chỉnh code cho nó thì là ác mộng đêm hè.

Nên tốt nhất chúng ta tạo một công cụ Chọn Thời Gian riêng biệt rồi khi cần thì gọi nó, nó sẽ giúp người dùng lựa chọn thời gian và báo về cho chúng ta cái Từ Ngày và Đến Ngày. Giao hẳn nhiệm vụ này cho nó.

Nói thì có vẻ khó hiểu, cùng Bợm bay vào thực hành sẽ rõ. Công cụ sẽ sử dụng một số hàm hệ thống ngày tháng: Date(), Month(), Day(), Year(), DateAdd().... các bạn có thể tìm hiểu các lệnh này trong diễn đàn, đã có nhiều hướng dẫn rồi.
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , hugox03 , Xuân Thanh , hctol , HoanTQ , KínhCận , Minh Tiên
#2
Trước tiên ta tạo 1 form Dialog để làm giao diện chọn lựa cho người dùng như sau:
[Hình: rraomp]

Tiếp theo tạo một module đặt tên chonTG để tách riêng code ra một bên cho nó, và viết 1 số lệnh sẵn như sau:
Mã PHP:
Public chonTuNgay As Date
Public chonDenNgay As Date
Public daChonNgay As Boolean

Public Function layTuNgay() As Date
    layTuNgay 
chonTuNgay
End 
Function

Public Function 
layDenNgay() As Date
    layDenNgay 
chonDenNgay
End 
Function

Public Function 
DauThang(thang As Integernam As Integer) As Date
    DauThang 
DateSerial(namthang1)
End Function

Public Function 
CuoiThang(ByVal thang As IntegerByVal nam As Integer) As Date
    CuoiThang 
DateAdd("m"1DauThang(thangnam)) - 1
End 
Function

Public Function 
Qui(thang As Integer) As Integer
    Qui 
Int((thang 1) / 3) + 1
End 
Function 


Tiếp theo viết code xử lý các tình huống chọn lựa trên form như sau:
Mã PHP:
Option Compare Database
Option Explicit

Private Sub cmdHuy_Click()
    
daChonNgay False
    DoCmd
.Close acFormMe.Name
End Sub

Private Sub cmdOK_Click()
    
daChonNgay True
    DoCmd
.Close acFormMe.Name
End Sub

Public Function DoiNgay()
    
Dim quy As Integerthang1 As Integerthang2 As Integer
    
    Select 
Case frCHON
        
Case 1
            chonTuNgay 
DauThang(1cmbNam)
            
chonDenNgay CuoiThang(12cmbNam)
        Case 
2
            quy 
cmbQuy
            thang1 
quy 2
            thang2 
quy 3
            chonTuNgay 
DauThang(thang1cmbNam2)
            
chonDenNgay CuoiThang(thang2cmbNam2)
        Case 
3
            thang1 
cmbThang
            chonTuNgay 
DauThang(thang1cmbNam3)
            
chonDenNgay CuoiThang(thang1cmbNam3)
        Case 
4
            thang1 
cmbThang1
            thang2 
cmbThang2
            chonTuNgay 
DauThang(thang1Year(Date))
            
chonDenNgay CuoiThang(thang2Year(Date))
    
End Select
    txtTN 
chonTuNgay
    txtDN 
chonDenNgay
End 
Function

Private Function 
DoiKieu(CHON As Byte)
    
frCHON CHON
    DoiNgay
End 
Function

Private 
Sub Form_Open(Cancel As Integer)
    
Dim i As Integernam As Integer
    
    DoCmd
.Restore
    chonTuNgay 
DauThang(Month(Date), Year(Date))
    
chonDenNgay CuoiThang(Month(Date), Year(Date))
    
daChonNgay False
    nam 
Year(Date)
    For 
nam 5 To nam 5
      cmbNam
.AddItem i
      cmbNam2
.AddItem i
      cmbNam3
.AddItem i
    Next i
End Sub 

Các thuộc tính (properties) của các đối tượng trên form các bạn có thể tham khảo trực tiếp từ chương trình. ví dụ như: Default value, Rule, AfterUpdate, GotFocus,....
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , hoahd , hugox03 , Xuân Thanh , KínhCận , Minh Tiên
#3
Ứng dụng:

xây dựng một function để gọi cái form chọn TG đó lên, và kiểm soát xem ngừoi dùng có chọn hay Hủy bằng code:

Mã PHP:
Public Function goiChonTG() As Boolean
    DoCmd
.OpenForm "FChonTG"acNormal, , , , acDialog
    goiChonTG 
daChonNgay
End 
Function 

Tạo một MAIN form thử gọi chức năng chọnTG này xem nào...

Chương trình

Các bạn có thể "biến tấu" thêm cho phù hợp với đòi hỏi của riêng mình nhé!024
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , hugox03 , Xuân Thanh , KínhCận
#4
021021
Chữ ký của Thương Bụi Xin chào, mình là Thương Bụi, Tham gia http://thuthuataccess.com/forum từ ngày 25-05 -13.
Reply
Những người đã cảm ơn Minh Tiên
#5
2. Tạo công cụ chọn để in một số đối tượng:

Giả thuyết đặt ra:
- Trong công ty có nhiều phòng ban, yêu cầu đặt ra là in danh sách nhân viên của từng phòng ban (dễ), in danh sách tùy chọn (chọn người cần in theo từng yêu cầu không biết trước được).
- Trong kinh doanh bạn cần xem doanh thu của tất cả các mặt hàng là bình thường, đôi lúc cũng cần xem doanh thu của 1 vài mặt hàng nào thôi. nên lúc in ra phải cho phép lựa chọn mặt hàng nào cần in thì in.
- Tóm lại, khi thiết kế report để in trọn vẹn Danh sách hoặc 1 vài trường hợp số lượng cố định cụ thể là điều đơn giản. Nhưng để tạo sự đa dạng cho người dùng bạn cần cho phép người dùng "chọn lựa" yêu cầu lúc in ra mới là khó.

Chúng ta không thể thiết kế nhiều mẫu report theo nhiều yêu cầu như thế được (vì khi chỉnh lại 1 chút sẽ lại là ác mộng).
Nên cách giải quyết bài toán trên là chúng ta sẽ tạo một công cụ cho phép người dùng chọn lựa (bằng tay) từng đối tượng cụ thể mà họ muốn in như sau:

Trong CSDL ở mỗi table loai danh mục như: danhSachNhanVien, danhMucHangHoa, danhSachKhachHang, danhSachPhongBan.... cần lựa chọn in, bạn nên thiết kế thêm một Field (Yes/No) đặt tên ChonIn để khống chế việc cho phép in/hay không đối tượng đó.

VÍ dụ:
table dmKhachHang (ID, MaKH, TenKH, DT, DC,......, ChonIn)
table dmHangHoa (ID, MaHH, TenHH, DVT,......., ChonIn)
table dsNhanVien (ID, MaNV, TenNV, NS, Phai,........, ChonIn)
.......

Tạo công cụ cho phép chọn in 1 số đối tượng cho người dùng thông qua Field ChonIn. Sau đó thiết kế report in ra những đối tượng nào có ChonIn là True thôi. Vấn đề sẽ được giải quyết. 021

(còn tiếp)
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , hugox03 , Xuân Thanh , KínhCận , Minh Tiên
#6
Trước tiên Long tạo một dữ liệu ví dụ như sau:
[Hình: rrpwkk]

Sau đó cũng tương tự như bài trên, Long sẽ tạo một module chonNV để tách riêng code ra cho dễ quản lý và thiết kế một số function, cũng như khai báo một số biến toàn cục như sau:
Mã PHP:
Option Compare Database
Option Explicit     
'kiem tra chat che cac bien da khai bao chua

Public chonNVSTT As Byte
Public daChonNV As Boolean

Public idPhongChon As Long
Public tenPhongChon As String
Public tenNVChon As String
Public phaiChon As Boolean

Public Function goiChonNV() As Boolean
    DoCmd.OpenForm "FChonNV", acNormal, , , , acDialog
    goiChonNV = daChonNV
End Function

Public Function laySTTChon() As Byte
    laySTTChon = chonNVSTT
End Function

Public Function layTenPhongChon() As String
    layTenPhongChon = tenPhongChon
End Function 

Tiếp theo Long tạo một form làm giao diện cho người dùng chọn lựa j đó cho đã đi như sau:
[Hình: rrpwkl]

Các thuộc tính (properties) của các đối tượng trên form như thế nào các bạn có thể tham khảo trực tiếp trong chương trình (tải về). vì nhiều quá không tiện liệt kê ra. hì015

Sau nữa mình xây dựng code cho các sự kiện trên form như sau:
Mã PHP:
Option Compare Database
Option Explicit

Dim tChon 
As Byte

Private Sub cmbPhai_AfterUpdate()
    
chonNV
End Sub

Private Sub cmbPhong_AfterUpdate()
    
chonNV
End Sub

Private Sub cmdHuy_Click()
    
daChonNV False
    DoCmd
.Close acFormMe.Name
End Sub

Private Sub cmdOK_Click()
    
daChonNV True
    DoCmd
.Close acFormMe.Name
End Sub

Private Sub Form_Load()
    
daChonNV False
    tChon 
1
    chonNVSTT 
1
    idPhongChon 
0
    tenPhongChon 
""
    
tenNVChon ""
    
phaiChon False
    CurrentDb
.Execute "Update [T0 dsNhanVien] Set ChonIn=True"
End Sub

Private Sub chonNV()
    
CurrentDb.Execute "Update [T0 dsNhanVien] Set ChonIn=False"
    
Select Case tChon
        
Case 1
            CurrentDb
.Execute "Update [T0 dsNhanVien] Set ChonIn=True"
        
Case 2
            idPhongChon 
cmbPhong
            tenPhongChon 
cmbPhong.Column(1)
            
CurrentDb.Execute "Update [T0 dsNhanVien] Set ChonIn=True WHERE MaP=" idPhongChon
        
Case 3
            tenNVChon 
Nz(txtTenNV"")
            
CurrentDb.Execute "Update [T0 dsNhanVien] Set ChonIn=True WHERE TenNV Like '*" txtTenNV "*'"
        
Case 4
            phaiChon 
cmbPhai
            CurrentDb
.Execute "Update [T0 dsNhanVien] Set ChonIn=True WHERE Phai=" phaiChon
        
Case 5
            
    End Select
    chonNVSTT 
frCHON.Value
    fSUB
.Requery
End Sub

Private Sub frCHON_AfterUpdate()
    If 
frCHON.Value <> tChon Then
        cmbPhong
.Enabled frCHON.Value 2
        txtTenNV
.Enabled frCHON.Value 3
        cmbPhai
.Enabled frCHON.Value 4
        fSUB
.Enabled frCHON.Value 5
        tChon 
frCHON.Value
        chonNV
    End 
If
End Sub

Private Sub txtTenNV_AfterUpdate()
    
chonNV
End Sub 
021
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , hugox03 , Xuân Thanh , Minh Tiên
#7
Ứng dụng:

Tiện tay tạo một report để trình bày danh sách nhân viên được chọn như sau:
[Hình: rrwcrp]

Với câu lệnh SQL lấy dữ liệu cho report như sau:
Mã PHP:
SELECT [T0 dsNhanVien].ID, [T0 dsPhong].TenPhong, [T0 dsNhanVien].MaNV, [T0 dsNhanVien].TenNVIIf([Phai],"Nữ","Nam") AS GioiTinh, [T0 dsNhanVien].ChucVu, [T0 dsNhanVien].NS, [T0 dsNhanVien].CMND, [T0 dsNhanVien].NgayBDLV, [T0 dsNhanVien].GhiChu
FROM 
[T0 dsPhongINNER JOIN [T0 dsNhanVienON [T0 dsPhong].ID = [T0 dsNhanVien].MaP
WHERE 
((([T0 dsNhanVien].ChonIn)=True)); 

Trên Main form tạo thêm 1 nút Command Button để gọi chọn nhân viên và code cho nó:
Mã PHP:
Private Sub cmdNV_Click()
    If 
goiChonNV Then
        DoCmd
.OpenReport "RDSNV"acViewPreview
    End 
If
End Sub 
014

Công đoạn cuối cùng là run MainForm để test kết quả. Các bạn có thể xem, mổ xẻ kỹ hơn khi tải về máy của mình!

Thân!!021021021021021
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn xuankien07
#8
3. Tạo công cụ để người dùng chọn in cái gì?

Lấy ý tưởng từ ví dụ trên: khi ông sếp đòi hỏi bạn phải in danh sách một số mẫu như sau: danh sách rút gọn thôi, danh sách nv đầy đủ chi tiết cho ổng, khi thì lấy danh sách Năm, khi thì Nữ,....

Mỗi yêu cầu của ổng bạn thiết kế một Report, vậy lúc cần in phải làm sao? không lẽ thiết kế form như vầy:
[Hình: vpmjaq]
mỗi nút chọn 1 cái report (trông kỳ cục kẹo quá)

Nên hôm nay Bợm hướng dẫn bạn làm một công cụ để giúp cho người dùng chọn lựa muốn in báo cáo nào thông qua 1 design form khác. Bắt đầu:

- Ứng dụng:
Trước hết mình tạo 1 cái table dùng để chứa mấy cái gì để cho người dùng chọn vào đó như sau:
[Hình: vpmani]
Dựa vào field Nhom mà ta cho công cụ biết lúc nào sẽ show hàng cái gì cho người ta chọn nhá!

Như vậy một đống report đó ta có thể gom lại theo chủ đề như sau:
[Hình: vpmaii]

Tùy nút nhấn nào click mà ta truyền cho nó Nhom=1 hay Nhom=2 hoặc Nhom=3 để nó biết.

Bắt đầu xây dựng nó:
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , hugox03
#9
Trước tiên thiết kế 1 cái form FChonIn như sau:
[Hình: vpmpcs]

cái trắng trắng là Listbox nhé

Ta lấy RowSource cho nó như sau:
[Hình: vpmmnw]

- Column Count : 3
- Column Width : 0; 4; 0

Tạo một Mudule chứa code khai báo như sau:
Mã PHP:
Option Compare Database
Option Explicit

Public nhomBaoCao As Byte       'nhom Bao cao nao can hien cho nguoi dung chon
Public daChonBaoCao As Boolean  '
kiem tra xem nguoi ta co hon ko hay la nhan Huy
Public giaTriChon As Long       'tra ve gia tri ma nguoi ta chon


Public Function layNhomBaoCao() As Byte
    layNhomBaoCao = nhomBaoCao
End Function

Public Function goiChonIN() As Boolean
    daChonBaoCao = False
    DoCmd.OpenForm "FChonIn", acNormal, , , , acDialog
    goiChonIN = daChonBaoCao
End Function 

Sau đó viết code cho form TChonIn, xử lý mấy tình huống xảy ra trên đó. Cụ thể code như sau:

Mã PHP:
Option Compare Database
Option Explicit

Dim viTriChonCU 
As ByteviTriMoi As Byte

Private Sub cmdHuy_Click()
    
daChonBaoCao False
    DoCmd
.Close acFormMe.Name
End Sub

Private Sub cmdIN_Click()
    If 
lstBC.Column(2) = 0 Then Exit Sub    'truong hop nguoi dung chon ngay caai dong toan dau --------
    viTriMoi = lstBC.Column(0)
    
    '
dua vao viTriChonCU ta bo chon trong table
    CurrentDb
.Execute "UPDATE TChonIn SET SD=False WHERE ID=" viTriChonCU
    
'dat lai vi tri su dung sau cung dua vao viTriMoi
    CurrentDb.Execute "UPDATE TChonIn SET SD=True WHERE ID=" & viTriMoi
    
    daChonBaoCao = True
    giaTriChon = lstBC.Column(2)
    DoCmd.Close acForm, Me.Name
End Sub

Private Sub Form_Load()
    viTriMoi = Nz(DLookup("ID", "TChonIn", "Nhom=layNhomBaoCao() AND SD=True"), 1)
    viTriChonCU = viTriMoi
    lstBC = viTriChonCU
End Sub

Private Sub lstBC_DblClick(Cancel As Integer)
    Call cmdIN_Click
End Sub 


Quay trở lại MainForm, chổ khởi đầu tội lỗi và thêm mấy cái nút nhấn nữa và viết code xử chúng như sau:
Mã PHP:
Private Sub cmdNV_Click()
    
nhomBaoCao 1
    
If goiChonIN Then
        Select 
Case giaTriChon
            
Case 1  'in report danh sach nv rut gon
                If goiChonNV Then
                    DoCmd.OpenReport "RDSNV", acViewPreview
                End If
            Case 2  '
goi in report danh sach nv chi tiet
            
Case 3  'goi in report ds nv nam
            Case 4  '
goi in report ds nv nu
            
Case 5  'goi in report ds lanh dao
            Case 6  '
goi in report ds phong ke toan
        End Select
    End 
If
End Sub

Private Sub cmdDT_Click()
    
nhomBaoCao 2
    
If goiChonIN Then
        Select 
Case giaTriChon
            
Case 1  'in report bao cao doanh thu thang
            Case 2  '
in report bao cao doanh thu ca nhan
        End Select
    End 
If
End Sub

Private Sub cmdKHO_Click()
    
nhomBaoCao 3
    
If goiChonIN Then
        Select 
Case giaTriChon
            
Case 1  'in report bao cao ton kho
            Case 2  '
in report bao cao han SD
        End Select
    End 
If
End Sub 

Chương trình được viết tại đây nè024
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , hugox03 , thuc1605 , conmeo , Minh Tiên
#10
hình như đề tại này bị ế hả ta?? hihi hôk ai hồi đáp j hết vậy cà.. hjc hjc ế nhệ gòi sad030
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn conmeo , caytregiavn77


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Hỏi] chương trình đơn giản để so sánh chuỗi text kanmai07 4 320 28-09-16, 06:05 PM
Bài mới nhất: kanmai07
  Thiết kế chương trình quản lý thu chi ChiMai 1 160 03-08-16, 10:52 AM
Bài mới nhất: maidinhdan
  [Hỏi] File chạy chậm vì trong quá trình design phải chỉnh sửa và test thử nhiều. toancvp 4 267 29-07-16, 11:36 PM
Bài mới nhất: toancvp
  [Help] Nhờ anh em trong diễn đàn giúp mình thiết kế chương trình báo dịch hàng ngày vinhpaint 1 258 21-06-16, 09:15 AM
Bài mới nhất: zinzin8x
  [Hỏi] Cách tạo chương trình quét và nhận dạng vân tay bằng access nguyenhungcuong 4 252 10-06-16, 03:13 PM
Bài mới nhất: ongke0711

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ơ