Firebird

Autor Tema: Seperador de Miles Firebird  (Leído 29 veces)

Claudio

  • Bit
  • *
  • Mensajes: 10
  • Karma: +0/-0
    • Ver Perfil
Seperador de Miles Firebird
« : agosto 07, 2019, 11:19:32 am »
 En alguna oportunidad quise emitir la información de un registro tipo numeric(18,2) y concatenarlo con un campo string para poder mostrar en un showmessage, guardar en algun expediente o posterior envio de mail de informes, etc.
El problema que encontré fue que por ejemplo: a los usuario les gustaba mas
Cita
Se autorizó una póliza de Gs. 150.000.000
que
Cita
Se autorizó una póliza de Gs. 150000000

 Quisiera saber si existe alguna otra manera??? no obstante a continuación publico mi SP que hace la funcion de separar un numero en formatos.

Cita de: Claudio

create or alter procedure separador_miles (
    i_monto double precision not null = 0,
    i_sep_miles char(1) not null = '.',
    i_cant_dec integer not null = 2)
returns (
    o_monto varchar(30))
as
declare variable v_sep_decim char(1);
declare variable v_monto varchar(30);
declare variable v_s_miles varchar(18);
declare variable v_s_decim varchar(12);
declare variable v_parte_ente bigint;
declare variable i integer;
declare variable chr char(3);
declare variable v_parte_dec double precision;
begin
  /*Creado por CBB 02/08/2019*/
  if (:i_monto = 0) then
  begin
    o_monto = 0;
    suspend;
    exit;
  end
  v_sep_decim=',';
  if (:i_sep_miles=',') then v_sep_decim='.';
  /*Seccion Miles*/
  v_monto = cast(:i_monto as varchar(30));
  v_s_miles = trim(substring(:v_monto from 1 for (position('.', :v_monto) - 1)));
  v_s_miles = lpad(:v_s_miles, 18, '0');
  i = 3;
  o_monto = '';
  while (:i <= 18) do
  begin
    chr = substring(:v_s_miles from :i - 2 for 3);
    if ((cast(chr as smallint) <> 0) or (:o_monto <> ''))  then
    begin
      if (:o_monto = '') then
      begin
        chr = trim('' || cast(:chr as smallint));
      end
      o_monto = :o_monto || trim(:chr);
      if (:i < 18) then
        o_monto = :o_monto || :i_sep_miles;
    end
    i = :i + 3;
  end
  if (:o_monto = '') then
    o_monto = '0';
  /*Seccion Decimales*/
  if (:i_cant_dec > 0) then
  begin
    v_parte_ente = trunc(:i_monto, 0);
    v_parte_dec = (cast(:i_monto as double precision) - cast(:v_parte_ente as double precision));
    if (:v_parte_dec < 0) then
      v_parte_dec = :v_parte_dec * -1;
    v_s_decim = cast(:v_parte_dec as varchar(12));
    v_s_decim = trim(substring(:v_s_decim from (position('.', :v_s_decim) + 1) for 12));
    v_s_decim = substring(:v_s_decim from 1 for :i_cant_dec);
    if (cast(:v_s_decim as integer) <> 0) then
      o_monto = :o_monto || :v_sep_decim || :v_s_decim;
  end
  suspend;
end

 
« Última Modificación: agosto 07, 2019, 11:24:13 am por Claudio »

Walter

  • Administrator
  • Gigabyte
  • *****
  • Mensajes: 511
  • Karma: +17/-0
    • Ver Perfil
Re:Seperador de Miles Firebird
« Respuesta #1 : septiembre 28, 2019, 09:17:34 am »
Aunque se puede crear una función o un stored procedure que realice esa tarea, no es del todo correcto hacerlo. Lo recomendable es que sea tu aplicación la que obtenga los datos y los formatee.

Saludos.

Walter.