2016-08-22 23 views
0

我有一個網絡民意調查應用程序,它讀取和處理來自sql server後端的訂單並插入到windss(jda)中。如何在另一個數據表中的數據表上的每個循環

1)I來自未加工
2)然後我需要的命令分成兩組
在SQL Server表中讀取所有的命令流 - 組1個訂單束試劑盒( 1個爲了與幾個亞目)
- 組2個僅僅是訂單沒有束試劑盒
3)然後每個訂單處理後我需要更新isprocessed SQL字段設置爲1

1)代碼,用於讀取所有訂單

Frmmain.vb

dt = WebDatabase.GetAllOrdersFromDatabase()**'this method is below** 

For Each drow In dt.Rows 
    If CDbl(WinDSSStoreNumber) = 123 Or CDbl(WinDSSStoreNumber) = 124 Then 
    ' Store 123 and 124 = customer service - only orders with qualifying source codes 

我的問題是:

上述每個檢查,如果賣場爲123或124,但現在我要實現的另一個每個循環讀取所有InvoiceHeader_Id然後檢查數據表中的第二個字段,然後檢查它是否有捆綁工具包,如果它沒有,然後處理它並更新數據表中的最後一個isprocessed字段,則不處理任何捆綁工具包的訂單,並且對於那些更新進行處理。請任何幫助慷慨讚賞,請在下面的評論中問我任何問題,然後再標記我的問題。

WebData.vb

Public Function GetAllOrdersFromDatabase() As DataTable 
      DrivePath = "C:\Users\somjething\Documents\files\somefiles\" 
      Dim ds As DataTable = Nothing 
      WinDSS.connectionString = ConfigurationManager.AppSettings("WinDSS_Connection").Replace("%DrivePath%", DrivePath) 
      ds = WinDSS.GetSysMst() 

      If ds.Rows.Count > 0 Then 
       WinDSSStoreNumber = ds.Rows(0)("store_no") 

      End If 
      Dim dt As New DataTable() 
      Dim conn As New SqlConnection(ConfigurationManager.AppSettings("WebData_Connection") & ConfigurationManager.AppSettings("WebDataSource")) 
      Dim cmd As SqlCommand 
      Dim da As New SqlDataAdapter 
      conn.Open() 
      cmd = conn.CreateCommand() 
      cmd.CommandType = CommandType.Text 
     cmd.CommandText= SELECT InvoiceDetail_Id, InvoiceHeader_Id, ActualFreightCharge, AmountCollected, 
     ChargedActualFreight, CollectedExternally, CollectedThroughAR, DateInvoiced, InvoiceNo, 
     InvoiceType, LineSubTotal, MasterInvoiceNo, OrderInvoiceKey, Reference1, TotalAmount, 
     TotalTax, isprocessed, storetoprocess 
      FROM dbo.InvoiceHeader 
     WHERE (isprocessed = 0) AND (storetoprocess = N'123') 
    da.SelectCommand = cmd 
     da.Fill(dt) 
     conn.Close() 

     Return dt 
    End Function 

Additoinal信息

這是我的經理給我的信息:

循環throught下面每個

SELECT InvoiceDetail_Id, InvoiceHeader_Id, ActualFreightCharge, AmountCollected, 
ChargedActualFreight, CollectedExternally, CollectedThroughAR, DateInvoiced, InvoiceNo, 
InvoiceType, LineSubTotal, MasterInvoiceNo, OrderInvoiceKey, Reference1, TotalAmount, 
TotalTax, isprocessed, storetoprocess 
FROM dbo.InvoiceHeader WHERE (isprocessed = 0) AND (storetoprocess = N'195') 

使用以上InvoiceHeader_Id爲l完成所有訂單信息。處理每個包(包/)

SELECT InvoiceHeader_Id, LineDetails_Id, LineDetail_Id, OrderLine_Id, GiftFlag, [References], 
GiftWrap, IsBundleParent, KitCode, KitQty, LevelOfService, LineSeqNo, LineType, 
MaxLineStatus, MaxLineStatusDesc, MinLineStatus, MinLineStatusDesc, MinShipByDate, 
OpenQty, OrderHeaderKey, OrderLineKey, OrderedQty, OriginalOrderedQty, OtherCharges, 
OverallStatus, PipelineKey, PrimeLineNo, ReceivingNode, RemainingQty, ReqCancelDate, 
ReqDeliveryDate, 
ReqShipDate, SCAC, ScacAndService, ScacAndServiceKey, ShipNode, ShipToID, ShipToKey, 
StatusQuantity, SubLineNo, SubstituteItemID, isprocessed 
FROM dbo.OrderLine 
WHERE (isprocessed = 0) AND (InvoiceHeader_Id = 13) AND (IsBundleParent = 'Y') 
ORDER BY PrimeLineNo, SubLineNo 

對於低於上述列表查詢的每個記錄,並添加作爲零(0)美元金額。成本與上述記錄的信息相關聯(您可能需要查詢表格以獲取值) 從上述記錄中獲取OrderLineKey,並在下面查詢以獲取關聯的子項目。

SELECT TOP (100) PERCENT dbo.BundleParentLine.InvoiceHeader_Id AS BPL_InvoiceHeader_Id, 
dbo.BundleParentLine.LineDetails_Id AS BPL_LineDetails_Id, dbo.BundleParentLine.LineDetail_Id AS BPL_LineDetail_Id, dbo.BundleParentLine.OrderLine_Id AS BPL_OrderLine_Id, dbo.BundleParentLine.BundleParentLine_id, dbo.BundleParentLine.SubLineNo AS BPL_SubLineNo, dbo.BundleParentLine.PrimeLineNo AS BPL_PrimeLineNo, dbo.BundleParentLine.OrderLineKey AS BPL_OrderLineKey, dbo.OrderLine.* 
FROM dbo.BundleParentLine INNER JOIN dbo.OrderLine ON dbo.BundleParentLine.OrderLine_Id = dbo.OrderLine.OrderLine_Id AND dbo.BundleParentLine.LineDetail_Id = dbo.OrderLine.LineDetail_Id AND dbo.BundleParentLine.LineDetails_Id = dbo.OrderLine.LineDetails_Id AND dbo.BundleParentLine.InvoiceHeader_Id = dbo.OrderLine.InvoiceHeader_Id 
WHERE (dbo.BundleParentLine.OrderLineKey = N'76873264832') AND (dbo.BundleParentLine.InvoiceHeader_Id = 13) AND (dbo.BundleParentLine.LineDetails_Id = 6) AND (dbo.OrderLine.isprocessed = 0) 
ORDER BY BPL_PrimeLineNo, BPL_SubLineNo 

處理之後,設置isprocessed = 1

使用上述InvoiceHeader_Id循環throught所有的加工

SELECT InvoiceHeader_Id, LineDetails_Id, LineDetail_Id, OrderLine_Id, GiftFlag, [References], 
GiftWrap, IsBundleParent, KitCode, KitQty, LevelOfService, LineSeqNo, 
LineType, 
MaxLineStatus, MaxLineStatusDesc, MinLineStatus, MinLineStatusDesc, MinShipByDate, 
OpenQty, OrderHeaderKey, OrderLineKey, OrderedQty, 
    OriginalOrderedQty, 
OtherCharges, OverallStatus, PipelineKey, PrimeLineNo, ReceivingNode, RemainingQty, 
ReqCancelDate, ReqDeliveryDate, ReqShipDate, SCAC, 
ScacAndService, 
ScacAndServiceKey, ShipNode, ShipToID, ShipToKey, StatusQuantity, 
SubLineNo, SubstituteItemID, isprocessed 
FROM dbo.OrderLine 
WHERE (isprocessed = 0) AND (InvoiceHeader_Id = 13) AND (IsBundleParent <> 'Y') 
ORDER BY PrimeLineNo, SubLineNo 

後的順序信息,設置isprocessed = 1

+0

你真的需要開始思考。你所描述的聽起來很像我的一個更新聲明。沒有必要通過痛苦的行循環這一行。只需使用Where謂詞更新所需的行。 –

+0

@SeanLange集實際上是有道理的,但我將如何在上述情況下使用它?我將所有的訂單都放到了一個數據表中,所以我現在怎麼才能將bundlekit和non-bundle工具包分解成集合,我有兩個查詢條件都設置了where條件,但我不知道如何從數據表中篩選。 – CodeMan

+2

從你所描述的你不需要將這些數據放入dotnet中。它只是一個更新聲明。我無法從你的描述中弄清楚你想在這裏做什麼來給你任何真實的代碼。發佈表格定義,一些示例數據以及您在此之後所期望的內容將大有幫助。 –

回答

0

這是不是一個答案,但我想提出這個提示你做一些澄清,這在評論中是不實際的。

首先,接近 Visual Studio和打開SQL Server Management Studio並連接到數據庫

我們將建立一些select語句來獲取數據回來,然後我們可以想想UPDATE語句

您發佈的第一個查詢會爲您提供商店195的未處理標題(直接來自您的帖子)。我不知道你是否想爲所有商店做這件事。將其粘貼到SSMS並運行它

SELECT H.* 
FROM dbo.InvoiceHeader H 
WHERE H.isprocessed = 0 AND H.storetoprocess = N'195' 

現在,這第二個查詢爲您提供未處理的行鍼對頭部有IsBundleParent =「Y」。

看!沒有循環!

SELECT H.*, L.* 
FROM dbo.InvoiceHeader H 
INNER JOIN 
dbo.OrderLine L 
ON L.InvoiceHeader_Id = H.InvoiceHeader_Id 
WHERE H.isprocessed = 0 AND H.storetoprocess = N'195' 
AND L.isprocessed = 0 AND L.IsBundleParent = 'Y' 

然後在你的解釋,你有對於低於上述列表查詢每個記錄,並添加零(0),這是沒有意義的,我金額所以也許你可以澄清

現在我們將添加第三個查詢中增加了BundleParentLine(它確實有它的內部連接了,但是這是一個非常奇怪的連接字段列表)

SELECT H.*, L.*, BPL.* 
FROM dbo.InvoiceHeader H 
INNER JOIN 
dbo.OrderLine L 
ON L.InvoiceHeader_Id = H.InvoiceHeader_Id 
INNER JOIN 
dbo.BundleParentLine BPL 
ON BPL.OrderLine_Id = L.OrderLine_Id 
AND BPL.LineDetail_Id = L.LineDetail_Id 
AND BPL.LineDetails_Id = L.LineDetails_Id 
AND BPL.InvoiceHeader_Id = L.InvoiceHeader_Id  
WHERE H.isprocessed = 0 AND H.storetoprocess = N'195' 
AND L.isprocessed = 0 AND L.IsBundleParent = 'Y' 

然後在你的解釋,你有P上之後rocessed,set isprocessed = 1,但是這裏的'處理'是什麼?它只是將它設置爲在表格中處理?

要做到這一點,你只需寫一條UPDATE聲明。這裏有一種方法來更新頭部信息(不要運行它,直到我們明白你想要做什麼爲止)。這裏的問題是您想要設置同時處理的標題和行嗎?

UPDATE InvoiceHeader 
SET Processed = 1 
WHERE isprocessed = 0 AND storetoprocess = N'195' 

你有第四個查詢似乎佔IsBundleParent <> 'Y'情況

再次,我們需要知道什麼加零(0)金額處理意味着再往前走。

相關問題