Ir para conteúdo
Fórum Script Brasil
  • 0

Como Obtenho Um Dado Do Registro Anterior?


André Basílio

Pergunta

Oi, pessoal!

Estou precisando muito de uma informação sobre como obter um dado de um campo do registro anterior ao que está sendo usado no momento. Isso seria utilizado num programa para mostrar a média de consumo de combustíveis.

Exemplo dos campos:

Km . . . Litros .. Média (km/l)

25660 . 56,0

26640 . 70,0 .. 14,0

27000 . 25,0 .. 14,4

No exemplo acima, no primeiro registro não há como calcular a média porque não há uma quilometragem anterior. Mas, a partir do segundo registro, dá para calcular a média utilizando uma fórmula semelhante a:

(Km atual - Km anterior) / Litros atual

Preciso utilizar o exemplo acima numa consulta. Já vi algumas coisas a respeito de subconsulta em SQL, mas não encontrei código algum que me forneça o conteúdo do campo de um registro específico tal como acontece facilmente em algumas linguagens como Visual FoxPro. Parece que o SQL, apesar de ser um banco de dados mais avançado, não tem apontador para ser utilizado como número do registro atual. Eu gostaria de buscar o conteúdo do campo do registro atual -1.

Estou utilizando um arquivo do tipo MDB.

Alguém pode me ajudar?

Aproveito a oportunidade para parabenizar os responsáveis pelo site! Coisa fina! Muito bom mesmo! Parabéns!

Abraços a todos!

André Basílio.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

como você sabe qual é o registro anterior? se você tiver um campo autonumeracao, você pode fazer tipo assim:

Select Tabela.Km, Tabela.Litros, ((Tabela.Km - Anterior.Km) / Tabela.Litros) as Media LEFT JOIN (Select * from Tabela) as Anterior ON Tabela.X - 1 = Anterior.X

sendo que X é o campo autonumeracao.

se você não tem um campo autonumeracao você vê como qual o anterior? pela kilometragem? se for fica mais foda...

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado, Kuroi!

Tentei fazer aqui, mas não deu certo. O código que usei foi o seguinte:

Select Tabela.Km, Tabela.Litros, ((Tabela.Km - Anterior.Km) / Tabela.Litros) as Media LEFT JOIN (Select * from Tabela) as Anterior ON Tabela.Código - 1 = Anterior.Código

(Código é o nome do campo AutoNumeração)

Após digitar o código na exibição SQL da consulta, quando tento visualizar o modo Design (estrutura), surge a seguinte mensagem: "A instrução SELECT inclui uma palavra reservada ou um nome de argumento que está incorreto ou faltando, ou a pontuação está incorreta".

Após clicar em OK, a palavra LEFT fica selecionada no vídeo e não consigo sair disso.

Reduzi a tabela a apenas 3 campos para facilitar o teste na consulta. Os campos são:

Código: AutoNumeração

Km: Número Inteiro Longo

Litros: Número Simples

Não existe o campo [Média] porque este campo deveria ser calculado através da consulta e não precisaria existir "fisicamente". Estou certo?

Em outras linguagens, isso é muito simples de ser feito, mas estou quebrando a cabeça com o Access/SQL! Se puder me ajudar novamente, fico muitíssimo grato!

Se puder me ajudar até aqui, já é uma grande ajuda! Isso já funciona em algumas situações que preciso. Porém, se o registro anterior for excluído, a consulta deixa de funcionar perfeitamente, não é mesmo?

Agora, quanto à minha necessidade exata pra essa consulta, é o seguinte: estou fazendo um sistema que, dentre suas funções, mostraria a média de consumo de cada vêículo da empresa durante cada registro de abastecimento. Então, na verdade, preciso saber qual foi o último abastecimento anterior de certa placa de vêículo (há o campo Placa na tabela também) ou de acordo com a data e hora do abastecimento (há esses campos também na tabela).

Pelo que entendi você dizendo, o código vai ser mais complicado para funcionar dessa forma, não?

Se puder me ajudar, ficarei IMENSAMENTE agradecido! Já perdi vários dias quebrando a cabeça com isso!

Mais uma vez, muito obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

foi mal, faltou o FROM:

Select Tabela.Km, Tabela.Litros, ((Tabela.Km - Anterior.Km) / Tabela.Litros) as Media from Tabela LEFT JOIN (Select * from Tabela) as Anterior ON Tabela.Código - 1 = Anterior.Código
no caso de ele excluir um registro da tabela, deve funcionar assim:
Select Tabela.Km, Tabela.Litros, Min(((Tabela.Km - Anterior.Km) / Tabela.Litros)) as Media from Tabela LEFT JOIN (Select * from Tabela) as Anterior ON Tabela.Código > Anterior.Código Group By Tabela.Km, Tabela.Litros, Tabela.Código

fiz uns testes e parece tudo bem, vê se você encontra algum problema.

assim acredito também que vai funcionar se você filtrar por placa, ou hora com você disse, é so adicionar um WHERE no final do código. vê se funciona, qualquer coisa poste.

Link para o comentário
Compartilhar em outros sites

  • 0

esquece o que eu te passei antes, o certo é esse:

Select X.Km, X.Litros, X.Media from (Select Tabela.Código, Tabela.Km, Tabela.Litros, ((Tabela.Km - Anterior.Km) / Tabela.Litros) as Media, IIf(IsNull(Tabela.Código - Anterior.Código), 0, Tabela.Código - Anterior.Código) as Diferenca from Tabela LEFT JOIN (Select * from Tabela) as Anterior ON Tabela.Código > Anterior.Código) as X INNER JOIN (SELECT Tabela.Código, Min(IIf(IsNull(Tabela.Código - Anterior.Código), 0, Tabela.Código - Anterior.Código)) as Diferenca FROM Tabela LEFT JOIN (Select * from Tabela) AS Anterior ON Tabela.Código>Anterior.Código Group By Tabela.Código) as Y ON X.Diferenca  = Y.Diferenca And  X.Código = Y.Código

cara foi foda foda foda pra fazer isso, testa aí e vê se está certinho. pra filtrar por placa, e tudo mais vai ficar mais complicado, mas deve dar, vê aí.

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu, Kuroi!

Funcionou beleza! Muito chique! Parabéns pelos conhecimentos em SQL! Percebi que vou ter que aprender muito SQL ainda...

Nesta semana, vou estar bem apertado. Na próxima semana, vou tentar colocar esse código na consulta do programa que estou fazendo, que tem tabelas vinculadas e faz a procura por ordem de data e hora, além de filtrar os registros por placa do vêículo. Caso eu não consiga, vou lhe enviar um e-mail e contratar uma consultoria sua. Você merece!

Gostei do seu trabalho! Muito fino!

Um grande abraço!

Pode contar comigo no que precisar!

Valeu!

Link para o comentário
Compartilhar em outros sites

  • 0

eu tava querendo fazer a mesma coisa so que deu erro nesse cod n sei nada sobre SQL

deu um tanto de erro oque tenho que criar??

um tabela com os campos KM,Litros, e cod

e criar uma consulta e ai coloca no modo SQL e copia o codigo ne??

qual o nome que a tabela tem que ter para funcionar

?

to falando mta merda???

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Otavio --

kuroi, beleza?

o que estou fazendo é parecido e como nosso amigo aí em cima disse não sei muita coisa também.

tem uma tabela com varias campos, entre eles o NUMERO(Chave Primaria), VEICULO, KM I, KM F, KM R

não sei como faco para que sempre no proximo registro o KM I tenha o KM F do anterior, de acordo com a placa.

tentei implementar o seu codigo sql no meu mas não deu certo.

Onde tenho que por o Codigo, dfentro do design de tabela? ou em um formulario.

Abraco, espero que me ajude

VLW

Link para o comentário
Compartilhar em outros sites

  • 0
eu tava querendo fazer a mesma coisa so que deu erro nesse cod n sei nada sobre SQL

cara, so vi seu post hj. se por acaso você voltar a acessar o forum e ainda hj, quase um ano depois, tiver co mesmo problema ainda, da um toque aí

kuroi, beleza?

o que estou fazendo é parecido e como nosso amigo aí em cima disse não sei muita coisa também.

tem uma tabela com varias campos, entre eles o NUMERO(Chave Primaria), VEICULO, KM I, KM F, KM R

não sei como faco para que sempre no proximo registro o KM I tenha o KM F do anterior, de acordo com a placa.

tentei implementar o seu codigo sql no meu mas não deu certo.

Onde tenho que por o Codigo, dfentro do design de tabela? ou em um formulario.

Abraco, espero que me ajude

VLW

bom, aquele codigo você poderia testar em Consultas no access, mas na verdade essas queries são feitas pra ser usadas quando você esta programando em alguma linguagem mesmo que for vba dentro do proprio access.

mas isso que você quer, pelo que vejo, é bem diferente, porque o que você quer é alterar o registro direto na tabela, não?? no caso do andre basilio, isso era uma forma de visualizar os dados já salvos la dentro.

mas pelo que sei, no access, não tem como fazer isso que você quer automaticamente. mas você esta usando alguma linguagem?? se estiver da pra fazer de algum jeito mais facil dependendo da linguagem. se não o mais facil seria mesmo digitar o kmf sempre na mao, mas também daria pra adaptar a query de cima.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...