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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-03-2015
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Parametros de salida de un stored procedure y valor por defecto

HOLA!!

Hoy es un buen día para llegar a los 1100 mensajes así que hay que aprovechar!!!!

¿Es posible asignar un valor por defecto a un parámetro de salida de un Stored Procedure?

En un parámetro de entrada se que si es posible, pero no he visto esta característica en un parámetro de salida. En mi mensaje anterior declaraba:

Código Delphi [-]
CREATE OR ALTER PROCEDURE CUENTATOTAL_3X_1 (
  P_DT_INICIO TIMESTAMP NOT NULL,
  P_DT_FINAL TIMESTAMP NOT NULL  
)
RETURNS (
  P_TOTAL_3X_1 INTEGER,
  P_CUENTA_3X_1 TYPE OF COLUMN DATOS.PESO

sin embargo si el valor de cuenta es Null me registra un error al tratar de asignarlo a algún componente -label, text, stringGrid, etc-

¿Es posible evitar eso? ¿Hay alguna técnica alternativa?

¡¡Saludos y Gracias por su atencion!!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #2  
Antiguo 02-03-2015
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Solo se me ocurre asignar el valor predeterminado dentro del código del procedimiento:

Código SQL [-]
as
begin
  P_CUENTA_3X_1 = 0;
  // ...
  IF ('ALGUNA CONDICIÓN') THEN
    P_CUENTA_3X_1 = 100;
end;


saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #3  
Antiguo 02-03-2015
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Gracias Maeyanes, pero la verdad no le capisco.....

Código SQL [-]
CREATE OR ALTER PROCEDURE CUENTATOTAL_3X_1 (
  P_DT_INICIO TIMESTAMP NOT NULL,
  P_DT_FINAL TIMESTAMP NOT NULL  
)
RETURNS (
  P_TOTAL_3X_1 INTEGER,
  P_CUENTA_3X_1 TYPE OF COLUMN DATOS.PESO
)
AS
BEGIN
  FOR SELECT 
      COUNT(*),
      SUM(PESO)
  FROM DATOS
  WHERE (FECHA >= :P_DT_INICIO AND FECHA <= :P_DT_FINAL) 
        /* resto de la condición ... */
  INTO
    P_TOTAL_3X_1, 
    P_CUENTA_3X_1
  DO
   SUSPEND;

La condición que me propones seria después del INTO?
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #4  
Antiguo 02-03-2015
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

En tu caso, al obtener el resultado directamente desde un query, podrías hacerlo así:

Código SQL [-]
CREATE OR ALTER PROCEDURE CUENTATOTAL_3X_1 (
  P_DT_INICIO TIMESTAMP NOT NULL,
  P_DT_FINAL TIMESTAMP NOT NULL  
)
RETURNS (
  P_TOTAL_3X_1 INTEGER,
  P_CUENTA_3X_1 TYPE OF COLUMN DATOS.PESO
)
AS
BEGIN
  FOR SELECT 
      COUNT(*),
      SUM(PESO)
  FROM DATOS
  WHERE (FECHA >= :P_DT_INICIO AND FECHA <= :P_DT_FINAL) 
        /* resto de la condición ... */
  INTO
    P_TOTAL_3X_1, 
    P_CUENTA_3X_1
  DO
  BEGIN
    IF (P_CUENTA_3X_1 IS NULL) THEN
      P_CUENTA_3X_1 = 0;
    SUSPEND;
  END;

Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #5  
Antiguo 03-03-2015
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Bueno al menos me compilo sin errores, sin embargo -y esta es harina de otro costal- no me respeta la condición dada en Where.

Seguiré buscando.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #6  
Antiguo 03-03-2015
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Fidel, que bueno verte más activo.

Estoy lejos de ser un experto en Firebird, pero me gustaría recordar que se usa Suspend cuando el procedimiento almacenado devolverá un cursor, es decir, cuando se va a consultar como si fuera una tabla (Select / subselect). Y cada vez que se ejecuta la instrucción Suspend se está "creando" y contestando al cliente una fila de resultados (con los valores que en ese momento tengan los parámetros de devolución).

En cambio, si el procedimiento ha de devolver un sólo dato o grupo de datos (no varias filas de datos), entonces basta con asignar los valores correspondientes a los parámetros de devolución, sin usar Suspend. Pero, en este caso, naturalmente el procedimiento no puede ser tratado como si fuera una tabla.

De manera predeterminada, los parámetros de devolución siempre tienen un valor de Null.

Por otra parte, Fidel, el "NOT NULL" en la cabecera no es para indicar valor predeterminado. Según entiendo es, como en el caso de la definición de tablas, para indicar que el parámetro de entrada en cuestión no debe ser Null.

Este artículo de la Fundación explica cómo de declaran realmente los parámetros con valor predeterminado (buscar ahí el apartado Default argument values).

Finalmente, dos cosas más. Enhorabuena por los 1100 mensajes , y algo igual de importante: No es buena práctica tratar de adaptar elementos de una base de datos a los elementos del lado cliente (como etiquetas o rejillas de la interfaz de usuario), ya que la capa de base de datos desconoce (y así debe ser) para qué clientes trabaja. Es la capa cliente la que tiene que adaptarse a la base de datos. Si un parámetro de devolución viene nulo, siempre habrá algún evento o propiedad en Delphi para convertirlo en una cosa aceptable.

Saludos.
Responder Con Cita
  #7  
Antiguo 03-03-2015
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Hola Al!

Los dos primeros puntos deberé de digerirlos mas lento.

El NOT NULL si lo entiendo y se aplica al parámetro de entrada, si a alguno de ellos le das un valor por defecto deberás dárselo a los que siguen.

La pregunta original se refería a parámetros de salida.

Con respecto al ultimo punto, se que lo ideal es aislar la capa de datos de la gui, y pues "El flojo trabaja dos veces"

Saludos!!!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #8  
Antiguo 03-03-2015
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 910
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Yo propondría usar una función como COALESCE(valor, Valor_Defecto_Si_Es_Nulo).

Código SQL [-]
CREATE OR ALTER PROCEDURE CUENTATOTAL_3X_1 (
  P_DT_INICIO TIMESTAMP NOT NULL,
  P_DT_FINAL TIMESTAMP NOT NULL  
)
RETURNS (
  P_TOTAL_3X_1 INTEGER,
  P_CUENTA_3X_1 TYPE OF COLUMN DATOS.PESO
)
AS
BEGIN
  FOR SELECT 
      COUNT(*),
      COALESCE(SUM(PESO),0)
  FROM DATOS
  WHERE (FECHA >= :P_DT_INICIO AND FECHA <= :P_DT_FINAL) 
        /* resto de la condición ... */
  INTO
    :P_TOTAL_3X_1, 
    :P_CUENTA_3X_1;

  SUSPEND;
END

Eso sería...
Responder Con Cita
  #9  
Antiguo 05-03-2015
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
GRRRRRRRR!

Me acabas de echar a perder 24 lineas de código y un montón de neuronas muertas.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Zeos, Stored Procedure y Parametros betto MySQL 3 18-02-2017 04:45:30
problema con parametros de un stored procedure ritamarkarla SQL 2 03-04-2012 15:56:16
Procedimiento con parámetros con valor por defecto Ledian_Fdez Varios 5 09-12-2010 23:15:12
Parametros + Stored Procedure betto MySQL 6 14-06-2010 22:30:52
Problema con un parámetro de salida en un Stored Procedure taote Firebird e Interbase 5 09-06-2004 21:41:38


La franja horaria es GMT +2. Ahora son las 20:41:15.


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