Testar se algum campo foi alterado em uma tela via AdvPL

Hoje vou mostrar como fazer a comparação de todos os campos em uma tabela estando em uma rotina de Alteração.

Por padrão em MVC, se você clica em confirmar, mas não houve alteração em nenhum campo, ele irá te mostrar uma mensagem, avisando que não teve alterações.

Porém, se você está em uma tela mais antiga, como fazer para validar essa informação? Como saber quais campos foram alterados?

Basicamente, nós precisamos fazer 4 coisas:

  1. Pegar todos os campos da tabela com a função DbStruct
  2. Fazer um laço de repetição, percorrendo todos esses campos
  3. Verificar se o conteúdo da tabela (por exemplo, SUATAB) é diferente do conteúdo em memória (M)
  4. Se o campo for diferente da tabela para a memória, ai você pode fazer suas tratativas

Então pegando a lógica acima, e aplicando, teríamos o seguinte cenário:

aCampos := SUATAB->(DbStruct())

For nAtual := 1 To Len(aCampos)

     If &("SUATAB->"+aCampos[nAtual]) != &("M->"+aCampos[nAtual])
          Alert("Teve alteração no campo " + aCampos[nAtual)
     EndIf
Next

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

7 Responses

  1. GERALDO disse:

    Bom dia mestre, jogando este codigo para orcamento de vendas que por sua vez ainda nao vou para MVC ele da type mismatch nao manjo nada de & Macrosubstituição pode ser algo ai ? carrega as dados certinho mas na comparacao se eu uso os nome reais ele compara 1 a um manualmente mas quando tempo usar o tal & ele nao reconhece …

  2. GERALDO disse:

    em MATA415 –> Ate sair MVC . Obrigado

    IF ALTERA == .T.
    aCampos1 := SCJ->(DbStruct())

    For nAtual := 1 To Len(aCampos1)

    if &(“SCJ->” + acampos1[nAtual][1]) &(“M->” + acampos1[nAtual][1])
    nValida++
    endif
    Next

    ENDIF

    if nValida == 1
    lRet := .F.
    msgalert(“Nada Foi Alterado”)
    Return (lRet)
    endif

    • Dan_Atilio disse:

      Boa tarde Geraldo, tudo bem?
      Faltou algum operador de comparação no seu if, por exemplo, != ou ==.
      if &(“SCJ->” + acampos1[nAtual][1]) {Faltou colocar o operador aqui dentro} &(“M->” + acampos1[nAtual][1])

      Note na linha acima, o que está entre chaves.
      Abraços.

  3. Luciano disse:

    Em que local eu coloco esse fonte? No ponto de entrada do MVC da tela?

    • Dan_Atilio disse:

      Você coloca esse trecho no ponto de entrada de validação da tela.
      Geralmente em telas antigas, é o p.e. TOK (TudoOK), e em MVC é a pós validação (bPost, bLinePost).

  4. Fernando disse:

    como comparar se um campo de um acols foi alterado?

    • Você teria que:
      1. Percorrer todas as linhas do aCols
      2. Se a linha foi incluída ou excluída, ignora
      3. Se a linha do aCols for uma operação de alteração
      3.1 Posiciona na tabela do aCols, conforme a linha atual
      3.2 Percorre todas as colunas da linha
      3.3 Compara a coluna do aCols com a informação gravada na tabela

Deixe uma resposta