Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

Salvar e Recuperar Valores :: ReadVar()


Boa noite pessoal, na semana passada eu passei por uma necessidade inusitada, precisei implementar uma validação na edição de campo (X3_VLDUSER) em uma MSGetDados (D1_TES), até ai tudo bem, poderia obter o valor do banco de dados e realizar uma comparação com o conteúdo atual obtendo através de:

cOldCodTES := &(ReadVar())

O problema é que, quando o Protheus passa pela minha validação de usuário, "cOldCodTES" esta contendo a nova informação inserida pelo usuário. Logo pensei, vou obter pelo AScan:

cOldCodTES := aCols[n,AScan(aHeader,{|x| Trim(x[2]) == "D1_TES"})]

E nada, antes mesmo da minha validação o Protheus já realizou a alteração do "aCols", fiz uma tentativa por curiosidade usando "GDFieldGet":

cOldCodTES := GDFieldGet("D1_TES")

Problemas também, nada de surpreendente, afinal "GDFieldGet" implementa um AScan internamente. Sem perder as esperanças, tentei métodos mais agressivos (rsrs), tentei utilizar "MaFisRet" para obter o valor do TES, afinal, o Protheus não deveria realizar a troca sem antes mesmo de passar pelo "X3_VALID" e "X3_VLDUSER", e la fui:

cOldCodTES := MaFisRet(n,"IT_TES")


E mesma coisa, o safado libera a troca do TES sem passar por todas as validações (curioso isto hein Totvs, chega ater ser questionável, mas tudo bem...) E agora José, como vou acessar este valor que estava no campo?
Parti para a galera do BlackTDN, o Sergio Souza me deu algumas dicas, porém também não tive avanço, eis que então surge o Naldo com uma sugestão básica, que nem tinha me passado pela cabeça. Utilizar o X3_WHEN com um retorno AllwaysTrue() (afinal não quero validar a edição do campo, apenas salvar o seu conteúdo para acessar na execução do método referenciado em X3_VLDUSER, resultado, perfeito conforme o que eu esperava.
Agora, apresento-lhes abaixo a "magia" rsrs.



//Fonte BackupCampo.prw responsável por salvar o conteúdo do campo
//uso genérico para qualquer campo ;)
#include "Totvs.ch"

//Implementação genérica para ser utilizada em qualquer campo
User Function BackupCampo()
Local uBackupField := &(ReadVar())

   //Utilizando funcao _SetNamedPrvt para mudar o escopo da variavel, conforme dica obtidade em:
   //http://www.blacktdn.com.br/2011/09/protheus-advpl-setownerprvt-vs.html
   _SetNamedPrvt("uBackupField",uBackupField,FunName())

Return AllwaysTrue() //não quero validar o campo, apenas salvar seu conteúdo no momento do acesso


#include "Totvs.ch"

//Implementação genérica para ser utilizada em qualquer campo
User Function ValidaCampo()
Local lValidacao := .T.
Local uValorCpoAtual := &(ReadVar())

//Neste ponto:
//* Variavel "uBackupField" (salva na função "BackupCampo" possui o conteúdo no momento em que o campo foi acessado
//* Variavel "uValorCpoAtual" possui o valor informado pelo usuario

//Verificando se os valores são os mesmos, ou ainda implementando validações conforme o necessario
lValidacao := (uValorCpoAtual == uBackupField)

Return lValidacao


Resta agora, adicionar no campo alvo da validação o seguinte:
X3_WHEN (Modo Edição) -> U_BackupCampo()
X3_VLDUSER (Valid. Usuário) -> U_ValidaCampo()

E esta tudo certo :)

Agradecimentos imensos a Sergio Souza e Naldo pelo apoio ?

BlackTDN rulex ;x

Comentários

  1. Não é possível fazer a validação do X3_VLDUSER
    usando M-> ?
    X3_VLDUSER
    Iif( M->D1_TES == "001", "a", "b" )
    ?

    ResponderExcluir
    Respostas
    1. Sim, é possivel, desde que a variável em questão seja uma variável de memória. Então teste-a com:

      IF IsMemVar("D1_TES") .and. GetMemVar("D1_TES") == "001"
      ...
      EndIF

      que seria o mesmo que:

      IF IsMemVar("D1_TES") .and. M->D1_TES == "001"
      ...
      EndIF

      ou

      IF Type("M->D1_TES") == "C" .and. M->D1_TES == "001"
      ...
      EndIF

      Nos três exemplos testamos a existência da variável de memória antes de utiliza-la.

      Excluir

Postar um comentário

Postagens mais visitadas