私はSQLに比較的慣れていないので、助けを借りることができます。私は自分の目的に近づくのに役立ったが、それを達成するのに役立たなかったコードの断片をまとめました。私の元のデータの要点は次のようになります。
- 製品-Qty_Shipping
- P65238 --- --- --4
- P65236 --- --- --2
- P65240 ---- ---- -3
私が最終的にやりたいことの本質は次のようになります:
- 製品-UCCコード
- P65238 --- 001475010
- P65238 --- 001475011
- P65238 --- 001475012
- P65238 --- 001475013
- P65236 --- 001475014
- P65236 --- 001475015
- P65240 --- 001475016
- P65240 --- 001475017
- P65240 --- 001475018
一意のUCCコード(開始:001475010)は、製品の数量ごとに、すべての出荷に割り当てる必要があります。以下は、注文された製品の総数に基づいて、いくつかの一意のUCCを作成するコードです。
CREATE TABLE #TEMP(UCCs INT)
DECLARE @UCC INT
,@textXML XML
,@data NVARCHAR(MAX)
,@delimiter NVARCHAR(5)
,@ConCatString NVARCHAR(MAX)
,@LoopCounter INT
SET @ConCatString = ''
SET @UCC = 001475009 + 1
SET @LoopCounter = (
SELECT CAST(Q.DSPTOTQTY_0 AS INT)
FROM x3v6prem.PILOTNEW.SDELIVERY Q
WHERE Q.SOHNUM_0 = 'SO1300259')
IF @LoopCounter = 1 GOTO Skip_Loop
Continue_Loop:
SET @ConCatString = @ConCatString + CAST(@UCC AS NVARCHAR(MAX)) + ','
SET @UCC = @UCC + 1
SET @LoopCounter = @LoopCounter -1
IF @LoopCounter > 1 GOTO Continue_Loop
Skip_Loop:
SET @ConCatString = @ConCatString + CAST(@UCC AS NVARCHAR(MAX))
SELECT @data = @ConCatString,
@delimiter = ','
SELECT @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML)
INSERT INTO #TEMP
SELECT T.split.value('.', 'nvarchar(max)') AS data
FROM @textXML.nodes('/d') T(split)
SELECT * FROM #TEMP
DROP TABLE #TEMP
次は、出荷される製品の数量に基づいて製品IDを何度も複製するコードです。最終的に、データは、注文された製品のすべてのボックスに配置され、各ボックスに固有の(バーコード)番号を示す出荷ラベルを作成するために使用されます。
CREATE TABLE #TEMP2(Products NVARCHAR(MAX))
DECLARE @Item2 NVARCHAR(MAX)
,@textXML2 XML
,@data2 NVARCHAR(MAX)
,@delimiter2 NVARCHAR(5)
,@ConCatString2 NVARCHAR(MAX)
,@LoopCounter2 INT
,@LastLine2 INT
DECLARE CC CURSOR LOCAL FAST_FORWARD FOR
SELECT T.ITMREF_0
FROM x3v6prem.PILOTNEW.SDELIVERYD T
WHERE T.SOHNUM_0 = 'SO1300259'
ORDER BY T.SDDLIN_0
OPEN CC
SET @ConCatString2 = ''
SET @LastLine2 = (
SELECT CAST(L.DSPTOTQTY_0 AS INT)
FROM x3v6prem.PILOTNEW.SDELIVERY L
WHERE L.SOHNUM_0 = 'SO1300259')
GetNextItem2:
FETCH NEXT FROM CC INTO @Item2
IF @@FETCH_STATUS <> 0 GOTO EndBothLoops2
SET @LoopCounter2 = (
SELECT CAST(Q.QTY_0 AS INT)
FROM x3v6prem.PILOTNEW.SDELIVERYD Q
WHERE Q.SOHNUM_0 = 'SO1300259' AND Q.ITMREF_0 = @Item2)
Continue_Loop2:
IF @LoopCounter2 = 0 AND @LastLine2 > 1 GOTO GetNextItem2
SET @ConCatString2 = @ConCatString2 + CAST(@Item2 AS NVARCHAR(MAX)) + ','
SET @LoopCounter2 = @LoopCounter2 - 1
SET @LastLine2 = @LastLine2 - 1
IF @LoopCounter2 > 0 AND @LastLine2 > 1 GOTO Continue_Loop2
IF @LoopCounter2 = 0 AND @LastLine2 > 1 GOTO GetNextItem2
SET @ConCatString2 = @ConCatString2 + CAST(@Item2 AS NVARCHAR(MAX))
EndBothLoops2:
CLOSE CC
DEALLOCATE CC
SELECT @data2 = @ConCatString2
,@delimiter2 = ','
SELECT @textXML2 = CAST('<d>' + REPLACE(@data2, @delimiter2, '</d><d>') + '</d>' AS XML)
INSERT INTO #TEMP2
SELECT T.split.value('.', 'nvarchar(max)') AS data
FROM @textXML2.nodes('/d') T(split)
SELECT * FROM #TEMP2
DROP TABLE #TEMP2
2つの別々のテーブルに入れた出力を1つのテーブルにまとめる方法を簡単に理解できれば、問題は解決され、残りを管理できると思います。使用しているXMLコードの実際の経験がないため、作成中のテーブルに複数の列を挿入する方法を識別できません。
その他の小さな問題:先行ゼロを維持する方法でUCC値をフォーマットできないようです