我想知道是否有人可以帮助我与下面的任何或全部代码。我已经完成了它的工作,但对我来说似乎效率低下,可能比最优慢。是否有更高效/优雅的方式来编写我的代码?
这个代码在首位的必要性一些基本的背景:
我有不包括相应的发票号发货记录的表。我已经浏览了所有桌子,并继续这样做。事实上,只有今天早上,我发现如果已经产生装箱单,我可以通过装箱单ID将装运台连接到装箱单并从那里获取发票号码。然而,如果没有这种联系,我不得不猜测。在大多数情况下,这不是非常困难,因为发票表的号码,行和发行版可以匹配。但是,如果有多个货件用于号码,行和发行(例如,当一条线部分发货时),那么可以有多个答案,其中只有一个是正确的。我的部分帮助是通过发货表中的一列来说明该号码,行号和发行日期的顺序是什么,但仍然有些情况下我用于“猜测”的过程可能有些模棱两可。
我的程序是做什么的。首先,它会创建一个包含发票号码的数据表,如果有包裹单连接它的话。
接下来,它会将所有数据转储到第二个表中,这次使用 - 仅当发票在第一个表中为NULL时 - 基于对所有运输记录进行分区的发票号的“猜测”数字,行,发布,日期顺序和日期,然后将其与发票表的相同类型的东西进行比较,并尝试按日期排列所有内容。
最后,它通过该表解析并找到最后一个空值,并将它们与该号码,行和释放的任何发票的第一条记录进行基本匹配。
这两个猜测都添加了字符来表明他们实际上是在猜测。
IF OBJECT_ID('tempdb..#cosTAble') IS NOT NULL
DROP TABLE #cosTable
DECLARE @cosTable2 TABLE (
ID INT IDENTITY
,co_num CoNumType
,co_line CoLineType
,co_release CoReleaseType
,date_seq DateSeqType
,ship_date DateType
,inv_num NVARCHAR(14)
)
DECLARE
@co_num_ck CoNumType
,@co_line_ck CoLineType
,@co_release_ck CoReleaseType
DECLARE @Counter1 INT = 0
SELECT cos.co_num, cos.co_line, cos.co_release, cos.date_seq, cos.ship_date, cos.qty_invoiced, pck.inv_num
INTO #cosTable
FROM co_ship cos
LEFT JOIN pckitem pck
ON cos.pack_num = pck.pack_num
AND cos.co_num = pck.co_num
AND cos.co_line = pck.co_line
AND cos.co_release = pck.co_release
;WITH cos_Order
AS(
SELECT co_num, co_line, co_release, qty_invoiced, date_seq, ship_date, ROW_NUMBER() OVER (PARTITION BY co_num, co_line, co_release ORDER BY ship_date) AS cosrow
FROM co_ship
WHERE qty_invoiced > 0
),
invi_Order
AS(
SELECT inv_num, co_num, co_line, co_release, ROW_NUMBER() OVER (PARTITION BY co_num, co_line, co_release ORDER BY RecordDate) AS invirow
FROM inv_item
WHERE qty_invoiced > 0
),
cos_invi
AS(
SELECT cosO.*, inviO.inv_num
FROM cos_Order cosO
LEFT JOIN invi_Order inviO
ON cosO.co_num = inviO.co_num AND cosO.co_line = inviO.co_line AND cosO.cosrow = inviO.invirow)
INSERT INTO @cosTable2
SELECT cosT.co_num, cosT.co_line, cosT.co_release, cosT.date_seq, cosT.ship_date, COALESCE(cosT.inv_num,'*'+cosi.inv_num) AS inv_num
FROM #cosTable cosT
LEFT JOIN cos_invi cosi
ON cosT.co_num = cosi.co_num
AND cosT.co_line = cosi.co_line
AND cosT.co_release = cosi.co_release
AND cosT.date_seq = cosi.date_seq
AND cosT.ship_date = cosi.ship_date
WHILE @Counter1 < (SELECT MAX(ID) FROM @cosTable2) BEGIN
SET @Counter1 += 1
SET @co_num_ck = (SELECT co_num FROM @cosTable2 WHERE ID = @Counter1)
SET @co_line_ck = (SELECT co_line FROM @cosTable2 WHERE ID = @Counter1)
SET @co_release_ck = (SELECT co_release FROM @cosTable2 WHERE ID = @Counter1)
IF EXISTS (SELECT * FROM @cosTable2 WHERE ID = @Counter1 AND inv_num IS NULL)
UPDATE @cosTable2
SET inv_num = '^' + (SELECT TOP 1 inv_num FROM @cosTable2 WHERE
@co_num_ck = co_num AND
@co_line_ck = co_line AND
@co_release_ck = co_release)
WHERE ID = @Counter1 AND inv_num IS NULL
END
SELECT * FROM @cosTable2
ORDER BY co_num, co_line, co_release, date_seq, ship_date
我会怀疑他的问题是不正确使用FK约束和数据定义的直接结果。如果发票的装箱单中有FK,并且装箱单ID是必需的,则只有在与装箱单相关后才能创建发票。他应该试图解决为什么这种情况不存在的问题。然而,即便如此,您仍然需要识别这些目前搞砸的记录并修复它们。但那是一次性修复。 – HLGEM