簡體   English   中英

你能簡化這個問題的編碼方式嗎?

[英]Can you simplify how to code this problem?

假設我與一家外部公司合作,該公司會在每次發票到期時向我發送對開單。 例如,我們從 folio 1 開始到 999。由於我們非常成功,我們得到了發票 999,為此實體給了我新的賬單代碼,范圍從 1000 到 10000。這是基礎,所以為此我創建了一個表將按如下方式存儲這些作品集,idEntity(指外部外部實體)、folioInicio、folioTermino、folioActual。 當前對開字段包含發票使用的最后一個對開,然后在每次為產品或服務開具發票時通過觸發器,它會增加和更改表中的字段。

這是基礎,但實際上,在 pdf 文檔中打印時或在操作中通過前綴 F 將作品集轉換為 7 位字母數字。例如,作品集 1 將是 F000001。 等等。

為此,創建一個在觸發器中執行的 function,如下所示。

CREATE FUNCTION dbo.GenerateFolioNumber(@FOLIO BIGINT)
RETURN VARCHAR(7)
ACE
START
DECLARE @NROFOLIO VARCHAR(7);
IF(LEN(CONVERT(VARCHAR(7), @FOLIO)) = 1) set @NROFOLIO ='F00000'+ CONVERT(VARCHAR(7), @FOLIO);
IF(LEN(CONVERT(VARCHAR(7), @FOLIO)) = 2) set @NROFOLIO ='F0000'+ CONVERT(VARCHAR(7), @FOLIO);
IF(LEN(CONVERT(VARCHAR(7), @FOLIO)) = 3) set @NROFOLIO ='F000'+CONVERT(VARCHAR(7), @FOLIO);
IF(LEN(CONVERT(VARCHAR(7), @FOLIO)) = 4) set @NROFOLIO ='F00'+CONVERT(VARCHAR(7), @FOLIO);
IF(LEN(CONVERT(VARCHAR(7), @FOLIO)) = 5) set @NROFOLIO ='F0'+CONVERT(VARCHAR(7), @FOLIO);
IF(LEN(CONVERT(VARCHAR(7), @FOLIO)) = 6) set @NROFOLIO ='F'+CONVERT(VARCHAR(7), @FOLIO);
RETURN @NROFOLIO;
END;

問題是這么多的 IF 對我來說似乎是多余的,而且我沒有太多編程經驗 SQL 但在我看來也許可以用另一種方式解決,這就是為什么我求助於這個社區來聽取他們的經驗和看看是否有另一種方法可以做到這一點。

也許 concat() 和 right()

Declare @FOLIO bigint = 27

Select 'F'+right(concat('0000000',@FOLIO),6)

結果

F000027

對於Function

ALTER Function dbo.GenerateFolioNumber(@FOLIO BIGINT)
Returns varchar(7)
Begin
    Return 'F'+right(concat('0000000',@FOLIO),6)
End

這里有很多選項,另一種方法是使用:

declare @folio bigint = 123;
select Concat('F', Replicate('0', 6-Len(@folio)), @folio);

此外,您不會分享您如何使用 function 但是如果在觸發器中,並且可能針對許多行,請考慮表值 function而不是標量 function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM