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 28-01-2012
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Hacer en un Procedimiento Almacenado algo Como el "DisplayFormat" de Delphi

Saludos

En un Procedimiento almacenado Necesito colocar en una Variable String el Valor de un Campo Numerico, actualmente estoy utilizando el CAST para hacerlo, pero me gustaria saber si existe una manera de FORMATEAR el campo numerico;

Ejemplo
Código SQL [-]
CREATE PROCEDURE PRUEBA (
    MONTO  NUMERIC(14,3)
    )
RETURNS (
    Mensaje  VARCHAR(50)
)
Begin
  Monto = Monto * 1523.62
  Mensaje = 'El Resultado es '||cast(monto as varchar(20));
  suspend; 
end

El procedimiento devuelve algo así "El Resultado es 12454545.24"
y me gustaria formatear el resultado ha algo como; "El Resultado es 12,454,545.24"

Existe la Manera de hacer esto ?
Responder Con Cita
  #2  
Antiguo 29-01-2012
[birmain] birmain is offline
Miembro Premium
 
Registrado: feb 2005
Ubicación: Albacete - España
Posts: 49
Poder: 0
birmain Va por buen camino
Esta es la solución

Tengo implementado un procedimiento almacenado que hace justamente eso. Admite tres parámetros de entrada:

NUMERO DECIMAL(18,4)
LONGNUM INTEGER,
PREC SMALLINT

y devuelve
RESULTADO VARCHAR(100)

El primero obviamente es el número a formatear, el segundo es la longitud de la cadena resultante, o sea que justifica con espacios a la izquierda hasta completar esa longitud, y el tercero es la precisión decimal con la que se obtendrá la salida.

Ejemplo: 1456.279, 12, 2 daría : '(cuatro espacios)1.456,28'

Este es el código del procedimiento almacenado:

Código SQL [-]
/******************************************************************************/
/***        Funciona en Firebird 2.5.x          ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES NONE;

SET CLIENTLIB 'C:\Program Files (x86)\Firebird\Firebird_2_5\bin\fbclient.dll'; -- Poner aquí el path del cliente firebird

CREATE DATABASE 'cadena de conexión'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 8192
DEFAULT CHARACTER SET NONE COLLATION NONE;



SET TERM ^ ; 



/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/

CREATE PROCEDURE IUDF_FORMATO_NUM (
    NUMERO DECIMAL(18,4),
    LONGNUM INTEGER,
    PREC SMALLINT)
RETURNS (
    RESULTADO VARCHAR(100))
AS
BEGIN
  SUSPEND;
END^






SET TERM ; ^



/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE IUDF_FORMATO_NUM (
    NUMERO DECIMAL(18,4),
    LONGNUM INTEGER,
    PREC SMALLINT)
RETURNS (
    RESULTADO VARCHAR(100))
AS
declare variable PARTE_ENTERA integer;
declare variable PARTE_DECIMAL integer;
declare variable NUM decimal(18,6);
declare variable NEGATIVO varchar(10);
declare variable NUM_CAD varchar(50);
declare variable POSDEC smallint;
declare variable J integer;
declare variable I integer;
declare variable PARTE_ENTERA_CAD varchar(100);
declare variable PARTE_DECIMAL_CAD varchar(20);
declare variable PARTE_ENTERA_CAD_REV varchar(100);
declare variable COMA varchar(5);
declare variable DECIMAL_CAD varchar(10);
begin
  if (numero < 0) then negativo = '-'; else negativo = '';
  numero = abs(numero);
  coma = ',';


  if (prec > 6) then prec = 6;
  num_cad = cast(numero as varchar(50));
  posdec = position('.' in num_cad);
  if (posdec <> 0) then
  begin
     num_cad = substring(num_cad from posdec+1);
     num_cad = trim(trailing '0' from num_cad);
  end


  parte_entera = floor(numero);
  num = round(numero, prec);
  num = num - parte_entera;
  parte_decimal = cast(num * power(10, prec) as integer);

  decimal_cad = cast(parte_decimal as varchar(10));
  if (char_length(num_cad) > prec) then
  begin
      decimal_cad = rpad(decimal_cad, char_length(num_cad), '0');
      parte_decimal = cast(decimal_cad as integer);
  end


  -- Extracción de la parte entera y decimal
  parte_entera = floor(numero);
  num = round(numero, prec);
  num = num - parte_entera;
  parte_decimal = cast(num * power(10, prec) as integer);
  parte_entera_cad = cast(parte_entera as varchar(100));
  parte_decimal_cad = cast(parte_decimal as varchar(10));

  if (parte_decimal = 0) then parte_decimal_cad = lpad('', prec,  '0');

  parte_entera_cad_rev = '';
  j = char_length(parte_entera_cad);
  i = 0;
  while (j >= 1) do
  begin
     i = i + 1;
     parte_entera_cad_rev = parte_entera_cad_rev || substring(parte_entera_cad from j for 1);
     if ((mod(i, 3)=0) and (j>1)) then parte_entera_cad_rev = parte_entera_cad_rev || '.';
     j = j - 1;
  end
  resultado = negativo || reverse(parte_entera_cad_rev) || coma || parte_decimal_cad;
  resultado = lpad(resultado,  longnum, ' ');
  suspend;
end^



SET TERM ; ^

Última edición por birmain fecha: 29-01-2012 a las 12:09:02.
Responder Con Cita
  #3  
Antiguo 29-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pienso que un servidor de bases de datos no debe dedicarse a formatear presentación de números y enviar mensajes para presentar al usuario. Eso son tareas que se debe hacer en la parte cliente. Pero, bueno, cada uno es libre de decidir lo que más le gusta o conviene.
Responder Con Cita
  #4  
Antiguo 29-01-2012
[birmain] birmain is offline
Miembro Premium
 
Registrado: feb 2005
Ubicación: Albacete - España
Posts: 49
Poder: 0
birmain Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Pienso que un servidor de bases de datos no debe dedicarse a formatear presentación de números y enviar mensajes para presentar al usuario. Eso son tareas que se debe hacer en la parte cliente. Pero, bueno, cada uno es libre de decidir lo que más le gusta o conviene.
Estoy de acuerdo, Casimiro, pero hay aplicaciones donde un stored procedure tiene que generar un campo blob con información escrita en modo texto y guardarla en la base de datos. En ese caso utilizo esta función si parte del texto a guardar de forma dinámica son cifras. Para otras operaciones puede ser totalmente innecesario, y puede hacerse como dices del lado del cliente.
Responder Con Cita
  #5  
Antiguo 29-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Sí, puede ser necesario a veces, como comentas
Responder Con Cita
  #6  
Antiguo 31-01-2012
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Cita:
Empezado por birmain Ver Mensaje
Estoy de acuerdo, Casimiro, pero hay aplicaciones donde un stored procedure tiene que generar un campo blob con información escrita en modo texto y guardarla en la base de datos. En ese caso utilizo esta función si parte del texto a guardar de forma dinámica son cifras. Para otras operaciones puede ser totalmente innecesario, y puede hacerse como dices del lado del cliente.
Amigo
Birmain


Efectivamente es asi debo guardar en un campo BLOB un explicación o comentario tipo Texto y dentro de ese comentario debo guardar el resultado de un calculo.

Probare el Procedimiento a ver que tal..

Saludos y Gracias por el aporte
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
Como hacer que se vea "Si" en vez de "TRUE" en un DBGrid lu9eui C++ Builder 2 07-08-2007 04:03:13
Algo similar a "FindComponent" en visual basic 6 Hugorr .NET 1 03-08-2007 14:44:35
Como hacer para que Vista no reporte "No se pudo comprobar el editor" Firma digital fcios Windows 2 16-06-2007 04:52:49
"no current record for fetch operation" con procedimiento almacenado usado en Select Al González Firebird e Interbase 1 17-03-2004 21:13:17


La franja horaria es GMT +2. Ahora son las 02:13:42.


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