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)
-   -   Verificar si un registro existe al insertarlo desde un procedimiento (https://www.clubdelphi.com/foros/showthread.php?t=45841)

sitrico 16-07-2007 04:29:31

Verificar si un registro existe al insertarlo desde un procedimiento
 
Tengo el siguiente procedimiento

Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE COPIARRUBROSXGRUPO (
    grupoorigen smallint,
    grupodestino smallint)
as
declare variable elcodrubro varchar(10);
declare variable elrubro varchar(50);
declare variable elidtiporubro smallint;
declare variable elidrubro integer;
declare variable elperiodo smallint;
declare variable elmonto numeric(18,5);
begin
-- copiar los rubros y montos de un grupo a otro
  For select codrubro, rubro, idtiporubro, periodo, monto
  from montoderubros -- montoderubroa es una vista que agrupa todos los archivos requeridos
  Where idgruporub = :grupoorigen
  into :elcodrubro, :elrubro, :elidtiporubro, :elperiodo, :elmonto do
     begin
     -- Validar si ya el rubro existe si no hay que crearlo
     Select IdRubro FROM rubros
     Where CodRubro = :elcodrubro And rubro = :elrubro And
           idgruporub = :grupodestino And idtiporubro = :elidtiporubro
     into :elidrubro;
     if (elidrubro is null) then
        Begin
        -- generar el nuevo ID
        elidrubro = gen_id(gen_rubros_id,1);
        Insert into rubros
           (idrubro, codrubro, rubro, idgruporub, idtiporubro) values
           (:elidrubro, :elcodrubro, :elrubro, :grupodestino, :elidtiporubro);
        End
     -- copiar los montos por periodo
     Insert Into montosrubros
        (idrubro, periodo, monto) values
        (:elidrubro, :elperiodo, :elmonto);
     End
end^

SET TERM ; ^

El procedimiento debe copiar los rubros y montos (2 tablas) desde un idgruporub a otro (ver parametros de entrada), antes de la validación funcionaba bien para 1 sólo periodo, para más de uno da error: clave duplicada en el archivo de rubros al copiar el segundo periodo)

encontré este post con el mismo caso pero no me sirve :(

alguna ayuda??

Gracias

egostar 16-07-2007 04:43:28

Tengo una duda con tu código


Código SQL [-]
if (elidrubro is null) then
        Begin
-- generar el nuevo ID
        elidrubro = gen_id(gen_rubros_id,1);
        Insert into rubros
           (idrubro, codrubro, rubro, idgruporub, idtiporubro) values
           (:elidrubro, :elcodrubro, :elrubro, :grupodestino, :elidtiporubro);
        End
-- copiar los montos por periodo
     Insert Into montosrubros
        (idrubro, periodo, monto) values
        (:elidrubro, :elperiodo, :elmonto);

esta parte (negrita) esta fuera de la validación a null, no debería de estar dentro del begin-end del IF?

Salud OS.

sitrico 16-07-2007 13:57:32

Cita:

esta parte (negrita) esta fuera de la validación a null, no debería de estar dentro del begin-end del IF?
No, debe estar fuera del begin-end del IF. El rubro se crea una sola vez, es una relacion de uno (rubro) a muchos (el monto para cada período puede variar).

La verdad el monto deberá tener su propia validación - eventualmente :o

El problema es que no ejecuta/valida la inserción.

PD Uso Firebird 2 + ibexpert

Ejemplo de los datos:

Código:

MONTOSDERUBROS ---------------------------

/*
Select r.idrubro, codrubro, rubro, idtiporubro, periodo, monto, idgruporub
from rubros r, montos m
Where r.IdRubro = m.IdRubro
*/

idrubro; codrubro, rubro, idtiporubro, periodo, monto, idgruporub
1; '5101'; 'Rubro1'; 1; 1; 1500,00; 1
1; '5101'; 'Rubro1'; 1; 2; 1510,00; 1
2; '5102'; 'Rubro2'; 1; 1; 1000,00; 1
2; '5102'; 'Rubro2'; 1; 2;  900,00 ; 1

RUBROS --------------------------------------

idrubro, codrubro, rubro, idgruporub, idtiporubro
1; '5101'; 'Rubro1'; 1; 1
2; '5102'; 'Rubro2'; 1; 1

MONTOS -------------------------------------

idMonto; idrubro, periodo, monto
1; 1; 1; 1500,00
2; 1; 2; 1510,00
3; 2; 1; 1000,00
4; 2; 2;  900,00

Los grupos de rubros se usan por lo siguiente:

Es un sistema de cobranzas para un colegio, los grupos representan los rubros y precios para cada grupo de niveles: Preescolar, Básica, Bachillerato, diversificado. Los Grupos repiten +- igual los rubros con distintos códigos (de contabilidad y en algunos casos la cambia la descripción) y los montos son distintos para cada periodo / grupo.

La idea es crear el primero a mano y luego copiarlo para no tener que repetir toda la información (solo modificar lo que cambie).

Pero el problema es que al ejecutar

Código SQL [-]
EXECUTE PROCEDURE COPIARRUBROSXGRUPO(2,3)

Me da un error (sonido) aparentemente por una violacion a las validaciones

Rubros.IDRUBRO indice primario.
Montos.IDRUBRO,PERIODO indice unico.
todos estos campos son not null

Spynosa 16-07-2007 18:26:34

Prueba a cambiar esta parte:
Código SQL [-]
if  ( not exists(select IdRubro FROM rubros
     Where CodRubro = :elcodrubro And rubro = :elrubro And
           idgruporub = :grupodestino And idtiporubro = :elidtiporubro)) then

  Begin
        -- generar el nuevo ID
        elidrubro = gen_id(gen_rubros_id,1);
        Insert into rubros
           (idrubro, codrubro, rubro, idgruporub, idtiporubro) values
           (:elidrubro, :elcodrubro, :elrubro, :grupodestino, :elidtiporubro);
   End

es posible que la variable en vez de se null sea "" y te puede fallar la comparación

sitrico 16-07-2007 22:15:59

Spynosa: así funcionó perfecto. Gracias


La franja horaria es GMT +2. Ahora son las 18:13:48.

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