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 

Fazer um select max no firebird?
Ir à página 1, 2, 3  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


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

MensagemEnviada: Qua Mai 30, 2012 8:29 pm    Assunto: Fazer um select max no firebird? Responder com Citação

Pessoal quero fazer um select max assim

Código:
SELECT MAX(CAST(nrordemserv as INTEGER))as n_doc
FROM ordemserv WHERE nrordemserv < 999999


E o resultado se ja tiver no banco pegar o próximo resultado vago.

Vou explicar, é que tenho um campo tipo varchar que é digitado numeros, ai estava fazendo o select acima para criar um novo sequencial, só que não sie o pq estou fazendo um select aqui e esta retornando 999901, só que este numero ja esta cadastrado no sistema, quero que quando acontecer isso ele pegue o próximo numero livre.

Por exemplo se o numero 999905 não tiver no banco então o resultado do select seria este ai.

Tem como fazer isso?

Obrigado.


Editado pela última vez por adriano_servitec em Qua Dez 05, 2012 8:11 am, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Mai 30, 2012 8:52 pm    Assunto: Responder com Citação

Adriano este numero 999999 você passa ele por parametro? e qual é o tipo do campo nrordemserv?
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
adriano_servitec
Colaborador
Colaborador


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

MensagemEnviada: Qua Mai 30, 2012 9:15 pm    Assunto: Responder com Citação

pestana escreveu:
Adriano este numero 999999 você passa ele por parametro? e qual é o tipo do campo nrordemserv?
Pestana este numero 999999 é o maximo que quero que faça, ja esta fixo, e o campo é um varchar 20

Obrigado amigo
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
builder_rs
Novato
Novato


Registrado: Quarta-Feira, 26 de Dezembro de 2007
Mensagens: 88

MensagemEnviada: Qui Mai 31, 2012 11:59 am    Assunto: Responder com Citação

Tenta assim:

SELECT CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
ORDER BY nrordemserv DESC
ROWS 1 to 1;

ou

select first 1 CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
ORDER BY nrordemserv DESC;

Abraços,

Anderson:.
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: Qui Mai 31, 2012 1:49 pm    Assunto: Responder com Citação

builder_rs escreveu:
Tenta assim:

SELECT CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
ORDER BY nrordemserv DESC
ROWS 1 to 1;

ou

select first 1 CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
ORDER BY nrordemserv DESC;

Abraços,

Anderson:.
A noite te informo se funcionou, obrigado amigo.
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: Qui Mai 31, 2012 10:31 pm    Assunto: Responder com Citação

adriano_servitec escreveu:
builder_rs escreveu:
Tenta assim:

SELECT CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
ORDER BY nrordemserv DESC
ROWS 1 to 1;

ou

select first 1 CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
ORDER BY nrordemserv DESC;

Abraços,

Anderson:.
A noite te informo se funcionou, obrigado amigo.


Olá amigo, então testei aqui e ambos retornaram o mesmo valor, que ja esta cadatrado no banco de dados e não o próximo vago

Código:
select first 1 CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
WHERE nrordemserv < 999999
ORDER BY nrordemserv DESC;

SELECT CAST(nrordemserv as INTEGER) as n_doc
FROM ordemserv
ORDER BY nrordemserv DESC
ROWS 1 to 1;


Obrigado.
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: Qui Mai 31, 2012 10:49 pm    Assunto: Responder com Citação

Acho que para obter o próximo vai ser necessário somar 1:

Código:
SELECT ( MAX( CAST(nrordemserv as INTEGER) ) + 1 )  as n_doc
FROM ordemserv WHERE nrordemserv < 999999


Espero que ajude.

_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-em-suzano
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: Qui Mai 31, 2012 10:57 pm    Assunto: Responder com Citação

imex escreveu:
Acho que para obter o próximo vai ser necessário somar 1:

Código:
SELECT ( MAX( CAST(nrordemserv as INTEGER) ) + 1 )  as n_doc
FROM ordemserv WHERE nrordemserv < 999999


Espero que ajude.

_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-em-suzano
Será que é por isso que minha função esta retornando um valor que ja tem no banco? Tenho que somar antes em vez do result da função, cfe abaixo?

Código:
function Tfrmcadordserv.FuncMaxOrdemServ(aqry: TZQuery): Integer;
begin
  with aqry do
  begin
    close;
    SQL.clear;
    SQL.Text := ' SELECT MAX(CAST(nrordemserv as INTEGER))as n_doc '+
      ' FROM ordemserv WHERE nrordemserv < 999999';
    Open;
    Result := FieldByName('n_doc').AsInteger + 1;
  end;
end;


Vou mudar a função pra ver se vai dar certo.

Código:
function Tfrmcadordserv.FuncMaxOrdemServ(aqry: TZQuery): Integer;
begin
  with aqry do
  begin
    close;
    SQL.clear;
    SQL.Text := ' SELECT ( MAX( CAST(nrordemserv as INTEGER) ) + 1 )  as n_doc '+
                '   FROM ordemserv WHERE nrordemserv < 999999 ';
    Open;
    Result := FieldByName('n_doc').AsInteger;
  end;
end;


Depois volto a postar
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: Qui Mai 31, 2012 11:13 pm    Assunto: Responder com Citação

Bom não sei deu certo, mais também fiz testes com a forma que ja usava e também deu certo, acho que eu estava viajando ontem.

Obrigado pessoal.
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: Qua Dez 05, 2012 8:14 am    Assunto: Responder com Citação

Alguém tem uma idéia se da pra fazer algo assim.

Por exemplo nesta função aqui
Código:
function Tfrmcadordserv.FuncMaxOrdemServ(aqry: TZQuery): Integer;
begin
  with aqry do
  begin
    close;
    SQL.clear;
    SQL.Text := ' SELECT ( MAX( CAST(nrordemserv as INTEGER) ) + 1 )  as n_doc '+
                '   FROM ordemserv WHERE nrordemserv < 999999 ';
    Open;
    Result := FieldByName('n_doc').AsInteger;
  end;
end;


Esta retornando 999.999

Quando chegar neste 999.999 buscar o proximo numero inferior a ele que não tennha ja gravado no banco de dados, e acima de 50.000?

Exemplo

Fiz o select desta função ai me retornou 999.999 neste caso ai então deve buscar a proxima sequencia vazia acima de 50.000, ai supondo que a sequencia 60.110 não esteja gravado no banco então o restorno seria ese ID

Entenderam?

Tem como fazer isso?

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: Qua Dez 05, 2012 9:02 am    Assunto: Responder com Citação

Poderia ser utilizada uma outra query que seria executada caso essa primeira retorne 999999 para a aplicação?
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: Qua Dez 05, 2012 9:12 am    Assunto: Responder com Citação

imex escreveu:
Poderia ser utilizada uma outra query que seria executada caso essa primeira retorne 999999 para a aplicação?


Não da pra fazer isso tudo em uma função, ou uma sp mesmo?

Obrigado Imex.
_________________
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: Qua Dez 05, 2012 9:31 am    Assunto: Responder com Citação

O que imaginei a princípio seria colocar dentro da função um If depois do Open para verificar se o retorno é igual a 999999, e se for alterar a propriedade SQL de aqry para tentar obter o outro número conforme a outra condição. Poderia ser desta forma?
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: Qua Dez 05, 2012 9:58 am    Assunto: Responder com Citação

imex escreveu:
O que imaginei a princípio seria colocar dentro da função um If depois do Open para verificar se o retorno é igual a 999999, e se for alterar a propriedade SQL de aqry para tentar obter o outro número conforme a outra condição. Poderia ser desta forma?
Sim pode ser, tem uma idéia, post então Imex pra ver se vai dar certo. Obrigado amigo
_________________
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: Qua Dez 05, 2012 10:24 am    Assunto: Responder com Citação

Experimente fazer um teste com a query abaixo para verificar o resultado:

Código:
SELECT FIRST 1 ( CAST(o.nrordemserv as INTEGER) + 1 ) as n_doc
FROM ordemserv as o
WHERE
    CAST(o.nrordemserv as INTEGER) > 50000 and
    not exists (select 1 from ordemserv as s
                where CAST(s.nrodermserv as INTEGER) = CAST(o.nrordemserv as INTEGER) + 1)
ORDER BY CAST(o.nrordemserv as INTEGER)


Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página 1, 2, 3  Próximo
Página 1 de 3

 
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