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.

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

Administrador

View all posts

1 comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Submit your video

Would you like to share your creativity with the world? Submit your video by clicking on the button below.

Submit your video