TrongLam > 10-05-20, 12:19 PM
dotrung > 10-05-20, 01:09 PM
Xuân Thanh > 10-05-20, 02:53 PM
tranthanhan1962 > 10-05-20, 11:39 PM
Xuân Thanh > 11-05-20, 06:48 AM
(10-05-20, 11:39 PM)tranthanhan1962 Đã viết: Cách xử lý số tăng dần + 1 trong field có nhiều cách, dùng count record +1, dùng DAO viết code, thậm chí cũng có thể dùng query. Nhưng thực ra chưa có cách nào là OK cả. Dùng recordcount khi bị xóa record thì xảy ra việc record cuối cùng có STT nhỏ hơn record trước đó và có thể bị trùng. Ví dụ có 100 record, record cuối cùng STT là 100, Khi xóa 10 record từ 21 đến 30 thì recordcount là 90. Khi tạo recocord mới sẽ có STT là 91 < STT record trước đó (100) và trùng với STT record trước đó (91), Viết code DAO phải dùng Do While, nếu số lượng record lớn sẽ rất chậm và nếu dùng query thì nặng khủng khiếp.
Trường auto number rất hay, Tự tạo ra dãy thứ tự +1, số TT record tạo sau bao giờ cũng lơn hơn record tạo trước, nhược điểm của nó là khi bị xóa thì tạo ra những lổ hỏng không liên tục. Tuy vậy, tôi đã phát hiện ra một công thức. Bình thường, auutonumber sẽ đánh số liên tục cho dù xóa hết record khi tạo mới nó vẫn ra số kế tiếp. Nhưng nếu sau lệnh:
DoCmd.RunSQL "DELETE Table.* FROM Table;"
thêm lệnh reset cột STT:
DoCmd.RunSQL " ALTER TABLE [Table] ALTER COLUMN [STT] COUNTER(1,1);"
Thì khi tạo record mới nó sẽ đánh STT (autonumber)=1
Như vậy, chỉ cần tạo một table tạm có file là autonumber. Khi cần tạo lại số thứ tự thì xóa table tạm + chạy lệnh reset, rồi dùng append query đưa dữ liệu cần thiết qua table tạm cho nó đánh lại STT sau đó dùng update query cập nhật lại field STT cho table chính Thì mấy lệnh RunSQL này xử lý cực nhanh và chính xác
tranthanhan1962 > 11-05-20, 09:46 AM
(11-05-20, 06:48 AM)Xuân Thanh Đã viết: Dù viết bằng cách nào đi nữa thì sau khi xóa record cũng phải resret lại cột STT(SoCT, SoPhieu....) Vì thế sao không reset ngay trên table chính mà phải qua table tạm để rồi phải thêm cái query Apppend nữa cho tốn time tranthanhan1962?Không tìm thấy lệnh reset autonumber khi table đang có dữ liệu, lệnh reset này chỉ trả lại việc đánh số từ 1 khi tạo dữ liệu mới nên phải dùng table tạm. Thưc ra còn cách khác. Dùng VBA delete field autonumber rồi tạo lại, nhưng giờ quên code, mà tìm lại demo chưa thấy
tranthanhan1962 > 11-05-20, 11:22 AM
Xuân Thanh > 11-05-20, 11:51 AM
yamakashi2003 > 15-10-20, 06:46 PM
(11-05-20, 11:22 AM)tranthanhan1962 Đã viết: OK! Góp ý của bác Xuân Thanh tạo cho mình động lực moi móc dữ liệu mấy mươi năm về trước (nói vậy thôi chứ nó chỉ khoảng 16-17 năm gì đó). Minh nhớ nó có trong ổ 10 Gb mình đã không xử dụng từ lâu lắm, mở máy ra thì không gắn được (máy mình không có cổng ATA). Chạy qua nhà thằng em gắn vào mà vẫn sợ bị hỏng, không đọc được. May là nó vẫn OK. Chép hết dữ liệu qua ổ đang xử dụng, rồi vọc. Kết quả bất ngờ. Thì ra việc reset field autonumber lại vô cùng đơn giản. VBA của Em nó đây:Bac ơi cái câu lệnh này nếu mà để STT là khóa chính thì nó báo lỗi và không cho xóa ạ, liệu có cách nào khác ngoài việc bỏ STT là khóa chính không ạ
Giả sử table có tên là TableA và field autonumber có tên là STT:
Sub ResetSoThuTu()
Dim XoafieldSQL, TaofieldSQL As String
XoafieldSQL = "ALTER TABLE TableA DROP COLUMN STT;"
TaofieldSQL = "Alter Table TableA Add COLUMN STT AutoIncrement"
CurrentDb.Execute XoafieldSQL
CurrentDb.Execute TaofieldSQL
End Sub
Vậy là sau khi xóa record chỉ cần chạy lệnh này thì field auutonumber lập tức reset liên tục lại ngay , lúc đầu mình cũng nhớ mang máng cái SQL này nhưng lại dung từ khóa field thay gì column. Đâu có nhớ đã sang access mà nó còn dùng từ khóa column như exel , thật là lộn xộn.
tranthanhan1962 > 15-10-20, 09:33 PM
(15-10-20, 06:46 PM)yamakashi2003 Đã viết: Bac ơi cái câu lệnh này nếu mà để STT là khóa chính thì nó báo lỗi và không cho xóa ạ, liệu có cách nào khác ngoài việc bỏ STT là khóa chính không ạCũng vẫn thế! Sử dụng câu lệnh SQL. Thứ tự: 1 gỡ bỏ khóa chính, 2/reset field autonumber, 3/ tạo lại khóa chính cho field autonumber