none
Como puedo hacer un sql mejorado pues el que tengo es muy lento, en vb.net - vs2013 RRS feed

  • Pregunta

  • Saludos amigos del foro, les traigo un inconveniente, no se como podría mejorar mi sql en sql server expres 2012, lo hice una vez pero ahora es muy lento, me podrán ayudar por favor, les dejo el código y una imagen de como tiene que salir el reporte,

    saludos,

    rudolf heiner.

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Math

    Public Class vvalorizacion

        Dim nue_conexion As New conexion
        Dim nue_var As New variables

        Public Sub Imprimir(ByVal IdProdInicial As Integer, ByVal IdProdFinal As Integer, ByVal IdMarcaInicial As Integer, _
                            ByVal IdMarcaFinal As Integer, ByVal IdALmacenInicial As Integer, ByVal IdAlmacenFinal As Integer)

            ' Initialize the random-number generator.
            Randomize()
            ' Generate random value between 1 and 99999999.
            Sys_Nombre_Tabla = CInt(Int((99999999 * Rnd()) + 1)).ToString

            nue_var.consulta = _
                "CREATE TABLE temp_vvalorizacion_" & Sys_Nombre_Tabla & "(" & _
                    "id nvarchar(5)," & _
                    "fecha date, " & _
                    "documento nvarchar(3)," & _
                    "cantidad decimal(12,3)," & _
                    "ingreso decimal(12,2)," & _
                    "egreso decimal(12,2)," & _
                    "saldo decimal(12,2)," & _
                    "idprod int," & _
                    "nomprod nvarchar(100)," & _
                    "idmarca int," & _
                    "nommarca nvarchar(100)," & _
                    "idalm int," & _
                    "nomalm nvarchar(100)," & _
                    "precio decimal(12,2))"

            Try
                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                nue_var.cmd.ExecuteNonQuery()
                nue_conexion.desconectar()
            Catch mierror As SqlException
                MsgBox("Error de Conexión a la Base de Datos: " & mierror.Message)
            End Try

            'Hacemos la carga de datos del kardex a la tabla temporal
            Dim cantreg, i As Integer
            Dim id, documento, cantidad, idprod, nomprod, idmarca, nommarca, idalm, nomalm As String
            Dim ingreso, egreso, saldo, precio As Decimal
            Dim fecha As Date

            'Calculamos la cantidad de registros
            nue_var.consulta = "SELECT COUNT(*) As cantreg FROM vkardex WHERE" & _
                " idprod BETWEEN @IdProdInicial AND @IdProdFinal AND" & _
                " idmarca BETWEEN @IdMarcaInicial AND @IdMarcaFinal AND" & _
                " idalm BETWEEN @IdAlmacenInicial AND @IdAlmacenFinal"

            nue_conexion.conectar()
            nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
            nue_var.cmd.Parameters.Add("@IdProdInicial", SqlDbType.Int).Value = IdProdInicial
            nue_var.cmd.Parameters.Add("@IdProdFinal", SqlDbType.Int).Value = IdProdFinal
            nue_var.cmd.Parameters.Add("@IdMarcaInicial", SqlDbType.Int).Value = IdMarcaInicial
            nue_var.cmd.Parameters.Add("@IdMarcaFinal", SqlDbType.Int).Value = IdMarcaFinal
            nue_var.cmd.Parameters.Add("@IdAlmacenInicial", SqlDbType.Int).Value = IdALmacenInicial
            nue_var.cmd.Parameters.Add("@IdAlmacenFinal", SqlDbType.Int).Value = IdAlmacenFinal
            nue_var.dr = nue_var.cmd.ExecuteReader()

            Do While nue_var.dr.Read
                cantreg = CInt(nue_var.dr("cantreg"))
            Loop

            nue_var.dr.Close()
            nue_conexion.desconectar()

            'Cargamos el array con los registros
            Dim registros(cantreg, 13) As String

            nue_var.consulta = "SELECT * FROM vkardex WHERE" & _
                " idprod BETWEEN @IdProdInicial AND @IdProdFinal AND" & _
                " vkardex.idmarca BETWEEN @IdMarcaInicial AND @IdMarcaFinal AND" & _
                " vkardex.idalm BETWEEN @IdAlmacenInicial AND @IdAlmacenFinal" & _
                " ORDER BY idmarca, idalm, idprod, documento, fecha, id"

            nue_conexion.conectar()
            nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
            nue_var.cmd.Parameters.Add("@IdProdInicial", SqlDbType.Int).Value = IdProdInicial
            nue_var.cmd.Parameters.Add("@IdProdFinal", SqlDbType.Int).Value = IdProdFinal
            nue_var.cmd.Parameters.Add("@IdMarcaInicial", SqlDbType.Int).Value = IdMarcaInicial
            nue_var.cmd.Parameters.Add("@IdMarcaFinal", SqlDbType.Int).Value = IdMarcaFinal
            nue_var.cmd.Parameters.Add("@IdAlmacenInicial", SqlDbType.Int).Value = IdALmacenInicial
            nue_var.cmd.Parameters.Add("@IdAlmacenFinal", SqlDbType.Int).Value = IdAlmacenFinal
            nue_var.dr = nue_var.cmd.ExecuteReader()

            i = 0
            Do While nue_var.dr.Read

                registros(i, 1) = nue_var.dr("id").ToString
                registros(i, 2) = nue_var.dr("fecha").ToString
                registros(i, 3) = nue_var.dr("documento").ToString
                registros(i, 4) = nue_var.dr("cantidad").ToString
                registros(i, 5) = nue_var.dr("ingreso").ToString
                registros(i, 6) = nue_var.dr("egreso").ToString
                registros(i, 7) = nue_var.dr("idprod").ToString
                registros(i, 8) = nue_var.dr("nomprod").ToString
                registros(i, 9) = nue_var.dr("idmarca").ToString
                registros(i, 10) = nue_var.dr("nommarca").ToString
                registros(i, 11) = nue_var.dr("idalm").ToString
                registros(i, 12) = nue_var.dr("nomalm").ToString
                registros(i, 13) = nue_var.dr("precio").ToString

                i = i + 1
            Loop

            nue_var.dr.Close()
            nue_conexion.desconectar()

            'Insertamos los datos a la tabla temporal
            idprod = ""
            For i = 0 To cantreg - 1

                id = registros(i, 1)
                fecha = CDate(registros(i, 2))
                documento = registros(i, 3)
                cantidad = registros(i, 4)
                ingreso = CDec(Round(CDbl(If(registros(i, 5) <> "", registros(i, 5), "0")) * CDbl(If(registros(i, 13) <> "", registros(i, 13), "0")), 2))
                egreso = CDec(Round(CDbl(If(registros(i, 6) <> "", registros(i, 6), "0")) * CDbl(If(registros(i, 13) <> "", registros(i, 13), "0")), 2))

                If idprod = registros(i, 7) Then
                    saldo = saldo + Round(ingreso - egreso, 2)
                Else
                    saldo = Round(ingreso - egreso, 2)
                End If

                idprod = registros(i, 7)
                nomprod = registros(i, 8)
                idmarca = registros(i, 9)
                nommarca = registros(i, 10)
                idalm = registros(i, 11)
                nomalm = registros(i, 12)
                precio = CDec(registros(i, 13))

                nue_var.consulta = "INSERT INTO temp_vvalorizacion_" & Sys_Nombre_Tabla & _
                    " (id, fecha, documento, cantidad, ingreso, egreso, saldo, idprod, nomprod, idmarca, nommarca, idalm, nomalm, precio)" & _
                    " VALUES(@id, @fecha, @documento, @cantidad, @ingreso, @egreso, @saldo, @idprod, @nomprod, @idmarca, @nommarca, @idalm, @nomalm, @precio)"

                Try
                    nue_conexion.conectar()
                    nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                    nue_var.cmd.Parameters.Add("@id", SqlDbType.VarChar).Value = id
                    nue_var.cmd.Parameters.Add("@fecha", SqlDbType.Date).Value = fecha
                    nue_var.cmd.Parameters.Add("@documento", SqlDbType.VarChar).Value = documento
                    nue_var.cmd.Parameters.Add("@cantidad", SqlDbType.Decimal).Value = CDec(cantidad)
                    nue_var.cmd.Parameters.Add("@ingreso", SqlDbType.Decimal).Value = ingreso
                    nue_var.cmd.Parameters.Add("@egreso", SqlDbType.Decimal).Value = egreso
                    nue_var.cmd.Parameters.Add("@saldo", SqlDbType.Decimal).Value = saldo
                    nue_var.cmd.Parameters.Add("@idprod", SqlDbType.VarChar).Value = idprod
                    nue_var.cmd.Parameters.Add("@nomprod", SqlDbType.VarChar).Value = nomprod
                    nue_var.cmd.Parameters.Add("@idmarca", SqlDbType.VarChar).Value = idmarca
                    nue_var.cmd.Parameters.Add("@nommarca", SqlDbType.VarChar).Value = nommarca
                    nue_var.cmd.Parameters.Add("@idalm", SqlDbType.VarChar).Value = idalm
                    nue_var.cmd.Parameters.Add("@nomalm", SqlDbType.VarChar).Value = nomalm
                    nue_var.cmd.Parameters.Add("@precio", SqlDbType.Decimal).Value = precio
                    nue_var.cmd.ExecuteNonQuery()
                    nue_conexion.desconectar()
                Catch mierror As SqlException
                    MsgBox("Error de Conexión a la Base de Datos: " & mierror.Message)
                End Try

            Next

            'Hacemos la consulta para el reporte
            nue_var.consulta = "SELECT * FROM temp_vvalorizacion_" & Sys_Nombre_Tabla

            Try

                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                Dim Table As New DataTable()
                nue_var.dt = New DataTable("vvalorizacion")
                nue_var.da = New SqlDataAdapter(nue_var.cmd)
                nue_var.da.Fill(nue_var.dt)
                nue_conexion.desconectar()
                Table = nue_var.dt

                Dim RepCrystal As New reporte_vvalorizacion
                RepCrystal.SetDataSource(Table)
                RepCrystal.SetParameterValue("Usuario", Sys_Usuario)
                RepCrystal.SetParameterValue("Cia", Sys_Cia)
                RepCrystal.SetParameterValue("Simbolo", Sys_Simbolo)

                Dim f As New Reportes_Viewer
                f.IniciaReporte(RepCrystal)

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

            'Eliminamos La Tabla Temporal
            nue_var.consulta = "DROP TABLE temp_vvalorizacion_" & Sys_Nombre_Tabla
            Try
                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                nue_var.cmd.ExecuteNonQuery()
                nue_conexion.desconectar()
            Catch mierror As SqlException
                MsgBox("Error de Conexión a la Base de Datos: " & mierror.Message)
            End Try

        End Sub

    End Class


    sábado, 4 de marzo de 2017 2:31

Todas las respuestas

  • Rudolf Heiner,

    Noto que creas una tabla, luego recuperas un conjunto de resultados que lo cargas en un array y luego insertas los elementos del array en la tabla que creaste inicialmente, claro que tiene sustento el tiempo de demora, ¿por qué no insertas lo datos de manera directa?

    CREATE TABLE dbo.NombreTablaTemporal(Col1 int, Col2 int, Col3 int);
    INSERT INTO dbo.NombreTablaTemporal (Col1, Col2, Col3)
    SELECT
        (Col1, Col2, Col3)
    FROM
        vKardex;

    Las instrucciones t-sql puedes impactarla por única vez contra la base de datos.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 4 de marzo de 2017 3:08
  • Gracias por responder Willams, te queria comentar que tengo que calcular el saldo este es el codigo: 

    'registros(i,7) representa el id del producto y si cambia ves en el codigo de abajo que hago cierto calculo

    If idprod = registros(i, 7) Then

         saldo = saldo + Round(ingreso - egreso, 2)
    Else
         saldo = Round(ingreso - egreso, 2)

    End If

    quedo de ti,

    saludos

    rudolf heiner.

    sábado, 4 de marzo de 2017 4:16