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 26-11-2009
NPIdea NPIdea is offline
Miembro
 
Registrado: feb 2005
Posts: 121
Poder: 20
NPIdea Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 27-11-2009
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 481
Poder: 20
lgarcia Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 09-12-2009
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
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);
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #4  
Antiguo 09-12-2009
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
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 .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 09-12-2009
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
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;
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #6  
Antiguo 09-12-2009
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por lbuelvas Ver Mensaje
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
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
ayuda de como Insertar registro con procedimiento almacenado y campo autoincremento El_Chava Firebird e Interbase 5 25-11-2008 06:57:42
Procedimiento almacenado efelix MS SQL Server 7 21-11-2007 17:53:00
Procedimiento Almacenado rodrigo19 Oracle 5 22-08-2007 22:55:40
Procedimiento Almacenado Ulises Providers 3 30-01-2004 18:14:58
procedimiento almacenado haron Firebird e Interbase 2 29-09-2003 01:09:56


La franja horaria es GMT +2. Ahora son las 04:31:08.


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