Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ayuda con un Procedure

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ayuda con un Procedure Responder citando

Pues eso que hay un procedimiento que me esta volviendo loco. No soy capaz de encontrar el problema. Trabajo con interbase y me da un error de "Column Unknow", por mas que reviso los nombres de las columnas no encuentro en fallo. el codigo es el siguiente

set term !!;

CREATE PROCEDURE Insertar_Cita ( ID_CLIENTE INTEGER, ID_USUARIO INTEGER,
ID_TRATAMIENTO INTEGER, FECHA DATE, INICIO TIME,
FIN TIME, AVISAR VARCHAR(2), ESTADO VARCHAR(2),
CICLICO VARCHAR(2), OBSERVACIONES VARCHAR(3000),
NOMBRE VARCHAR(50), TELEFONO VARCHAR(15),
SECUNDARIA VARCHAR(3), COSTE NUMERIC(10, 2),
COBRADA VARCHAR(3), PRIMERA_CITA VARCHAR(3),
PREV_ADELANTAMIENTO VARCHAR(10), DUO VARCHAR(3),
TRATAMIENTO VARCHAR(30) )
RETURNS (idcita INTEGER ) AS
DECLARE VARIABLE ncita integer;
DECLARE VARIABLE conflicto integer;
BEGIN
SELECT COUNT(*)
FROM CITA
WHERE fecha=:fecha AND id_usuario=:id_usuario AND secundaria=:secundaria
AND (:inicio<fin AND fin<=:fin AND :inicio<=inicio AND inicio<:fin
AND ((inicio<=:inicio AND :inicio<fin AND inicio<:fin AND :fin<=fin )
oR ( :inicio<=inicio AND inicio<:fin AND :inicio<fin AND fin<=:fin )))
INTO conflicto;
IF (conflicto=0) THEN
BEGIN
ncita=GEN_ID(NUEVA_CITA,1);
INSERT INTO CITA (ID_CITA,ID_CLIENTE,ID_USUARIO,ID_TRATAMIENTO,FECHA,
INICIO, FIN, AVISAR,ESTADO,CICLICO,OBSERVACIONES,NOMBRE,
TELEFONO,SECUNDARIA,COSTE,COBRADA,PRIMERA_CITA,PREV_ADELANTAMIENTO,
DUO,TRATAMIENTO)
VALUES
(:ncita,:ID_CLIENTE,:ID_USUARIO,:ID_TRATAMIENTO,:FECHA,
:INICIO, :FIN, :AVISAR,:ESTADO,:CICLICO,:OBSERVACIONES,:NOMBRE,
:TELEFONO,:SECUNDARIA,:COSTE,:COBRADA,:PRIMERA_CITA,:PREV_ADELANTAMIENTO,
:DUO,:TRATAMIENTO);
idcita=ncita;
EXIT;
END
ELSE
POST_EVENT "falloInsercion" ;
END!!

set term ;!!


Gracias a todos de antemano.
Volver arriba
Mensaje    Asunto: Responder citando

Has probado por ejemplo el INSERT fuera del procedure, es decir, ejecutandolo de prueba sobre el servidor, por si algun nombre de campo estuviera incorrecto ?

También deberías revisar el SELECT y ver si los nombres de los campos están bien.

Sería interesante que dieras los campos que tiene la tabla.
Aparentemente no veo ningun fallo salvo que fuera alguno de los antes citados.

OJO probablemente es que te faltan los dos puntos en el INTO :conflicto ?
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Nada tio, que me esquivan (como decian en amanece que no es poco).
he probado las consultas por separado, he puesto los dos puntos y nada que sigue aparececiendo una columna desconocida.
He prvado con un una version en las que no usaba los parametros los constantes en las consultas y nada. Empiezo a tener ganas de tirar el ordenata por la ventana

La tabla en cuestion es esta:

/* Table: CITA, Owner: SYSDBA */

CREATE TABLE "CITA"
(
"ID_CITA" INTEGER NOT NULL,
"ID_CLIENTE" INTEGER NOT NULL,
"ID_USUARIO" INTEGER NOT NULL,
"ID_TRATAMIENTO" INTEGER,
"FECHA" DATE NOT NULL,
"INICIO" TIME NOT NULL,
"FIN" TIME NOT NULL,
"AVISAR" VARCHAR(2) NOT NULL,
"ESTADO" VARCHAR(2) NOT NULL,
"CICLICO" VARCHAR(2) NOT NULL,
"OBSERVACIONES" VARCHAR(3000),
"NOMBRE" VARCHAR(50) NOT NULL,
"TELEFONO" VARCHAR(15),
"SECUNDARIA" VARCHAR(3),
"COSTE" NUMERIC(10, 2),
"COBRADA" VARCHAR(3) NOT NULL,
"PRIMERA_CITA" VARCHAR(3) NOT NULL,
"PREV_ADELANTAMIENTO" VARCHAR(10) NOT NULL,
"DUO" VARCHAR(3),
"TRATAMIENTO" VARCHAR(30),
PRIMARY KEY ("ID_CITA")
);
ALTER TABLE "CITA" ADD FOREIGN KEY ("ID_USUARIO") REFERENCES USUARIO ("ID_USUARIO") ON DELETE CASCADE;
ALTER TABLE "CITA" ADD FOREIGN KEY ("ID_CLIENTE") REFERENCES CLIENTE ("ID_CLIENTE") ON DELETE CASCADE;



el puñertero procedure este:


CONNECT "c:\victor\esteban\desarrollo\clinicaastur.gdb" USER 'SYSDBA' PASSWORD 'masterkey';

set term !!;

CREATE PROCEDURE Insertar_Cita ( ID_CLIENTE INTEGER, ID_USUARIO INTEGER,
ID_TRATAMIENTO INTEGER, FECHA DATE, INICIO TIME,
FIN TIME, AVISAR VARCHAR(2), ESTADO VARCHAR(2),
CICLICO VARCHAR(2), OBSERVACIONES VARCHAR(3000),
NOMBRE VARCHAR(50), TELEFONO VARCHAR(15),
SECUNDARIA VARCHAR(3), COSTE NUMERIC(10, 2),
COBRADA VARCHAR(3), PRIMERA_CITA VARCHAR(3),
PREV_ADELANTAMIENTO VARCHAR(10), DUO VARCHAR(3),
TRATAMIENTO VARCHAR(30) )
RETURNS (id INTEGER ) AS
DECLARE VARIABLE ncita integer;
DECLARE VARIABLE conflicto integer;
DECLARE VARIABLE id integer;
BEGIN
SELECT COUNT(*)
FROM CITA
WHERE fecha='12/30/03' AND id_usuario=1 AND secundaria='NO'
AND ('15:00'<fin AND fin<='15:30' AND '15:00'<=inicio AND inicio<'15:30')
AND ( (inicio<='15:00' AND '15:00'<fin AND inicio<'15:30' AND '15:30'<=fin)
oR ('15:00'<=inicio AND inicio<'15:30' AND '15:00'<fin AND fin<='15:30'))
INTO conflicto;
IF (conflicto=0) THEN
BEGIN
ncita=GEN_ID(NUEVA_CITA,1);
INSERT INTO CITA (ID_CITA,ID_CLIENTE,ID_USUARIO,ID_TRATAMIENTO,FECHA,
INICIO, FIN, AVISAR,ESTADO,CICLICO,OBSERVACIONES,NOMBRE,
TELEFONO,SECUNDARIA,COSTE,COBRADA,PRIMERA_CITA,PREV_ADELANTAMIENTO,
DUO,TRATAMIENTO)
VALUES
(:ncita,:ID_CLIENTE,:ID_USUARIO,:ID_TRATAMIENTO,:FECHA,
:INICIO, :FIN, :AVISAR,:ESTADO,:CICLICO,:OBSERVACIONES,:NOMBRE,
:TELEFONO,:SECUNDARIA,:COSTE,:COBRADA,:PRIMERA_CITA,:PREV_ADELANTAMIENTO,
:DUO,:TRATAMIENTO);
id=ncita;
EXIT;
END
ELSE
POST_EVENT "falloInsercion" ;
END!!

set term ;!!
Volver arriba
Mensaje    Asunto: Responder citando

Por favor puedes poner exactamente el error que te devuelve cuando intentas crear el procedimiento.

Ciao.
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Haber yo no soy especialista en Interbase, pero vamos a ver ese codigo... en Oracle los procedimientos en su cabecera, cuando indicas la varible que recibe unicamente debes indicar el tipo al que pertenece sin indicar el tamaño, ejm:

Cita:
nombre varchar2 ->no tienes que poner Varchar2(20).


Por otro lado un procedimiento no devuelve nada salvo que indiques que la variable es tipo out, tu tienes puesto Returns(idcita INTEGER), el devolver algo es tipico de Funciones. En fin como te comente antes, no soy especialista en Interbase por ello lo mismo este bien lo que te comente antes... mientras en Oracle no es asi.

Saludos y que tengas Suerte. Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, bueno me costo un poquito, tuve que crear las tablas usuario y cliente con su integridad referencial y un generator ademas de la de citas,
tambien habia un problema entre variables la, id de retorno del procedure y otra id interna, bueno despues de todo esto encontre el fallo, el cual estaba muy a la vista, tanto como para no verlo y no hubiera hecho falta este trabajo, este era:
Código:
POST_EVENT "falloInsercion" ;
Debe ser:
Código:
POST_EVENT 'falloInsercion'

con comillas simples, las comillas dobles estan reservadas para los nombres de Tablas, Campos, Triggers, Procedures etc. y Funcionan asi:

Código:
//Tablas y Campos con MAYUSCULAS y minusculas plus espacios en blanco
Create Table "Mi Tablita"
(
 "Nombre Del Fulano:" varchar(30),
 "Otros Caracteres ^@!?" varchar(20)
)


Y aqui esta el procedure modificado y probado:
Código:
set term^;
CREATE PROCEDURE Insertar_Cita ( ID_CLIENTE INTEGER, ID_USUARIO INTEGER,
ID_TRATAMIENTO INTEGER, FECHA DATE, INICIO TIME,
FIN TIME, AVISAR VARCHAR(2), ESTADO VARCHAR(2),
CICLICO VARCHAR(2), OBSERVACIONES VARCHAR(3000),
NOMBRE VARCHAR(50), TELEFONO VARCHAR(15),
SECUNDARIA VARCHAR(3), COSTE NUMERIC(10, 2),
COBRADA VARCHAR(3), PRIMERA_CITA VARCHAR(3),
PREV_ADELANTAMIENTO VARCHAR(10), DUO VARCHAR(3),
TRATAMIENTO VARCHAR(30) )
RETURNS (id INTEGER ) AS
DECLARE VARIABLE ncita integer;
DECLARE VARIABLE conflicto integer;
DECLARE VARIABLE id1 integer;
BEGIN
SELECT COUNT(*)
FROM CITA
WHERE fecha='12/30/03' AND id_usuario=1 AND secundaria='NO'
AND ('15:00'<fin AND fin<='15:30' AND '15:00'<=inicio AND inicio<'15:30')
AND ( (inicio<='15:00' AND '15:00'<fin AND inicio<'15:30' AND '15:30'<=fin)
oR ('15:00'<=inicio AND inicio<'15:30' AND '15:00'<fin AND fin<='15:30'))
INTO :conflicto;
IF (:conflicto=0) THEN
BEGIN
ncita=GEN_ID(NUEVA_CITA,1);
INSERT INTO CITA (ID_CITA,ID_CLIENTE,ID_USUARIO,ID_TRATAMIENTO,FECHA,
INICIO, FIN, AVISAR,ESTADO,CICLICO,OBSERVACIONES,NOMBRE,
TELEFONO,SECUNDARIA,COSTE,COBRADA,PRIMERA_CITA,PREV_ADELANTAMIENTO,
DUO,TRATAMIENTO)
VALUES
(:ncita,:ID_CLIENTE,:ID_USUARIO,:ID_TRATAMIENTO,:FECHA,
:INICIO, :FIN, :AVISAR,:ESTADO,:CICLICO,:OBSERVACIONES,:NOMBRE,
:TELEFONO,:SECUNDARIA,:COSTE,:COBRADA,:PRIMERA_CITA,:PREV_ADELANTAMIENTO,
:DUO,:TRATAMIENTO);
id=:ncita;
EXIT;
END
ELSE
POST_EVENT 'falloInsercion' ;
END^

Esto esta probado con Ib 6.0.1.0 como server y ISQL de Ib Console

Alfredo desde Venezuela.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si en Interbase es correcto el RETURN
Código:

CREATE PROCEDURE name
   [( param < datatype> [, param < datatype> …])]
   [RETURNS < datatype> [, param < datatype> …])]
   AS <procedure_body> [ terminator]


Ese es el bosquejo de la cabecera de un Procedimiento Almacenado segun el Language Reference de Interbase 6 OS, como ves si es correcto que devuelva o bien un tipo o bien parametros con tipo, o nada claro también sería correcto, es decir en Interbase las variables de tipo OUT se indican con RETURNS que es donde se especifican las variables a devolver.

Sobre los parametros de entrada, en Interbase si es obligatorio especificar el tipo de parametros de entrada, o bien no especificar ninguno sino lo hay.

Olegario solo una cosa, aunque quizás no tenga que ver con esto, veo que la mayoría de tus campos son NOT NULL, quizás sería idoneo que en los que pudieras, puedes usar la clausula DEFAULT, para establecer un valor por defecto, piensa que en muchos campos te evitarias el NOT NULL simplemente estableciendo un valor adecuado en DEFAULT para cada campo, imaginemos por ejemplo un campo llamado "AVISADO" si suponemos que es un número que indica si ha sido o no avisado o cualquier otro valor y lo normal es que no lo haya sido y eso lo representas con un 0, pues en vez de tener AVISADO INTEGER NOT NULL, y tener que introducir siempre a la fuerza un valor, pues podrías tener AVISADO INTEGER DEFAULT 0, con lo que siempre que no establezcas ningun valor cuando insertes una nueva tabla, por defecto tomará el valor de 0, luego nunca será nulo, salvo modifiques el valor. En fin es un consejo simplemente.

Olegario como has puesto la tabla, la he introducido en una BD Firebird Dialect 3, la tabla despues de quitar las comillas todo perfecto, el proc. almacenado me daba un error con POST_EVENT donde "falloInserccion" es una columan desconocida, he estado leyendo el Language Reference y en POST_EVENT pone que:
Cita:

POST_EVENT event_name | col Posts the event, event_name, or uses the value in col as an event name

Pero no traga con un nombre entre comillas y si lo pones sin comillas, pues se piensa que es una columna y claro no existe. Yo he puesto el siguiente cambio no sé si es lo que quieres hacer:

Código:

// Crea una excepción
CREATE EXCEPTION Exc_Fallo_Insercion 'Se ha producido un fallo en la inserción';

// Crea el procedimiento almacenado.
set term !!;
CREATE PROCEDURE Insertar_Cita ( ID_CLIENTE INTEGER, ID_USUARIO INTEGER, ID_TRATAMIENTO INTEGER,
  FECHA DATE, INICIO TIME, FIN TIME, AVISAR VARCHAR(2), ESTADO VARCHAR(2), CICLICO VARCHAR(2),
  OBSERVACIONES VARCHAR(3000), NOMBRE VARCHAR(50), TELEFONO VARCHAR(15), SECUNDARIA VARCHAR(3),
  COSTE NUMERIC(10, 2), COBRADA VARCHAR(3), PRIMERA_CITA VARCHAR(3), PREV_ADELANTAMIENTO VARCHAR(10),
  DUO VARCHAR(3), TRATAMIENTO VARCHAR(30) )
 RETURNS (idcita INTEGER )
AS
  DECLARE VARIABLE ncita integer;
  DECLARE VARIABLE conflicto integer;
BEGIN
  SELECT COUNT(*)
  FROM CITA
  WHERE fecha=:fecha AND id_usuario=:id_usuario AND secundaria=:secundaria
        AND (:inicio<fin AND fin<=:fin AND :inicio<=inicio AND inicio<:fin
        AND ((inicio<=:inicio AND :inicio<fin AND inicio<:fin AND :fin<=fin )
        OR ( :inicio<=inicio AND inicio<:fin AND :inicio<fin AND fin<=:fin )))
        INTO conflicto;
  IF (conflicto=0) THEN
    BEGIN
      ncita=GEN_ID(NUEVA_CITA,1);
      INSERT INTO CITA (ID_CITA,ID_CLIENTE,ID_USUARIO,ID_TRATAMIENTO,FECHA,
        INICIO, FIN, AVISAR,ESTADO,CICLICO,OBSERVACIONES,NOMBRE,
        TELEFONO,SECUNDARIA,COSTE,COBRADA,PRIMERA_CITA,PREV_ADELANTAMIENTO,
        DUO,TRATAMIENTO)
      VALUES (:ncita,:ID_CLIENTE,:ID_USUARIO,:ID_TRATAMIENTO,:FECHA,
        :INICIO, :FIN, :AVISAR,:ESTADO,:CICLICO,:OBSERVACIONES,:NOMBRE,
        :TELEFONO,:SECUNDARIA,:COSTE,:COBRADA,:PRIMERA_CITA,:PREV_ADELANTAMIENTO,
        :DUO,:TRATAMIENTO);
      idcita=ncita;
      EXIT;
    END
  ELSE
    EXCEPTION Exc_Fallo_Insercion;
END!!
set term ;!!


Por lo visto para usar POST_EVENT debes crearte el evento primero.
Cita:

Syntax EVENT INIT request_name [ dbhandle]
[(’ string’ | :variable [, ’ string’ | : variable …]);

Además pone lo siguiente:
Cita:

Events are posted by a POST_EVENT call within a stored procedure or trigger.


Luego imagino que deberías crearlo primero, y sino mira a ver si lo que quieres hacer es que salte la excepción que es el codigo que te he puesto antes, aun así también debes crearte la excepción primero con CREATE EXCEPTION.

En fin espero que lo soluciones. Ciao.
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Ok Olegario veo que ya lo has solucionado, se vé que estabamos posteando los dos a la vez, pues porque no leí el tuyo. En fin, me alegro de que lo solucionaras, yo no había usado todavía ni EVENTOS ni EXCEPCIONES así que siempre se aprende algo.

Por cierto lo de las comillas simples me dí cuenta al final, pero pensaba que era otra cosa el fallo. En fín, pilarín, suerte y Feliz año nuevo.

Ciao.
Wink
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: No es lo mismo " que ' nooooo es lo mismoooo Responder citando

Pues como decia la señora del fibregran... solamente es eso?
Con cambiar las comillas dobles por simples funciona.

En fin esas cosas que tiene la informatica.

Muchisimas gracias a todos por el esfuerzo y la ayuda!!!!
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.