 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 10, 2010 2:23 pm Assunto: So numero no select Firebird 2.0? [RESOLVIDO] |
|
|
Pessoal como extraio somente numeros de um campo no firebird ?
Estou até com uma procedure que faz isso
| Código: | create or alter procedure sonumeros(
-- texto com a máscara.
texto varchar(100)
)returns(
-- texto final, contendo apenas os dígitos, caso existam.
resultado varchar(100)
)as
declare variable indice integer;
declare variable caracter char(1);
begin
-- não informou o texto?
if (texto is null) then
-- também sem resultado.
resultado = null;
else
begin
-- inicializa o resultado.
resultado = texto;
-- inicializa o índice do laço.
indice = char_length(resultado);
-- laço de remoção da máscara.
while (indice > 0) do
begin
-- obtém o próximo caracter a ser analisado.
caracter = cast(substring(resultado from indice for 1) as char(1));
-- não é um dígito?
if (not(caracter between '0' and '9')) then
-- remove o caracter atual.
resultado = substring(resultado from 1 for (indice - 1)) ||
substring(resultado from (indice + 1) for
(char_length(resultado) - indice));
-- avança para o caracter anterior.
indice = indice - 1;
end -- while
end -- else
-- envia o resultado.
suspend;
end |
Mais não sei como chama-la no select
| Código: | select max(numero_documento)as xn_doc,
(select from sonumeros(a.numero_documento)
)as numero
from contas_receber a |
Alguém pode me ajudar? _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Editado pela última vez por adriano_servitec em Sex Out 19, 2012 10:23 pm, num total de 3 vezes |
|
| Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Seg Mai 10, 2010 2:29 pm Assunto: |
|
|
exemplo:
select xxxxx, sonumeros(campo) from tabela |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 10, 2010 2:37 pm Assunto: |
|
|
| gilsonnrodrigues escreveu: | exemplo:
select xxxxx, sonumeros(campo) from tabela |
Não consegui chamar
| Código: | select max(numero_documento)as xn_doc,
sonumeros(a.numero_documento)as numero
from contas_receber a |
ou assim
| Código: | select max(numero_documento)as xn_doc,
sonumeros(xn_doc)as numero
from contas_receber a |
An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Function unknown.
SONUMEROS.
Eu preciso usar o max e depois deste resultado extrair apenas os numeros e mostrar o resultado _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
rafmattos Colaborador

Registrado: Quinta-Feira, 11 de Fevereiro de 2010 Mensagens: 3416 Localização: Campo Grande/MS
|
Enviada: Seg Mai 10, 2010 2:58 pm Assunto: |
|
|
amigo não sei se existe uma função ja definida mas vc pode fazer uma procedure para isso
| Código: |
SET TERM ^ ;
CREATE PROCEDURE Proc_Digitos(Texto VARCHAR(100))
RETURNS(Retorno VARCHAR(100)) AS
DECLARE Ch CHAR(1);
BEGIN
Retorno = '';
WHILE (Texto IS NOT NULL AND Texto <> '') DO
BEGIN
Ch = SUBSTRING(Texto FROM 1 FOR 1);
IF (Ch >= '0' AND Ch <= '9') THEN
Retorno = Retorno || Ch;
Texto = SUBSTRING(Texto FROM 2 FOR 100);
END
SUSPEND;
END^
SET TERM ; ^
|
nesse caso ele retornaria só os numero do endereço
| Código: |
select (SELECT Retorno FROM Proc_Digitos(C.endereco))
from cliente c |
|
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
rafmattos Colaborador

Registrado: Quinta-Feira, 11 de Fevereiro de 2010 Mensagens: 3416 Localização: Campo Grande/MS
|
Enviada: Seg Mai 10, 2010 3:36 pm Assunto: |
|
|
eu fiz umas alteração da uma olhada os q sao vazio ele retorna como null e depois dou cast e um coalesce e fiz aqui deu certo
| Código: |
SET TERM ^ ;
CREATE PROCEDURE PROC_DIGITOS (
texto varchar(100))
returns (
retorno varchar(100))
as
declare variable ch char(1);
BEGIN
Retorno = '';
WHILE (Texto IS NOT NULL AND Texto <> '') DO
BEGIN
Ch = SUBSTRING(Texto FROM 1 FOR 1);
IF (Ch >= '0' AND Ch <= '9') THEN
Retorno = Retorno || Ch;
Texto = SUBSTRING(Texto FROM 2 FOR 100);
END
if (retorno = '') then
retorno = null;
SUSPEND;
END^
SET TERM ; ^
|
| Código: |
select max(cast(coalesce( (SELECT Retorno FROM Proc_Digitos(c.endereco)) ,0) as integer))
from cliente c
|
|
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
rafmattos Colaborador

Registrado: Quinta-Feira, 11 de Fevereiro de 2010 Mensagens: 3416 Localização: Campo Grande/MS
|
Enviada: Seg Mai 10, 2010 3:50 pm Assunto: |
|
|
de nada
sempre q pode ajuda estamos aii |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
douglas_fc Profissional


Registrado: Quarta-Feira, 26 de Mai de 2010 Mensagens: 672
|
Enviada: Qua Out 17, 2012 8:52 am Assunto: |
|
|
Amigo ja tentou usar o case???
mais ou menos assim :
| Código: |
select
case
when substring(numero_documento from 1 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 1 for 1)
else ''
end ||
case
when substring(numero_documento from 2 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 2 for 1)
else ''
end as SO_NUMERO
from contas_receber
|
ai dependendo do tamanho do seu campo é só ir implementando inserindo mais linhas na consulta e concatenando seguindo essa logica ai blz _________________ O conhecimento só tem valor quando compartilhado!
Douglas Sousa |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Out 17, 2012 9:35 am Assunto: |
|
|
| douglas_fc escreveu: | Amigo ja tentou usar o case???
mais ou menos assim :
| Código: |
select
case
when substring(numero_documento from 1 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 1 for 1)
else ''
end ||
case
when substring(numero_documento from 2 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 2 for 1)
else ''
end as SO_NUMERO
from contas_receber
|
ai dependendo do tamanho do seu campo é só ir implementando inserindo mais linhas na consulta e concatenando seguindo essa logica ai blz | Olá amigo, então, a noite vou testar.
Muito obrigado. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sex Out 19, 2012 7:38 pm Assunto: |
|
|
Olá douglas_fc, testei seu codigo e retornou assim
A sp SONUMEROS_MAX que estou usando é esta
| Código: | SET TERM ^ ;
CREATE OR ALTER PROCEDURE SONUMEROS_MAX (
texto varchar(100))
returns (
resultado varchar(100))
as
declare variable indice integer;
BEGIN
-- Não informou o texto?
IF (TEXTO IS NULL) THEN
-- Também sem resultado.
RESULTADO = NULL;
ELSE
BEGIN
INDICE = 1;
WHILE ((INDICE <= CHAR_LENGTH(TEXTO)) AND
(SUBSTRING(TEXTO FROM INDICE FOR 1) <> '-')) DO
BEGIN
INDICE = INDICE + 1;
END -- WHILE
RESULTADO = SUBSTRING(TEXTO FROM 1 FOR INDICE - 1);
END -- ELSE
-- Envia o resultado.
SUSPEND;
END^
SET TERM ; ^ |
Obrigado. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Out 19, 2012 9:02 pm Assunto: |
|
|
Acho que está faltando verificar se existe uma barra no código:
| Código: | WHILE ((INDICE <= CHAR_LENGTH(TEXTO)) AND
(SUBSTRING(TEXTO FROM INDICE FOR 1) not in ('-', '/'))) DO |
Espero que ajude.
Editado pela última vez por imex em Qui Set 28, 2023 12:00 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
douglas_fc Profissional


Registrado: Quarta-Feira, 26 de Mai de 2010 Mensagens: 672
|
Enviada: Seg Out 22, 2012 8:51 am Assunto: |
|
|
Adriano que bom que deu tudo certo mais da forma que postei acredito que faltou implementar para os demais esse codigo que postei esta concatenando só os dois primeiros numeros tem q continuar o select mais sou menos assim :
| Código: |
select
case
when substring(numero_documento from 1 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 1 for 1)
else ''
end ||
case
when substring(numero_documento from 2 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 2 for 1)
else ''
end ||
case
when substring(numero_documento from 3 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 3 for 1)
else ''
end ||
case
when substring(numero_documento from 4 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 4 for 1)
else ''
end ||
case
when substring(numero_documento from 5 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 5 for 1)
else ''
end ||
case
when substring(numero_documento from 6 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 6 for 1)
else ''
end ||
case
when substring(numero_documento from 7 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 7 for 1)
else ''
end ||
case
when substring(numero_documento from 8 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 8 for 1)
else ''
end ||
case
when substring(numero_documento from 9 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 9 for 1)
else ''
end ||
case
when substring(numero_documento from 10 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 10 for 1)
else ''
end ||
case
when substring(numero_documento from 11 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 11 for 1)
else ''
end ||
case
when substring(numero_documento from 12 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 12 for 1)
else ''
end ||
case
when substring(numero_documento from 13 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 13 for 1)
else ''
end ||
case
when substring(numero_documento from 14 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 14 for 1)
else ''
end ||
case
when substring(numero_documento from 15 for 1) in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then substring(numero_documento from 15 for 1)
else ''
end as SO_NUMERO
from contas_receber
|
_________________ O conhecimento só tem valor quando compartilhado!
Douglas Sousa |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|