如何在另一个数据表中的数据表上的每个循环

问题描述:

我有一个网络民意调查应用程序,它读取和处理来自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中。它只是一个更新声明。我无法从你的描述中弄清楚你想在这里做什么来给你任何真实的代码。发布表格定义,一些示例数据以及您在此之后所期望的内容将大有帮助。 –

这是不是一个答案,但我想提出这个提示你做一些澄清,这在评论中是不实际的。

首先,接近 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)金额处理意味着再往前走。