evitar datos duplicados

1,925 views
Skip to first unread message

magdalena concepcion cañete fretes

unread,
Apr 29, 2011, 4:15:42 PM4/29/11
to Comunidad de Visual Foxpro en Español
hola amigos tengo un inconveniente en cuanto a datos que selecciono
de mi base de datos.....me explico
tengo un cursor en el cual hago union de cuatro tablas, que me trae
bien los datos de las facturas cobradas en cuanto a mi caja,
lo que quiero es evitar el duplicado, como figura en el ejemplo de
abajo, que por mas que tenga mas factura de ventas o lo que fuere, que
no me duplique los demas datos como por ejemplo el recibo que en este
caso se cobro una sola vez, pero como tengo dos filas me duplica en la
sgte, como puedo hacer que solo me traiga datos sin duplicar y que si
tengo mas filas, que me muestre como en el ejemplo 2. Espero que me
haya explicado bien....


ejemplo: nro.venta importe nro. servicio
descripcion importe nro.recibo cliente importe
123 1241254 0 "
" 0 1 YO
112412
124 1241325 0 "
" 0 1 YO
112412


ejemplo2 :nro.venta importe nro. servicio
descripcion importe nro.recibo cliente importe
123 1241254 0 "
" 0 1 YO
112412
124 1241325 0 "
" 0 0
"" 0
gracias

Carlos Miguel FARIAS

unread,
Apr 29, 2011, 6:21:00 PM4/29/11
to publice...@googlegroups.com
Sin estructura de tablas es dificil poder evitar que se dupliquen datos.
Probastes con DISTINCT?, a lo mejor la solución no es una UNION sino usar LEFT JOIN.
Si usas vfp9, podes tener campos calculados a partir de una sentencia SELECT
Si tiras mas descripcion de tablas, podría acercar una solución, con simple listado de datos, al no saber como se generan, es imposible (al menos para mi)

magdalena concepcion cañete fretes

unread,
Apr 29, 2011, 9:16:35 PM4/29/11
to Comunidad de Visual Foxpro en Español
Hola Carlosss....este es mi select....ya pobre todo lo que se.. pero
igual me duplica datos

SELECT m.nro_movimiento,
case when f.nro_serie is null then 0 else f.nro_serie end,
case when f.importe is null then 0 else f.importe end,
case when s.referencia is null then 0 else s.referencia end,
case when ds.descri_servicio is null then '' else ds.descri_servicio
end,
case when s.importe is null then 0 else s.importe end,
case when r.nro_recibo is null then 0 else r.nro_recibo end,
case when r.nro_cabecera is null then 0 else r.nro_cabecera end,
case when dr.clie_nom is null then '' else dr.clie_nom end,
case when r.importe is null then 0 else r.importe end
FROM caja_movimiento m
inner join caja_mov_factura f on (f.caja_movimiento_nro_movimiento =
m.nro_movimiento and m.nro_movimiento = 3)
LEFT OUTER JOIN caja_mov_servicios s on (s.nro_movimiento =
m.nro_movimiento and m.nro_movimiento = 3)
left outer join caja_tipos_servicios ds on (s.cod_tipo_servicio =
ds.cod_tipo_servicio)
LEFT OUTER JOIN caja_mov_recibos r on (r.nro_movimiento =
m.nro_movimiento and m.nro_movimiento = 3)
left outer join cta_recibos_cab cr on (cr.nro_cabecera =
r.nro_cabecera)
left outer join cliente dr on (dr.clie_cod = cr.cliente_clie_cod)

magdalena concepcion cañete fretes

unread,
Apr 29, 2011, 9:18:36 PM4/29/11
to Comunidad de Visual Foxpro en Español
ahhhh carlos ya pobre con DISTINCT() no funciona, tambien con HAVING
COUNT()=1 , sera que hay alguna forma de poner una condicion dentro de
mismo informe ?

Oscar Calderon Fuentes

unread,
Apr 29, 2011, 10:02:31 PM4/29/11
to publice...@googlegroups.com
Si con DISTINCT no te resulta, eso quiere decir que los supuestos registros duplicados deben tener si o si una diferencia en alguna de sus columnas. El DISTINCT lo que hace es omitir aquellas filas que son exactamente iguales en todas sus columnas dejando solo una de ellas.
--
Oscar Calderón Fuentes
Santiago - Chile
 

magdalena concepcion cañete fretes

unread,
Apr 29, 2011, 10:08:49 PM4/29/11
to Comunidad de Visual Foxpro en Español
Hola Oscar.....el problema no es que toda la fila la duplica sino una
de las columnas de otras tablas, esto pasa cuando tengo mas filas de
lo que tiene la tabla unida , como ya mencione uni cuatro tablas y
trae todos los datos y no todas las tablas tienen la misma cantidad de
filas.....por eso no me funciona el distinct...

Carlos Miguel FARIAS

unread,
Apr 30, 2011, 9:27:24 AM4/30/11
to publice...@googlegroups.com
Sigo sin entender que tipo de movimientos cargas en cada tabla, sin eso, no puede dilucidar de donde saco los datos.
Y deberías tal vez aclarar un poco que quieres obtener.
SQL es explicar en un lenguaje racional y relacional que es lo que se quiere, y de donde se saca. Lo que no me queda claro.
Igual, simplifique la sentencia con


SELECT
        m.nro_movimiento,;
        NVL( F.nro_serie, 0 ),;
        NVL( F.importe, 0 ),;
        NVL( s.referencia, 0 ),;
        NVL( ds.descri_servicio, '' ),;
        NVL( s.importe , 0 ),;
        NVL( r.nro_recibo, 0 ),;
        NVL( r.nro_cabecera, 0 ),;
        NVL( dr.clie_nom, '' ),;
        NVL( r.importe, 0 );
    FROM caja_movimiento m;
         INNER JOIN caja_mov_factura F;
            ON (F.caja_movimiento_nro_movimiento = m.nro_movimiento);
        LEFT OUTER JOIN caja_mov_servicios s;
            ON (s.nro_movimiento = m.nro_movimiento);
        LEFT OUTER JOIN caja_tipos_servicios ds;
            ON (s.cod_tipo_servicio = ds.cod_tipo_servicio);
        LEFT OUTER JOIN caja_mov_recibos r;
            ON (r.nro_movimiento = m.nro_movimiento );
        LEFT OUTER JOIN cta_recibos_cab cr;
            ON (cr.nro_cabecera = r.nro_cabecera);
        LEFT OUTER JOIN cliente dr;
            ON (dr.clie_cod = cr.cliente_clie_cod)
    WHERE;
        m.nro_movimiento = 3

replace el case when (que es de vfp  9) por nvl, el efecto es igual a lo que tu resolvias pero es mucho mas compacto.
En todos los casos que relacionabas con las tablas auxiliares, vi que filtrabas por m.nro_movimiento = 3, de la tabla principal, por lo que lo pase al where.
Esto último no se soluciona algo, ya que cuando se ponde una condición multiple en el ON del JOIN generalmente filtra sobre la tabla que se asocia y no sobre la principal.

magdalena concepcion cañete fretes

unread,
Apr 30, 2011, 2:41:21 PM4/30/11
to Comunidad de Visual Foxpro en Español
Hola Carlos....te explico mejor, yo trabajo con postgres y tuve
problema a la hora de imprimir desde mi formulario ......este
formulario es donde se registran todos los movimientos de la caja...en
el cual tiene un detalle de ventas, detalle de servicios, detalle de
recibos y detalle de formas de pagos.....a la hora de consultar
movimientos registrados anteriormente lo consultaba desde este
formulario y a la hora de imprimir usaba este codigo....
select detallefactu
select detalleservicio
select detallerecibo
REPORT FORM infocierre.frx to printer prompt preview

seleccionaba directamente los datos que tenia en el detalle pero que
pasa que solo me traia los datos del ultimo select antes de llamar a
mi informe y los demas datos que tenia en mis otros detalles no me
traia y como no sabia como hacer entonces opte por crear mi select
consultando directamente desde mi base de datos Postgres, y solucione
todo ahora el pequenho inconveniente que tengo es que al unir todas
las tablas me trae todos los datos pero que pasa, me repiten los
datos como habia mencionado anteriormente.....ejemplo en el
detalleventa tengo 17 registros, en el detalle servicios tengo 2
registros y en el detalle recibo tengo uno, a la hora de unirlos me
trae por supuestro todos los datos y el total de filas es 17 pero como
tenia en servicios 2 registros me repite las demas filas que faltan
para completar 17 filas en total...lo que quiero hacer es evitar
eso.....

Carlos Miguel FARIAS

unread,
Apr 30, 2011, 4:25:02 PM4/30/11
to publice...@googlegroups.com
Pero entonces lo que necesitas es unir (UNION) las tablas y no juntarlas (JOIN).

Deberias hacer una construccion del tipo:

SELECT 'F' as 'cCodigoSelect', {campos detalle factu} FROM detallefactu WHERE {condiciones selección facturas}
UNION
SELECT 'S' as 'cCodigoSelect', {campos detalle servicio} FROM detalleservicioWHERE {condiciones selección servicios}
UNION
SELECT 'R' as 'cCodigoSelect', {campos detalle recibo} FROM detallerecibo WHERE {condiciones selección recibos}
ORDER BY 1, 2, 3 etc.

A tener en cuenta:
el campo que agrego como cCodigoSelect, te permite al momento de armar el detalle en el reporte, seleccionar si ciertos campos se imprimen o no, o hacer los agrupamientos correspondientes, si no necesitas agrupar por tipo comprobante/movimiento, quitas el 1 del ORDER BY.

Ese campo debe ser una constante alfabetica o numerica, a tu gusto, con valor diferente para que puedas manejar (saber) en el reporte la table de origen.

Entre llaves puse {campos detalle....}, la cantidad de campos, sus tipos y orden de enumeración debe ser el mismo en todas, no importa que los nombres sean diferentes.

SQL toma siempre el nombre de la primera select (alli podes colocar campo_tabla AS 'nombre para la select').

Si en alguna tabla, no hay equivalente para las columnas de otra tabla (equivalente a nivel tipo de dato), en la enumeración de columnas de dicha tabla colocas en el lugar correspondiente una constante (por ejemplo 0 para numericas, '' para alfanuméricas).

No se en postgres pero en vfp, el tipo de dato (entero, decimal, cadena) de la primer select determina el tipo de dato para dicha columna, por eso debes buscar coincidencia a ese nivel. En vfp, el ancho de un dato string del primer select, determina el ancho final, o sea que si en las segundas select los campos string son mas anchos, quedan truncados.

Ejemplo:
SELECT
   'tabla1' AS 'cCodigoSelect',
   nCodigoFactura AS 'nCodigo',
   dFechaFactura AS 'dFecha1',
   nCliente AS 'nNumero',
   cDescripcionFactura AS 'cDescripcion',
   yImporteFactura AS 'yImporte,
   0 AS 'nCheque'
FROM Facturas
UNION
SELECT
   'tabla2',
   nCodigoRecibo,
   dFechaRecibo,
   0,
   '',
   yImporteRecibo
   nCheque
FROM Recibos

(agregar si corresponde, los punticomas al final de cada linea)
Los recibos no tienen ni numero cliente ni descripcion, tengo que agregar, columnas "vacias" en su select.
Recibos tiene numero cheque, que factura no, agregue la constante 0 en la select de facturas, y le di nombre.
Saludos: Miguel

Carlos Miguel FARIAS

unread,
May 1, 2011, 9:10:53 AM5/1/11
to publice...@googlegroups.com
Si queres de lujo, te mando los cromados, el tapizado en cuero y las levas de cambio al volante, pero a otro precio.

El 30 de abril de 2011 18:35, magdalena concepcion cañete fretes <pich...@hotmail.com> escribió:
de lujoooooo Carlos me salio eso mismo estaba buscando muchisimas
gracias por tu ayuda.......en postgres seguro que tiene....

magdalena concepcion cañete fretes

unread,
Apr 30, 2011, 5:35:13 PM4/30/11
to Comunidad de Visual Foxpro en Español
Reply all
Reply to author
Forward
0 new messages