Visual Basic Foro

Programación => Bases de Datos => Mensaje iniciado por: lucius en Noviembre 22, 2010, 11:51:13 pm

Título: Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado 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.

Código: [Seleccionar]
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'"

Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 23, 2010, 04:20:36 am
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.
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: ssccaann43 en Noviembre 23, 2010, 12:04:07 pm
Especifica los errores. Por otro lado no es estrictamente necesario usar SHAPE para trabajar con 4 tablas en una consultas y agrupar campos.
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 23, 2010, 01:03:11 pm
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
Código: [Seleccionar]
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
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 23, 2010, 02:37:28 pm
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 ..."
Código: (vb) [Seleccionar]
"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)
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 23, 2010, 03:37:44 pm
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)
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 23, 2010, 03:40:13 pm
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.
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 23, 2010, 05:28:52 pm
Divide y venceras
Prueba tu consulta cabecera y detalle por separado pues debe darte resultados. Confirma esto.
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: ssccaann43 en Noviembre 24, 2010, 11:48:32 am
La solución ya te la ha dado Yvan..! Por favor confirma..!
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 24, 2010, 03:26:36 pm
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)
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 24, 2010, 04:11:50 pm
mete un HAVING en tu consulta o un WHERE ALGO > 0
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 24, 2010, 06:31:18 pm
 :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
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 24, 2010, 09:37:24 pm
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
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 25, 2010, 01:58:59 am
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.
Código: [Seleccionar]
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"
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 25, 2010, 05:29:01 am
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
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: wolf_kof en Noviembre 25, 2010, 11:40:03 am
jajajajajaja... se deja de llamar minelin jajajajajajaja  ;D ;D ;D ;D ;D ;D
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: ssccaann43 en Noviembre 25, 2010, 12:00:02 pm
garantizado o me dejo de llamar Miguel Nuñez jeje.

 >:(
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 25, 2010, 04:53:21 pm
Te dejo el ejemplo http://www.megaupload.com/?d=M23UA48D (http://www.megaupload.com/?d=M23UA48D)
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 26, 2010, 03:45:48 am
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:

Código: (vb) [Seleccionar]
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.
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: ssccaann43 en Noviembre 26, 2010, 10:32:20 am
Yvan, Excelente..!  ;D

Y Lucius, a ver si te animas a investigar sobre Crystal Reports, porque DataReports es muy deficiente..!
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 26, 2010, 01:48:22 pm
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.
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: ssccaann43 en Noviembre 26, 2010, 04:21:18 pm
Ok, en este link hay unos manuales muy buenos...

http://www.recursosvisualbasic.com.ar/htm/tutoriales/manual-crystal-reports.htm
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 26, 2010, 10:28:23 pm
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)

Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 27, 2010, 07:00:35 pm
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
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 28, 2010, 11:54:58 pm
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
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: ssccaann43 en Noviembre 29, 2010, 10:43:30 am
No olvides ver el link que te deje...!
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 29, 2010, 03:19:17 pm
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
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Noviembre 29, 2010, 07:15:07 pm
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.
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: YAcosta en Noviembre 29, 2010, 11:00:34 pm
jeje, el link lo dejo sscaamm43 (Miguel Nuñez). Saludos
Título: Re:Cambiar consulta Shape Compute a Shape Append - Ayuda
Publicado por: lucius en Diciembre 07, 2010, 03:20:18 pm
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