Página 1 de 1

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Enviado: 03 Out 2023 13:18
por NiltonGM
Pessoal, como vão todos?
Alguém já teve esse problema ao converter um Hash Table em JSON usando hb_jsonEncode(hBody, 4), os campos numéricos com casas decimais zerada é ignorado, tipo 340.0000 ou 30.00, as casas decimais são ignorados mostrando os valores inteiros.
Screenshot_20231003_123935.png
Nos testes que fiz no playgroud https://os.allcom.pl/harbour/ isso não acontece, não uso SET FIXED ON e nem SET DECIMALS TO n

Código: Selecionar todos

PROCEDURE Main
   LOCAL hTeste := {=>}
   LOCAL jsonText
   
	? 25141251 / 362
	? 214514.214 / 6325

   hTeste['Produto'] := "UltraMegaPower PC com estonteantes 4MB RAM 386Plus"
   hTeste['Preco1'] := 343.0000
   hTeste['Preco2'] := 71.01
   hTeste['Preco3'] := 65.00457
   
   ? "Produto:", hTeste['Produto']
   ? "Preço 1", hTeste['Preco1']
   ? "Preço 2", hTeste['Preco2']
   ? "Preço 3", hTeste['Preco3']
   ? 
   
   jsonText := hb_jsonEncode(hTeste, 4)
   ?
   ? jsonText
      
RESULTADO:
69450.97
33.92
Produto: UltraMegaPower PC com estonteantes 4MB RAM 386Plus
Preço 1 343.0000
Preço 2 71.01
Preço 3 65.00457


{
"Produto": "UltraMegaPower PC com estonteantes 4MB RAM 386Plus",
"Preco1": 343.0000,
"Preco2": 71.01,
"Preco3": 65.00457
}

Program exited.
Grato!

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Enviado: 09 Out 2023 12:02
por Kapiaba
Já testou com o comando SET DECIMALS TO?

Abs. Regards, saludos.

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Enviado: 09 Out 2023 12:39
por JoséQuintas
Mas número é número, não precisa decimais zeradas.
Isso seria problema da rotina do outro lado.

O programa do governo pra SCANC feito em Delphi tem esse tipo de problema.
É como se ele usasse inteiro ou double baseado no que está sendo importado.
Mas ele usa TXT e não json.

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Enviado: 09 Out 2023 12:51
por NiltonGM
Kapiaba escreveu:Já testou com o comando SET DECIMALS TO?

Abs. Regards, saludos.
Kapiaba. Sim, testei e problema persiste, mas a nuvem fiscal resolve isso ao gerar o XML.
JoséQuintas escreveu:Mas número é número, não precisa decimais zeradas.
Isso seria problema da rotina do outro lado.

O programa do governo pra SCANC feito em Delphi tem esse tipo de problema.
É como se ele usasse inteiro ou double baseado no que está sendo importado.
Mas ele usa TXT e não json.
José Quintas, concordo, número é numero, eu iria resolver da seguinte forma, todo valor numérico eu ia salvar como string adicionado nas duas extremidades do string o caracter # (ficando assim: "valor": "#35.2548#"), depois usaria o Strtrans() para trocar no texto json tudo que é ["#] por "" e [#"] também por "", mas deixei como está pois a api da Nuvem Fiscal trata isso corretamente ao gerar o XML do CTe.

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Enviado: 09 Out 2023 13:48
por JoséQuintas
Em stored procedure/function mais fácil ainda.

Código: Selecionar todos

CREATE FUNCTION ze_xmlnfeprodutoipi( nIdItPed INT(11) )
RETURNS TEXT CHARSET latin1

BEGIN

   DECLARE cIpiCst, cIpiEnq VARCHAR(10) DEFAULT '';
   DECLARE nIpiBas, nIpiAli, nIpiVal DECIMAL(16,2) DEFAULT 0;
   DECLARE cXml TEXT;

   SELECT
      COALESCE( IPIPICST, '' ),
      COALESCE( IPIPIBAS, 0 ),
      COALESCE( IPIPIALI, 0 ),
      COALESCE( IPIPIVAL, 0 ),
      IPIPIENQ
   FROM JPITPED
   LEFT JOIN JPITEM ON IDPRODUTO = IPPRODUTO
   WHERE IDITPED = nIdItPed
   INTO cIpiCst, nIpiBas, nIpiAli, nIpiVal, cIpiEnq ;

   IF LENGTH( cIpiCst ) = 0 OR LENGTH( cIpiEnq ) = 0 THEN
      RETURN '';
   END IF;

   SET cXml := CONCAT(
      '<IPI>',
      ze_XmlTag( 'cEnq', cIpiEnq ),
      IF( nIpiVal = 0,
         CONCAT( '<IPINT>',
            ze_XmlTag( 'CST', cIpiCst ), /* valem 01,02,03,04,05,51,52,53,54,55 */
            '</IPINT>' ),
         CONCAT( '<IPITrib>',
            ze_XmlTag( 'CST',  cIpiCst ), /* 00,49,50,99 */
            ze_XmlTag( 'vBC',  nIpiBas ),
            ze_XmlTag( 'pIPI', nIpiAli ),
            ze_XmlTag( 'vIPI', nIpiVal ),
            '</IPITrib>' ) ),
         '</IPI>' );

   RETURN cXml;

END;
E dá pra simplificar um pouquinho.

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Enviado: 09 Out 2023 14:06
por JoséQuintas
Sei lá se simplificou.....

Código: Selecionar todos

   IF nIPIVal = 0 THEN
      /* valem 01,02,03,04,05,51,52,53,54,55 */
      SET cXml := ze_XmlTag( 'IPINT', ze_XmlTag( 'CST', cIpiCst ) ); 
   ELSE
      /* 00,49,50,99 */
      SET cXml := ze_XmlTag( 'IPITribut', 
         CONCAT( ze_XmlTag( 'CST',  cIpiCst ), 
            ze_XmlTag( 'vBC',  nIpiBas ),
            ze_XmlTag( 'pIPI', nIpiAli ),
            ze_XmlTag( 'vIPI', nIpiVal ) ) );
   END IF;
   
   SET cXml := ze_XmlTag( 'IPI', CONCAT( ze_XmlTag( 'cEnq', cIpiEnq ), cXml ) );

   RETURN cXml;
Nota: é que só olhei agora que postei, e vi que dava pra mexer.