problemas com sql de pesquisa

Delphi

03/03/2012

fiz um topico nesta pagina, onde pesquisava a opção para se fazer uma pesquisa no generaitor, de uma tabela que criei,

ok , eu precisava saber o ultimo numero do generaitor desta tabela, me foi informado um select, mas ai esta minha duvida como aplico este select,

nos meus sistemas uso o select com um clientedataset assim:

cds_registro.commandtext:= Select.........

sera que devo usar o select informado dete mesmo jeito, mas preciso jogar o numero em uma variavel

ajude
Edson Melo

Edson Melo

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

03/03/2012

Você quer saber como usar no Delphi o select que lhe trás o último número utilizado?
Bem, você faz da mesma forma que para qualquer outro select, utilizando um DataSet. A diferença é que no select haverá apenas um campo que você pode nomear conforme sua preferência. Para recuperar o valor, faça algo como o seuginte:

ultimo_valor = cdsUltimoValor.FieldByName(CAMPO).AsInteger;

Não sei se é essa sua dúvida...
GOSTEI 0
Edson Melo

Edson Melo

03/03/2012

não e isto, não

queria uma maneira de pegar o ultimo numero do generaitor criado para a tabela em questão.

no seu caso eu teria que abrir a tabela para dar um comando last que ira para o ultimo registro e dai pegar o numero no campo. nao e essa minha intensao, preciso saber o ultimo numero gerado pelo generaitor, mas sem ter que abrir a tabela em questão, pois penso esta tabela agora e pequena, mas daqui a alguns anos ela se tornara grande e deixara o sistema lento para poder abrir. a informação que me interessa nesta tabela e pegar o ultimo registro gravado nela,para isso e so aplicar um filtro informado o ultimo registro e so sera trafegado na rede 1 registro so, seeu tiver que abrir toda tabela para saber o ultimo registro,para mim não serve.

vou te esplicar melhor ,no meu sistema tem um dedo duro,ou seja tudo que o usuario fizer vai ficar registrado emuma tabela,por isso da pra se entender que logo esta tabela ira ficar enorme,a minha ideia e aplicar um filtro nos ultimos 50 operações executadas, mas pra isso teria de saber o ultimo numero e aplicar um filtro tirando 50 que me daria a faixa requerida das informações. so para constrar e um sistema para hotel,e o gerente pe pediu um dedo duro no sistema,para saber oque o pessoal anda fazendo

me enviaram um select que sei que resolveria o problema mas não sei como aplicar o select, e ainda guardar o numero retornado por ele em uma variavel

espero que alguem me ajude
GOSTEI 0
Edson Melo

Edson Melo

03/03/2012

exemp em firebid

--saber o proximo numero da seq

select max(oservico_id)+1 from ordemservico // nao serve pois tenho que abrir a tabela
--saber o meu proximo numero do generator
select gen_id(GENAGENCIA_ID,1) from rdb$database // esta acho que me serve mas nao sei como aplicar e ainda armazenar a
// resposta em uma variavel

quen solber me ajudem
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

03/03/2012

Alguns esclarecimentos:
- no exemplo que eu dei, a ideia não era abrir a tabela com todos os registros e ir para o último com o comando Last();
- utilizando a instrução
select max(oservico_id)+1 from ordemservico
você não está abrindo toda a tabela, está trazendo apenas UM registro contendo o maior valor do campo oservico_id;
- utilizando a instrução
select gen_id(GENAGENCIA_ID,1) from rdb$database
você pega o último valor gerado pelo generator GENAGENCIA_ID, mas veja bem, e se o último registro for apagado? O generator vai ter gerado um número, mas este não estará mais na tabela. Logo, sugiro utilizar a instrução SQL anterior;
- você costuma fazer selects no seu sistema utilizando datasets (querys, tables, etc)? Se sim, o procedimento para trazer apenas um registro é o mesmo (como eu citei na primeira postagem). Você define o comando sql do dataset, e ao abrí-lo, recupera o valor do campo em questão;
- o tal DEDO DURO tem um nome técnico: AUDITORIA;

Boa sorte.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

03/03/2012

Permita-me esclarecer mais meu exemplo:
(não lembro bem das propriedades dos componentes IB e DBx, pois faz muito tempo que não uso, logo, adeque à sua necessidade)

var
ult_id:Integer;//nessa variável vou armazenar o último valor
begin
dsUltimoValor.Close();
dsUltimoValor.SQL.Text := ´SELECT MAX(ID) AS ULTIMO_ID FROM TABELA´;
dsUltimoValor.Open();
ult_id := dsUltimoValor.FieldByName(´ULTIMO_ID´).AsInteger;
end;

Pronto, eis um exemplo simples.

MAS, diante da sua necessidade, a menos que seja realmente necessário você armazenar o maior valor da coluna, você pode fazer seu select na tabela de auditoria diretamente, trazendo apenas os 50 últmos. Veja um exemplo:

´SELECT * FROM AUDITORIA WHERE ID_AUDIT <= (SELECT (MAX(ID_AUDIT)-50) FROM AUDITORIA)´

Ou seja, recupera os registros cuja coluna ID_AUDIT seja menor ou igual que o maior valor dessa coluna - 50.

Teste aí, qualquer coisa é só falar.
GOSTEI 0
Edson Melo

Edson Melo

03/03/2012

ola joel

tentei a opcao

´SELECT * FROM AUDITORIA WHERE ID_AUDIT <= (SELECT (MAX(ID_AUDIT)-50) FROM AUDITORIA)´

não funcionou ela me deu o arquivo completo e não os ultimos 50 registros que solicitei no comando

GOSTEI 0
Edson Melo

Edson Melo

03/03/2012

ok ja consegui resolver

obrigado a todos
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

03/03/2012

O correto seria inverter o sinal de < para >. Foi falha minha, só agora, relendo o tópico, percebi:
SELECT * FROM AUDITORIA WHERE ID_AUDIT >= (SELECT (MAX(ID_AUDIT)-50) FROM AUDITORIA)
GOSTEI 0
Marcelo Augusto

Marcelo Augusto

03/03/2012

Ola, Creio que você pode usar algo mais facil sempre uso o seguinte, coloco uma adoquery e na string (select max(cod)+1)

voce pode usar um componente tipo edit ou outro para pegar o valor somente ligando-o no datasource.
GOSTEI 0
POSTAR