advpl - Código Expresso https://codigoexpresso.com Código Expresso Mon, 26 May 2025 17:13:30 +0000 pt-BR hourly 1 https://wordpress.org/?v=6.8.1 244947812 Criando uma consulta Padrão (Especifica) Dinâmica com MarkBrow – Advpl https://codigoexpresso.com/2025/05/26/consulta-especifica-com-markbrow-advpl/?utm_source=rss&utm_medium=rss&utm_campaign=consulta-especifica-com-markbrow-advpl https://codigoexpresso.com/2025/05/26/consulta-especifica-com-markbrow-advpl/#comments Mon, 26 May 2025 08:00:56 +0000 https://demo.mekshq.com/vlog/dc/?p=161 Synergistically syndicate optimal channels without superior "outside the box" thinking. Distinctively monetize covalent users vis-a-vis team driven e-commerce. Professionally fashion proactive value through vertical core competencies.

The post Criando uma consulta Padrão (Especifica) Dinâmica com MarkBrow – Advpl first appeared on Código Expresso.

]]>
Nesse artigo iremos apresentar a criação de uma consulta especifica dinâmica com ADVPL para que possa ser usada na criação consultas padrão, sem necessidade de alteração ou replicação da função ADVPL original, facilitando o processo de criação ou manutenção.

Para ressaltar, a diferença entre consulta padrão e consulta especifica é que a consulta padrão fornece ao usuário uma maneira simples para exibir e procurar valores nas tabelas do Protheus sem necessidade de uma função customizada, e a consulta específica é um programa customizado, criado via User Function, para trazer determinada informação para a consulta.

A consulta especifica tem como principal característica o total controle de todas os pontos da consulta por parte do desenvolvedor, nesse tipo de consulta temos apenas que definir qual será a função chamada para exibir a tela da consulta, e a função que será chamada caso a rotina de consulta retornar o valor lógico verdadeiro, em contra partida.

Já a consulta genérica não necessita de codificação advpl, mas que seja configurado as colunas, índices, filtros e o retorno, como no exemplo abaixo:

Nosso objetivo aqui é criar uma consulta que tenha as vantagens de uma consulta especifica mas seja configurável igual, assim como a padrão, alem de ser pratica.

Quickly simplify customized initiatives through professional metrics. Efficiently morph B2B supply chains without equity invested “outside the box” thinking.

Enthusiastically reconceptualize go forward initiatives via interoperable ideas. Completely simplify focused opportunities via standardized technology. Intrinsicly orchestrate interactive supply chains vis-a-vis market-driven paradigms.

Authoritatively generate functionalized convergence whereas vertical paradigms. Phosfluorescently plagiarize seamless information before cutting-edge communities. Enthusiastically redefine 24/7 functionalities with ethical web-readiness. Competently build quality applications with go forward “outside the box” thinking. Proactively transform 24/7 e-services via worldwide methodologies.

Conveniently whiteboard client-focused best practices rather than high-quality niche markets. Proactively embrace viral channels and intermandated meta-services. Enthusiastically empower long-term high-impact scenarios for cross functional experiences. Completely plagiarize reliable.

Fontes: TDN

The post Criando uma consulta Padrão (Especifica) Dinâmica com MarkBrow – Advpl first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/05/26/consulta-especifica-com-markbrow-advpl/feed/ 1 161
Contando registros da consulta SQL com Count To https://codigoexpresso.com/2025/05/22/contando-registros-da-consulta-sql-com-count-to/?utm_source=rss&utm_medium=rss&utm_campaign=contando-registros-da-consulta-sql-com-count-to https://codigoexpresso.com/2025/05/22/contando-registros-da-consulta-sql-com-count-to/#comments Thu, 22 May 2025 08:00:02 +0000 https://demo.mekshq.com/vlog/dc/?p=170 Assertively underwhelm 2.0 web-readiness and error-free customer service. Interactively facilitate resource maximizing partnerships whereas collaborative schemas. Distinctively strategize client-based interfaces for turnkey process improvements. Synergistically cultivate.

The post Contando registros da consulta SQL com Count To first appeared on Código Expresso.

]]>
Count To é um comando utilizado para contagem dos registros de uma tabela ou query

Segue baixo a sintaxe do comando, onde [nVariavel] é a variável, do tipo numérica que irá receber o valor retornado do Count to com a quantidade de registros.

Count to [nVariavel]

Segue exemplo para contagem de registros da tabela SB1:

User Function fCountTo1()

    Local aArea  := GetArea()
    Local nTotal := 0
 
    DbSelectArea('SB1')
 
    //Contando os registros e voltando ao topo da tabela
    Count To nTotal
    SB1->(DbGoTop())
 
    MsgInfo("Total de Registros: "+cValToChar(nTotal), "Atenção")
 
    RestArea(aArea)
Return

Segue um exemplo, para contagem de registros em uma consulta SQL:

User Function fCountTo2()

    Local aArea  := GetArea()
    Local nTotal := 0
    Local cAlias := getNextAlias()

    BeginSql Alias cAlias 
        SELECT *
        FROM %table:SB1% SB1
        WHERE SB1.%notDel%
        AND B1_FILIAL = %xFilial:SB1%
    EndSql

    (cAlias)->(DBSelectArea())

    Count To nTotal 

    (cAlias)->(DbGoTop())
    
    MsgInfo("Total de Registros: "+cValToChar(nTotal), "Atenção")

   (cAlias)->(DBCloseArea())

   RestArea(aArea)

Return 

The post Contando registros da consulta SQL com Count To first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/05/22/contando-registros-da-consulta-sql-com-count-to/feed/ 1 170
FieldPos( ) https://codigoexpresso.com/2025/05/16/fieldpos/?utm_source=rss&utm_medium=rss&utm_campaign=fieldpos https://codigoexpresso.com/2025/05/16/fieldpos/#respond Fri, 16 May 2025 08:00:35 +0000 https://demo.mekshq.com/vlog/dc/?p=444 Continually embrace sustainable benefits with revolutionary metrics. Completely benchmark premier partnerships through multifunctional convergence. Objectively disseminate customized vortals via front-end schemas.

The post FieldPos( ) first appeared on Código Expresso.

]]>
A função FieldPos() é usada para validar se um campo existe no dicionário de dados (SX3).

Essa função precisa ser usada logo após o comando DbSelectArea( ) para garantir que area de trabalho, ou tabela, esteja ativa ou aberta. A função retorna o valor numérico da posição daquele campo dentro do arquivo, caso o campo não exista, ela retora 0 (zero).

Segue exemplo de uso:

User Function fFieldFpos()
    Local aArea      := FWGetArea()
  
    DbSelectArea("SB1")
  
    //Valida se o campo existe:
    If FieldPos("B1_X_CAMPO") > 0
        /* Aqui da para fazer a customização caso o campo exista */
  
    Else
        FWAlertError('Contate o Administrador do Sistema', 'O campo [B1_X_CAMPO] não foi     encontrado!')
    EndIf
  
    FWRestArea(aArea)
Return

The post FieldPos( ) first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/05/16/fieldpos/feed/ 0 444
SQL para PROTHEUS e ADVPL https://codigoexpresso.com/2025/05/15/sql-para-protheus-e-advpl/?utm_source=rss&utm_medium=rss&utm_campaign=sql-para-protheus-e-advpl https://codigoexpresso.com/2025/05/15/sql-para-protheus-e-advpl/#respond Thu, 15 May 2025 20:00:29 +0000 https://demo.mekshq.com/vlog/dc/?p=448 Distinctively redefine reliable human capital via prospective metrics. Assertively synergize real-time partnerships for tactical partnerships. Distinctively foster user-centric web services and an expanded array.

The post SQL para PROTHEUS e ADVPL first appeared on Código Expresso.

]]>
Para falar de SQL ou banco de dados no Protheus, vamos primeiramente falar sobre o Dicionário de Dados do Protheus, o dicionário de dados incialmente foi criado fora do banco de dados,

Hoje, o dicionário de dados do Protheus está dentro do banco de dados, além das tabelas de dados do ERP (Cadastros, movimentos, pe.)

O dicionário no banco é uma funcionalidade recente do Protheus que tem gerado boas expectativas para a comunidade.

Phosfluorescently grow distinctive human capital without end-to-end action items. Compellingly repurpose competitive technologies and backward-compatible catalysts for change. Uniquely formulate impactful technology whereas granular opportunities. Continually promote exceptional models without top-line networks. Seamlessly disseminate 24/7 resources via enterprise applications.

Efficiently benchmark goal-oriented functionalities and future-proof markets. Phosfluorescently optimize next-generation deliverables through extensible sources. Monotonectally predominate sticky deliverables before front-end benefits. Professionally monetize world-class catalysts for change rather than 24/7 imperatives. Competently predominate business action items vis-a-vis cross-unit web services.

Professionally reintermediate high-payoff technology vis-a-vis prospective internal or “organic” sources. Assertively generate front-end channels vis-a-vis worldwide resources. Distinctively procrastinate integrated mindshare without ubiquitous methodologies. Monotonectally pursue high-quality quality vectors for premier potentialities. Continually fabricate 24/365 markets and economically sound schemas.

Dramatically synergize adaptive outsourcing without functionalized users. Professionally engage future-proof innovation through multifunctional technology. Rapidiously simplify resource sucking value rather than empowered relationships. Objectively productivate leveraged strategic theme areas after multifunctional solutions. Assertively evisculate enterprise-wide information after resource-leveling e-commerce.

Progressively enable client-centered e-commerce.

The post SQL para PROTHEUS e ADVPL first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/05/15/sql-para-protheus-e-advpl/feed/ 0 448
Seu ponto de encontro com a Informação https://codigoexpresso.com/2025/05/15/seu-ponto-de-encontro-com-a-informacao/?utm_source=rss&utm_medium=rss&utm_campaign=seu-ponto-de-encontro-com-a-informacao https://codigoexpresso.com/2025/05/15/seu-ponto-de-encontro-com-a-informacao/#comments Thu, 15 May 2025 17:40:33 +0000 https://demo.mekshq.com/vlog/dc/?p=151 Efficiently e-enable distinctive deliverables without high-quality e-services. Holisticly integrate go forward systems rather than customized functionalities. Conveniently disintermediate backward-compatible materials without seamless internal or "organic" sources.

The post Seu ponto de encontro com a Informação first appeared on Código Expresso.

]]>
Vivemos em uma era onde a informação não é apenas abundante, mas o principal motor de transformação e progresso em todas as esferas da sociedade. Desde decisões cotidianas até estratégias complexas de negócios globais, a informação qualificada e bem gerida é o alicerce para a inovação, eficiência e desenvolvimento sustentável. Na era digital, os dados tornaram-se ativos valiosíssimos, impulsionando a gestão eficiente e a tomada de decisões embasadas.

Vivemos em uma era onde a informação não é apenas abundante, mas o principal motor de transformação e progresso em todas as esferas da sociedade.

No campo da tecnologia, a informação é a matéria-prima e o produto final. Sistemas de informação são projetados para coletar, processar, armazenar e disseminar informações, tornando-se cruciais para o funcionamento moderno das empresas. Eles automatizam processos, permitem análises profundas através de Business Intelligence (BI), facilitam a comunicação e colaboração, gerenciam o relacionamento com clientes (CRM) e, fundamentalmente, garantem a segurança dos dados.

A Tecnologia da Informação (TI) otimiza recursos, aumenta a eficiência operacional e possibilita a inovação. A capacidade de transformar dados brutos em insights acionáveis é o que permite às organizações se adaptarem rapidamente às mudanças do mercado, personalizarem serviços e manterem-se competitivas.

Neste contexto, sistemas de gestão empresarial (ERP) desempenham um papel vital. Um exemplo proeminente no mercado brasileiro é o Protheus da TOTVS. Desenvolvido por uma empresa nacional, o Protheus é um ERP robusto e flexível, totalmente adaptado à complexa legislação brasileira, o que representa uma grande vantagem para as empresas locais. Ele oferece uma vasta gama de módulos personalizáveis que abrangem áreas como contábil e fiscal, recursos humanos, vendas e faturamento, compras, estoque e produção. A capacidade de integração do Protheus com outras soluções e sua constante atualização garantem que as empresas tenham uma visão holística de suas operações, facilitando a tomada de decisões estratégicas e a otimização de processos.

Atrelada a sistemas como o Protheus, está a linguagem de programação que permite sua customização e desenvolvimento de funcionalidades específicas. A ADVPL (Advanced Protheus Language) é a linguagem proprietária da TOTVS, desenvolvida especificamente para as necessidades do sistema Protheus e do mercado nacional. Sua arquitetura permite o desenvolvimento de aplicações visuais, orientação a objetos e a eventos, e a criação de rotinas customizadas que se adaptam às particularidades de cada negócio. A ADVPL é fundamental para que o ERP Protheus possa ser moldado às demandas específicas dos clientes, permitindo a criação de aplicativos web personalizados, interfaces amigáveis, e a integração com outros sistemas e tecnologias, demonstrando a importância de linguagens especializadas no ecossistema tecnológico.

A Importância do Compartilhamento de Conhecimento

Tão importante quanto gerar e gerenciar informação é a capacidade de compartilhá-la. No dinâmico setor de tecnologia, onde a inovação ocorre em ritmo acelerado, o compartilhamento de conhecimento é crucial. Ele fomenta um ambiente de aprendizado contínuo, acelera a resolução de problemas, estimula a criatividade e evita a duplicação de esforços.

Quando o conhecimento flui livremente dentro de uma organização ou comunidade, ele capacita indivíduos e equipes, promove a colaboração e constrói uma base sólida para o crescimento coletivo. Empresas que incentivam uma cultura de compartilhamento, onde sucessos e fracassos são vistos como oportunidades de aprendizado para todos, tendem a ser mais resilientes, inovadoras e bem-sucedidas. A informação, quando compartilhada, multiplica seu valor e se torna a verdadeira força propulsora do avanço tecnológico e social.

Em suma, a informação é a espinha dorsal da era moderna, especialmente no setor tecnológico. Sistemas robustos como o Protheus e linguagens especializadas como a ADVPL são ferramentas poderosas que manipulam e transformam essa informação em valor. Contudo, o verdadeiro potencial só é alcançado quando essa informação e o conhecimento dela derivado são amplamente compartilhados, catalisando o progresso e a inovação contínua.

The post Seu ponto de encontro com a Informação first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/05/15/seu-ponto-de-encontro-com-a-informacao/feed/ 1 151
Tudo sobre Embedded SQL https://codigoexpresso.com/2025/05/15/tudo-sobre-embedded-sql/?utm_source=rss&utm_medium=rss&utm_campaign=tudo-sobre-embedded-sql https://codigoexpresso.com/2025/05/15/tudo-sobre-embedded-sql/#comments Thu, 15 May 2025 16:00:55 +0000 https://demo.mekshq.com/vlog/dc/?p=92 Completely re-engineer go forward platforms and fully tested process improvements. Professionally mesh quality synergy via diverse potentialities. Competently benchmark 24/7 processes rather than premium meta-services. Proactively.

The post Tudo sobre Embedded SQL first appeared on Código Expresso.

]]>

O objetivo do Embedded SQL é facilitar a escrita e leitura de queries dentro da linguagem de programação ADVPL. Para isso, foi definida uma sintaxe para que se possa escrever a query diretamente no código, sem a necessidade de concatenar partes da string para compor a string final que representa a query.

O objetivo do Embedded SQL é facilitar a escrita e leitura de queries dentro da linguagem de programação ADVPL.

Segue abaixo alguns exemplos da utilização da melhoria explicando a conversão a partir da sintaxe antiga.

Exemplo 1: Query para consulta de campos da tabela SE2 (Contas a Pagar):

cQuery:= " SELECT SE2.E2_PREFIXO,"
cQuery += " SE2.E2_NUM "
cQuery += " FROM '+RetSqlTable('SE2')+' SE2 "
cQuery += " WHERE SE2.D_E_L_E_T_ <> '*' " 
cQuery += " SE2.E2_FILIAL= '+xfilial('SE2')+' AND "
cQuery += " SE2.E2_PREFIXO = '"+cPrefixo+"' AND "
cQuery += " ORDER BY "+RetSqlOrder('SE2')
 
dbUseArea(.T.,'TOPCONN',TcGenQry(,,cQuery),'E2TEMP',.T.,.T.)

Exemplo 1: Query reescrita utilizando Embedded SQL:

BeginSql alias 'E2TEMP'
    SELECT
        SE2.E2_PREFIXO,
        SE2.E2_NUM
    FROM %table:SE2% SE2
    WHERE SE2.%notDel% AND
        SE2.E2_FILIAL = %xfilial:SE2% AND
        SE2.E2_PREFIXO = %exp:cPrefixo% 
        ORDER BY %Order:SE2%
EndSql

Neste exemplo foi criada uma query simples que consulta alguns campos na tabela SE2 (Contas a Pagar). Pode-se observar nesse exemplo que a forma reescrita elimina a necessidade escrever a query em strings e que as mesma sejam armazenadas em uma variável, deixando a sintaxe da query mais clara e limpa.

Pode ser notado também que o comando SQL possui o comando de inicio BeginSQL e o comando de encerramento EndSQL, logo tudo que estiver dentro dessas duas palavras chaves será interpretado como parte da query a ser executada. O BeginSQL é seguido pelo comando alias e é necessário passar uma string, no exemplo é utilizado o ‘E2TEMP’ para armazenar o nome do alias da consulta, que na sintaxe antiga era passar como parâmetro na função dbUseArea( ). Uma opção é se utilizar a função getNextAlias( )que retorna um alias para ser utilizado.

O comando para selecionar a tabela a ser consultada foi substituída por %table:SE2% podendo ainda ter o alias renomeado, como no exemplo com SE2. As partes do código-fonte que devem ser substituídos aparecem entre os sinais de % (porcentagem). Essas expressões possuem tratamentos especiais em momento de execução.

Em vez de usar o D_E_L_E_T_ <> ‘*’ ou D_E_L_E_T_ = ‘ ‘ para eliminar os registros excluídos da consulta, usa-se a sintaxe SE2.%notDel% com o alias criado.

O xfilial(‘SE2’) usado para conteúdo do campo E2_FILIAL do alias passado foi substituído por %xfilial:SE2%.

Variáveis, expressões e funções aparecem iniciando com %exp:%, no exemplo, o trecho ” SE2.E2_PREFIXO = ‘”+cPrefixo+” é substituído por SE2.E2_PREFIXO = %exp:cPrefixo%.

O ODER BY “+RetSqlOrder(‘SE2’) ou “ORDER BY 1 ” é substituído por  %Order:SE2%.

Segue abaixo outro exemplo mais completo do uso da sintaxe Embedded SQL:

BeginSql alias 'E2TEMP'
    column E2_EMISSAO as Date,
    column E2_VALOR as Numeric(tam_cp,2)
  SELECT
    SE2.E2_PREFIXO,
    SE2.E2_NUM,
    SE2.E2_FORNECE,
    SE2.E2_LOJA,
    SE2.E2_VALOR,
    SA2.A2_NOME, 
    SA2,A2_CGC
    SE2.R_E_C_N_O_ SE2RECNO
  FROM
    %table:SE2% SE2,
    %table:SA2% SA2
  WHERE 
    SE2.%notDel% AND
    SA2.%notDel% AND
    SE2.E2_FILIAL= %xfilial:SE2% AND
    SA2.A2_FILIAL= %xfilial:SA2% AND
    SE2.E2_FORNECE = SA2.A2_COD AND
    SE2.E2_LOJA = SA2.A2_LOJA 
    SE2.E2_PREFIXO = %exp:cPrefixo% AND
    SE2.E2_NUM = %exp:cNumero% AND
    SE2.E2_FORNECE=%exp:SE2->E2_FORNECE% AND
    SE2.E2_LOJA=%exp:SE2->E2_LOJA% AND
    SE2.E2_EMISSAO=%exp:MV_PAR01% AND
    SE2.E2_VALOR >= %exp:MV_PAR02% AND
  ORDER BY
      %Order:SE2%
EndSql

Como já vimos exemplo anterior, é necessário iniciar o comando com o BeginSql e finaliza-lo com EndSql, indicando quais instruções serão interpretadas com um comando SQL.

Aqui usamos um outro recurso, a instrução column E2_EMISSAO as Date, especifica que o campo da query é do tipo DATE, isso é útil para trazer campos com o formato desejado no retorno da query, sem precisar fazer conversões posteriormente. Utilizando esse recurso também para a coluna E2_VALOR, para os tipos numérico com duas casas decimais e logico, respectivamente.

Nessa query fazemos uma consulta em duas tabelas: SE2 (Contas a Pagar) e SA2 (Fornecedores), possivelmente você já tenha feito (ou pelo menos visto, sendo mais provável ainda) alguma query com mais de uma tabela na clausula FROM, em questão de performance isso não é considerado uma boa pratica, mas o exemplo é para mera ilustração, abaixo mostraremos a mesma query reescrita com o uso de JOIN.

Na clausula WHERE. assim como no exemplo anterior, também filtramos as colunas filiais (para trazer somente registros da filial corrente) e D_E_L_E_T_ (para remover os registros deletados) das duas tabelas e também como no exemplo anterior, fazendo filtros na coluna E2_PREFIXO, assim como também filtramos as colunas E2_NUM, E2_FORNECE, E2_LOJA e E2_EMISSAO. Observe que nas colunas E2_EMISSAO e E2_VALOR filtramos utilizando parâmetros e não variáveis, esses parametros podem ser retornando de uma consulta padrão, ou de um parambox, executado antes da query. E por fim, fazemos uma ordenação dos registros retornados na query utilizando o ORDER BY pela ordenação primaria da SE2 %Order:SE2%

Abaixo segue a query reescrita utilizando o JOIN como uma boa pratica na criação de query com duas ou mais tabelas:

BeginSql alias 'E2TEMP'
    column E2_EMISSAO as Date,
    column E2_VALOR as Numeric(tam_cp,2)
  SELECT
    SE2.E2_PREFIXO,
    SE2.E2_NUM,
    SE2.E2_FORNECE,
    SE2.E2_LOJA,
    SE2.E2_VALOR,
    SA2.A2_NOME, 
    SA2,A2_CGC
    SE2.R_E_C_N_O_ SE2RECNO
  FROM
    %table:SE2% SE2
  INNER JOIN
    %table:SA2% SA2
  ON SE2.%notDel% AND 
     SA2.%notDel% AND 
     SE2.E2_FILIAL= %xfilial:SE2% AND
     SA2.A2_FILIAL= %xfilial:SA2% AND
     SE2.E2_FORNECE = SA2.A2_COD AND
     SE2.E2_LOJA = SA2.A2_LOJA 
  WHERE 
    SE2.%notDel% AND
    SE2.E2_PREFIXO = %exp:cPrefixo% AND
    SE2.E2_NUM = %exp:cNumero% AND
    SE2.E2_FORNECE=%exp:SE2->E2_FORNECE% AND
    SE2.E2_LOJA=%exp:SE2->E2_LOJA% AND
    SE2.E2_EMISSAO=%exp:MV_PAR01% AND
    SE2.E2_VALOR >= %exp:MV_PAR02% AND
  ORDER BY
      %Order:SE2%
EndSql

The post Tudo sobre Embedded SQL first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/05/15/tudo-sobre-embedded-sql/feed/ 1 92