Artigo: 210504 - Última revisão: quinta-feira, 23 de Junho de 2005 - Revisão: 3.0

ACC2000: Referência a um campo no registo anterior ou registo seguinte

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Avançado: Requer conhecimentos avançados sobre codificação, interoperabilidade e multi-utilizador.

Este artigo aplica-se apenas a uma base de dados do Microsoft Access (.mdb).

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve dois métodos que pode utilizar para obter valores de anterior ou o registo seguinte para utilização em cálculos. O primeiro método utiliza a função DLookup() numa expressão; o segundo método utiliza duas funções definidas pelo utilizador.

Nota : É possível ver uma demonstração da técnica utilizada neste artigo no ficheiro de exemplo Qrysmp00.exe. Para obter informações sobre como obter este ficheiro de exemplo, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
207626  (http://support.microsoft.com/kb/207626/EN-US/ ) ACC2000: Access 2000 Sample consultas disponíveis no Centro de transferências

Mais Informação

Método 1: Utilizar DLookup()

Nota : Esta técnica assume que tem uma tabela com um campo de ID de um tipo de dados número e que os valores de ID não faltam qualquer número (ou números) por ordem sequencial. Se a tabela não cumprir estes critérios, deverá utilizar o método "Utilizar código" descrito neste artigo.

Pode utilizar as seguintes expressões DLookup() de exemplo para obter valores de um campo no registo anterior ou seguinte de um formulário, relatório ou uma consulta.
Nota : tem de inserir o campo de dados correctos, tabela, formulário, relatório e ID de campo nomes nas seguintes expressões de exemplo.

Num formulário

Para obter um valor de um campo no registo anterior, escreva a seguinte linha de propriedade OrigemDoControlo da caixa de texto:
= DLookUp("[MyField]","MyTable","[ID]=Forms![MyForm]![ID]-1")
Para obter um valor de um campo no registo seguinte, escreva a seguinte linha de propriedade OrigemDoControlo da caixa de texto:
= DLookUp("[MyField]","MyTable","[ID]=Forms![MyForm]![ID]+1")

Num relatório

Para obter um valor de um campo no registo anterior, escreva a seguinte linha de propriedade OrigemDoControlo da caixa de texto:
= DLookUp("[MyField]","MyTable","[ID]=Reports![MyReport]![ID]-1")
Para obter um valor de um campo no registo seguinte, escreva a seguinte linha de propriedade OrigemDoControlo da caixa de texto:
= DLookUp("[MyField]","MyTable","[ID]=Reports![MyReport]![ID]+1")

Numa consulta

Para obter um valor de um campo no registo anterior, escreva a seguinte linha na linha campo da grelha da consulta:
Expr1: DLookUp("[MyField]","MyTable","[ID]=" & [ID]-1)
Para obter um valor de um campo no registo seguinte, escreva a seguinte linha na linha campo da grelha da consulta:
Expr1: DLookUp("[MyField]","MyTable","[ID]=" & [ID]+1)
Nota : nestas expressões de exemplo, a -1 e + 1 indicam os registos anteriores e seguintes. Quando o registo actual é o primeiro registo no conjunto de registos, o-1 devolve um valor Nulo porque não existe nenhum registo anterior. Do mesmo modo, quando o registo actual é o último registo no conjunto de registos, a + 1 devolve um valor nulo . Se pretender devolver um valor de um registo diferente do seguinte ou anterior, pode especificar um número diferente, por exemplo,-3 para o terceiro registo anterior.

Método 2: Utilizar código

A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador. Nota : O código de exemplo deste artigo utiliza Microsoft Data Access Objects. Para que este código seja executado correctamente, tem de referenciar a biblioteca Microsoft DAO 3.6 Object Library. Para o fazer, clique em References no menu Ferramentas no Editor do Visual Basic e certifique-se de que está seleccionada a caixa de verificação Microsoft DAO 3.6 Object Library .

Para obter um valor num campo do registo anterior ou seguinte num formulário utilizando código, siga estes passos:
  1. Crie um novo módulo e escreva a linha seguinte na secção Declarations, caso ainda não estiver escrito:
    opção explícita
  2. Escreva os seguintes procedimentos:
    '*************************************************************
    ' FUNCTION: PrevRecVal()
    ' PURPOSE: Retrieve a value from a field in the previous form
    '          record.
    ' PARAMETERS:
    '    F        - The form from which to get the previous value.
    '    KeyName  - The name of the form's unique key field.
    '    KeyValue - The current record's key value.
    '    FieldNameToGet - The name of the field in the previous
    '                     record from which to retrieve the value.
    ' RETURNS: The value in the field FieldNameToGet from the
    '          previous form record.
    ' EXAMPLE:
    '    =PrevRecVal(Form,"ID",[ID],"OdometerReading")
    '**************************************************************
    Function PrevRecVal(F As Form, KeyName As String, KeyValue, _
    FieldNameToGet As String)
       Dim RS As DAO.Recordset
    
    On Error GoTo Err_PrevRecVal
    
       ' The default value is zero.
       PrevRecVal = 0
    
       ' Get the form recordset.
       Set RS = F.RecordsetClone
    
       ' Find the current record.
       Select Case RS.Fields(KeyName).Type
          ' Find using numeric data type key value?
          Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
          DB_DOUBLE, DB_BYTE
             RS.FindFirst "[" & KeyName & "] = " & KeyValue
          ' Find using date data type key value?
          Case DB_DATE
             RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
          'Find using text data type key value?
          Case DB_TEXT
             RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
          Case Else
             MsgBox "ERROR: Invalid key field data type!"
             Exit Function
       End Select
    
       ' Move to the previous record.
       RS.MovePrevious
    
       ' Return the result.
       PrevRecVal = RS(FieldNameToGet)
    
    Bye_PrevRecVal:
       Exit Function
    Err_PrevRecVal:
       Resume Bye_PrevRecVal
    End Function
    
    '************************************************************
    ' FUNCTION: NextRecVal()
    ' PURPOSE: Retrieve a value from a field in the next form
    '          record.
    '*************************************************************
    Function NextRecVal(F As Form, KeyName As String, KeyValue, _
    FieldNameToGet As String)
       Dim RS As DAO.Recordset
    
    On Error GoTo Err_NextRecVal
    
       ' The default value is zero.
       NextRecVal = 0
    
       ' Get the form recordset.
       Set RS = F.RecordsetClone
    
       ' Find the current record.
       Select Case RS.Fields(KeyName).Type
          ' Find using numeric data type key value?
          Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
          DB_DOUBLE, DB_BYTE
             RS.FindFirst "[" & KeyName & "] = " & KeyValue
          ' Find using date data type key value?
          Case DB_DATE
             RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
          ' Find using text data type key value?
          Case DB_TEXT
             RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
          Case Else
             MsgBox "ERROR: Invalid key field data type!"
             Exit Function
       End Select
    
       ' Move to the next record.
       RS.MoveNext
    
       ' Return the result.
       NextRecVal = RS(FieldNameToGet)
    
    Bye_NextRecVal:
       Exit Function
    Err_NextRecVal:
       Resume Bye_NextRecVal
    End Function
    					
O exemplo seguinte demonstra como utilizar a função PrevRecVal() num formulário para criar um registo de quilometragem. A função personalizada devolve o odometer anterior de leitura, que é utilizado para calcular milhas por litro (MPG) para um automóvel. Para utilizar a função PrevRecVal(), siga estes passos:
  1. Crie a seguinte tabela nova e, em seguida, guarde-o como registo de quilometragem:
    Nome de campo: ID
    Tipo de dados: numeração automática
    Indexados: Sim (duplicação não autorizada)

    Nome de campo: data
    Tipo de dados: Data/hora

    Nome de campo: Odometer
    Tipo de dados: número
    FieldSize: duplo

    Nome de campo: galões
    Tipo de dados: número
    FieldSize: duplo

    Chave primária: ID
  2. Visualizar a tabela de registo de quilometragem na vista de folha de dados e introduza os seguintes dados de exemplo:
       ID   Date      Odometer   Gallons
       ---------------------------------
       1    6/21/94   77917.8    10.2
       2    6/25/94   78254.7    9.6
       3    6/30/94   78582.3    10
       4    7/5/94    78918.4    10.4
       5    7/10/94   79223.4    9.4
    					
  3. Utilize o Assistente de formulários para criar um novo formulário em forma de tabela com base na tabela de registo de quilometragem. Incluir todos os registo de quilometragem tabela campos, excepto o ID de campo.
  4. Visualizar o formulário na vista de estrutura e adicione os controlos de caixa de texto de três seguintes ao formulário:
    1 a caixa de texto
    Nome: PrevOdometer
    OrigemDoControlo: =PrevRecVal(Form,"ID",[ID],"Odometer")
    Formato: fixo

    caixa de texto 2
    Nome: MilesDriven
    OrigemDoControlo: =iif([PrevOdometer]=0,0,[Odometer]-[PrevOdometer])
    Formato: fixo

    caixa de texto 3
    Nome: MPG
    OrigemDoControlo: = [MilesDriven] / [galões]
    Formato: fixo
  5. Visualiza o formulário na vista de formulário. Nota o formulário apresenta as seguintes informações:
       Date     Odometer   Gallons  PrevOdometer  MilesDriven  MPG
       -------------------------------------------------------------
       6/21/94  77917.8    10.2     0             0            0
       6/25/94  78254.7     9.6     77917.80      336.90       35.09
       6/30/94  78582.3    10.0     78254.70      327.60       32.76
       7/05/94  78918.4    10.4     78582.30      336.10       32.32
       7/10/94  79223.4     9.4     78918.40      305.00       32.45
    					

Referências

Para obter informações adicionais sobre como introduzir automaticamente dados num formulário, utilizando valores do registo anterior, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
210236  (http://support.microsoft.com/kb/210236/EN-US/ ) ACC2000:Fill automaticamente no registo com dados do registo anterior

A informação contida neste artigo aplica-se a:
  • Microsoft Access 2000 Standard Edition
Palavras-chave: 
kbmt kbfaq kbhowto kbinfo KB210504 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 210504  (http://support.microsoft.com/kb/210504/en-us/ )