 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Olegario Invitado
|
Publicado: Mar 30 Dic, 2003 12:35 pm Asunto: Ayuda con un Procedure |
|
|
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 |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Mar 30 Dic, 2003 3:37 pm Asunto: |
|
|
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 |
|
 |
Gario Invitado
|
Publicado: Mar 30 Dic, 2003 4:41 pm Asunto: |
|
|
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 |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Mar 30 Dic, 2003 4:59 pm Asunto: |
|
|
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 |
|
 |
ubudubu Cdt

Registrado: 27 Sep 2003Mensajes: 4
|
Publicado: Mar 30 Dic, 2003 6:50 pm Asunto: |
|
|
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.  |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Mar 30 Dic, 2003 7:20 pm Asunto: |
|
|
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 |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Mar 30 Dic, 2003 7:21 pm Asunto: |
|
|
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 |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Mar 30 Dic, 2003 8:46 pm Asunto: |
|
|
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.
 _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
Olegario Invitado
|
Publicado: Mie 31 Dic, 2003 1:03 pm Asunto: No es lo mismo " que ' nooooo es lo mismoooo |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|