Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Renumerar un campo por procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=65188)

NPIdea 26-11-2009 08:35:41

Renumerar un campo por procedimiento almacenado
 
Hola a todos.

Tengo una tabla, por ejemplo que se compone de 4 campos:ID,Fecha,Numero,Valor. El campo Valor lo tengo vacio.

Lo que quiero es re-numerar el campo valor según una consulta ordenada por fecha,numero.

¿Lo puedo hacer por procedimiento almacenado?

Gracias.

lgarcia 27-11-2009 18:15:21

Renumerar campo
 
Hola:

Dado que tienes 2 campos de referencia para renumerar el campo bien pudieras con un SP obtener el maximo donde se cumpla la condicion de fecha y numero y luego otro SP que te haga una actualizacion del campo valor.

Saludos

Luis Garcia

lbuelvas 09-12-2009 17:54:18

Hola foro,

Adjunto codigo fuente y datos de prueba para la tarea que solicitas

Código SQL [-]
SET SQL DIALECT 3;

CREATE TABLE DATOS (
    ID      INTEGER NOT NULL,
    FECHA   DATE NOT NULL,
    NUMERO  INTEGER NOT NULL,
    VALOR   INTEGER
);

ALTER TABLE DATOS ADD CONSTRAINT PK_DATOS PRIMARY KEY (ID);

INSERT INTO DATOS (ID, FECHA, NUMERO, VALOR) VALUES (1, '12-01-2009', 5000, NULL);
INSERT INTO DATOS (ID, FECHA, NUMERO, VALOR) VALUES (2, '12-01-2009', 4999, NULL);
INSERT INTO DATOS (ID, FECHA, NUMERO, VALOR) VALUES (3, '11-30-2009', 4998, NULL);
INSERT INTO DATOS (ID, FECHA, NUMERO, VALOR) VALUES (4, '11-30-2009', 5001, NULL);
INSERT INTO DATOS (ID, FECHA, NUMERO, VALOR) VALUES (5, '12-02-2009', 5002, NULL);
INSERT INTO DATOS (ID, FECHA, NUMERO, VALOR) VALUES (6, '12-02-2009', 4997, NULL);

SET TERM ^ ;

create or alter procedure SP_RE_NUMERAR (
    CONSECUTIVO integer)
as
declare variable ID integer;
begin
  -- Procedimiento para llenar el campo 'datos.valor' con un consecutivo de
  -- forma que al consultar la tabla 'datos' ordenado por el campo 'datos.valor'
  -- los registros se vean ordenados por los campos 'datos.fecha' y
  -- 'datos.numero'.

  if (consecutivo is null) then
    consecutivo = 1;

  for select datos.id
      from datos
      order by datos.fecha,  datos.numero
      into :id
  do begin
    update datos
    set    datos.valor = :consecutivo
    where  datos.id = :id;
    consecutivo = consecutivo + 1;
  end
end^

SET TERM ; ^

GRANT SELECT,UPDATE ON DATOS TO PROCEDURE SP_RE_NUMERAR;

GRANT EXECUTE ON PROCEDURE SP_RE_NUMERAR TO SYSDBA;

Para ejecutar el procedimiento por SQL es asi:

Código SQL [-]
execute procedure sp_re_numerar (1000);

jhonny 09-12-2009 19:25:15

Me gustaría proponer la siguiente "pequeña" modificación al procedimiento que nos muestra lbuelvas, para que sea probado y comentar sobre los resultados obtenidos...

Teniendo en cuenta que todas las tablas de Firebird tienen el campo rdb$db_key, del cual parece, se puede usar unicamente dentro de la misma "transacción", entonces probemos lo siguiente y comentar si les ha parecido mas rapido, igual, mas lento o si hizó o no... lo que tenia que hacer.

Código SQL [-]
create or alter procedure SP_RE_NUMERAR (
    CONSECUTIVO integer)
as
DECLARE VARIABLE ID CHAR(8);
begin
  -- Procedimiento para llenar el campo 'datos.valor' con un consecutivo de
  -- forma que al consultar la tabla 'datos' ordenado por el campo 'datos.valor'
  -- los registros se vean ordenados por los campos 'datos.fecha' y
  -- 'datos.numero'.

  if (consecutivo is null) then
    consecutivo = 1;

  for select datos.rdb$db_key
      from datos
      order by datos.fecha,  datos.numero
      into :id
  do begin
    update datos
    set    datos.valor = :consecutivo
    where  datos.id = :id;
    consecutivo = consecutivo + 1;
  end
end^

Dicen que es mas rapido, que incluso la llave primaria... esta es una posible buena oportunidad, para probar si es eso cierto o no :).

lbuelvas 09-12-2009 21:24:21

Amigo jhonny, siguiendo la modificación recomendada el update deberia quedar de la siguiente manera ?

Código SQL [-]
    update datos
    set    datos.valor = :consecutivo
    where  datos.rdb$db_key = :id;

jhonny 09-12-2009 21:35:44

Cita:

Empezado por lbuelvas (Mensaje 348554)
Amigo jhonny, siguiendo la modificación recomendada el update deberia quedar de la siguiente manera ?
Código SQL [-]
    update datos
    set    datos.valor = :consecutivo
    where  datos.rdb$db_key = :id;


Opsss... tienes toda la razón, gracias por la corrección. :)


La franja horaria es GMT +2. Ahora son las 13:58:35.

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