跳至主要內容

工具

chanchaw大约 3 分钟染厂项目vb6

删除执行一半的发货单

本脚本制作于:2023年7月9日。 老版本ERP中新逻辑成品发货单适用客户:月诚、 该新逻辑是:

  1. 打卷表 g_jrkbill.b_fpdid 中保存发货单主表主键
  2. 从打卷明细数据生成发货单过程中不生成成品入库单据

下面代码执行效果:

  1. 清除发货单对应的 g_jrkbill 打卷明细数据在字段 B_FPDID 上标记的发货单主表主键
  2. 删除发货单明细数据、主表数据
  3. 需要重新发货
-- 清除202379日发货一半的垃圾数据,发货单主表主键114995,114996
-- 下面数字填写发货单主表主键
-- 初次制作在月诚
update g_jrkbill set B_FPDID=null where B_FPDID in(114995,114996)
delete from g_billdetailcp where b_id in (114995,114996)
delete from g_billcp where b_id in (114995,114996)

成品发货中途退出删除数据

老版本逻辑中生成成品发货单的过程中要先生成成品入库单,可能会出现中途退出导致已经生成成品入库但是没有生成成品发货,再次制作发货显示没有库存,下面的脚本是将该中间入库的数据删除最终可以再次发货

-- 制作时间:202012716:56:28
-- 根据一系列卡号先查看是否有发货单
-- 然后可以将其对应的成品入库单删除后重新发货
-- 解决生成发货单在中途意外退出导致无法生成发货单
DECLARE @kh VARCHAR(100)
Declare @T1 Table(B_ID int)
SET @kh='19786,19550,19549,19791,19784,19548,19796,19551,19788,19792,19798,19543,19793,19797,19794,19789,19787,19547,19790,19539,19540,19541,19542,19544'


--检查是否有对应的已经生成的成品发货单
select * from G_BillDetailCP where B_BelongItemID IN (
    SELECT B_ItemID FROM G_BillDetailCP WHERE B_BelongItemID IN (
            select G_JRKBill.B_ItemID from G_JRKBill where 1=1 AND B_BCFC IN (
                select B_Value FROM dbo.SplitEx(@kh,',')
            )
    )
)

-- 缓存所有成品入库单主表主键
INSERT INTO @T1
SELECT DISTINCT B_ID FROM G_BillDetailCP WHERE B_BelongItemID IN (
    select G_JRKBill.B_ItemID from G_JRKBill where 1=1 AND B_BCFC IN (
        select B_Value FROM dbo.SplitEx(@kh,',')
    )
)


-- 先删除明细再删除主表
DELETE FROM master.dbo.G_BillDetailCP WHERE B_ID IN (SELECT B_ID FROM @T1)
DELETE FROM master.dbo.G_BillCP WHERE B_ID IN (SELECT B_ID FROM @T1)

创建ENA13标准条码的前面12位

本项目中卡号以9开头,所以下面是硬编码该长度为12的字符串。传入卡号返回条码,依赖了函数 FillRepeat

CREATE FUNCTION [dbo].[usf_buildBarCode12]
(
@number VarChar(12)
)
Returns varchar(12)
as
begin
--2021年4月8日13:29:24
--传入长度小于等于12的数字构成的字符串
--构建并返回以9开头的BC13标准的前面长度为12的字符串

declare @part1 varchar(11)
set @part1 = [dbo].[FillRepeat](@number,11,'0',0)
return '9'+@part1
end

被依赖的函数

USE [CJ_XTServer]
GO
/****** Object:  UserDefinedFunction [dbo].[FillRepeat]    Script Date: 2021/4/8 13:31:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



--函数解释:
--@m_oStr        原始字串
--@m_TNumber     填充需要达到的字串的长度
--@m_FillStr     要填充的字符
--@m_PreOrBack   填充在前或者在后      0为在前,1为在后
ALTER   Function [dbo].[FillRepeat]
(
@m_oStr varchar(100),
@m_TNumber int,
@m_FillStr as varchar(100),
@m_PreOrBack int
)
RETURNS varchar(100)
AS
BEGIN

	Declare @i as int
	Declare @j as int
	Declare @m_Result as varchar(100)
	Declare @m_FillStrs varchar(100)


	set @j=1
	set @m_FillStrs=''
	if len(@m_oStr)>=@m_TNumber
		--如果原始字串的长度大于等于目标长度了,则直接返回原始字串
		BEGIN
			set @m_Result=@m_oStr
		END
	else
		--否则才需要做填充的工作
		BEGIN
			set @i=@m_TNumber-len(@m_oStr)
			while @j<=@i
			BEGIN
				set @m_FillStrs=@m_FillStrs + @m_FillStr
				set @j=@j+1
			END



			if @m_PreOrBack=0
				set @m_Result=@m_FillStrs + @m_oStr
			else
				set @m_Result=@m_oStr + @m_FillStrs

		END
	RETURN @m_Result
END

根据卡号删除计划单品名中的印花

下面存储过程依赖上面的两个函数:FillRepeat 和 usf_buildBarCode12 传入卡号精确查找到对应的计划单,然后修改计划单中的 B_PinMingKH ,将前面自动拼接的“印花”删除掉

create PROC [dbo].[usp_delYHPre]
(
@KH varchar(12)
)
AS
BEGIN
declare @ID int
declare @BC12 varchar(12)
set @BC12 = dbo.usf_buildBarCode12(@KH)
select @ID=B_BIDCJBill from G_CJFlowBill where B_BarCode=@BC12
update g_cjbill set B_PinMingKH = REPLACE(B_PinMingKH,'印花','') where B_ID=@ID

END