SQL Server 中的电子发票二维码 TLV Base64 字符串 |扎特卡 |税务发票 |沙特

E-Invoice QR Code TLV Base64 string in SQL Server | ZATCA | Tax Invoice | KSA

提问人:Haseeb 提问时间:3/23/2022 更新时间:7/7/2022 访问量:1689

问:

#e-Invoice #Tax-Invoice #KSA-Invoice #SQL-Server-E-Invoice #ZATCA

如何在 SQL Server 中生成 TLV based64 字符串?下面的代码在 C# 中运行良好,但在我的情况下,我需要在 SQL Server 中生成相同的字符串。

有一种方法可以解决,我可以在 SQL 过程中使用 DLL/COM 在 SQL Server 进程之外运行基于 DLL 的 COM 对象,但由于安全问题和其他问题而避免这种情况。

基本上,在SQL中转换的两种方法

  1. public String ConvertBase64(String sellername, String vatregistration, String timestamp, string invoiceamount,String vatamoun)

  2. public byte[] ConvertTLV(String tagnums, String tagvalue)

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        public String GenerateAndGetString()
        {
    
            var sellername = " حسيب احمد";
            var vatregistration = "810866391234567";
            var timestamp = "2020-03-22 10:16:14";
            var invoiceamount = "1000.00";
            var vatamoun = "150.00";
    
            return ConvertBase64(sellername, vatregistration, timestamp, invoiceamount, vatamoun);
        }
    
        public String ConvertBase64(String sellername, String vatregistration, String timestamp, String invoiceamount,
            String vatamoun)
        {
            string ltr = ((char)0x200E).ToString();
            var seller = ConvertTLV("1", sellername);
            var vatno = ConvertTLV("2", vatregistration);
            var time = ConvertTLV("3", timestamp);
            var invamt = ConvertTLV("4", invoiceamount);
            var vatamt = ConvertTLV("5", vatamoun);
            var result = seller.Concat(vatno).Concat(time).Concat(invamt).Concat(vatamt).ToArray();
            Console.WriteLine(result);
            Console.WriteLine(result.ToString());
            var output = Convert.ToBase64String(result);
            Console.WriteLine(output);
            return output;
        }
    
    
    
        public byte[] ConvertTLV(String tagnums, String tagvalue)
        {
            string[] tagnums_array = { tagnums };
            var tagvalue1 = tagvalue;
            var tagnum = tagnums_array.Select(s => Byte.Parse(s)).ToArray();
            var tagvalueb = System.Text.Encoding.UTF8.GetBytes(tagvalue1);
            string[] taglengths = { tagvalueb.Length.ToString() };
            var tagvaluelengths = taglengths.Select(s => Byte.Parse(s)).ToArray();
            var tlvVAlue = tagnum.Concat(tagvaluelengths).Concat(tagvalueb).ToArray();
    
    
            return tlvVAlue;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            //GENEARING AND GETTING OUTPUT STRING HERE
            textBox1.Text=GenerateAndGetString();
        }
    }
    
sql 二维码 sql-server-2019 TLV

评论


答:

1赞 Mohammad Alfateh 7/7/2022 #1

我在SQL Server中制作了这个解决方案: -- ************************************************************************************

Begin Try  Drop FUNCTION StringToBase64_Func End Try Begin Catch End Catch 
Go --xxxxx

CREATE FUNCTION StringToBase64_Func(@InputString VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) AS
BEGIN
  RETURN (
    SELECT CAST(@InputString as varbinary(max)) FOR XML PATH(''), BINARY BASE64 
  ) 
END

Go --xxxxx
-- ************************************************************************************

IF exists (select [name] from sysobjects Where [name] = 'SalesTaxVio') BEGIN  Drop View SalesTaxVio END 
Go --xxxxx

Create View SalesTaxVio As 

Select H.*, CONVERT(varchar(250), CN.SValue) As CompanyName, CONVERT(varchar(250), TN.SValue) As CompanyTaxNumber, 
       CONVERT(varchar(50), CONVERT(datetime, CONVERT(date, H.TrxDate)) + CONVERT(datetime, CONVERT(time, IsNull(H.TrxTime, 0))), 127) As TrxDateTime, 
       CONVERT(varchar(50), H.TrxAmount) As TrxAmountStr, CONVERT(varchar(50), H.TaxValue) As TaxValueStr 
From   saTrxHeader H 
  LEFT OUTER JOIN Settings CN on CN.SName = 'CompanyName' 
  LEFT OUTER JOIN Settings TN on TN.SName = 'CompanyTaxNumber' 

Go --xxxxx
-- ************************************************************************************

IF exists (select [name] from sysobjects Where [name] = 'saTrxHeaderTaxVio') BEGIN  Drop View saTrxHeaderTaxVio END 
Go --xxxxx

Create View saTrxHeaderTaxVio As 

Select H.*, 
       dbo.StringToBase64_Func(CONVERT(varbinary(1564), 
       '01' + convert(nvarchar, convert(varbinary(1), Len(H.CompanyName       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.CompanyName       ), 2) + 
       '02' + convert(nvarchar, convert(varbinary(1), Len(H.CompanyTaxNumber  )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.CompanyTaxNumber  ), 2) + 
       '03' + convert(nvarchar, convert(varbinary(1), Len(H.TrxDateTime       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TrxDateTime       ), 2) + 
       '04' + convert(nvarchar, convert(varbinary(1), Len(H.TrxAmountStr      )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TrxAmountStr      ), 2) + 
       '05' + convert(nvarchar, convert(varbinary(1), Len(H.TaxValueStr       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TaxValueStr       ), 2) 
       , 2)) As TaxQRCode 
From   SalesTaxVio H 

Go --xxxxx
-- ************************************************************************************

但仅适用于公司名称中的拉丁字符。 如果公司名称包含阿拉伯字符,则不起作用。

评论

0赞 Haseeb 2/11/2023
由于脚本中的表名“saTrxHeader”无效,无法执行。请更新它谢谢
0赞 Mohammad Alfateh 2/27/2023
@Haseeb确定这不会运行,您必须创建具有适当列的“saTrxHeader”表。此表包含发票信息。