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 16-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Question 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
__________________
Sitrico
Responder Con Cita
  #2  
Antiguo 16-07-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
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.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 16-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
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

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
__________________
Sitrico

Última edición por sitrico fecha: 16-07-2007 a las 14:24:43.
Responder Con Cita
  #4  
Antiguo 16-07-2007
Avatar de Spynosa
Spynosa Spynosa is offline
Miembro
 
Registrado: nov 2004
Ubicación: Ecija - Sevilla
Posts: 99
Poder: 20
Spynosa Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 16-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Thumbs up

Spynosa: así funcionó perfecto. Gracias
__________________
Sitrico
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
verificar con procedimiento almacenado fedelphi Firebird e Interbase 3 15-05-2007 22:10:28
Verificar registro con trigger fedelphi Firebird e Interbase 3 20-12-2006 12:57:43
Verificar si una imagen existe mcarazas Varios 36 10-08-2006 13:38:05
Existe el procedimiento perfecto? jam888 Varios 2 09-10-2004 00:40:43
Como verificar si un txt existe? danytorres Varios 1 02-12-2003 15:51:20


La franja horaria es GMT +2. Ahora son las 03:04:58.


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