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)
-   -   Incrementar Campo (https://www.clubdelphi.com/foros/showthread.php?t=67690)

sierraja 30-04-2010 14:36:31

Incrementar Campo
 
Este procedimiento es aplicado para generar en un campo NR un valor incremental. Pero lo resultados son que siempre ve guarda en el campo el ultimo numero que consulta. Es decir hay 93 registros con ese filtro y almacena 93 en el campo NR pero para todos los registro, cuando deberia ser su incremento desde el 1 hasta el 93 en forma sucesiva. Les dejo el sp para que lo corrigan. Gracias por su atencion.


Código SQL [-]
SET TERM ^ ;
CREATE PROCEDURE RELLENAR 
AS
DECLARE VARIABLE X_CODIGO_DO INTEGER;
DECLARE VARIABLE I INTEGER;
begin
  i=1;
  for select codigo_suscriptor
      from facturacion
      where codigo_suscriptor='2580'
      into :x_codigo_do
  do
  begin
    i=i+1;
    update facturacion
    set nr=:i
    where codigo_suscriptor=:X_codigo_do;
  end
  suspend;
end^
SET TERM ; ^
GRANT SELECT,UPDATE ON FACTURACION TO PROCEDURE RELLENAR;
GRANT EXECUTE ON PROCEDURE RELLENAR TO SYSDBA;

Casimiro Notevi 30-04-2010 14:42:50

Código:

select codigo_suscriptor
      from facturacion
      where codigo_suscriptor='2580'
      into :x_codigo_do

Es que si buscas el codigo_suscriptor=2580' te devolverá el '2580',
o sea, el bucle posterior no hace nada porque sólo hay uno, el 2580.

sierraja 30-04-2010 14:46:38

Gracias por tu tiempo. No vemos de nuevo :D

Es decir, el filtro lo aplico en el where del update ? o como deberia ir ?

Casimiro Notevi 30-04-2010 18:24:22

Debería de ir, depende de lo que quieras hacer ;)

guillotmarc 30-04-2010 19:00:28

Hola.

codigo_suscriptor no es la clave primaria de esa tabla, ¿ verdad ?. Tienes que utilizar la clave primaria para identificar cada uno de los registros a actualizar. Sino ocurre lo que te está pasando ahora, que en cada pasada del bucle actualizas todos los registros afectados (y claro, al final solo queda el valor puesto en la última pasada).

Es decir, supongamos que la clave primaria se llama simplemente ID_FACTURA. Entonces tu procedimiento almacenado queda :

Código:

SET TERM ^ ;
CREATE PROCEDURE RELLENAR
AS
DECLARE VARIABLE ID_FACTURA;
DECLARE VARIABLE I INTEGER;
begin
  i=1;
  for select ID_FACTURA
      from facturacion
      where codigo_suscriptor='2580'
      into :ID_FACTURA
  do
  begin
    i=i+1;
    update facturacion
    set nr=:i
    where ID_FACTURA = :ID_FACTURA;
  end
  suspend;
end^
SET TERM ; ^
GRANT SELECT,UPDATE ON FACTURACION TO PROCEDURE RELLENAR;
GRANT EXECUTE ON PROCEDURE RELLENAR TO SYSDBA;

NOTA: He puesto en negrita los cambios que tienes que hacer (claro que en lugar de ID_FACTURA tienes que usar el nombre de tu campo de clave primaria).

sierraja 05-05-2010 17:40:19

Buenos dias,

Efectivamente el codigo_suscriptor no es la clave primaria, la tabla tampoco tiene clave primaria. La idea es que el campo que vamos incrementar sucesivamente en forma ascendente es ID_FACTURA el no existe y lo vamos a crear, hay que tener en cuenta que el codigo_suscriptor se repite varias veces y necesito identificarlo en la tabla con un numero que no se repita para nadie, por eso pense en un campo autoincrementable. Gracias por tu tiempo :D

sierraja 05-05-2010 17:42:12

:D Hago una correccion. El campo que necesito incrementar es nr (numero de registro asi lo llamo) ese vendria a ser la clave primaria pero necesitamos crearla ya despues de creada la tabla. Nuevamente gracias por su valioso tiempo.:D


La franja horaria es GMT +2. Ahora son las 23:19:46.

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