Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

BlackTDN :: ADVPL ~ Strongly Typed Variables : ParamType Extended

Baseado na idéia original “Strongly Typed Variables  (c) 1996-1997 by Bryan Duchesne” BlackTDN disponibiliza uma versão adaptada para o ADVPL. A base para a versão “eXtended” foi o include ParmType.ch da própria TOTVS. Alguns ajustes foram necessários dentre eles: Substituir  “List match marker” por “Regular match marker” na atribuição de variável do tipo Objeto e na verificação de exceção.
 
-  Regular match marker:
Matches the next legal expression in the input text.  The regular match marker, a simple label, is the most general and, therefore, the most likely match marker to use for a command argument. Because of its generality, it is used with the regular result marker, all of the stringify result markers, and the blockify result marker.
-  List match marker:
Matches a comma-separated list of legal expressions.  If no input text matches the match marker, the specified marker name contains nothing. You must take care in making list specifications because extra commas will cause unpredictable and unexpected results.
 
Em função dessas alterações uma particularidade, em relação ao exemplo postado em BlackTDN :: ADVPL ~ PARAMTYPE, é a passagem do nome da Classe a ser usada na atribuição. Como ParmType.ch usa “List match marker” o nome da classe é passada como “Literal” sendo resolvida pelo pré-processador. Já em ParamTypeX.ch a classe a ser utilizada, considerando o uso de “Regular match marker”, deverá ser passada como uma “String”.
 
Denominamos o novo arquivo de cabeçalho de ParamTypeX.ch. Com ele poderemos, além validar a atribuição dos valores formais em uma função, validar os valores atribuídos a variáveis. Nesta primeira versão de ParamTypeX não nos preocupamos em salvar o conteúdo atribuído às variáveis para uso com depuração em tempo de execução deixaremos isso para uma versão futura.
 
Um uso para ParamTypeX.ch poderá ser visto a seguir:
 
   1: #ifdef TOTVS
   2:     #include "TOTVS.CH"
   3: #else    
   4:     #include "protheus.ch"
   5: #endif
   6:  
   7: /*
   8:     Programa : StronglyTypedVar.prg
   9:     Função   : STypedVar
  10:     Autor    : Marinaldo de Jesus [ http://www.blacktdn.com.br ]
  11:     Data     : 29/07/2012
  12:     Uso      : Strongly Typed Variables
  13: */
  14: User Function STypedVar()
  15:  
  16:     // declare your variables as strongly typed
  17:     LOCAL bError AS BLOCK VALUE {|e|MsgRun(e:Description,"Exception: "+IF(Empty(ProcName(3)),ProcName(2),ProcName(3)),{||Sleep(1000)})}
  18:     LOCAL bErrorBlock AS BLOCK
  19:  
  20:     LOCAL alcVar1 AS ARRAY VALUE Array(10)
  21:     LOCAL alcVar2 AS ARRAY
  22:      
  23:     LOCAL blcVar1 AS BLOCK VALUE { || .T. }
  24:     LOCAL blcVar2 AS BLOCK
  25:      
  26:     LOCAL clcVar1 AS CHARACTER VALUE "cVar1"
  27:     LOCAL clcVar2 AS CHARACTER
  28:      
  29:     LOCAL nlcVar1 AS NUMERIC VALUE 15
  30:     LOCAL nlcVar2 AS NUMERIC
  31:      
  32:     LOCAL dlcVar1 AS DATE VALUE Date()
  33:     LOCAL dlcVar2 AS DATE
  34:      
  35:     LOCAL llcVar1 AS LOGICAL VALUE .T.
  36:     LOCAL llcVar2 AS LOGICAL
  37:      
  38:     LOCAL olcVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
  39:     LOCAL olcVar2 AS OBJECT VALUE TFTPClient():New() //Generic Object
  40:           
  41:     STATIC astVar1 AS ARRAY VALUE Array(10)
  42:     STATIC astVar2 AS ARRAY
  43:      
  44:     STATIC bstVar1 AS BLOCK VALUE { || .T. }
  45:     STATIC bstVar2 AS BLOCK
  46:      
  47:     STATIC cstVar1 AS CHARACTER VALUE "cVar1"
  48:     STATIC cstVar2 AS CHARACTER
  49:      
  50:     STATIC nstVar1 AS NUMERIC VALUE 15
  51:     STATIC nstVar2 AS NUMERIC
  52:      
  53:     STATIC dstVar1 AS DATE VALUE Date()
  54:     STATIC dstVar2 AS DATE
  55:      
  56:     STATIC lstVar1 AS LOGICAL VALUE .T.
  57:     STATIC lstVar2 AS LOGICAL
  58:      
  59:     STATIC ostVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
  60:  
  61:     PRIVATE aptVar1 AS ARRAY VALUE Array(10)
  62:     PRIVATE aptVar2 AS ARRAY
  63:      
  64:     PRIVATE bptVar1 AS BLOCK VALUE { || .T. }
  65:     PRIVATE bptVar2 AS BLOCK
  66:      
  67:     PRIVATE cptVar1 AS CHARACTER VALUE "cVar1"
  68:     PRIVATE cptVar2 AS CHARACTER
  69:     
  70:     PRIVATE nptVar1 AS NUMERIC VALUE 15
  71:     PRIVATE nptVar2 AS NUMERIC
  72:      
  73:     PRIVATE dptVar1 AS DATE VALUE Date()
  74:     PRIVATE dptVar2 AS DATE
  75:     
  76:     PRIVATE lptVar1 AS LOGICAL VALUE .T.
  77:     PRIVATE lptVar2 AS LOGICAL
  78:      
  79:     PRIVATE optVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
  80:     
  81:     PUBLIC apbVar1 AS ARRAY VALUE Array(10)
  82:     PUBLIC apbVar2 AS ARRAY
  83:      
  84:     PUBLIC bpbVar1 AS BLOCK VALUE { || .T. }
  85:     PUBLIC bpbVar2 AS BLOCK
  86:      
  87:     PUBLIC cpbVar1 AS CHARACTER VALUE "cVar1"
  88:     PUBLIC cpbVar2 AS CHARACTER
  89:      
  90:     PUBLIC npbVar1 AS NUMERIC VALUE 15
  91:     PUBLIC npbVar2 AS NUMERIC
  92:      
  93:     PUBLIC dpbVar1 AS DATE VALUE Date()
  94:     PUBLIC dpbVar2 AS DATE
  95:     
  96:     PUBLIC lpbVar1 AS LOGICAL VALUE .T.
  97:     PUBLIC lpbVar2 AS LOGICAL
  98:     
  99:     PUBLIC opbVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
 100:     
 101:     //This command replaces the traditional := assignment
 102:     ASSIGN alcVar1 := Array(10)
 103:     ASSIGN blcVar1 := { || .T. }
 104:     ASSIGN clcVar1 := "ASSIGN cVar1"
 105:     ASSIGN nlcVar1 := 20
 106:     ASSIGN dlcVar1 := MsDate()
 107:     ASSIGN llcVar1 := .F.
 108:     ASSIGN olcVar1 := FWFORMBROWSE():New()
 109:      
 110:     ASSIGN astVar1 := Array(10)
 111:     ASSIGN bstVar1 := { || .T. }
 112:     ASSIGN cstVar1 := "ASSIGN cVar1"
 113:     ASSIGN nstVar1 := 20
 114:     ASSIGN dstVar1 := MsDate()
 115:     ASSIGN lstVar1 := .F.
 116:     ASSIGN ostVar1 := FWFORMBROWSE():New()
 117:      
 118:     ASSIGN aptVar1 := Array(10)
 119:     ASSIGN bptVar1 := { || .T. }
 120:     ASSIGN cptVar1 := "ASSIGN cVar1"
 121:     ASSIGN nptVar1 := 20
 122:     ASSIGN dptVar1 := MsDate()
 123:     ASSIGN lptVar1 := .F.
 124:     ASSIGN optVar1 := FWFORMBROWSE():New()
 125:      
 126:     ASSIGN apbVar1 := Array(10)
 127:     ASSIGN bpbVar1 := { || .T. }
 128:     ASSIGN cpbVar1 := "ASSIGN cVar1"
 129:     ASSIGN npbVar1 := 20
 130:     ASSIGN dpbVar1 := MsDate()
 131:     ASSIGN lpbVar1 := .F.
 132:     ASSIGN opbVar1 := FWFORMBROWSE():New()
 133:      
 134:     //Ao Tentar Atribuir uma valor diferente do que o esperado ocorrera uma Excecao
 135:  
 136:     ASSIGN bErrorBlock := ErrorBlock(bError)
 137:     
 138:     BEGIN SEQUENCE
 139:         ASSIGN alcVar1 := 1
 140:     END SEQUENCE
 141:  
 142:     BEGIN SEQUENCE
 143:         ASSIGN blcVar1 := .T.
 144:     END SEQUENCE
 145:  
 146:     BEGIN SEQUENCE
 147:          ASSIGN clcVar1 := 10
 148:     END SEQUENCE
 149:  
 150:     BEGIN SEQUENCE
 151:          ASSIGN nlcVar1 := "10"
 152:     END SEQUENCE
 153:  
 154:     BEGIN SEQUENCE
 155:          ASSIGN llcVar1 := 0
 156:     END SEQUENCE
 157:  
 158:     BEGIN SEQUENCE
 159:          ASSIGN olcVar1    := FWBROWSE():NEW() //Espera "FWFORMBROWSE"
 160:     END SEQUENCE
 161:  
 162:     BEGIN SEQUENCE
 163:         ASSIGN olcVar2    := TSocketClient():New() 
 164:     END SEQUENCE    
 165:  
 166:     ASSIGN bError := { |e| MsgInfo( e:Description , "Exception: " + ProcName(3) ) }
 167:  
 168:     ErrorBlock( bError )
 169:  
 170:     BEGIN SEQUENCE
 171:         ParamType()
 172:     END SEQUENCE
 173:  
 174:     ErrorBlock( bErrorBlock )
 175:  
 176: Return( NIL )
 177:  
 178: /*
 179:     Programa : StronglyTypedVar.prg
 180:     Função   : ParamType
 181:     Autor    : Marinaldo de Jesus [ http://www.blacktdn.com.br ]
 182:     Data     : 29/07/2012
 183:     Uso      : Strongly Typed Variables
 184: */
 185: Static Function ParamType(cVar,nVar,lVar,dVar,bVar,uVar,aVar,oVar1,oVar2)
 186:  
 187:     PARAMTYPE 1 VAR cVar  AS CHARACTER                   OPTIONAL DEFAULT ""
 188:     PARAMTYPE 2 VAR nVar  AS NUMERIC                     OPTIONAL DEFAULT 0
 189:     PARAMTYPE 3 VAR lVar  AS LOGICAL                     OPTIONAL DEFAULT .T.
 190:     PARAMTYPE 4 VAR dVar  AS DATE                        OPTIONAL DEFAULT Date()
 191:     PARAMTYPE 5 VAR bVar  AS BLOCK                       OPTIONAL DEFAULT { || .F. }
 192:     PARAMTYPE 6 VAR uVar  AS CHARACTER,NUMERIC           OPTIONAL DEFAULT "0"
 193:     PARAMTYPE 7 VAR aVar  AS ARRAY                       OPTIONAL DEFAULT Array(0)
 194:     PARAMTYPE 8 VAR oVar1 AS OBJECT CLASS "FWFORMBROWSE" OPTIONAL DEFAULT FWFORMBROWSE():New()
 195:     PARAMTYPE 9 VAR oVar2 AS OBJECT                      OPTIONAL DEFAULT TSocketClient():New()
 196:  
 197:     ASSIGN cVar  := cVar
 198:     ASSIGN nVar  := nVar 
 199:     ASSIGN lVar  := lVar
 200:     ASSIGN dVar  := dVar
 201:     ASSIGN bVar  := bVar
 202:     ASSIGN uVar  := uVar
 203:     ASSIGN aVar  := aVar
 204:     ASSIGN oVar1 := oVar2 //Espera "FWFORMBROWSE"
 205:     ASSIGN oVar2 := oVar1
 206:  
 207: Return( NIL )
 208:  
 209: #include "paramtypex.ch"

 

 

 

ParamTypeX.ch e o arquivo de exemplo poderão ser obtidos ao clicar aqui.



[]s
иαldσ dj

Comentários

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA