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
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
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