
Quote from joferar333 on September 16, 2024, 2:18 am@rasl
Amigo, he intentado probar con un pequeño ejercicio implementar el script que me sugeriste para eliminar registros duplicados, partiendo como filtro el campo planilla que es numerico al ejecutarlo me da un error ya que dice que se espera una instruccion de sql inexistente ...
Te adjunto la carpeta que contiene el pub y la base que es minima ya que solo tiene 3 registros y dos estan duplicados a proposito para probar..., me darias una gran ayuda si puedes echarle un vistazo y ver que es lo que falta o esta mal.
WITH duplicados AS (
SELECT
id,
ROW_NUMBER() OVER (PARTITION BY planilla ORDER BY id) AS fila
FROM
usuarios
)
DELETE FROM usuarios
WHERE id IN (
SELECT id
FROM duplicados
WHERE fila > 1
)Tambien intento hacer esto que me sugieres pero no logro dar con el comando y la sintax adecuada...
me podrias brindar un ejemplo sobre la base y pub adjunta?para evitar que se te dupliquen en lo sucesivo deberias hacer:
If not exists (select 1 from usarios where planilla=@planilla)
insert into usuarios.......
Desde ya mil gracias!
Un cordial saludo
Amigo, he intentado probar con un pequeño ejercicio implementar el script que me sugeriste para eliminar registros duplicados, partiendo como filtro el campo planilla que es numerico al ejecutarlo me da un error ya que dice que se espera una instruccion de sql inexistente ...
Te adjunto la carpeta que contiene el pub y la base que es minima ya que solo tiene 3 registros y dos estan duplicados a proposito para probar..., me darias una gran ayuda si puedes echarle un vistazo y ver que es lo que falta o esta mal.
WITH duplicados AS (
SELECT
id,
ROW_NUMBER() OVER (PARTITION BY planilla ORDER BY id) AS fila
FROM
usuarios
)
DELETE FROM usuarios
WHERE id IN (
SELECT id
FROM duplicados
WHERE fila > 1
)
Tambien intento hacer esto que me sugieres pero no logro dar con el comando y la sintax adecuada...
me podrias brindar un ejemplo sobre la base y pub adjunta?
para evitar que se te dupliquen en lo sucesivo deberias hacer:
If not exists (select 1 from usarios where planilla=@planilla)
insert into usuarios.......
Desde ya mil gracias!
Un cordial saludo

Quote from alangonzalez91 on September 17, 2024, 12:56 pmTu base de datos carece de ID, o sea no tiene identificador único de registro en la tabla datos, esta suele llamarse clave primaria, por lo que no se puede realizar la eliminación por medio de un comando directo SQL, porque el mismo motor no sabe cual registro eliminar...
De todas formas te doy el código para obtener la lista de planillas que están duplicadas
SELECT PLANILLA FROM datos GROUP BY PLANILLA, TITULAR, DOMICILIO HAVING COUNT(*) > 1Lo siguiente es que agregues un campo Autoincremental, que le de un número único a cada registro porque de otra forma, si se le dice al motor de base de datos que borre la Planilla 101, entonces, eliminara todos los registros 101. Pero al tener el ID único, entonces se puede ir jugando con subconsultas hasta eliminar el resto de registros dejando 1 solo.
Otra forma de solución es que armes un procedimiento que recorra la tabla buscando el registro duplicado, y deje intacto la primer coincidencia, y vaya borrando las siguientes usando un while
Tu base de datos carece de ID, o sea no tiene identificador único de registro en la tabla datos, esta suele llamarse clave primaria, por lo que no se puede realizar la eliminación por medio de un comando directo SQL, porque el mismo motor no sabe cual registro eliminar...
De todas formas te doy el código para obtener la lista de planillas que están duplicadas
SELECT PLANILLA FROM datos GROUP BY PLANILLA, TITULAR, DOMICILIO HAVING COUNT(*) > 1
Lo siguiente es que agregues un campo Autoincremental, que le de un número único a cada registro porque de otra forma, si se le dice al motor de base de datos que borre la Planilla 101, entonces, eliminara todos los registros 101. Pero al tener el ID único, entonces se puede ir jugando con subconsultas hasta eliminar el resto de registros dejando 1 solo.
Otra forma de solución es que armes un procedimiento que recorra la tabla buscando el registro duplicado, y deje intacto la primer coincidencia, y vaya borrando las siguientes usando un while

Quote from joferar333 on September 17, 2024, 1:12 pmEstimado @alangonzalez91, primero que nada infinitamente agradecido por tu ayuda y por tu tiempo ya que te has tomado el trabajo de descargar y revisar la base con la que estaba experimentando.
Aprovecho tambien para agradecerte tu respuesta en los otros post que respondiste.
Ya voy a probar rearmando nuevamente la base y agregandole el id autoincremental como me sugieres.
La verdad que el comando dbpExecSQL me cuenta mucho encontrarle la vuela ya que no se SQL y recurriendo a la IA las sentencias que me da como resultado luego me dan error porque no interpretan correctamente el uso de este comando.
en este caso el comando aplicaria asi?
dbpExecSQL "pruebas" "SELECT PLANILLA|FROM datos|GROUP BY PLANILLA, TITULAR, DOMICILIO|HAVING COUNT(*) > 1" ""
esto funcionaria con el autoincremento, perfecto ya lo pruebo ahora me faltaria poder eliminar los duplicados encontrados....
Estimado @alangonzalez91, primero que nada infinitamente agradecido por tu ayuda y por tu tiempo ya que te has tomado el trabajo de descargar y revisar la base con la que estaba experimentando.
Aprovecho tambien para agradecerte tu respuesta en los otros post que respondiste.
Ya voy a probar rearmando nuevamente la base y agregandole el id autoincremental como me sugieres.
La verdad que el comando dbpExecSQL me cuenta mucho encontrarle la vuela ya que no se SQL y recurriendo a la IA las sentencias que me da como resultado luego me dan error porque no interpretan correctamente el uso de este comando.
en este caso el comando aplicaria asi?
dbpExecSQL "pruebas" "SELECT PLANILLA|FROM datos|GROUP BY PLANILLA, TITULAR, DOMICILIO|HAVING COUNT(*) > 1" ""
esto funcionaria con el autoincremento, perfecto ya lo pruebo ahora me faltaria poder eliminar los duplicados encontrados....

Quote from alangonzalez91 on September 17, 2024, 2:04 pmEse script SQL que te he dado solo muestra cuales planilla están duplicados, pero no elimina nada. A partir de la modificación de la tabla agregando el campo Autoincrementeal se puede armar un algoritmo o un comando SQL mas elaborado para eliminación.
Con respecto a la sentencia dbpexecsql, cuando coloques código quita las barras verticales | así:
dbpExecSQL "pruebas" "SELECT PLANILLA FROM datos GROUP BY PLANILLA, TITULAR, DOMICILIO HAVING COUNT(*) > 1" ""
Otra forma más sencilla de lidiar con registros duplicados seria capturarlos antes de que se agreguen en la tabla, osea, verificar si ya existe un registro con esas carateristicas... también usando un comando SQL
SELECT PLANILLA WHERE ( PLANILLA = '[textentry planilla]' AND TITULAR = '[textentry titular]' ) AND DOMICILIO = '[textentry domicilio]'
Y si el resultado del comando arroja registros quiere decir que efectivamente el usuario esta a punto de duplicar el registro y daría una advertencia o directamente bloquearía o saldría del proceso de agregado del registro.
Un abrazo!
Ese script SQL que te he dado solo muestra cuales planilla están duplicados, pero no elimina nada. A partir de la modificación de la tabla agregando el campo Autoincrementeal se puede armar un algoritmo o un comando SQL mas elaborado para eliminación.
Con respecto a la sentencia dbpexecsql, cuando coloques código quita las barras verticales | así:
dbpExecSQL "pruebas" "SELECT PLANILLA FROM datos GROUP BY PLANILLA, TITULAR, DOMICILIO HAVING COUNT(*) > 1" ""
Otra forma más sencilla de lidiar con registros duplicados seria capturarlos antes de que se agreguen en la tabla, osea, verificar si ya existe un registro con esas carateristicas... también usando un comando SQL
SELECT PLANILLA WHERE ( PLANILLA = '[textentry planilla]' AND TITULAR = '[textentry titular]' ) AND DOMICILIO = '[textentry domicilio]'
Y si el resultado del comando arroja registros quiere decir que efectivamente el usuario esta a punto de duplicar el registro y daría una advertencia o directamente bloquearía o saldría del proceso de agregado del registro.
Un abrazo!

Quote from joferar333 on September 17, 2024, 2:56 pm@alangonzalez91 genial pero no tengo idea de como armar esa sentencia para que los elimine....
con relacion a lo que me envias la advertencia seria un error para poder capturar?
@alangonzalez91 genial pero no tengo idea de como armar esa sentencia para que los elimine....
con relacion a lo que me envias la advertencia seria un error para poder capturar?
Quote from rasl on September 24, 2024, 1:57 amHola @joferar333 , disculpa la demora pero estuve fuera de accion
El script que te pase para los duplicados anda bien en sql pero no en access, edite tu pub de ejemplo para que funcione en access.
Observa que le agregue un campo Id autonumerico a la tabla datos
espero aun te sea util
salu2
Hola @joferar333 , disculpa la demora pero estuve fuera de accion
El script que te pase para los duplicados anda bien en sql pero no en access, edite tu pub de ejemplo para que funcione en access.
Observa que le agregue un campo Id autonumerico a la tabla datos
espero aun te sea util
salu2
Uploaded files: