0

私は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値をフォーマットできないようです

4

1 に答える 1

0

まるで自分の問題を解決できたかのようです。IDENTITY キーワードを使用して、作成したテーブルに 2 番目のフィールドを追加することができました。この時点で、なぜこのフィールドを追加できたのか、他のフィールドを追加できなかったのかはまだわかりませんが、受け入れます! 私が書いたコードはまだひどく非効率的である可能性が高いので、誰かがコードをより良く実行するのを手伝ってくれるなら、私は大いに感謝します! ありがとう!!

于 2013-03-25T14:46:14.507 に答える