문제
대형 배치로 송장을 생성 해야하는 송장을 EDI로 변환하고 본사로 전송해야합니다. 모든 주문이 들어오는 주문 테이블이 있습니다. 어느 시점에서 나는 세트 (약 1K)를 잡고 송장을 생성해야합니다.
- 송장 번호를 생성하기에 가장 좋은 곳은 어디입니까? SQL Server 백엔드에서? 또는 배치를 .NET 응용 프로그램으로 가져간 다음 송장 번호를 생성 하시겠습니까? 송장 번호는 무작위 일 수 있지만 반복해서는 안됩니다 (3-4 년 동안). 나는 최대 12 자리 숫자를 가지고 있으며 알파 숫자 일 수 있습니다. 송장 번호 생성에 대한 정보는 어디에서 찾을 수 있습니까?
참고 : 송장을 생성하는 동안 주문 합계와 세금을 계산해야합니다.
귀하의 의견에 감사드립니다.
해결책
송장 번호는 법적 요구에 의해 규제 될 수 있습니다 (내가 사는 곳은 순서대로 있어야하며 순서대로 간격이있을 수 있다고 생각하지 않습니다).
당신은 종종 숫자에 제 시간에 그들을 범위로 만드는 요소가 포함되어 있음을 알 수 있습니다 (예 : 올해 : 200903472). 그렇게하면 같은 숫자를 두 번 사용할 위험을 최소화합니다.
하루에 ~ 1k 송장이 있다고 말합니다. 즉, 6 그림 송장 번호가 귀하의 요구를 충당 할 것임을 의미합니다. 따라서 4 자리 연도와 제로 패딩 6 그림 송장 번호가 나올 것입니다.
데이터베이스가 고유한지 확인하기 위해 데이터베이스를 생성 할 것입니다.
다른 팁
사용 된 마지막 송장 번호의 값을 저장하는 데이터베이스에 테이블을 추가 하고이 값을 증가시키고 송장 생성에 사용할 새 값을 반환하기위한 저장된 절차.
새 송장을 저장할 때 SP에 호출하여 다음 송장 번호 1을 마지막으로 받으십시오. 유효성 검사가 통과 된 후 디스크에 글을 쓰기 전에 즉시 "구멍"의 위험을 최소화하려고 노력하십시오. 당신의 번호 순서.
어떤 이유로 랜덤이되기를 원하지 않는 한 순차 ID를 사용하는 것이 가장 좋을 것입니다 (고객은 거의 같은 기간부터 다른 주문의 주문 ID를 추측 할 수 없기 때문에). 순차 ID를 사용하면 현재 Max를 읽은 다음 배치 프로세스에서 주문을 받기 직전에 쓸 수있는 범위에 기록 된 것이 없는지 확인할 수 있습니다.
데이터베이스 확인 부담을 원하지 않고 다른 프로세스가 방해하지 않을 수있는 경우 DateTime.utcNow 및 Base64 변환을 활용할 수 있습니다. 정말 어리석은 일러스트레이션은 다음과 같습니다.
Convert.ToBase64String(new byte[] { (byte)DateTime.UtcNow.Year,
(byte)DateTime.UtcNow.Month,
(byte)DateTime.UtcNow.Day,
(byte)DateTime.UtcNow.Hour,
(byte)DateTime.UtcNow.Minute,
(byte)DateTime.UtcNow.Second,
(byte)DateTime.UtcNow.Millisecond })
또는
Convert.ToBase64String(new byte[] { (byte)DateTime.UtcNow.Ticks })
당신은 아마도 더 관심이있을 것입니다 베이스 32 전환 (문자 AZ와 Digits 2-7을 사용합니다)은 기본 .NET 변환이 없지만 검색해야합니다.
송장 ID 생성에 관한 규칙을 제한하는 법이 없다면, 원하는 것이 될 수 있다고 생각합니다.
이제 좋은 예가 있습니다.
실제로 송장 시스템을 프로그래밍하고 있으며 ID 코드를 순차적으로 생성했으며 고객이 회사와 계약을 취소 할 때 이미 12 개의 송장을 생성했기 때문에 약간의 차이가있었습니다.
(여기서 우리는 ISP 회사이고 계약은 6, 12 개월이어야합니다)
시스템 사용자가 취소 된 송장을 삭제했기 때문에 데이터베이스에 차이가 생겼습니다. 정말 순차적 인 숫자가 필요하다면 법에 문제가 있습니다. 그리고 나는 여기에 순차적 인 송장 번호에 차이가있는 다른 많은 상황이 있습니다.
나는 이런 종류의 문제를 피하는 방법을 실제로 모른다. 아이디어가 있습니까?