
Sinh mã chi tiết tự động theo quy tắc (loại-năm-số thứ tự) và ghi vào thuộc tính, tránh trùng
#Python#Attribute#Mã chi tiết1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Mã chi tiết do con người đặt dễ trùng và lộn xộn. Sinh mã bằng script theo quy tắc có số thứ tự cuối cùng lưu trong file đếm cho phép đảm bảo duy nhất, kể cả khi nhiều người dùng chung.
Sinh mã chi tiết tự động theo quy tắc…Các bước thực hiện
- Thiết kế quy tắc. Ví dụ CT-26-0001: loại, năm, số thứ tự 4 chữ số.
- Lưu bộ đếm. File JSON chia sẻ trên ổ mạng.
- Khóa file khi cập nhật. Tránh hai người cùng lấy một số.
- Sinh và ghi mã. Ghi vào MA_CHI_TIET nếu chưa có.
- Tránh đổi mã đã có. Không cấp lại cho part đã có mã.
Code tham khảo (Python)
import json import os import time import NXOpen NGAY = NXOpen.Update.Option.Now FILE_DEM = "D:/NXLab_cau_hinh/bo_dem_ma.json" KHOA = FILE_DEM + ".lock" class Khoa: """Khóa đơn giản bằng file; đủ dùng cho vài người, không thay cho cơ sở dữ liệu.""" def __enter__(self): for _ in range(50): try: self.fd = os.open(KHOA, os.O_CREAT | os.O_EXCL | os.O_WRONLY) return self except FileExistsError: time.sleep(0.1) raise TimeoutError("Không lấy được khóa bộ đếm: " + KHOA) def __exit__(self, *a): os.close(self.fd) os.remove(KHOA) def cap_ma(loai="CT"): os.makedirs(os.path.dirname(FILE_DEM), exist_ok=True) nam = time.strftime("%y") with Khoa(): dem = {} if os.path.isfile(FILE_DEM): with open(FILE_DEM, "r", encoding="utf-8") as f: dem = json.load(f) khoa = "%s-%s" % (loai, nam) so = dem.get(khoa, 0) + 1 dem[khoa] = so with open(FILE_DEM, "w", encoding="utf-8") as f: json.dump(dem, f, indent=2) return "%s-%s-%04d" % (loai, nam, so) def main(): session = NXOpen.Session.GetSession() lw = session.ListingWindow lw.Open() part = session.Parts.Work if part is None: return kieu = NXOpen.NXObject.AttributeType.String if part.HasUserAttribute("MA_CHI_TIET", kieu, -1): lw.WriteLine("Part đã có mã: " + part.GetUserAttributeAsString("MA_CHI_TIET", kieu, -1)) return ma = cap_ma("CT") part.SetUserAttribute("MA_CHI_TIET", -1, ma, NGAY) lw.WriteLine("Đã cấp mã mới: " + ma) if __name__ == "__main__": main()Giải thích code
os.O_CREAT | os.O_EXCLtạo file khóa nguyên tử; nếu đã có người giữ khóa thì báoFileExistsErrorvà ta thử lại.- Bộ đếm theo cặp (loại, năm) để số thứ tự quay lại 0001 mỗi năm mới.
- Không bao giờ cấp lại mã cho part đã có mã, để tránh làm lệch tham chiếu.
Lỗi thường gặp
- File khóa treo (script chết giữa chừng) làm người khác chờ mãi; thêm cơ chế xóa khóa quá cũ.
- Với nhiều người dùng đồng thời nên dùng PDM/CSDL cấp mã thay vì file chia sẻ.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.