hareshdgr8 Ответов: 2

Как получить расчет запасов самым быстрым способом в VB.NET


Как получить расчет запасов самым быстрым способом в vb.net

Привет мне нужно найти самый быстрый способ расчета запасов,
моя формула такова

Stock = Opening Stock + PURCHASE STOCK - OUTGOING STOCK + CREDIT NOTE STOCK - DEBIT NOTE STOCK

в то время как один элемент он приходит быстро но с несколькими элементами это займет слишком много времени


Мой бэкэнд-это SQL SERVER 2012, а фронтэнд-это VB.NET

Пожалуйста ответьте
заранее спасибо

Что я уже пробовал:

Я просто использовал

Сначала я запускаю запрос из продукта, в котором я получаю данные из diff. таблица сравнения, как покупки , счета, кредит-ноты , Дебет нота И все
но это занимает слишком много времени если элемент равен 50 то только это занимает время пожалуйста предложите мне применить индекс также и ко всей таблице


Мой код код

sqlSelect.CommandText = "Select Opening_Stock,ProdId from Product_tbl"
    adp.SelectCommand = sqlSelect
    adp.Fill(ds, "PrdList")

    While i <= ds.Tables("PrdList").Rows.Count - 1
        strCate = ""
        strSubCate = ""
        iStock = 0
        iGRN = 0
        iOrdQty = 0
        iCrd = 0
        iDbt = 0
        iWrkStock = 0
        iOrdWorkQty = 0
        iOpn = 0
        iIncStock = 0


        iStockTransFrom = 0
        iStockTransTo = 0
        iAssem = 0
        iAssemOth = 0
        iShortFall = 0


strProdId = (ds.Tables("PrdList").Rows(i).Item("Prod_Id").ToString)

        iOpn = Val(ds.Tables("PrdList").Rows(i).Item("Opening_Stock").ToString)


        sqlSelectInnr.CommandText = "Select ISNULL(SUM(Qty),0) as GRNQty from GRNTable where GRN_Type='Local' and Prod_Id=" & strProdId
        dtAdtInnr.SelectCommand = sqlSelectInnr
        dtAdtInnr.Fill(dtStInnr, "GRN_Stock")
        If dtStInnr.Tables("GRN_Stock").Rows.Count - 1 >= 0 Then
            iGRN = Val(dtStInnr.Tables("GRN_Stock").Rows(0).Item("GRNQty").ToString)
        End If
        dtStInnr.Tables("GRN_Stock").Rows.Clear()



        sqlSelectInnr.CommandText = "select ISNULL(SUM(Qty_FullFill),0) as Qty from Order_tbl where Prod_Id=" & strProdId & ""

        dtAdtInnr.SelectCommand = sqlSelectInnr
        dtAdtInnr.Fill(dtStInnr, "Ord_Dtls")
        If dtStInnr.Tables("Ord_Dtls").Rows.Count - 1 >= 0 Then
            iOrdQty = Val(dtStInnr.Tables("Ord_Dtls").Rows(0).Item("Qty").ToString)
        End If
        dtStInnr.Tables("Ord_Dtls").Rows.Clear()



        sqlSelectInnr.CommandText = "Select ISNULL(SUM(Qty),0) as CrdQty from CrditNote_tb where Prod_Id=" & strProdId
        dtAdtInnr.SelectCommand = sqlSelectInnr
        dtAdtInnr.Fill(dtStInnr, "Crd_Dtls")
        If dtStInnr.Tables("Crd_Dtls").Rows.Count - 1 >= 0 Then
            iCrd = Val(dtStInnr.Tables("Crd_Dtls").Rows(0).Item("CrdQty").ToString)
            End If
        dtStInnr.Tables("Crd_Dtls").Rows.Clear()

        sqlSelectInnr.CommandText = "Select ISNULL(SUM(Qty),0) as DbtQty from DebitNote_tb where Prod_Id=" & strProdId
        dtAdtInnr.SelectCommand = sqlSelectInnr
        dtAdtInnr.Fill(dtStInnr, "Dbt_Dtls")
        If dtStInnr.Tables("Dbt_Dtls").Rows.Count - 1 >= 0 Then
            iDbt = Val(dtStInnr.Tables("Dbt_Dtls").Rows(0).Item("DbtQty").ToString)
            End If
        dtStInnr.Tables("Dbt_Dtls").Rows.Clear()





        iStock = iOpn + iGRN - iOrdQty + iCrd - iDbt

        If iStock < 0 Then
            iStock = 0

            End If

        dgvData.Rows.Add(strProdId, ds.Tables("PrdList").Rows(i).Item("Prod_Name").ToString, iStock) ',  strItemType, ds.Tables("PrdList").Rows(i).Item("HSN_Code").ToString, strCate, ds.Tables("PrdList").Rows(i).Item("Location_Name").ToString, ds.Tables("PrdList").Rows(i).Item("Rack_No").ToString, ds.Tables("PrdList").Rows(i).Item("Tax3_Per").ToString, Val(ds.Tables("PrdList").Rows(i).Item("WQty").ToString), Val(ds.Tables("PrdList").Rows(i).Item("MIQ").ToString), iWrkStock, iIncStock, ds.Tables("PrdList").Rows(i).Item("Product_Description").ToString)

            k += 1


        i += 1
    End While

    ds.Tables("PrdList").Rows.Clear()

Richard MacCutchan

Пожалуйста, отредактируйте свой вопрос и покажите код, который вызывает проблему. Никто не может догадаться, что делает ваша программа.

hareshdgr8

хорошо сэр

Patrice T

"в то время как один элемент он приходит быстро, но с несколькими элементами это займет слишком много времени"
Определите "быстро" и "слишком много времени".

Patrice T

Кстати, структура базы данных, отношения и индексы тоже имеют значение

2 Ответов

Рейтинг:
5

MadMyche

Прежде всего: ваш код восприимчив к SQL-инъекциям. Уже освещено в других ответах, поэтому я не буду пересказывать.

Во-вторых, ваш VB-код слишком много болтает с SQL-сервером; вам нужно сократить количество SQL-команд, которые вы выполняете спина к спине

Третья вещь в этом списке-это рекомендация проверить ваши схемы баз данных; интересующие вас пункты таковы: INDEXЭс, были ли они созданы и есть ли вы индексирование правильные вещи относительно этого запроса.

А теперь о моих рекомендациях
Прекратите работу над этим блоком кода в Visual Studio. Установите среду Sql Server Management Studio и используйте в ней такие инструменты, как Включить Действительный План Выполнения ; чтобы точно настроить запросы и посмотреть, какая индексная работа должна быть выполнена.
Вы также можете провести некоторые исследования по использованию присоединяетсяподзапросы совместно, чтобы увидеть, что нужно сделать, чтобы использовать это. И ваш набор запросов может быть выполнен таким образом.

Как только вы решите свои проблемы с запросами, я бы поместил все запросы в 1 хранимая процедура Это позволит скомпилировать все запросы в один план выполнения и оптимизировать их один раз - что ускорит выполнение пакета и потребует только одного вызова из VB, что сократит количество разговоров между серверами.
Я не собираюсь переписывать все это для вас, так как у меня нет ваших схем, и это то, что вы должны узнать через исследования и работу с инструментами. Но вы можете в конечном итоге получить что-то вроде этого (что просто может сработать для вас как есть)

CREATE PROCEDURE dbo.AggregateValues (
   @ProdID NVARCHAR(16)
) AS
BEGIN
    SELECT p.ProdID
         , GRNQty   = ISNULL(SUM(g.Qty),0)
         , Qty      = ISNULL(SUM(o.Qty_FullFill)
         , CrdQty   = ISNULL(SUM(c.Qty),0)
         , DbtQty   = ISNULL(SUM(d.Qty),0)
   FROM (SELECT ProdID = @ProdID) p
   LEFT OUTER JOIN GRNTable      g ON p.ProdID = g.Prod_ID AND g.GRN_Type='Local'
   LEFT OUTER JOIN Order_tbl     o ON p.ProdID = o.Prod_ID
   LEFT OUTER JOIN CrditNote_tb  c ON p.ProdID = c.Prod_ID
   LEFT OUTER JOIN DebitNote_tb  d ON p.ProdID = d.Prod_ID
END
GO
Естественно, вам придется переделать свой VB, чтобы приспособиться к этому изменению
Вот основы вызова этой новой хранимой процедуры, и она находится в C#, так что вам нужно будет перекодировать ее в VB, но это должно помочь вам понять, что происходит; и это в основном просторечные изменения, так что это должно быть относительно легко. Примите к сведению cmd.Parameters.Add... строка, поскольку это правильный способ добавления переменных в команду SQL для смягчения уязвимости SQL-инъекции
SqlCommand cmd = new SqlCommand("AggregateValues", connection);
cmd.CommandType =  CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@ProdID", strProdId);

SqlDataReader dr = cmd.ExecuteReader();
if ((dr != null) && (dr.Rows.Count > 0)) {
  // retrieve values from "dr" and put where you need them


Maciej Los

5ed!
[править]сделано[/правка]

hareshdgr8

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

Рейтинг:
0

Maciej Los

На первый взгляд - слишком много отборных запросов!

sqlSelectInnr.CommandText = "Select ISNULL(SUM(Qty),0) as GRNQty from GRNTable where GRN_Type='Local' and Prod_Id=" & strProdId
'...
sqlSelectInnr.CommandText = "select ISNULL(SUM(Qty_FullFill),0) as Qty from Order_tbl where Prod_Id=" & strProdId & ""
'...
sqlSelectInnr.CommandText = "Select ISNULL(SUM(Qty),0) as CrdQty from CrditNote_tb where Prod_Id=" & strProdId
'...
sqlSelectInnr.CommandText = "Select ISNULL(SUM(Qty),0) as DbtQty from DebitNote_tb where Prod_Id=" & strProdId
'...


Я бы настоятельно рекомендовал использовать Присоединяется[^]. Для получения более подробной информации, пожалуйста, прочтите это: Визуальное представление SQL-соединений[^]

SELECT ISNULL(SUM(G.Qty),0) as GRNQty, ISNULL(SUM(O.Qty_FullFill),0) as Qty, ISNULL(SUM(C.Qty),0) as CrdQty, ISNULL(SUM(D.Qty),0) as DbtQty
FROM GRNTable AS G
    INNER JOIN Order_tbl AS O ON O.Prod_Id = G.Prod_Id
    INNER JOIN CrditNote_tb AS C.Prod_Id = G.Prod_Id
    INNER JOIN DebitNote_tb AS D.Prod_Id = G.Prod_Id
WHERE G.GRN_Type='Local' and G.Prod_Id=@prodid


Вам, вероятно, понадобится использовать Группировка по заявлениям[^].

Я должен предупредить вас об этом. SqlInjection[^].
Вместо того, чтобы конкатенировать строки, вы должны использовать параметризованный запрос[^]!

Ниже приведен пример OleDb.
Try
    Dim sConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=DatabaseName.accdb;Persist Security Info =False;"
    Dim oRdr As OleDbDataReader
    Dim dt As DataTable = New DataTable()
    Dim empIdToFind As Integer = 111

    Using oConn As OleDbConnection = New OleDbConnection(sConn)
        oConn.Open()
        Using oComm AS OleDbCommand = New OleDbCommand()
            oComm.Connection = oConn
            oComm.CommandType = CommandType.Text
            oComm.CommandText =  "SELECT * FROM EmployeeTbl WHERE EmpId=@empid;"
            oComm.Parameters.AddWithValue("@empid", empIdToFind)
            oComm.ExecuteNonQuery()
            oRdr = oComm.ExecuteReader()
            dt.Load(oRdr)
        End Using
        oConn.Close()
    End Using

    dt.Dump()

Catch ex As OleDbException
    Console.WriteLine(ex.Message)

Catch ex As Exception
    Console.WriteLine(ex.Message)

End Try


Удачи вам!


hareshdgr8

сэр не может использовать join, потому что в какой-то момент в другой таблице нет деталей продукта, мы должны получать их по одному, только есть только один способ...
пример какой-то продукт не в GRN, а в кредит-ноте есть один и тот же продукт, поэтому используется слишком много select ... Присоединиться-это провал в моем сценарии ....

помогите мне больше если вы поняли мою точку зрения сэр

MadMyche

+5

Maciej Los

Большое спасибо!