Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: lucius en Noviembre 22, 2010, 11:51:13 pm
-
Tengo una consulta que utiliza 4 tablas y utiliza el SHAPE COMPUTE para agrupar y quiero pasar el codigo y utilizar el SHAPE APPEND pero me saltan varios errores y no lo he podido hacer, alguien me podria ayudar.
SQL = "
SHAPE {SELECT F.Fecha,F.Numero,D.Cantidad,D.subtotal/1.19 AS Neto,D.subtotal-neto AS IGV,
D.subtotal as totalpagar,F.CodClie,C.NomClie,D.CodProd,P.nomprod
FROM Factura F, Detalle D, Cliente C, Producto P
WHERE F.Numero=D.Numero AND F.CodClie=C.CodClie AND D.CodProd=P.CodProd
}
AS ComDetalle COMPUTE ComDetalle BY 'CodClie','NomClie'"
-
Por favor edita tu consulta poniendo enter para que sea mas legible leerla porque sale el codigo como una culebra de dos metros ejje.
E indica que errores son los que te sale.
-
Especifica los errores. Por otro lado no es estrictamente necesario usar SHAPE para trabajar con 4 tablas en una consultas y agrupar campos.
-
El problema que tengo es q no se la sintaxis para hacerlo con 4 tablas, solo he podido con 2 tablas, el error que sale es "error de sintaxis", no se si tengo que hacerlo anidado o que como trabajarlo con el RELATE.
'con 2 tablas
SHAPE {SELECT * FROM cabecera} AS NIVEL1
APPEND ({SELECT * FROM detalle} AS NIVEL2
RELATE idnumero TO idnumero) AS NIVEL2
Como podria trabajar con agrupaciones sin utilizar SHAPE, quiero mandar la agrupacion a un datareport, saludos
-
La cantidad de tablas no es el problema. A ver, creo que tu consulta esta al reves, checa hacerlo mas o menos con esta estructura, a mi me funciona a la perfeccion:
sqlCAB y sqlDET son funciones, lo hago por legibilidad para yo leer mas facilmente el SHAPE, pero si quieres pon el SQL todo junto
sqlCAB = "Select mi_campo as campo1, campo2... From tabla1, tabla2.. where param1 =..."
sqlDET = "Select campo1, campo2... From tabla1, tabla2.. where ..."
"SHAPE {" & sqlCAB(param1, param2) & "} AS Cabecera " & _
"APPEND ({" & sqlDET() & "} AS Detalle " & _
"RELATE campo1 to campo1) AS Detalle"
Ojo, no se porque michi, pero el campo de la Cabecera debe tener el mismo nombre que el campo detalle (campo1 to campo1)
-
Hola Yvan la consulta que quiero realizar es mas o menos asi, dejo la imagen pero con 3 tablas
(http://img534.imageshack.us/img534/3965/1232546564.png)
-
lo que te mande sirve para hacer eso, alli tienes cabecera y detalle. Y tambien uso DataReport, asi que: si se puede!!! si se puede!!!
Primero resuelve el tema de la sintaxis, despues de eso seguro vas a tener algun problema con el reporte, publicas los problemas para irlos resolviendo pero primero superemos la sintaxis.
Lo de 4 tablas no es el problema, yo lo tengo con 6 y 7 tablas y con inner joins y toda la madre. Son dos SQL una cabecera y otro detalle y se unen por un campo comun de igual nombre, en tu caso como en el mio el ID.
-
Divide y venceras
Prueba tu consulta cabecera y detalle por separado pues debe darte resultados. Confirma esto.
-
La solución ya te la ha dado Yvan..! Por favor confirma..!
-
Ya logre que funcionara, pero cuando una cabecera no tiene detalle igual la muestra pero vacia, esto no sucede con el SHAPE-COMPUTE, se puede solucionar esto o queda asi?
(http://img89.imageshack.us/img89/9324/dfff3564.png)
-
mete un HAVING en tu consulta o un WHERE ALGO > 0
-
:PTienes razon se me paso debido a la costumbre del shape-compute, pero que pasa si en la cabecera solo tengo 2 campos como idcliente,nomclie?
Aplicando un WHERE al hacer un filtrado por idcliente corre bien, probare con el having por que no lo he utilizado y no recuerdo bien para que era.
Muchas gracias por la ayuda, saludos
-
el having es lo mismo que el where pero para sum, avg, etc.
Usalo para el criterio aquel en el que no halla registros nada mas, tu decide el criterio
-
Ya entendi para que se utiliza el having pero no he podido solucionar el problema.
Por ejemplo si hay un reporte de productos(idProd,nomprod,precio) por categoria(idcat,nomcat) en dicho caso la tabla categoria seria la cabecera y quiero hacer un filtro por producto, acaso esta mal mi plantiamiento por que con SHAPE COMPUTE me funcionaba bien, dejo el ejemplo haber si me corrigen para evitar espacion vacios como se muestran en la 2da imagen que deje.
Con_sql = "
SHAPE {SELECT idcat,nomcat FROM categoria} AS NIVEL1
APPEND({SELECT P.idprod,P.nomprod,P.precio,P.idcat FROM producto P"
WHERE P.idprod='" & Text1.Text & "'} AS NIVEL2
RELATE idcat TO idcat) AS NIVEL2"
-
Ahora si estoy un poco jodido con el tiempo, pero si me mandas esa parte del proyecto con la bd te lo resuelvo: garantizado o me dejo de llamar Miguel Nuñez jeje.
Publica el proyecto.
En todo caso insisto que lo estas haciendo al reves, la condicional debes mandarla al SHAPE no al APPEND... estoy al vuelo, publicalo y te lo resuelvo
-
jajajajajaja... se deja de llamar minelin jajajajajajaja ;D ;D ;D ;D ;D ;D
-
garantizado o me dejo de llamar Miguel Nuñez jeje.
>:(
-
Te dejo el ejemplo http://www.megaupload.com/?d=M23UA48D (http://www.megaupload.com/?d=M23UA48D)
-
Disculpa la demora, tu sabes como son los usuarios, son lo mejores para halla excepciones.
Bueno, como te dije lo que considero debes hacer es llevar al SHAPE el where y no en el APPEND. Asi que tuve que mover tu codigo, copia y pegalo en el proyecto que me enviaste y una vez que lo pruebes y me captes lo que quise decir lo trasladas a tu proyecto. Este es el codigo:
Private Sub Command1_Click()
Dim rs As New ADODB.Recordset
Dim Query As String
Query = "SHAPE {SELECT c.idcat, c.nomcat FROM categoria c, producto p where c.idcat = p.idcat"
If Check1 Then
Query = Query & " AND idprod='" & Text1 & "' "
End If
Query = Query & "} AS LEVEL1 "
Query = Query & "APPEND ({SELECT idprod, nomprod, precio, idcat FROM producto "
Query = Query & "} AS LEVEL2 RELATE idcat TO idcat) AS LEVEL2"
Set rs = New ADODB.Recordset
rs.Open Query, cn
Set DataReport1.DataSource = rs
DataReport1.Show
End Sub
Lo he probado y va bien en la consulta con o sin el filtro. Espero haberte ayudado.
-
Yvan, Excelente..! ;D
Y Lucius, a ver si te animas a investigar sobre Crystal Reports, porque DataReports es muy deficiente..!
-
Voy a probar el ejemplo.
ssccaann43 haber si me mandas un par de proyectos/ejemplos con crystal.
Cual es la mejor forma de trabajar con crystareport por que segun sé hay 2 formas creando el objeto desde codigo y la otra colocando un control CR en un form, cual es la mas practica para mi seria la 1era.
-
Ok, en este link hay unos manuales muy buenos...
http://www.recursosvisualbasic.com.ar/htm/tutoriales/manual-crystal-reports.htm
-
Si capte la idea de ponerle el where en el shape e incluso le meti el where al shape y al append y no doy con la solucion, estoy ahogado con este pequeño inconveniente y debe ser por eso.
El codigo que dejaste arroja esto y logicamente lo intente adaptar pero nada de nada :'(
(http://img143.imageshack.us/img143/1599/11803105.png)
Y si busco el producto 5002 me devuelve todos osea el 5001 y 5002
(http://img26.imageshack.us/img26/6633/87888388.png)
-
Sorry recien me pude conectar.
Doc cuando envie la solucion solo me preocupe por desaparecer lo que pediste, no vi la data ni nada pq supuse que ya eso lo verias tu, sorry por eso debi ver la data.
El problema se resuelve poniendo una sola palabra DISTINCT en el Select del SHAPE.
Query = "SHAPE {SELECT DISTINCT c.idcat, c.nomcat FROM ca.... etc etc
Espero haberte ayudado. De ser asi cierra el hilo. Chau
-
Muchas gracias yvan ya solucione el problema con tu codigo.
El unico detalle es que debo pasarle tanto al SHAPE como APPEND la condicion de busqueda para que filtre bien en caso active el check el cual me busca un solo producto por medio del id, en fin el problema ya esta resuelto. Gracias nuevamente.
Private Sub Command2_Click()
Dim rs As New ADODB.Recordset
Dim Query As String
Query = "SHAPE {SELECT DISTINCT c.idcat, c.nomcat FROM categoria c, producto p where c.idcat = p.idcat"
If Check1 Then
Query = Query & " and idprod='" & Text1 & "'"
End If
Query = Query & "} AS LEVEL1 "
Query = Query & "APPEND ({SELECT idprod, nomprod, precio, idcat FROM producto "
If Check1 Then
Query = Query & " where idprod='" & Text1 & "'"
End If
Query = Query & "} AS LEVEL2 RELATE idcat TO idcat) AS LEVEL2"
Set rs = New ADODB.Recordset
rs.Open Query, cn
Set DataReport1.DataSource = rs
DataReport1.Show
End Sub
-
No olvides ver el link que te deje...!
-
Si, es cierto, requiere poner dos veces la búsqueda.
El problema esta resuelto ya tiene solución, pero coincido contigo que esta solución no es la mejor solución, no me gusta hacer dos veces la misma consulta a la BD, asi que ya con la calma del problema resuelto, déjame investigar mas para lograr la mejor solución que se pueda.
Saludos
-
Nuevamente gracias por atender la pregunta y si en algun momento surge la forma de optimizar la consulta sql bienvenida sea,por otro lado ya he revisado algunos capitulos del link que dejaste, saludos.
-
jeje, el link lo dejo sscaamm43 (Miguel Nuñez). Saludos
-
Al final encontre que utilizar SHAPE APPEND es precisamente para mostrar las cabeceras aunque estas no tengas registros
"2. SHAPE APPEND funciona de manera similar a OUTER JOIN (combinación de datos externa), en cuanto a que se devuelve un registro primario, incluso aunque éste no tenga registros secundarios."
http://personal.lobocom.es/claudio/ado001.htm (http://personal.lobocom.es/claudio/ado001.htm)
Asi que en mi caso lo mejor sera seguir utilizando el SHAPE COMPUTE.
Gracias por la ayuda