2012-01-04 2 views
2

증분 번호 솔루션이 따르SQL 서버 + 문자열 형식 내가 바우처 형식이 같은 읽는 저장이

[VOUTYPECODE][ISBIRTHDAY][ISREUSABLE][STARTD][ENDD]VT555 + (RunningNo) 

아래의 쿼리 부분에 참조를 @VouFormatLastNum은 다음과 같이 표현되는 문자열의 형식은 다음과 같습니다

'VouT001012012010420120704VT555181' 위와 같이 바우처 형식에서 각괄호로 묶은 항목을 쿼리하여 파생됩니다. 이제, (모든 괄호로 묶은 항목을 분리하여 파생 됨)에 저장된 차단기로 'VT555'을 사용하여 실행중인 번호를 검색합니다. 이전에 발행 된 바우처의 '181'이므로 그 +1에 +1을 추가 할 수 있습니다. 다음 바우처를 위해.

내 바우처 형식이 VT555이 아닌 다른 차단기로 변경 될 때까지 모든 것이 올바르게 작동합니다. 분명히 마지막 바우처는 여전히 VT555이지만 새로운 @VouFormatCore은 다른 값으로 변경되었으므로 더 이상 실행중인 no를 검색하기 위해 아래 쿼리를 수행 할 수 없습니다.

저는이 문제를 해결할 방법을 생각해 봤습니다. 어쨌든 솔루션 공유에 신경을 쓰시겠습니까? 감사.

[email protected] = 'VouT001012012010420120704VT555181' (This is obtained by querying the Top 1 voucher from the voucher table ordered by issue date.) 

    Declare @position as int  
    Set @position = (select len(@VouFormatLastNum) - charindex(reverse(@VouFormatCore),reverse(@VouFormatLastNum)) +1) 

[email protected] will now contain the next running no. after selecting the substring below: 
    Set @VouFormatLastNum = (select substring(@VouFormatLastNum, @position+1,len(@VouFormatLastNum)[email protected]) + 1) 
    select @VouFormatLastNum 
      Set @NextVoucher= @var1 + @var2 + @var3 + @var4 + @var5 + @VouFormatCore + @VouFormatLastNum 
+5

여러 개의 "값"을 하나의 열에 연결하면 많은 고통을 겪습니다. 각 값을 고유 한 열로 저장하고 표시 목적으로 만 연결하는 것 (그리고/또는 계산 된 열 /보기 사용)을 제안합니다. 별도의 열을 사용하면 시퀀스를 더 쉽게 계산할 수 있습니다. –

답변

2

저장 메커니즘을 변경할 수 있습니까?

6 개 또는 7 개의 정보가 있으므로 스토리지 테이블에 6 개 또는 7 개의 필드가 있어야합니다. 마지막 문자열은 다음

지금 나는 당신의 예에서 MS SQL 서버를 가정합니다

...

CREATE TABLE vouchers (
    id    INT IDENTITY(1,1), 
    VouTypeCode  NCHAR(7)  NOT NULL, 
    IsBirthday  NCHAR(2)  NOT NULL, 
    IsReusable  NCHAR(2)  NOT NULL, 
    StartD   SMALLDATETIME NOT NULL, 
    EndD    SMALLDATETIME NOT NULL, 
    PRIMARY KEY (id) 
) 

만들 ... 또한 매우 간단 개별 요소를 쿼리 만드는 동안, 해당 필드에서 재구성 할 수있다 새로운 바우처, id 필드를 제외하고 테이블에 삽입하면 새로운 ID가 생성됩니다. 그리고 그 레코드에서 전체 바우처 코드를 생성 할 수 있습니다.

또한 필요에 따라 데이터 유형을 실제 사용에보다 유연하게/적절하게 변경할 수 있습니다. 또한 '차단기'입력란과 같은 추가 입력란을 추가하면 다른 입력란에 다른 차단기를 설정할 수 있습니다. 당신은 데이터 구조를 변경할 수없는 경우


, 당신은 바우처 코드의 데이터 포맷에 대한 제약에 대한 특정 할 필요가있다. 예를 들어, REVERSE()를 사용하는 것을 볼 수 있습니다. 따라서 'VT555'이 문자열의 앞부분에 나타날 수도 있습니다. 실행 번호는 항상 설정된 길이가되거나 최대/최소 길이가 있습니까?

정확한 제약 조건을 알지 못하면 여러 다른 차단제를 처리하는 알고리즘을 작성할 수 없습니다.

옵션이 될 수 ... 다른 차단제에 대한

점검 'VT555'는 결코 다른 차단제에 대한 CHARINDEX() = 0

확인 CHARINDEX() > 8 (또는 다른 값)이 나타나는 경우에 초기 문자열에 표시하지 않는 경우 계산하기.

첫 번째 숫자가 아닌 문자에 대해 역 문자열을 스캔하십시오.그 지점을 둘러싼 알파와 숫자는 블로커를 형성합니다. 적절한 일치가 발견 될 때까지 모든 차단기를 반복합니다.

그러나 좀 더 구체적으로 말하면 문제 공간에 대해보다 구체적으로 설명해야합니다. 죄송합니다.