Clipper On Line • Ver Tópico - Função extenso() no MySQL

Função extenso() no MySQL

Discussão sobre SQL

Moderador: Moderadores

 

Função extenso() no MySQL

Mensagempor JoséQuintas » 09 Abr 2021 21:04

Estou querendo criar uma função de extenso no MySQL, mas sem idéia.
Alguém pode me dar uma luz como se criam funções/variáveis/etc.?

Pode ser uma função de somar A + B pra começar, criando a variável C pra retorno.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 11:03

Já tentei algumas mas não deu.
Por exemplo, assim:

delimiter //
CREATE FUNCTION ze_extenso( nValor DECIMAL )
BEGIN
DECLARE ctxt VARCHAR;
ctxt = CONCAT( nvalor,'');
End
//


Já tentei com IN, OUT, DECLARE, RETURNS, etc., conforme exemplos que encontrei.
Dá erro na criação.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor Itamar M. Lins Jr. » 12 Abr 2021 11:43

Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 11:57

Começou a dar sinal de vida.

https://mariadb.com/kb/pt-br/create-function/

CREATE function ze_extenso ( nValue decimal(10,2) )
RETURNS VARCHAR(500)  DETERMINISTIC
RETURN CONCAT( 'Hello ', nValue, ' !' );


extenso.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 12:03

Encontrei uma diferença interessante:

RETURN CONCAT_WS( ' ', 'Hello', nValue, '!' )


extenso2.png


No CONCAT() vém inteiro, no CONCAT_WS() vém decimal.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 12:12

Na hora que vai declarar variável, não vai

cTxt VARCHAR(500);

set cTxt := CONCAT_WS( ' ', 'Hello', nValue, cTxt, '!' );

RETURN cTxt
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 12:31

uma coisa simples assim não vai

DROP FUNCTION if exists ze_extenso;
SET delimiter $$
create function ze_extenso( nValue DECIMAL(15,2) )
RETURNS VARCHAR(500)  DETERMINISTIC
BEGIN
DECLARE ctxt VARCHAR(500);
SET ctxt = CONCAT( 'Hello ', nValue, cTxt, ' !' );
RETURN cTxt
end$$         
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 12:34

ufa, finalmente.

DROP FUNCTION if exists ze_extenso;
delimiter $$
create function ze_extenso( nValue DECIMAL(15,2) )
RETURNS VARCHAR(500)  DETERMINISTIC
BEGIN
DECLARE ctxt VARCHAR(500);
SET ctxt = CONCAT( 'Hello ', nValue, ' !' );
RETURN cTxt;
END
$$         
delimiter ;
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 12:38

A propósito....
DETERMINISTIC....
Sei lá pra que serve, pode ser assim ou NOT.
Nesse manual não diz, apenas mostra que pode usar DETERMINISTIC ou NOT DETERMINISTIC.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 12:52

Bom, a parte principal tá pronta.
Falta só o extenso, que vou tentar converter a minha do Harbour.

DROP FUNCTION if exists ze_extenso;
delimiter $$
create function ze_extenso( nValor DECIMAL(15,2) )
RETURNS VARCHAR(500)  DETERMINISTIC
BEGIN
DECLARE cTxt VARCHAR(500);
SET cTxt := '';
if nvalor != 0 then
   SET cTxt := CONCAT( ' ', 'extenso', LPAD( Ceil(nValor * 100 ), 15, '0' ), '!' );
end if;
RETURN cTxt;
END
$$         
delimiter ;


Na consulta, ela está assim:

CREATE DEFINER=`jpatecnologia`@`%` FUNCTION `ze_extenso`(
   `nValue` DECIMAL(15,2)
)
RETURNS varchar(500) CHARSET latin1
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
RETURN CONCAT_WS( ' ', 'Hello', nValue, '!' )


extenso.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 13:55

dezenove.png


Uia, de 1 a 19 tá pronto.
O difícil foi aquele começo mesmo.

DROP FUNCTION if exists ze_extensoUnidade;
delimiter $$
create function ze_extensoUnidade( nValor INT )
RETURNS VARCHAR(500)  DETERMINISTIC
BEGIN
DECLARE cTxt VARCHAR(500);
SET cTxt := (
case
when nvalor = 1 then 'HUM'
when nvalor = 2 then 'dois'
when nvalor = 3 then 'tres'
when nvalor = 4 then 'quatro'
when nvalor = 5 then 'cinco'
when nvalor = 6 then 'seis'
when nvalor = 7 then 'sete'
when nvalor = 8 then 'oito'
when nvalor = 9 then 'nove'
when nvalor = 10 then 'dez'
when nvalor = 11 then 'onze'
when nvalor = 12 then 'doze'
when nvalor = 13 then 'treze'
when nvalor = 14 then 'quatorze'
when nvalor = 15 then 'quinze'
when nvalor = 16 then 'dezesseis'
when nvalor = 17 then 'dezessete'
when nvalor = 18 then 'dezoito'
when nvalor = 19 then 'dezenove'
ELSE ''
END );
RETURN cTxt;
END
$$         
delimiter ;
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 14:27

extenso2.png


DROP FUNCTION if exists ze_extensoDezena;
delimiter $$
create function ze_extensodezena( nValor INT )
RETURNS VARCHAR(500)  DETERMINISTIC
BEGIN
DECLARE cTxt VARCHAR(500);
DECLARE ndezena INT;
DECLARE nunidade INT;
SET ctxt = '';
if nvalor > 0 then
   if nvalor < 20 then
      set cTxt = ze_ExtensoUnidade( nValor );
   else
      SET ndezena = floor( nvalor / 10 );
      SET nunidade = nvalor - ( ndezena * 10 );
      set cTxt = (
      case
      when ndezena = 2 then 'VINTE'
      when ndezena = 3 then 'TRINTA'
      when ndezena = 4 then 'QUARENTA'   
      when ndezena = 5 then 'CINQUENTA'
      when ndezena = 6 then 'SESSENTA'
      when ndezena = 7 then 'SETENTA'
      when ndezena = 8 then 'OITENTA'
      when ndezena = 9 then 'NOVENTA'
      ELSE ''
      END );
      if nunidade != 0 then
         set cTxt = CONCAT( ctxt, ' E ', ze_extensounidade( nUnidade ) );
      END if ;
   END if;
END if   ;
RETURN cTxt;
END
$$         
delimiter ;


Eu gostei de como ficou minha função de extenso no Harbour.
Só ver como tá interessante converter pra MySQL.

Agora dezenas resolvido.
Próximo passo: CENTENAS
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 14:46

CENTENA.png


Uia....
Agora tá pronto extenso pra qualquer grupo de centena.
A de centena apaguei o comando, tive que pegar a salva.

CREATE DEFINER=`jpatecnologia`@`%` FUNCTION `ze_extensocentena`(
   `nValor` INT
)
RETURNS varchar(500) CHARSET latin1
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE cTxt VARCHAR(500);
DECLARE ncentena INT;
DECLARE ndezena INT;
SET ctxt = '';
if nvalor > 0 then
   if nvalor = 100 then
      set cTxt = 'CEM';
   else
      SET ncentena = floor( nvalor / 100 );
      SET ndezena = nvalor - ( ncentena * 100 );
      set cTxt = (
      case
      when ncentena = 1 then 'CENTO'
      when nCENTENA = 2 then 'DUZENTOS'
      when nCENTENA = 3 then 'TREZENTOS'
      when nCENTENA = 4 then 'QUATROCENTOS'   
      when nCENTENA = 5 then 'QUINHENTOS'
      when nCENTENA = 6 then 'SEISSENTOS'
      when nCENTENA = 7 then 'SETECENTOS'
      when nCENTENA = 8 then 'OITOCENTOS'
      when nCENTENA = 9 then 'NOVECENTOS'
      ELSE ''
      END );
      if nDEZENA != 0 then
         set cTxt = CONCAT( ctxt, IF( NCENTENA = 0, '', ' e ' ), ze_extensoDEZENA( nDEZENA ) );
      END if ;
   END if;
END if   ;
RETURN cTxt;
END


Aliás, também apaguei a de dezena, a sorte é que salvei aqui no fórum e peguei de volta.
Agora só falta as unidades monetárias, e juntar os blocos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 15:02

visaogeral.png


Pra quem não entendeu ainda.
Estou criando a função DENTRO DO BANCO DE DADOS.

Vantagem?
Se está no banco de dados, QUALQUER LINGUAGEM DE PROGRAMAÇÃO vai poder usar.

Entenderam?

Aquilo de converter pra outra linguagem de programação.....
É converter pra SQL e tem tudo pronto pra qualquer coisa.

Mas o melhor: pode procurar coisa pronta na internet de qualquer linguagem de programação que use SQL.

Lógico, convém lembrar: existem algumas diferenças entre os SQL de SQL Server, MySQL, Firebird, etc.

E como viram aqui, eu apanhei um pouco pra criar a primeira função.
Agora tá começando a dar certo.

Lembrando também: são comandos SQL, que também poderiam ser usados nos SELECTs, pra buscar informações.
Aqui usando pra criar função, que vai ficar disponível para o aplicativo.

Como eu disse tempos atrás, é começar a usar, e vamos descobrindo as possibilidades aos poucos.
Acho que Isso ainda faz parte do básico, de tanta coisa que tem pra aprender.
Podemos viver sem isso, não é obrigado a aprender, mas.... com isso as possibilidades aumentam cada vez mais.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Função extenso() no MySQL

Mensagempor JoséQuintas » 12 Abr 2021 15:17

Aproveitando também....

Trocar DBF pra MySQL/SQL não se trata apenas de como salvar as informações, ou de não ter índice corrompido.
É um "mundo novo", repleto de possibilidades.

No aplicativo, no caso de ADO, vai ser algo como

rs := conexao:Execute(  "SELECT ze_Extenso( " + Str( Valor ) + " ) AS EXTENSO"  )
? rs:Fields( "EXTENSO" ):Value
rs:Close()


O servidor vai dar o extenso pronto para o terminal.

E com essas coisinhas.... desenvolver pra web depois pode ser fácil, porque fica tudo no SQL.

Então, ao invés de quebrar a cabeça agora com o que vai usar no futuro, é só começar a usar SQL, e vai deixando tudo preparado.
Vai aprendendo, vai testando, e vai evoluindo o conhecimento.

Sem pressa...
Isso de função, de vez em quando eu tentava alguma coisa....
Ainda não sei direito o que vou fazer, mas primeiro precisava funcionar, o que agora funcionou.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro