Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sumar con SQL en VB 2010

Iniciado por baldomero, 14 de Enero de 2012, 04:31:53 PM

« anterior - próximo »

baldomero

Buenas tardes:

Llevo varios días dando vueltas a esta cuestión. A ver si sois tan amables de ayudarme.
Tengo una tabla con los nombres ("denominaciones") de las acciones y otra tabla con las operaciones que realizan "titulares", con acciones ("denominacion") y con "nrodetitulos". Quiero, entrando a mano el nombre de un titular (tres letras), obtener los títulos que este titular tiene de cada clase de acciones. Es decir obtener algo como:
Telefonica 2456 titulos; Repsol 764 títulos, etc. Para eso he escrito el código siguiente, pero me da siempre cero para todas las acciones. La fíormula de la suma está bien; la he comprobado con el wizard de VB2010 y me da un resultado correcto. ¿Que tengo mal? Muchas gracias.
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        'Obtendremos para un titular: la cartera total, su valor de compra y el precio medio
        btnSeguir.Visible = True
        Dim con As New OleDb.OleDbConnection
        con.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Users\Mis documentos\bd4.mdb"
        con.Open()
        Dim sql1, sql2 As String
        Dim ds2, ds1 As New DataSet
        'Ciclo de las Denominaciones
        sql1 = "SELECT * from denominacion WHERE clase = 'Acciones' ORDER BY denominacion"
        Dim da1 As New OleDb.OleDbDataAdapter(sql1, con)
        da1.Fill(ds1, "FiltDenom") 'FiltroDenom es el DataSet que contiene los nombres de todas las acciones
        Dim i As Integer
        '¿Cuántas denominaciones distintas de acciones hay?
        Dim posicion As Integer
        Dim totalacc As Integer = 0
        Dim inc As Integer = 1
        Dim c1 As String
        MsgBox("Cuantas acciones distintas hay")
        MsgBox(cuantasacciones) 'Resultado de una función OK
        For i = 0 To cuantasacciones - 1 'Ciclo de las distintas acciones. Cada rotación es de una denominación distinta de acciones
            c1 = ds1.Tables("FiltDenom").Rows(i).Item("denominacion") 'Nombre de la acción  OK
            MsgBox(c1) 'OK
            sql2 = "SELECT SUM(nrotitulos) AS totalacc FROM operaciones WHERE (titular='AMM') AND (denominacion = '" & c1 & "')"            MsgBox("segundopaso") 'OK
            MsgBox(totalacc)  'MAAAAL
            If totalacc > 0 Then
                e.Graphics.DrawString(c1, New Font("Arial", 10), Brushes.Black, 200, posicion) 'nOMBRE DE LA ACCIÓN
                e.Graphics.DrawString(totalacc, New Font("Arial", 10), Brushes.Black, 360, posicion)
                posicion = posicion + 30
            End If
            totalacc = 0
            c1 = ""
        Next
    End Sub

IDandT

#1
Asi a lo pronto, diría que tu problema es que no estas ejecutando la consulta sql2.

La primera consulta la ejecutas y te traes los datos en un dataset, mediante FILL


 sql1 = "SELECT * from denominacion WHERE clase = 'Acciones' ORDER BY denominacion"
       Dim da1 As New OleDb.OleDbDataAdapter(sql1, con)
       da1.Fill(ds1, "FiltDenom") 'FiltroDenom es el DataSet que contiene los nombres de todas las acciones



Pero esta solo la metes en un string, no estas ejecutandola, es decir no estas tirando la consulta contra la BBDD, solo montas el string con la select.

 sql2 = "SELECT SUM(nrotitulos) AS totalacc FROM operaciones WHERE (titular='AMM') AND (denominacion = '" & c1 & "')"


Al principio declaras dos strings y dos datasets, pero solo usas sql1, ds1 y sql2.

Supongo que ds2 lo habias declarado para este fin.


      Dim sql1, sql2 As String
       Dim ds2, ds1 As New DataSet



shephiroth

#2
Buenas. Creo que ya esta respondido, la segunda consulta no llega a ejecutarse, por lo que el valor de la variable no se modifica nunca y siempre te da el valor inicial.

Pero me gustaría añadir, SQL es un lenguaje sencillo pero complejo. Complejo en el sentido de que por muchas tablas relaciones y/o campos que necesites utilizar solo necesitas una transaccion por cada "dato" que necesites. Si tu lo que necesitas es una tabla que contenga "denominacion" "cantidad", solo necesitaras una transaccion para conseguir ese dato. Realizar una transaccion para verificar que denominaciones son acciones, y por cada una realizar una transaccion para conseguir la cantidad ....... puede que sea eficaz pero en ningun caso eficiente.

Puede que esta sentencia parezca mas compleja, pero es mas eficiente y más clara:
SELECT denominacion.denominacion AS nombre, sum(nrotitulos) AS cantidad
FROM denominacion, operaciones
WHERE denominacion.clase='Acciones' AND denominacion.denominacion = operaciones.denominacion
ORDERBY nombre

La cantidad de acciones diferentes la consigues al mismo tiempo con el tamaño del dataset resultante.

Suerte






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.