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

Protheus :: Programação Básica em Advpl “Combo XXXIX”

Buscando um Array Bidimensional:

Existem várias funções de manipulação de Array. Uma delas é a aScan() que serve para efetuar pesquisa em um Array e retorna o numero do elemento do Array ( Índice ) se a pesquisa foi satisfeita e Zero (0) caso contrário. Essa função poderá ser utilizada tanto em Arrays unidimensionais como em Arrays Bidimensionais. aScan() recebe quatro parâmetros: O primeiro é o Array a ser pesquisado, o segundo é um Bloco de Código com as instruções para pesquisa, o terceiro é a posição inicial ( índice ou elemento inicial ) para pesquisa e o quarto é a posição final para pesquisa ( índice ou elemento final ). O primeiro parâmetro o Array a ser pesquisado é obrigatório, já do segundo ao quarto são opcionais. O segundo parâmetro deve ser passado quando o array a ser pesquisado for um array Multidimensional ou Bidimensional e, quando o Bloco de Codificação for passado aEval() se comportará de maneira diferente do usual. Em vez de aScan() comparar internamente elementos do Array com o que estamos procurando, ela permitirá que o bloco passado como parâmetro faça isso. aScan(), como aEval(), faz um Loop em cada elemento do Array passando cada elemento por sua vez para o bloco de codificação. O bloco de codificação, passado como parâmetro, deve retornar um valor lógico, indicando se o elemento que aScan() acabou de passar era o que estávamos procurando; .T. ( true = verdadeiro ) significa que o atual elemento é o que estamos procurando; .F. ( false = falso ) significa que não é. Se a avaliação do Bloco de Código for verdadeira, aScan() interrompe a busca e retorna o número do atual elemento. Se a avaliação do Bloco de Código for falsa, aScan() salta para o próximo elemento e efetua a avaliação do Bloco mais uma vez. aScan() prossegue seu processo de busca até terminar todos os elementos, em cujo caso retornará um Zero (0), ou até a avaliação do Bloco retornar verdadeiro. aScan() é semelhante a aEval(), exceto pelo fato de não existir uma maneira de interromper aEval() prematuramente.

Exemplos:

Local aStru := {;
{ “SNome” , “C” , 10 , 0 },;
{ “PNome” , “C” , 10 , 0 },;
{ “Ender1” , “C” , 30 , 0 },;
{ “Ender2” , “C” , 40 , 0 } ;
}

Local bExemplo := { |uElem| ConOut( uElem ) }

aEval( aStru[1] , bExemplo )

/*/
Neste Caso, processamos apenas os elementos do sub-array aStru[1] e Teremos a seguida saída no Console do Server:

SNome
C
10
0

/*/

Para processar todos os elementos do array poderíamos fazê-lo da seguinte forma:

Local aStru := {;
{ “SNome” , “C” , 10 , 0 },;
{ “PNome” , “C” , 10 , 0 },;
{ “Ender1” , “C” , 30 , 0 },;
{ “Ender2” , “C” , 40 , 0 } ;
}

Local bExemplo := { |uElem| ConOut( uElem ) }
Local nLoop
Local nLoops

//Utilizando um Loop For/Next
nLoops := Len( aStru )
For nLoop := 1 To nLoops
aEval( aStru[ nLoop ] , bExemplo )
Next nLoop

//Ou aEval de forma recursiva
aEval( aStru , { |aElem| aEval( aElem , bExemplo ) } )

/*/
Neste Caso, processamos Todos os elementos do Array e seus sub-arrays. Teremos, dessa forma, a seguida saída no Console do Server:

SNome
C
10
0
PNome
C
10
0
Ender1
C
30
0
Ender2
C
40
0
/*/

Quando usarmos um Bloco de Codificação com aScan(), ela passara cada elemento por vez para o bloco. Se esse elemento for outra Array o parâmetro formar conterá uma referência para esse Array. O bloco poderá então usar um só subscrito com seu parâmetro para acessar determinado elemento. Por exemplo, o seguinte fragmento de código localiza o número do elemento do Array que descreve o campo “PNome”

Local aStru := {;
{ “SNome” , “C” , 10 , 0 },;
{ “PNome” , “C” , 10 , 0 },;
{ “Ender1” , “C” , 30 , 0 },;
{ “Ender2” , “C” , 40 , 0 } ;
}
//Monto bloco para comparação exata
Local bAscan := { |aCpo| Upper( AllTrim( aCpo[1] ) ) == “PNOME” }
Local nPos

nPos := aScan( aStru , bAscan ) //nPos irá retornar 2
IF ( nPos > 0 )
ConOut( "A Posicao eh:" + Str( nPos ) )
ConOut( "Conteudo:" + aStru[ nPos , 1 ] )
Else
ConOut( "Elemento nao encontrado" )
EndIF

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" // ---------------

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

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ã