Вопрос:

как сделать для каждого цикла в таблице данных в другой таблицы данных

sql-server vb.net foreach datatable

91 просмотра

1 ответ

68 Репутация автора

У меня есть приложение для веб-опроса, которое читает и обрабатывает заказы с сервера SQL Server и вставляет в windss (jda).

поток

1) Я прочитал все заказы из таблиц sql server, которые не были обработаны.
2) Затем мне нужно разделить заказы на два набора
- установить 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, что второе поле в datatable, а затем проверяет, есть ли у него комплект комплекта или нет, если он затем обрабатывает он и обновляет поле isprocessed, второе за последним в datatable, иначе обрабатывает заказы без какого-либо комплекта комплекта, и обновление также обрабатывается для них. пожалуйста, любая помощь приветствуется, пожалуйста, задавайте мне любые вопросы в комментариях ниже, прежде чем пометить мой вопрос вниз.

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

Дополнительная информация

Это информация, предоставленная мне моим менеджером:

цикл через каждый ниже

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 для циклического прохождения всей информации о заказе. Обработать каждый комплект (комплект /)

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, чтобы зациклить всю информацию о заказе

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

Автор: CodeMan Источник Размещён: 22.08.2016 08:40

Ответы (1)


0 плюса

12817 Репутация автора

Это не ответ, но я хочу изложить это, чтобы попросить вас дать некоторые разъяснения, и это не практично в комментариях.

Сначала закройте 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'

Затем, в своем объяснении у вас есть After Processed, установите isprocessed = 1 , но что здесь «обрабатывается»? Это просто установка его для обработки в таблице?

Для этого вы просто пишете UPDATEзаявление. Вот один из способов сделать это, чтобы обновить только заголовок (не запускайте его, пока мы не поймем, что вы пытаетесь сделать). Проблема в том, что вы хотите, чтобы заголовок и строка обрабатывались одновременно?

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

Четвертый запрос, который у вас есть, кажется, объясняет IsBundleParent <> 'Y'случай

Опять же, нам нужно знать, что добавить в виде нулевой (0) долларовой суммы и обработанных средств, чтобы идти дальше.

Автор: Nick.McDermaid Размещён: 23.08.2016 01:48
Вопросы из категории :
32x32