工具
大约 3 分钟染厂项目vb6
删除执行一半的发货单
本脚本制作于:2023年7月9日。 老版本ERP中新逻辑成品发货单适用客户:月诚、 该新逻辑是:
- 打卷表 g_jrkbill.b_fpdid 中保存发货单主表主键
- 从打卷明细数据生成发货单过程中不生成成品入库单据
下面代码执行效果:
- 清除发货单对应的 g_jrkbill 打卷明细数据在字段 B_FPDID 上标记的发货单主表主键
- 删除发货单明细数据、主表数据
- 需要重新发货
-- 清除2023年7月9日发货一半的垃圾数据,发货单主表主键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)
成品发货中途退出删除数据
老版本逻辑中生成成品发货单的过程中要先生成成品入库单,可能会出现中途退出导致已经生成成品入库但是没有生成成品发货,再次制作发货显示没有库存,下面的脚本是将该中间入库的数据删除最终可以再次发货
-- 制作时间:2020年12月7日 16: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
