advpl - Código Expresso https://codigoexpresso.com Código Expresso Fri, 04 Jul 2025 20:12:30 +0000 pt-BR hourly 1 https://wordpress.org/?v=6.8.2 https://codigoexpresso.com/wp-content/uploads/2025/06/cropped-logo_codigo-expresso-32x32.png advpl - Código Expresso https://codigoexpresso.com 32 32 244947812 Buscando o nome do ambiente com GetEnvServer( ) – Advpl https://codigoexpresso.com/2025/07/02/buscandoo-o-nome-do-ambiente-com-getenvserver-advpl/?utm_source=rss&utm_medium=rss&utm_campaign=buscandoo-o-nome-do-ambiente-com-getenvserver-advpl https://codigoexpresso.com/2025/07/02/buscandoo-o-nome-do-ambiente-com-getenvserver-advpl/#respond Wed, 02 Jul 2025 09:00:36 +0000 https://demo.mekshq.com/vlog/dc/?p=126  A função GetEnvServer( ) retorna o nome do ambiente (environment) onde esta sendo executado a rotina. Ela traz o nome do ambiente configurada no Ini do appserver.

The post Buscando o nome do ambiente com GetEnvServer( ) – Advpl first appeared on Código Expresso.

]]>
 A função GetEnvServer( ) retorna o nome do ambiente (environment) onde esta sendo executado a rotina. Ela traz o nome do ambiente configurada no Ini do appserver daquele ambiente logado.

Exemplo:

User Function fNomeAmb()
    Local aArea      := FWGetArea()
    Local cMensagem  := ""
 
    //Busca a informação e exibe
    cMensagem := "O nome do ambiente que esta rodando o sistema é: " + GetEnvServer()
    FWAlertInfo(cMensagem, "Teste GetEnvServer")
 
    FWRestArea(aArea)
Return

The post Buscando o nome do ambiente com GetEnvServer( ) – Advpl first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/07/02/buscandoo-o-nome-do-ambiente-com-getenvserver-advpl/feed/ 0 126
Buscando informações da Empresa (SM0) com FWSM0Util https://codigoexpresso.com/2025/07/02/buscando-informacoes-da-empresa-sm0-com-fwsm0util/?utm_source=rss&utm_medium=rss&utm_campaign=buscando-informacoes-da-empresa-sm0-com-fwsm0util https://codigoexpresso.com/2025/07/02/buscando-informacoes-da-empresa-sm0-com-fwsm0util/#respond Wed, 02 Jul 2025 08:00:02 +0000 https://demo.mekshq.com/vlog/dc/?p=165 Energistically foster principle-centered web-readiness whereas wireless technology. Competently visualize value-added metrics rather than covalent methodologies. Synergistically orchestrate end-to-end systems before cost effective opportunities. Efficiently recaptiualize reliable.

The post Buscando informações da Empresa (SM0) com FWSM0Util first appeared on Código Expresso.

]]>
A tabela SM0 armazena informações relacionadas às filiais da empresa do ERP TOTVs Protheus. Ela funciona como um cadastro de filiais, onde são armazenados dados como endereço, CNPJ, inscrição estadual, entre outras informações relevantes para cada filial.

Atualmente, com o dicionário de dados migrado para dentro do banco de dados, esses dados não devem mais ser acessados diretamente, sendo disponibilizadas funções para esse isso.

A classe FWSM0Util possui o método GetSM0Data() onde é possível informar o código da empresa, o código da filial e quais campos você deseja buscar a informação. A função retorna um array com os campos informados.

No exemplo abaixo é mostrado como recuperar o Nome, CNPJ/CPF e Cidade do cadastro da filial 01 da Empresa 99 de teste:

User Function fBuscaSM0()
Local aFieldSM0 := { ;
    "M0_CODIGO",;    //Posição [1]
    "M0_CODFIL",;    //Posição [2]
    "M0_NOMECOM",;   //Posição [3]
    "M0_CGC",;       //Posição [4]
    "M0_INSCM",;     //Posição [5]
    "M0_CIDENT",;    //Posição [6]
    "M0_ESTENT",;    //Posição [7]
    "M0_ENDENT",;    //Posição [8]
    "M0_BAIRENT",;   //Posição [9]
    "M0_CEPENT",;    //Posição [10]
    "M0_COMPENT",;   //Posição [11]
    "M0_TEL";        //Posição [12]
}
Local aSM0Data2 := {}

aSM0Data2 := FWSM0Util():GetSM0Data("99", "01", aFieldSM0)
If Len(aSM0Data2) > 0
    Alert(aSM0Data2[3][2]) //M0_NOMECOM
    Alert(aSM0Data2[4][2]) //M0_CGC
    Alert(aSM0Data2[6][2]) //M0_CIDENT
EndIf

Return 

Outra forma de utilização é mostrada no exemplo abaixo, onde a função retorna todos os campos presentes na SM0 daquela filial:

User Function f2BuscaSM0()
Local aSM0Data2 := {}
aSM0Data2 := FWSM0Util():GetSM0Data("99", "01")

Return 

The post Buscando informações da Empresa (SM0) com FWSM0Util first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/07/02/buscando-informacoes-da-empresa-sm0-com-fwsm0util/feed/ 0 165
FWRest – Advpl https://codigoexpresso.com/2025/06/30/fwrest-metodo-post-com-url-https/?utm_source=rss&utm_medium=rss&utm_campaign=fwrest-metodo-post-com-url-https https://codigoexpresso.com/2025/06/30/fwrest-metodo-post-com-url-https/#respond Mon, 30 Jun 2025 20:00:39 +0000 https://demo.mekshq.com/vlog/dc/?p=124 FWRest() é uma classe Client para consumir uma API ou webservice REST.

The post FWRest – Advpl first appeared on Código Expresso.

]]>
FWRest() é uma classe Client para consumir uma API ou webservice REST.

The post FWRest – Advpl first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/06/30/fwrest-metodo-post-com-url-https/feed/ 0 124
Travar função como semáforo com LockByName https://codigoexpresso.com/2025/06/12/travar-funcao-como-semaforo-com-lockbyname/?utm_source=rss&utm_medium=rss&utm_campaign=travar-funcao-como-semaforo-com-lockbyname https://codigoexpresso.com/2025/06/12/travar-funcao-como-semaforo-com-lockbyname/#respond Thu, 12 Jun 2025 14:03:30 +0000 https://demo.mekshq.com/vlog/dc/?p=452 Esse recurso trava uma função como semáforo, essa função utilizada para criar um semáforo no servidor de licenças ou em disco. Exemplo: Sintaxe: LockByName( < cName >, [ lEmpresa ], [ lFilial ] ) → lCreated Parâmetros: Nome Tipo Descrição Valor Padrão Obrigatório cName Caracter Nome do semáforo a ser criado. X lEmpresa Logical Se […]

The post Travar função como semáforo com LockByName first appeared on Código Expresso.

]]>
Esse recurso trava uma função como semáforo, essa função utilizada para criar um semáforo no servidor de licenças ou em disco.

Exemplo:

LockByName("NOME_SEMAFORO",.T.,.F.)

Sintaxe:

LockByName( < cName >, [ lEmpresa ], [ lFilial ] ) → lCreated

Parâmetros:

NomeTipoDescriçãoValor PadrãoObrigatório
cName CaracterNome do semáforo a ser criado.X
lEmpresa LogicalSe verdadeiro (.T.), o controle será feito por filial, considerando a filial (considera empresa e filial caso o layout possua).F.
lFilial LogicalSe verdadeiro (.T.), o controle será feito por grupo de empresa..T.

Observações:

A LockByName trabalha em conjunto com a chave SpecialKey, que pode ser informada no arquivo de configuração do servidor no ambiente corrente, para distinguir os diversos ambientes (produção e homologação).

Em versões que não possuem Servidor de Licenças o semáforo é criado automaticamente em disco.

Exemplo (ini):

[EnvironmentX]
SourcePath=D:\Protheus\APO\
RootPath=D:\Protheus\
StartPath=\System\
RpoDb=TOP
RpoLanguage=Multi
RpoVersion=120
LocalFiles=ctree
SpecialKey=EnvironmentX

Código:

If LockByName("NOME_FUNCAO", .F., .F.) //Lock no ambiente inteiro, pois não considera empresa nem filial
    //Faço meu processamento
    UnlockByName("ffuncao", .F., .F.) //Efetuo a liberação do lock após o término do processamento
Else
    MsgInfo("Rotina já em execução", "Framework")

EndIf

The post Travar função como semáforo com LockByName first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/06/12/travar-funcao-como-semaforo-com-lockbyname/feed/ 0 452
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/#respond Mon, 26 May 2025 08:00:56 +0000 https://demo.mekshq.com/vlog/dc/?p=161 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 […]

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/ 0 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/#respond Thu, 22 May 2025 08:00:02 +0000 https://demo.mekshq.com/vlog/dc/?p=170 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. Segue exemplo para contagem de registros da tabela SB1: Segue um exemplo, […]

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/ 0 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 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 […]

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
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/#respond Thu, 15 May 2025 16:00:55 +0000 https://demo.mekshq.com/vlog/dc/?p=92 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 […]

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/ 0 92
Pegar o tamanho de um campo com TamSX3( )- ADVPL https://codigoexpresso.com/2025/01/02/pegar-o-tamanho-de-um-campo-com-tamsx3-advpl/?utm_source=rss&utm_medium=rss&utm_campaign=pegar-o-tamanho-de-um-campo-com-tamsx3-advpl https://codigoexpresso.com/2025/01/02/pegar-o-tamanho-de-um-campo-com-tamsx3-advpl/#respond Thu, 02 Jan 2025 08:00:58 +0000 https://demo.mekshq.com/vlog/dc/?p=163 A função TamSX3( ) retorna o tamanho de um campo, seu decimal e seu tipo de dado de acordo com a tabela SX3 do dicionário de dados.

The post Pegar o tamanho de um campo com TamSX3( )- ADVPL first appeared on Código Expresso.

]]>
A função TamSX3( ) retorna o tamanho de um campo, seu decimal e seu tipo de dado de acordo com a tabela SX3 do dicionário de dados.

Sintaxe:

TamSx3(cCampo)[nInd]

Parâmetros:

NomeTipoDescriçãoObrigatório
cCampoCaractereNome do campo na tabela de campos SX3Sim
nPosNuméricoNúmero da posição(1=Tamanho do campo,2=Tamanho do decimal do campo,3=Tipo de dado do campo)Sim

Exemplo:

User Function fTamSx3()

Local cCampo:="A1_NOME"

_nTamanho:= TamSx3(cCampo)[1] //Retorna o tamanho do campo
_nTamaDec:= TamSx3(cCampo)[2] //Retorna o tamanho das casas decimais do campo
_cTipoCpo:= TamSx3(cCampo)[3] //Retorna o tipo do campo.

Return 

The post Pegar o tamanho de um campo com TamSX3( )- ADVPL first appeared on Código Expresso.

]]>
https://codigoexpresso.com/2025/01/02/pegar-o-tamanho-de-um-campo-com-tamsx3-advpl/feed/ 0 163