SQL Server 根据文件名称在ERP系统里面获取门店名称

程序代码园发文地址:SQL Server 根据文件名称在ERP系统里面获取门店名称-程序代码园

        在工作中遇到,门店的POS数据需要根据ERP的门店名称导入到系统里面,之前写的导入方法不是很好,复制粘贴的工作量太大了(将回传回来的POS数据文件加上正确的门店名称,中间用特殊标志字段“byq”隔开,虽然已经用批处理的办法批量去修改文件名称,但是复制粘贴的工作量还是很大);还好回传回来的POS数据文件名称上已经有门店名称的关键信息;

       问题描述:

               之前的导入程序,需要提前处理文件上的门店名称,但是工作量太大了(复制,粘贴)

       解决思路:

                利用SQL Server 工具处理,把文件名称批量读取出来后导入数据库里面,结合ERP系统里面的门店信息表,取最相似的门店名称。

       技术要点:

                1、批量获取文件名称

                2、获取相似度最高的方法

                3、文件名称中会有一些多余的数据干扰判断的处理方法

                4、通过文件名称获取相似度最高的方法

                5、循环通过文件名称获取相似度最高的门店名称

                6、批量更新文件名称

         第一步:1、批量获取文件名称

               用批处理的命令,获取文件名称在一个Excel表格里面,代码如下:

               执行批处理的文件:readFileName.bat;处理后的结果放到Excel文件中:readFileName.xls

dir /b>readFileName.xls

         第二步:获取相似度最高的方法

               在数据库里面新建一个方法“FN_Resemble”,用于比较2个字符串的相似度(这里就简认为:字符串1中的字符在字符串2出现的次数,出现的越多越相似,网上参考写法),该方法返回相似度,代码如下:

---两个字段简单相似
ALTER FUNCTION [dbo].[FN_Resemble]
    (@Cloumna NVARCHAR(MAX),
     @Cloumnb NVARCHAR(MAX)
    )
RETURNS FLOAT
AS
BEGIN
    DECLARE @num FLOAT,@len int
    SET @Cloumna=ISNULL(@Cloumna,0)
    SET @Cloumnb=ISNULL(@Cloumnb,0)
    SET @len=1
    SET @num=0
    WHILE(LEN(@Cloumna)<>0 AND LEN(@CloumnB)<>0)
    BEGIN
        WHILE(@len<=LEN(@Cloumna))
        BEGIN
            DECLARE @a NVARCHAR(4)
            SET @a=''
            SET @a=SUBSTRING(@Cloumna,@len,1)
            IF(CHARINDEX(@a,@CloumnB)>0)
            BEGIN
            SET @num=@num+1
            END
        SET  @len=@len+1   
        END
    SET @num=@num*1.0/LEN(@Cloumna)
    BREAK
    END
    
    RETURN @num
END

       第三步:文件名称中会有一些多余的数据干扰判断的处理方法

               在数据库里面新建一个方法“fn_getSimpleFilename”,将文件名称里面干扰获取最高相似度的信息全部处理掉,这里用到的是替换,代码如下:

ALTER FUNCTION [dbo].[fn_getSimpleFilename]
(
	@FileName varchar(200)
	
)
RETURNS varchar(200)
AS
BEGIN
    set @FileName = REPLACE(@FileName, '1', '')
		set @FileName = REPLACE(@FileName, '2', '')
		set @FileName = REPLACE(@FileName, '3', '')
		set @FileName = REPLACE(@FileName, '4', '')
		set @FileName = REPLACE(@FileName, '5', '')
		set @FileName = REPLACE(@FileName, '6', '')
		set @FileName = REPLACE(@FileName, '7', '')
		set @FileName = REPLACE(@FileName, '8', '')
		set @FileName = REPLACE(@FileName, '9', '')
		set @FileName = REPLACE(@FileName, '0', '')

		set @FileName = REPLACE(@FileName, '年', '')
		set @FileName = REPLACE(@FileName, '月', '')
		set @FileName = REPLACE(@FileName, '日', '')
		set @FileName = REPLACE(@FileName, '份', '')
		set @FileName = REPLACE(@FileName, '销量', '')
		set @FileName = REPLACE(@FileName, '集鑫隆', '')
		set @FileName = REPLACE(@FileName, '纸业', '')
		set @FileName = REPLACE(@FileName, '店', '')
		set @FileName = REPLACE(@FileName, '一', '')
		set @FileName = REPLACE(@FileName, '二', '')
		set @FileName = REPLACE(@FileName, '三', '')
		set @FileName = REPLACE(@FileName, '线', '')
		set @FileName = REPLACE(@FileName, '商品', '')
		set @FileName = REPLACE(@FileName, '销售', '')
		set @FileName = REPLACE(@FileName, '汇总', '')
		set @FileName = REPLACE(@FileName, '报表', '')
		set @FileName = REPLACE(@FileName, '毛利', '')
		set @FileName = REPLACE(@FileName, '明细', '')
		set @FileName = REPLACE(@FileName, '超市', '')
		set @FileName = REPLACE(@FileName, '集', '')
		set @FileName = REPLACE(@FileName, '类', '')
		set @FileName = REPLACE(@FileName, '家清', '')
		set @FileName = REPLACE(@FileName, '纸品', '')
		set @FileName = REPLACE(@FileName, '统计', '')
		set @FileName = REPLACE(@FileName, '数据', '')
		set @FileName = REPLACE(@FileName, 'POS', '')
		set @FileName = REPLACE(@FileName, '化妆品', '')

		set @FileName = REPLACE(@FileName, '(', '')
		set @FileName = REPLACE(@FileName, ')', '')
		set @FileName = REPLACE(@FileName, '-', '')
		set @FileName = REPLACE(@FileName, '_', '')
		set @FileName = REPLACE(@FileName, ' ', '')
		

		set @FileName = REPLACE(@FileName, '.xls', '')
		
		set @FileName = REPLACE(@FileName, '.', '')
		
    RETURN @FileName
END

       第四步:通过文件名称获取相似度最高的方法

               在写一个方法“fn_getSimilarity”,通过该方法循环上一步方法将文件名称和ERP门店名称比较,最终获取相似度的门店名称,返回门店名称,代码如下:

-- 获取文件名称和门店名称匹配度最高的

ALTER FUNCTION [dbo].[fn_getSimilarity]
(
	@FileName varchar(200),
	@FDeptName varchar(200)
)
RETURNS varchar(200)
AS
BEGIN
    declare @FCustomerName VARCHAR(200)
		-- 根据分公司取门店名称
    declare  @c_tbd_Customer table(
			id int IDENTITY
			,FCustomerName VARCHAR(200)
			,Similarity float(10)
			
		)
		
		insert into @c_tbd_Customer(FCustomerName)
		select FCustomerName from c_tbd_Customer_ERP where FDeptName = @FDeptName
		
		DECLARE @count int
		select @count = (select count(*) from @c_tbd_Customer)
		-- 获取相似度最高的门店名称
		declare @i int,@FCustName VARCHAR(200),@Similarity float(10)
		set @i = 1
		while @i< @count + 1
		-- 拼接sql
		begin
			set @FCustName = (select FCustomerName from @c_tbd_Customer where id = @i)
			set @Similarity = (SELECT dbo.FN_Resemble(@FileName,@FCustName))
			update @c_tbd_Customer set Similarity = @Similarity where id = @i
			set @i = @i + 1
		end
		
		set @FCustomerName = (select top 1 FCustomerName from @c_tbd_Customer order by Similarity desc)
		
    RETURN @FCustomerName
END

         第五步:循环通过文件名称获取相似度最高的门店名称

               新建一个存储过程,将前面通过批处理获取到的文件导入数据库中,循环执行上一步的方法获取文件名称对应的最高相似度的门店名称,返回每个文件名称对应的最高相似度的门店名称,代码如下:

ALTER PROCEDURE [dbo].[a_jxl_getSimilarity]
	@FDeptName varchar(200)
AS
BEGIN
	set nocount on
		-- 删除无效数据
		delete a_jxl_FileName_FCustomerName where FileName is null
		
		create table #message(
			id int IDENTITY
			, message NVARCHAR (255)
			, flag varchar(255)
		)
		
		create table #a_jxl_FileName_FCustomerName(
			id int IDENTITY
			, FileName NVARCHAR (255)
			, SimpleFilename NVARCHAR (255)
			, FCustomerName NVARCHAR (255)
		)
		
		insert into #a_jxl_FileName_FCustomerName(FileName)
		select FileName from a_jxl_FileName_FCustomerName
		
		DECLARE @count int,@i int,@FileName VARCHAR(200)
		select @count = (select count(*) from a_jxl_FileName_FCustomerName)
		
		-- 获取处理过的文件名称
		declare @SimpleFilename VARCHAR(200)
		set @i = 1
		while @i< @count + 1
		-- 拼接sql
		begin
			set @FileName = (select FileName from #a_jxl_FileName_FCustomerName where id = @i)
			set @SimpleFilename = (SELECT dbo.fn_getSimpleFilename (@FileName))
			update #a_jxl_FileName_FCustomerName set SimpleFilename = @SimpleFilename where id = @i
			set @i = @i + 1
		end
		
		-- 获取相似度最高的客户名称
		

		declare @FCustomerName VARCHAR(200)
		set @i = 1
		while @i< @count + 1
		-- 拼接sql
		begin
			set @SimpleFilename = (select SimpleFilename from #a_jxl_FileName_FCustomerName where id = @i)
			set @FCustomerName = (SELECT dbo.fn_getSimilarity (@SimpleFilename,@FDeptName))
			update #a_jxl_FileName_FCustomerName set FCustomerName = @FCustomerName where id = @i
			set @i = @i + 1
		end
		
		select id	,FileName	,FCustomerName,SimpleFilename	 from #a_jxl_FileName_FCustomerName
		
		delete a_jxl_FileName_FCustomerName
	
		drop table #message
		drop table #a_jxl_FileName_FCustomerName
		
	set nocount off
END

         第六步:批量更新文件名称

               将上一步的结果,文件名称和门店名称,复制粘贴到第一步新建的Excel文件中,写Excel公式形成批处理命令,公式如下:

="ren "&A1&" "&B1&"byq"&A1

               将形成批处理命令,复制粘贴到批处理文件“WrightNewFileName.bat”中,保存,双击执行批处理就可以批量更新文件名称

 程序代码园发文地址:SQL Server 根据文件名称在ERP系统里面获取门店名称-程序代码园 

猜你喜欢

转载自blog.csdn.net/qq_41674785/article/details/130213004