• Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    pherotao > 09-11-17, 06:12 PM

    [/quote]

    Vấn đề thay đổi lại mã số HĐ này của bạn đơn giản nhưng một vấn đề quan trong hơn nữa bạn phải nghĩ đến khi thực hiện việc “Sửa” mã HĐ của nghiệp vụ này là nó có ảnh hưởng đến dữ liệu báo cáo kế toán của bạn không? tính đúng đắn của qui trình, nguyên tắc nhập liệu dữ liệu quan trọng như hóa đơn nhập xuất này. 
    Bạn cần tính đến:
    - Mã HD này sẽ làm khóa ngoại cho các table khác liên quan. khi sửa đổi nó cũng sẽ ảnh hưởng. Nếu bạn đã thiết lập Relationship cho Mã HD này với các table khác là  “Cascading update…” thì ok.
    - Mã HD tạo tự động dùng để định danh (primary key) một dòng (1 record) để phân biệt các dòng khác và thường là không cho sửa đổi mà bây giờ bạn lại muốn sửa đổi hàng loạt các Primary Key [mã HD] như hóa đơn tháng 11 trong ví dụ của bạn. Như vậy không đảm bảo tính toàn vẹn dữ liệu. Vd: Tháng 11 bạn đã làm nghiệp vụ thanh toán cho nhà cung cấp các Mã HD đó rồi, in chứng từ, lưu trữ kế toán v.v.. Sau đó tự nhiên phát sinh sửa mã HD hàng loạt vậy mấy chứng từ đã xử lý rồi sai thông tin hết…Do vậy nếu Mã HD đã có phát sinh liên quan đến dữ liệu, nghiệp vụ khác, bạn sửa nó sẽ ảnh hưởng đến tính nhất quán của dữ liệu. Thường thì Kế toán không cho nghiệp vụ nhập ngược trở về tháng trước sau khi đã khóa sổ. Tốt nhất cho trường hợp sửa mã HD về tháng khác thì chỉ cập nhật nó thôi, các Mã HD đã tồn tại của tháng đó rồi, không được thay đổi.
    - Một vấn đề bạn phải tính tới nữa khi code cho việc sửa Mã HD này - code cho nút [Sửa]: Phải xét xem có sửa Field  [tháng] không, nếu có thì chạy code cập nhật lại mã HD, nếu không thì chỉ cập nhật thông thường.

    Code tạo số tt tăng dần trong demo của bạn cũng hay là nó tự tìm nhưng số nào chưa có (có thể là nhỏ hơn số tt đã cấphiện tại) để cấp lại. Thay vì dùng vòng lặp while... trong Recordset thì dùng Dlookup sẽ nhanh hơn.

    Mã PHP:
    ' tim xem soCT nay da co hay chua'
    [/font]
       k 1
       Do Until k 
    0
           vsoct 
    Right("000" i3)
           k Len(Nz(DLookup("SoChungTu""tblxuatnhap""[NgayCT]=#" Format(Me.txtngayct"mm/dd/yyyy") & "# AND SoChungTu ='" vsoct "'"), ""))
           i 1
       Loop

       vrs
    .Close
       Set vdata 
    Nothing

    [font=Tahoma]   SoChungTu vsoct 

    [/quote]

    Cám ơn bạn đã quan tâm trả lời. Nhưng bạn có thử nhấn nút "Sửa" không? và nó xảy ra hiện tượng "nhảy số" phải không? Bạn khuyên không nên sửa số HĐ, tôi xin ghi nhận, nhưng đại khái, tôi chỉ muốn sửa dữ liệu, hoặc số tiền, sau đó ấn "Ghi", thì MãHĐ tự "nhảy số"... hichic....
    Có cách nào vẹn toàn hơn không bạn? Vì trong quá trình nhập liệu thì sai sót là điều không tránh khỏi.
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    ongke0711 > 09-11-17, 08:23 PM

    (09-11-17, 06:12 PM)pherotao Đã viết: Cám ơn bạn đã quan tâm trả lời. Nhưng bạn có thử nhấn nút "Sửa" không? và nó xảy ra hiện tượng "nhảy số" phải không? Bạn khuyên không nên sửa số HĐ, tôi xin ghi nhận, nhưng đại khái, tôi chỉ muốn sửa dữ liệu, hoặc số tiền, sau đó ấn "Ghi", thì MãHĐ tự "nhảy số"... hichic....
    Có cách nào vẹn toàn hơn không bạn? Vì trong quá trình nhập liệu thì sai sót là điều không tránh khỏi.


    - Trong file mà bạn gửi tôi, nút [Sửa] chẳng có gì khác ngoại trừ lệnh SetFocus cho textbox NgayCT, có code gì để "Sửa" đâu mà nhảy số?
    [Hình: 38282987751_ed4e14c4fc_z.jpg]

    - Code tạo mã HD tăng tự động thì đơn giản nhưng để áp dụng vô một form nhập liệu tổng thể thì không đơn giản như bạn nghĩ chút nào.
    - Những code cơ bản của nút "Ghi" làm những gì, và nút "Sửa" làm những gì, bạn còn chưa lập trình cho nó mà bạn đã nhảy vô code tự động tạo mã. Code nút [Ghi] hiện tại của bạn chỉ thực hiện một nhiệm vụ duy nhất là tạo Mã HĐ tự động - Xong => dịch code ra là mỗi lần bấm nút [Ghi] nó sẽ chạy lệnh và tạo mã mới, lưu vào trường [SoChungTu] của table, chỉ vậy thôi. Bạn phải ngâm cứu lại những cái cơ bản nhất của Access thôi. Bạm tham khảo bài này để biết code cho các nút [Thêm], [Sửa]... cho Bound Form của bạn.
    http://thuthuataccess.com/forum/thread-8467.html
    http://thuthuataccess.com/forum/thread-5855.html

    Giả sử bạn đã biết code cho các nút [Thêm], [Ghi], [Sửa], [Xóa] rồi thì tôi nói về cái luồng xử lý của code tạo mã HĐ mới nó nằm ở phần nào trong code nút [Ghi]. Khi Form đang "Tạo mới" hay "Sửa", sau đó bạn đều phải bấm nút [Ghi] này để cập nhật dữ liệu vừa "Sửa" hay vừa "Tạo mới". Do vậy:
    - Code tạo mới Mã HD chỉ cho chạy khi Form nhập liệu đang ở trạng thái là "Tạo mới" record (nhập liệu HĐ mới). Nếu trong trạng thái "Sửa" thì không cần chạy code này để tránh tạo mã và ghi đè lên record như file hiện tại của bạn. 
    - Vậy vấn đề là làm sao phát hiện Form đang ở trạng thái "Tạo mới" hay trạng thái "Sửa"? Một thủ thuật tôi dùng là kiểm tra thuộc tính "Enabled" hay "Disable" các nút lệnh [Tạo mới] và [Sửa]. Khi bấm nút [Tạo mới] sẽ chạy code cho nó Disable luôn, sau khi [Ghi] sẽ "Enabled" lại. Khi bấm nút [Sửa] thì sẽ Enable nút [Tạo mới] (nếu nó đang Disable).
    Vd: Code cho nút [Ghi] (cơ bản thôi)
    -------------------------------------------------------------------------------      
    Private cmdGhi_Click()
             Select Case Me.cmdTaoMoi.Enabled
                  Case True    '-> Đang ở trạng thái 'Sửa'
                      'Không cần chạy code tạo mã HĐ
                      Chạy code cập nhật cho việc sửa dữ liệu
                  Case False    '-> Đang ở trạng thái 'Tạo mới'
                      Chạy code tạo mã HĐ
                      Chạy code cập nhật dữ liệu mới
             End Select
    End Sub
    --------------------------------------------------------------------------------
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    pherotao > 10-11-17, 12:17 PM

    - Trong file mà bạn gửi tôi, nút [Sửa] chẳng có gì khác ngoại trừ lệnh SetFocus cho textbox NgayCT, có code gì để "Sửa" đâu mà nhảy số?
    [Hình: 38282987751_ed4e14c4fc_z.jpg]

    - Code tạo mã HD tăng tự động thì đơn giản nhưng để áp dụng vô một form nhập liệu tổng thể thì không đơn giản như bạn nghĩ chút nào.
    - Những code cơ bản của nút "Ghi" làm những gì, và nút "Sửa" làm những gì, bạn còn chưa lập trình cho nó mà bạn đã nhảy vô code tự động tạo mã. Code nút [Ghi] hiện tại của bạn chỉ thực hiện một nhiệm vụ duy nhất là tạo Mã HĐ tự động - Xong => dịch code ra là mỗi lần bấm nút [Ghi] nó sẽ chạy lệnh và tạo mã mới, lưu vào trường [SoChungTu] của table, chỉ vậy thôi. Bạn phải ngâm cứu lại những cái cơ bản nhất của Access thôi. Bạm tham khảo bài này để biết code cho các nút [Thêm], [Sửa]... cho Bound Form của bạn.
    http://thuthuataccess.com/forum/thread-8467.html
    http://thuthuataccess.com/forum/thread-5855.html

    Giả sử bạn đã biết code cho các nút [Thêm], [Ghi], [Sửa], [Xóa] rồi thì tôi nói về cái luồng xử lý của code tạo mã HĐ mới nó nằm ở phần nào trong code nút [Ghi]. Khi Form đang "Tạo mới" hay "Sửa", sau đó bạn đều phải bấm nút [Ghi] này để cập nhật dữ liệu vừa "Sửa" hay vừa "Tạo mới". Do vậy:
    - Code tạo mới Mã HD chỉ cho chạy khi Form nhập liệu đang ở trạng thái là "Tạo mới" record (nhập liệu HĐ mới). Nếu trong trạng thái "Sửa" thì không cần chạy code này để tránh tạo mã và ghi đè lên record như file hiện tại của bạn. 
    - Vậy vấn đề là làm sao phát hiện Form đang ở trạng thái "Tạo mới" hay trạng thái "Sửa"? Một thủ thuật tôi dùng là kiểm tra thuộc tính "Enabled" hay "Disable" các nút lệnh [Tạo mới] và [Sửa]. Khi bấm nút [Tạo mới] sẽ chạy code cho nó Disable luôn, sau khi [Ghi] sẽ "Enabled" lại. Khi bấm nút [Sửa] thì sẽ Enable nút [Tạo mới] (nếu nó đang Disable).
    Vd: Code cho nút [Ghi] (cơ bản thôi)
    -------------------------------------------------------------------------------      
    Private cmdGhi_Click()
             Select Case Me.cmdTaoMoi.Enabled
                  Case True    '-> Đang ở trạng thái 'Sửa'
                      'Không cần chạy code tạo mã HĐ
                      Chạy code cập nhật cho việc sửa dữ liệu
                  Case False    '-> Đang ở trạng thái 'Tạo mới'
                      Chạy code tạo mã HĐ
                      Chạy code cập nhật dữ liệu mới
             End Select
    End Sub
    --------------------------------------------------------------------------------
    [/quote]


    Vậy mình sẽ thêm 1 cmd 'Lưu' nữa, để khỏi đụng chạm nút 'Ghi'. Nhưng như vậy thì không "pro" lắm. Vì mình thiết kế tất cả các form đều có 05 nút là: 'Sửa', 'Xóa', 'Thêm', 'Ghi', 'Không'. Như bạn thấy đó, tôi bấm 'Ghi' thì ok, đến khi bấm 'Sửa' (ví dụ tôi có 03 hóa đơn, lần lượt là: "001", "002", "003". Tôi sửa "001"), thì khi bấm 'Ghi', "001" thành "004"... và số "001" mất tích luôn... Nhức cái đầu...
    Nếu có cách nào "pro" nhờ bạn chỉ giúp nha. Cám ơn nhiều!
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    ongke0711 > 10-11-17, 02:12 PM

    (10-11-17, 12:17 PM)pherotao Đã viết: Vậy mình sẽ thêm 1 cmd 'Lưu' nữa, để khỏi đụng chạm nút 'Ghi'. Nhưng như vậy thì không "pro" lắm. Vì mình thiết kế tất cả các form đều có 05 nút là: 'Sửa', 'Xóa', 'Thêm', 'Ghi', 'Không'. Như bạn thấy đó, tôi bấm 'Ghi' thì ok, đến khi bấm 'Sửa' (ví dụ tôi có 03 hóa đơn, lần lượt là: "001", "002", "003". Tôi sửa "001"), thì khi bấm 'Ghi', "001" thành "004"... và số "001" mất tích luôn... Nhức cái đầu...
    Nếu có cách nào "pro" nhờ bạn chỉ giúp nha. Cám ơn nhiều!

    040 Thế quái nào mà mình càng làm nó càng rối nhỉ. 
    Mình không hiểu nguời hay nguời không hiểu mình!!!
    Chắc nhờ a tranthanhan1962 hay bạn nào khác có phuơng pháp "sư phạm" huớng dẫn cho dễ hiểu giùm. Phương pháp " sư hổ mang" của mình không truyền đạt đụơc.  008
    008 

    040  Hình như bạn không hiểu ý tôi trong bài viết trên.
    Nút Lưu hay Ghi cũng như nhau thôi.
    Bạn thử post một cái file hoàn chỉnh code 5 cái nút mà bạn nói xem thử nhé.
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    ledangvan > 10-11-17, 05:35 PM

    Anh không đọc hết những gì bạn chủ top hỏi nhưng hình như bạn ấy hiểu chưa đúng trình tự, lập mã số tự nhảy là phải lập khi thêm mới chứ không ai lập lúc ghi chứng từ. Tại vì khi ghi chứng từ có 2 trường hợp : Ghi bản ghi mới và ghi bản ghi sửa. (Một bản ghi cứ sửa đi sửa lại thì cứ mọc ra liên tục các số thứ tự)
    Trường hợp thêm mới thì chương trình sẽ đọc, kiểm tra đã ghi đến số bao nhiêu rồi và tự động cộng thêm 1 nữa là được
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    pherotao > 10-11-17, 10:14 PM

    040 Thế quái nào mà mình càng làm nó càng rối nhỉ. 
    Mình không hiểu nguời hay nguời không hiểu mình!!!
    Chắc nhờ a tranthanhan1962 hay bạn nào khác có phuơng pháp "sư phạm" huớng dẫn cho dễ hiểu giùm. Phương pháp " sư hổ mang" của mình không truyền đạt đụơc.  008
    008 

    040  Hình như bạn không hiểu ý tôi trong bài viết trên.
    Nút Lưu hay Ghi cũng như nhau thôi.
    Bạn thử post một cái file hoàn chỉnh code 5 cái nút mà bạn nói xem thử nhé.
    [/quote]

    Nhờ bạn download file của mình và sử dụng thử. bạn sẽ thấy "bực mình" ngay thôi. Nhưng đúng như bạn nói: lúc đầu tôi cũng biết là số thứ tự tăng dần rất đơn giản, nhưng càng đi sâu, nó càng rối rắm và trở nên "vô duyên"...
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    maidinhdan > 11-11-17, 01:21 AM

    Tôi đã làm demo trên bài bạn, bạn xem link này nhé: [Thủ Thuật] [Video+Demo] 2 Cách Tạo Số tăng dần và Reset theo nhu cầu

    Thân mến!
  • RE: Mã Số Hóa Đơn Tăng Dần theo Ngày - Tháng - Năm

    pherotao > 11-11-17, 09:15 PM

    (11-11-17, 01:21 AM)maidinhdan Đã viết: Tôi đã làm demo trên bài bạn, bạn xem link này nhé: [Thủ Thuật] [Video+Demo] 2 Cách Tạo Số tăng dần và Reset theo nhu cầu

    Thân mến!

    "Ý số 01" và "Ý số 02" thì có nhiều cách giải quyết. Mình làm được. Chỉ còn "Ý số 03" là nan giải thật. Cảm ơn mọi người đã nhiệt tình trả lời bài của mình.