Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: Como Criar Relatórios de Cotações com Dados Agrupados Usando SQL

img: DALL·E 2024-08-09 07.00.00 - A high-quality image showcasing a detailed SQL query being written in a code editor, such as VS Code, on a dark theme background. ... ## Como Criar Relatórios de Cotações com Dados Agrupados Usando SQL Quando trabalhamos com sistemas ERP e precisamos gerar relatórios de cotações que apresentam dados de múltiplos fornecedores, é comum encontrarmos a necessidade de pivotar registros que, originalmente, são apresentados de forma vertical. Isso é especialmente útil quando o objetivo é comparar preços ou condições de diferentes fornecedores para um mesmo produto em uma única linha do relatório. Neste artigo, vamos explorar uma abordagem para transformar registros verticais em colunas, facilitando a impressão de relatórios que consolidam informações de vários fornecedores em uma única linha. Vamos utilizar SQL com técnicas de pivotagem, e ao final, mostraremos como estender essa técnica para um número variável de fornecedores. ### Estrutura do Relatór

Protheus :: Advpl :: FINR530 :: PE F530QRY :: Eu acho que vi um gatinho!

 

Cliente gostaria que os Bancos/Agências/Contas usadas no Cadastro de Funcionários não aparecessem no Relatório de Movimento Financeiro Diário (FINR530). Sugeri-lhe:

  1. Deixar esses registros como Bloqueados (A6_BLOCKED=’1’); e
  2. Incluir um Filtro, na emissão do relatório, para só emitir os Bancos em que o Campo A6_BLOCKED seja diferente de ‘1’

Mas, considerando que o Filtro salvo não é restaurado automaticamente, dependendo da ação do usuário, perguntou se teria como isso ser feito automaticamente pelo sistema. A resposta, sim, poderemos implementar o Ponto de Entrada F530QRY (Normalmente utilizado para Filtrar os Registros da Tabela SE5) para esse fim.

Mas, aí vem a surpresa! Ao implementar o PE F530QRY quem aparece “Frajola”:

TOTVS Build 7.00.101202A-20110330
ERRO THREAD ([5456], <user>, <computer>)   09/12/2011   12:41:51
variable does not exist NINDEX on FA530IMP(FINR530.PRX) 06/07/2010 15:47:56 line : 278

Mas porque “Frajola” resolve aparecer logo após a implementação do Ponto de Entrada? Vamos analisar o código:

image

Irá verificar se o Ponto de Entrada foi compilado e atribui valor inicial a cQueryADD que será utilizado na Complementação do “Filtro”

image

Se a Função Referente ao Ponto de Entrada foi encontrada e se o tipo da variável cQueryAdd for Caractere (e sempre vai ser), executa o “Ponto de Entrada” armazenando o retorno em cQueryADD (na realidade isso deveria estar a 2 linhas acima), mas, até aqui tudo bem. Frajola resolve aparecer quando:

image

O sistema tenta usar nIndex. nIndex não foi formalmente declarada em nenhum ponto do sistema, sua atribuição ocorre (ou ocorria) logo apos a chamada a IndRegua de forma a obter o retorno de RetIndex() que se TOPCONN será 0, caso contrário, o último índice da tabela SE5. Ocorre que, ou a “Vovó” deixou nIndex “de castigo”, restringindo-lhe àlguma condição, ou mandou-lhe passear e…

image

quando o sistema tenta usá-la… (@#&$*!) crash....

TOTVS Build 7.00.101202A-20110330
ERRO THREAD ([5456], <user>, <computer>) 09/12/2011 12:41:51
variable does not exist NINDEX on FA530IMP(FINR530.PRX) 06/07/2010 15:47:56 line : 278

É um erro com “Solução/Contorno” (paliativo é claro). Ei-la: Usaremos _SetNamedPrvt() para fazer o trabalho do programador, e restituir nIndex onde de direito.

image

“Piu-Piu agradece”.

[]s

иαldσ dj

Comentários

  1. Naldo, por que usar _SetNamedPrvt ao invés de private ou public?

    ResponderExcluir
  2. Pelo simples fato de inserir a variável em seu contexto. Public iria usar um espaço desnecessário em memória e Private não atenderia à solução pela limitação de escopo. Já _SetNamedPrvt() (salve salve Weber por tê-la criado) irá "por a variável em seu devido lugar" e quando FINR350 "deixar de existir" levará com ele a variável.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas