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

Protheus :: Advpl TOP (DBAccess) :: Será que o configurador é pra marreco???

Fala ae minha gente,

Hoje apos uma manha cheia de risadas e indo almoçar junto com o grande brother Wellington Bis, começa a rolar o assunto do blog:
- "Pô mano.. blog do Naldo é foda e tal... ja me salvou varias vezes..."
Respondo:
- "Hehehe... póis é... no blog só tem monstrao... Naldo, Eu (OverFail), RLeg... Regazzo..."
E ja bateu a vontade louca de mandar mais uma loucura... da mesma linha de ontem... porem faltava um som para embalar o desenrolar do post... entao nada melhor do que faze-lo ao som: Beastie Boys - Licensed to iLL - No Sleep Till Brooklyn... é o q ha!

Vamos ao codigo...

O foco da brincadeira é demonstrar uma maneira de alterar a estrutura de um campo "a quente" no protheus, sem o uso do configurador... utilizando pra isso a função TCALTER()...



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Segue o codigo:

#include "protheus.ch"
#DEFINE NL CHR(13)+CHR(10)

// Exemplo de como ajustar o tamanho de um campo "a quente" no Protheus
// Utiliza a função TCALTER para realizar a modificação

// Exemplo:
// lOk := TCAlter(cTable,aOldStru,aNewStru,@nTopErr)

// lOK -> .T. se conseguiu alterar a tabela
// cTable -> Nome físico da tabela no banco (ex: SB1010)
// aOldStru -> Estrutura atual da tabela
// aNewStru -> Nova estrutura da tabela
// @nTopErr -> Se der erro, retorna o código numérico do erro no TOP

*=====================================*
FUNCTION U_AjusAX()
*=====================================*
Local cMsg := ""
Local i, aEmp

aEmp := LoadEMP()

For i := 1 to LEN(aEmp)
MsgRun( "Ajustando Empresa " + aEmp[i,1], , {|| cMsg += AjustZAX( aEmp[i] ), RpcClearEnv() } )
Next

MsgInfo( cMsg, "Retorno" )

Return

*=====================================*
Static Function LoadEMP()
*=====================================*
Local cEmp := "", aRet := {}
OpenSM0(); SM0->(DBGOTOP())
While !SM0->(EOF())
IF ! SM0->M0_CODIGO $ cEmp
  cEmp += SM0->M0_CODIGO + ";"
  SM0->( AADD( aRet, {M0_CODIGO, M0_CODFIL} ) )
ENDIF
SM0->(DBSKIP())
Enddo
Return aRet

*=====================================*
Static Function AjustZAX(aEmp)
*=====================================*
Local aX3, aStru, nTopErr := 0
cEmp := aEmp[1]; cFil := aEmp[2]

RpcSetType(3)
RpcSetEnv(cEmp, cFil)

IF !SX2->(DBSEEK("ZAX"))
Return cEmp+": Não tem ZAX no SX2" + NL
ENDIF

IF ! TcCanOpen(SX2->X2_ARQUIVO)
Return cEmp+": Não houve alterações" + NL
Endif

IF !ChkFile("ZAX", .T.)  // Tenta abrir a tabela em modo exclusivo para alterar
Return cEmp+": Não pode abrir ZAX exclusivo" +NL
ENDIF
aStru := ZAX->(DBSTRUCT())
ZAX->(DBCLOSEAREA())

SX3->(DBSETORDER(2))

IF SX3->(DBSEEK("ZAX_REFMT1"))
RecLock("SX3", .F.)
SX3->X3_TAMANHO := 17
SX3->X3_PICTURE := "@R 999,999,999,999.99"
SX3->(MSUNLOCK())
ENDIF

IF SX3->(DBSEEK("ZAX_REFMT2"))
RecLock("SX3", .F.)
SX3->X3_TAMANHO := 17
SX3->X3_PICTURE := "@R 999,999,999,999.99"
SX3->(MSUNLOCK())
ENDIF

// Monta a estrutura em SX3 p/ comparação
SX3->(DBSETORDER(1))

SX3->(DBSEEK("ZAX01"));  aX3 := {}

While SX3->(!EOF() .and. X3_ARQUIVO=="ZAX")
IF SX3->X3_CONTEXT <> "V"
  SX3->( AADD( aX3, {X3_CAMPO, X3_TIPO, X3_TAMANHO, X3_DECIMAL} ))
ENDIF
SX3->(DBSKIP())
Enddo

IF TCAlter( Alltrim(SX2->X2_ARQUIVO), aStru, aX3, @nTopErr)
Return cEmp+": Alterado com sucesso" +NL
Else
Return cEmp+": Erro ao alterar - " + ALLTRIM(STR(nTopErr)) +NL
Endif

RpcClearEnv()
Return

--------------------------------------------------------------------------------



E assim a estrutura do campo foi mudada...

[]s

Rodrigo "OverFail"

Comentários

  1. Boa tarde Naldo!! Você poderia colocar um
    artigo sobre o comando TCINTERNAL ou ensinar
    a criar campos e deletar no sx2, sx3 e six através um prw .

    ResponderExcluir
  2. Naldo,

    Eu observei q a execução dessa Function irá provocar um CREATE, DROP, INSERT na tabela. Teria como fazer isso apenas alterando SX3 e TOP_FIELD ?

    ResponderExcluir
    Respostas
    1. Teóricamente, com TCSetField(cAlias,cField,cType,nSize,nDec), é possível. Testaew.

      []s

      Excluir

Postar um comentário

Postagens mais visitadas