Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-06-2022
glopez glopez is offline
Miembro
 
Registrado: ago 2003
Ubicación: Huelva
Posts: 76
Poder: 21
glopez Va por buen camino
Hola, ante todo muchas gracias a todos por vuestras respuestas.
Quizás no me explique bien.
Lo que necesito es ver que saltos hay en la numeración en un campo de una tabla (número factura). Lo necesito para ver si existen saltos en la numeración que le asigna un usuario a las facturas recibidas y/o emitidas en un programa contable.
He probado la solución de duilioisola porque la veía más simple pero la ejecución de la consulta es muy lenta unos 20s en unos 2000 registros y falla cuando hay dos saltos consecutivos (1,2,5,6,7...).

La solución de Neftali no la he probado pero la veo un poco complicada y creo que no obtendré más rapidez en los resultados, porque hay que ir insertando valores en una tabla. Tengo clientes con millones de registros.

¿Alguna otra solución?
Responder Con Cita
  #2  
Antiguo 23-06-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.082
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Entonces, tienes una tabla con un campo numérico.
Código:
1
2
4
5
6
8
9
Y quieres sabe qué números faltan, ¿es eso?
Responder Con Cita
  #3  
Antiguo 23-06-2022
glopez glopez is offline
Miembro
 
Registrado: ago 2003
Ubicación: Huelva
Posts: 76
Poder: 21
glopez Va por buen camino
Exactamente eso.
Responder Con Cita
  #4  
Antiguo 23-06-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.738
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Este SQL te devuelve una lista de números entre 1 y 100.
Código SQL [-]
with recursive n as (
      select 1 /*nro. inicial*/ as n
      from rdb$database
      union all
      select n.n + 1
      from n
      where n < 100 /*nro. final*/
     )
select n.n
from n;

Con esto como base restrinjo el rango al min/max id de la tabla articulos.
De este rango devuelvo solo los que no existen en la tabla de artículos.
Se parece a la respuesta de Neftali, pero para Firebird.
El único problema es que debido a la recursividad solo permite rangos de 1024 registros.

Código SQL [-]
WITH RECURSIVE N
AS (SELECT (SELECT MIN(ID)
            FROM ARTICULOS) AS N
    FROM RDB$DATABASE
    UNION ALL
    SELECT N.N + 1
    FROM N
    WHERE
    N < (SELECT MAX(ID)
         FROM ARTICULOS))
SELECT N.N
FROM N
WHERE
NOT EXISTS(SELECT ID
           FROM ARTICULOS
           WHERE
           ID = N.N)

Con respecto a la velocidad, lo he probado con una tabla con 800 registros indexados por el ID y no ha tardado nada.
Responder Con Cita
  #5  
Antiguo 23-06-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.738
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si puedes crear un procedimiento que te devuelva la lista de números ya no hay problemas.
Lo he probado en una base con 23.000 registros y ha tardado 31ms
La tabla tiene un índice único por el campo ID.

Código SQL [-]
/* Procedimiento que devuelve lista de numeros */
create procedure dame_rango (
    ini integer,
    fin integer)
returns (
    n integer)
as
begin
    n = ini;
    while (n <= fin) do
    begin
        suspend;
        n = n + 1;
    end
end

Código SQL [-]
/* Recorre lista de numeros y devuelve los que no existe en la tabla ARTICULOS */
WITH RECURSIVE N
AS (SELECT N
    FROM DAME_RANGO((SELECT MIN(ID)
                     FROM ARTICULOS),
                    (SELECT MAX(ID)
                     FROM ARTICULOS)))
SELECT N.N
FROM N
WHERE
NOT EXISTS(SELECT ID
           FROM ARTICULOS
           WHERE
           ID = N.N)
Responder Con Cita
  #6  
Antiguo 23-06-2022
cloayza cloayza is online now
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 922
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Propongo esta opción...Procedimiento almacenado en firebird

Código SQL [-]
reate or alter procedure check_correlativos
returns (id_falta integer)
as
declare variable id integer;
declare variable id_next integer;
declare variable oldNext integer;
BEGIN
     OldNext=-1;
     FOR
       select c.id, c.id+1
       from articulos c
       INTO :ID, :ID_NEXT
     DO
     BEGIN
          id_falta=null;
          if (OldNext=-1) then
             OldNext=ID;
   
          if (OldNext<>id) then
             id_falta=OldNext;
   
          OldNext=ID_NEXT;
   
          if (not id_falta is null) then
             suspend;
     END
END
Responder Con Cita
  #7  
Antiguo 24-06-2022
glopez glopez is offline
Miembro
 
Registrado: ago 2003
Ubicación: Huelva
Posts: 76
Poder: 21
glopez Va por buen camino
Muchas gracias a todos.
Al final me he decantado por la solución de duilioisola, iba un poco lento porque los campos por los que tenía que buscar no tenían un índice. Lo he creado y va perfecto.
Responder Con Cita
  #8  
Antiguo 25-06-2022
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Buenas noches,

Hace un tiempo tuve que hacer lo mismo porque un cliente cada vez que eliminaba un registro quería que el código que quedaba libre se utilizara nuevamente.

Código SQL [-]
SELECT a.Sector + 1
FROM UbicacionSector a
LEFT JOIN UbicacionSector b ON (a.Sector = b.Sector - 1)
WHERE b.Sector IS NULL

Aclaro que esto en su momento fue hecho en Oracle, pero como el código es SQL puro se pude implementar en cualquier motor de base de datos

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mostrar barras en Tchart sin huecos cocute Varios 1 26-01-2015 14:45:36
Problema con Stored Procedure para actualizar tabla con datos de otra tabla. Adrian Murua MySQL 4 04-02-2012 02:54:49
Huecos en una tabla digongo SQL 5 20-12-2007 19:03:14
Recorrer Tabla, contar registro repetidos y escribir totales en otra Tabla Lucas_diaz1810 Conexión con bases de datos 1 25-12-2006 13:04:34
Tabla con huecos NickName Firebird e Interbase 5 23-09-2003 19:42:09


La franja horaria es GMT +2. Ahora son las 15:45:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi