ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

So numero no select Firebird 2.0? [RESOLVIDO]
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 10, 2010 2:23 pm    Assunto: So numero no select Firebird 2.0? [RESOLVIDO] Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Mai 10, 2010 2:29 pm    Assunto: Responder com Citação

exemplo:

select xxxxx, sonumeros(campo) from tabela
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 10, 2010 2:37 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mai 10, 2010 2:58 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 10, 2010 3:22 pm    Assunto: Responder com Citação

Ola amigo,

Tanto a sua SP quanto a minha o resultado é o mesmo, apenas com diferença de tamanho nas linhas Very Happy

Código:
select (SELECT Resultado FROM sonumeros (c.numero_documento))as so_numero



Código:
select (SELECT Retorno FROM Proc_Digitos (c.numero_documento))as so_numero
from contas_receber cfrom contas_receber c


O problema é depois como uso o MAX para extrair o maior dentre estes retornos?
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mai 10, 2010 3:36 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 10, 2010 3:47 pm    Assunto: Responder com Citação

Deu certo amigo, no caso aqui não precisei usar o CAST

Código:
select
 max(coalesce(
 (SELECT Resultado FROM sonumeros(c.numero_documento)) ,0))
from contas_receber c


Muito obrigado pela grande ajuda amigão...
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mai 10, 2010 3:50 pm    Assunto: Responder com Citação

de nada

sempre q pode ajuda estamos aii
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Out 16, 2012 9:57 pm    Assunto: Responder com Citação

Olá, voltou a dar erro

Vejam a imagem


e o erro


Alguém sabe explicar o que esta dando errado?

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
Ver o perfil de Usuários Enviar Mensagem Particular
douglas_fc
Profissional
Profissional


Registrado: Quarta-Feira, 26 de Mai de 2010
Mensagens: 672

MensagemEnviada: Qua Out 17, 2012 8:52 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Out 17, 2012 9:35 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Out 19, 2012 7:38 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Out 19, 2012 9:02 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Out 19, 2012 10:23 pm    Assunto: Responder com Citação

imex escreveu:
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.
Sabe que eu nem tinha me ligado nisso, é isso mesmo Imex.

Obrigado amigo, sempre ajudando.
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
douglas_fc
Profissional
Profissional


Registrado: Quarta-Feira, 26 de Mai de 2010
Mensagens: 672

MensagemEnviada: Seg Out 22, 2012 8:51 am    Assunto: Responder com Citação



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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB