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....

BlackTDN :: Tips & Tricks ~ mBrowse e Tabelas Temporárias

magic_tips_and_tricks Bem, até que o paradigma do MVC se torne um fato muita gente ainda utilizará as funções já conhecidas. Dentre elas a mBrowse.

A dica de hoje surgiu em função da necessidade de alteração em um programa que usava a MarkBrow(se). O caso é o que segue:

O  Analista que me contatou disse o seguinte: “Baixamos o último RPO do portal do Cliente e alguns programas deixaram de apresentar as Cores no ‘Browse’”.

Analisando o código enviado, verifiquei que o desenvolvedor do código, por desconhecimento e/ou falta de documentação mais detalhada, simulou a mBrowse através da MarkBrow(se). Ao invés de ficar quebrando a cabeça para tentar descobrir o porquê, a partir da atualização do RPO, as cores deixaram de aparecer no ‘Browse” preferi ajustar a rotina para usar mBrowse ao invés da MarkBrow(se) uma vez que no programa original a MarkBrow(se) não era utilizada com a sua finalidade primeira: Permitir “marcar” um determinado registro.

As alterações de fato, foram bem pequenas, mas para fazê-las deveria saber o seguinte a respeito da mBrowse:

  1. Para usar Tabela Temporária com a mBrowse o parâmetro aFixe deve ser passado com as seguintes características:
      aFixe A estrutura do array é diferente para arquivos que que fazem parte do dicionário de dados e para arquivos de trabalho.
      Arquivos que fazem parte do dicionários de dados
      aFixe[n][1] Descrição do campo
      aFixe[n][2] Nome do campo
      Arquivos de trabalho
      aFixe[n][1] Descrição do campo
      aFixe[n][2] Nome do campo
      aFixe[n][3] Tipo
      aFixe[n][4] Tamanho
      aFixe[n][5] Decimal
      aFixe[n][6] Picture
  2. Os três primeiros bytes do Alias da Tabela Temporária devem ser, obrigatoriamente, “TRB” lembrando que um Alias pode ter até 10 Caracteres;
  3. a mBrowse obriga que a tabela seja Indexada. Logo, a Tabela Temporária deve possuir, no mínimo, uma ordem.

Com base nas premissas acima, as alterações para que o programa voltasse a funcionar apresentando corretamente as Cores no ‘Browse’ foram as seguintes:

O desenvolvedor utilizou, corretamente, GetNextAlias() para retornar o próximo Alias disponível para uso e a alteração feita foi a seguinte:

Original Modificação
cTRB        := GetNextAlias() cTRB        := Eval(bGetTrb)

Onde: bGetTrb

bGetTrb    := { || "TRB"+SubStr(GetNextAlias(),4) }

Testado como:

While ( Select( cTRB ) > 0  )
    cTRB := Eval(bGetTrb)
End While   

Utilizava a MarkBrow(se) para apresentar o Browse.

Original Modificação
MarkBrow(cTRB,,,aCampos,.F.,,"",,,, "cFunction”,,,,aCores) mBrowse(0,0,0,0,cTRB,aCampos,NIL,NIL,NIL,NIL,aCores)

Uma consideração sobre aCampos de MarkBrow(se) e aCampos de mBrowse: Suas estruturas são diferentes.

Original Modificação

SX3->(dbSetOrder(2))
For nI := 1 To Len(aStru)
    If( SX3->( DBSeek(aStru[nI][1]) ))
        SX3->( AAdd(aCampos,{X3_CAMPO,"",Trim(X3_TITULO),Trim(X3_PICTURE)}) )
    Else
        AAdd(aCampos, {aStru[nI][1],"",aStru[nI][1],""})
    EndIf
Next

SX3->(dbSetOrder(2))
For nI := 1 To Len(aStru)
    n := nI
    aAdd( aCampos , Array(6) )
    If( SX3->( DBSeek(aStru[nI][1]) ))
        aCampos[n][1]:=SX3->X3_TITULO
        aCampos[n][2]:=SX3->X3_CAMPO
        aCampos[n][3]:=SX3->X3_TIPO
        aCampos[n][4]:=SX3->X3_TAMANHO
        aCampos[n][5]:=SX3->X3_DECIMAL
        aCampos[n][6]:=SX3->X3_PICTURE
    Else
        aCampos[n][1]:=aStru[nI][1]
        aCampos[n][2]:=aStru[nI][1]
        aCampos[n][3]:=aStru[nI][2]
        aCampos[n][4]:=aStru[nI][3]
        aCampos[n][5]:=aStru[nI][4]
        aCampos[n][6]:=""
    EndIf
Next

A Tabela temporária não estava indexada, e como mBrowse espera uma Tabela Indexada um Índice temporário foi criado usando a função IndRegua().

Original Modificação
Sem Índice IndRegua(cTRB,cInd,"C5_FILIMPR+C9_PEDIDO+C9_ITEM")

Uma outra modificação, ocorrida devido a uma particularidade da MarkBrow(se) que em seu 11o. Parâmetro permite a passagem de uma função a ser executada no “Duplo Clique”, foi transportar a ação do “Duplo Clique” para o menu aRotina.

Feitas essas alterações o programa voltou a funcionar conforme o esperado. O Cliente ficou satisfeito e menos um problema para o suporte da TOTVS resolver.

[]s
иαldσ dj

Comentários

Postagens mais visitadas