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)
-   -   Error de sintaxis al ejecutar procedimiento almacenado en Firebird 2.1.3 (https://www.clubdelphi.com/foros/showthread.php?t=69089)

dant 25-07-2010 20:25:22

Error de sintaxis al ejecutar procedimiento almacenado en Firebird 2.1.3
 
Hola a todos; soy nuevo en este foro y estoy recien aprendiendo la sintaxis SQL en firebird. Tengo el siguiente procedimiento almacenado el cual me permite ingresar nuevos registros verificando antes que estos no se repitan ( comprobando el campo código "CODPER" ):

SET TERM ^ ;
CREATE PROCEDURE INGRESARPER (
CODPER char(5),
APEPER varchar(25),
NOMPER varchar(25),
DNIPER char(8),
FNACPER date,
DIRPER varchar(30),
PROVPER varchar(25),
TELFPER varchar(12),
CELPER varchar(16),
EMAILPER varchar(30),
CARGPER varchar(25),
FINGPER date,
FCESPER date,
PLAPER char(1),
FONDPENSPER varchar(25),
CODESSPER varchar(15) )
AS
declare variable existe smallint;
BEGIN
SELECT COUNT(*) FROM REGISTROSPER WHERE REGISTROSPER.COD_PER = :codper INTO :existe;
IF (:existe = 0) THEN BEGIN
INSERT INTO REGISTROSPER VALUES (:codper, :apeper, :nomper, :dniper, :fnacper, :dirper, :provper, :telfper, :celper, :emailper, :cargper,
:fingper, :fcesper, :plaper, :fondpensper, :codessper);
END
END^
SET TERM ; ^

El problema es que al momento de ejecutar el procedimiento almacenado a través de esta sintaxis:

EXECUTE PROCEDURE INGRESARPER('T1000', 'Pérez Aguilar', 'Carlos Daniel', '12345897', '25/05/1990', 'Av. Larco # 846', 'Trujillo', '(044)-425810', '(044)948-654-127', 'pacd@gmail.com', 'Administrador', '15/02/2010', '15/02/2012', '1', 'SNP', 'SDF789RTY156FG5');


Me da el siguiente mensaje de error:

Message: isc_dsql_execute2 failed
SQL Message : -413
Overflow occurred during data type conversion.
Engine Code : 335544334
Engine Message :
conversion error from string "25/05/1990"

Al parecer el problema es que estoy dando mal los parámetros para los campos de tipo DATE -> conversion error from string "25/05/1990", pero no se como solucionar eso.

Agradeceria su aporte.

celades1 25-07-2010 21:07:22

Hola

Debes poner las fechas en formato mm/dd/yy o mm/dd/yyyy

Código SQL [-]
EXECUTE PROCEDURE INGRESARPER('T1000', 'Pérez Aguilar', 'Carlos Daniel', '12345897', '05/25/1990', 'Av. Larco # 846', 'Trujillo', '(044)-425810', '(044)948-654-127', 'pacd@gmail.com', 'Administrador', '02/15/2010', '02/15/2012', '1', 'SNP', 'SDF789RTY156FG5');

Saludos

dant 26-07-2010 00:23:38

[Resuelto]
 
Muchas gracias man algo tan simple jejeje...

duilioisola 26-07-2010 11:08:47

Tambien puedes dar mormato a la fecha con puntos barras o guiones:
dd.mm.yy o dd.mm.yyyy
mm/dd/yy o mm/dd/yyyy
yy-mm-dd o yyyy-mm-dd

Gallosuarez 26-07-2010 20:18:25

Opinión personal...
 
dant:

Según mi opinión personal, lo que estás tratando de hacer es un poco ineficiente. Mira yo lo haría de la siguiente forma:
1.- Crear mi base de datos con el siguiente juego de caracteres: ISO8859_1 (que es el juego de caracteres para la mayoría de los idiomas occidentales, incluyendo el Español, por supuesto).
2.-Crear los campos de Nombre, Apellido Paterno y Apellido Materno con el juego de caracteres mencionado arriba y utilizar el siguiente collate: ES_ES_CI_AI (Español de España, Caracter Insensitive, Accent Insentive), es decir tus campos no van a ser sensibles a mayúsculas ni minúsculas ni a los acentos. Por ejemplo, el siguiente nombre: Gerardo Suárez Trejo, sería exactamente igual a GERARDO Suarez Trejo (me explico, no importan las mayúsculas ni los acentos).
3.- Crear un campo computado con la concatenación de Apellido Paterno + Apellido Materno + Nombre (puedes calcular este campo con las valores antes capturados y es mucho mas cómodo para los usuarios).
4.- Creas un índice con el campo calculado (tu búsquedas sería de lo mas rápido que puedas imaginar, incluso puedes hacer búsquedas parciales, por ejemplo nombre_cmplto = 's', o nombre_cmplto = 'sua', etc. (la búsqueda automáticamente utilizaría el índice antes mencionados lo cual nos traería muchos beneficios en cuanto a velocidad se refiere).
5.-Creas un disparador (trigger before insert or update), y aquí haces una búsqueda para saber si existe el nombre_cmplto antes de hacer la inserción en la BD)
anexo un pequeño ejemplo que hice para una Escuela.
Código SQL [-]
CREATE OR ALTER trigger alumnos_biu0 for alumnos
active before insert or update position 0
AS
BEGIN
  IF(NEW.ID IS NULL) THEN
    NEW.ID = GEN_UUID();
  /* Quita espacios en blanco al inicio y al final del campo */
  NEW.NOMBRE = TRIM(NEW.NOMBRE);
  /* Quita espacios en blanco y se asegura que los Apellidos no contengan un valor NULL */
  NEW.A_PATERNO = COALESCE(TRIM(NEW.A_PATERNO), '');
  NEW.A_MATERNO = COALESCE(TRIM(NEW.A_MATERNO), '');
  /* No permite que haya Alumnos repetidos */
  IF (EXISTS(
    SELECT 1
    FROM ALUMNOS
    WHERE NEW.ID <> ID AND NEW.NOMBRE_CMPLTO = NOMBRE_CMPLTO)) THEN
      EXCEPTION ALUMNO_REPETIDO;
END

Saludos,
Gerardo Suárez Trejo

PD. No dejes de platicarnos como te fue...


La franja horaria es GMT +2. Ahora son las 01:45:13.

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