Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Mai 30, 2012 8:29 pm Assunto: Fazer um select max no firebird? |
|
|
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 |
|
 |
pestana Colaborador

Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qua Mai 30, 2012 8:52 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Mai 30, 2012 9:15 pm Assunto: |
|
|
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 |
|
 |
builder_rs Novato


Registrado: Quarta-Feira, 26 de Dezembro de 2007 Mensagens: 88
|
Enviada: Qui Mai 31, 2012 11:59 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Mai 31, 2012 1:49 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Mai 31, 2012 10:31 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Mai 31, 2012 10:49 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Mai 31, 2012 10:57 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Mai 31, 2012 11:13 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Dez 05, 2012 8:14 am Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Dez 05, 2012 9:02 am Assunto: |
|
|
Poderia ser utilizada uma outra query que seria executada caso essa primeira retorne 999999 para a aplicação? |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

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

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Dez 05, 2012 9:31 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

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

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Dez 05, 2012 10:24 am Assunto: |
|
|
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 |
|
 |
|