【问题标题】:Can you simplify how to code this problem?你能简化如何编码这个问题吗?
【发布时间】:2022-11-15 02:01:39
【问题描述】:

假设我与一家外部公司合作,该公司会在每次发票到期时向我发送对开单。例如,我们从 folio 1 开始到 999。由于我们非常成功,我们得到了发票 999,为此实体给了我新的账单代码,范围从 1000 到 10000。这是基础,所以为此我创建了一个表将按如下方式存储这些作品集,idEntity(指外部外部实体)、folioInicio、folioTermino、folioActual。 当前的folio字段有发票使用的最后一个folio,然后在每次为产品或服务开具发票时通过触发器,它增加和改变表中的字段。

这是基础,但实际上,在 pdf 文档或操作中打印对开时,会通过前缀 F 将其转换为 7 位字母数字。例如,对开 1 将是 F000001。等等。

为此,创建一个在触发器中执行的函数,如下所示。

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 的经验,但在我看来,也许它可以用另一种方式解决,这就是为什么我求助于这个社区来倾听他们的经验和看看是否有另一种方法可以做到这一点。

【问题讨论】:

    标签: sql sql-server triggers billing


    【解决方案1】:

    也许 concat() 和 right()

    Declare @FOLIO bigint = 27
    
    Select 'F'+right(concat('0000000',@FOLIO),6)
    

    结果

    F000027
    

    对于函数

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

    【讨论】:

    • 谢谢,我会试试这个,让你知道它是怎么回事。
    猜你喜欢
    • 2010-09-27
    • 2011-12-08
    • 1970-01-01
    • 2010-10-07
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2021-08-14
    相关资源
    最近更新 更多