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

BlackTDN :: utThread (tBigNThread) : Exemplo de Uso classe em AdvPL

Exemplo de uso para a classe em AdvPL: utThread (ndjlib031.prg).

Obs.: A classe utThread é completamente dependente de tBigNThread (tBigNThread.prg: um vez que deriva desta) então, para executar o exemplo de teste abaixo, compile, também, os programas que se encontram aqui.

Ao exemplo:

#include "tBigNumber.ch"

#define TST_MAXTHREAD 15

user procedure ThreadT1()
local oProcess:=MsNewProcess():New({||thProcess(oProcess)})
oProcess:Activate()
return

static function thProcess(oProcess)
Local oThread:=utThread():New(oProcess)
Local nThread
Local nThreads:=TST_MAXTHREAD
Local nValor1
Local nValor2
Local nTotal
oThread:Start(nThreads)
oProcess:SetRegua1(nThreads)
oProcess:SetRegua2(0)
For nThread:=1 To nThreads
nValor1:=nThread
nValor2:=(nThreads-nThread)
oProcess:IncRegua2()
if ((nThread%2)==0)
oThread:setEvent(nThread,{"u_Sum",nValor1,nValor2})
else
oThread:setEvent(nThread,"u_Sum('"+NToS(nValor1)+"','"+NToS(nValor2)+"')")
endif
oProcess:SetRegua1()
Next nThread
oThread:Notify()
oThread:Wait()
oThread:Join()
aResults:=oThread:getAllResults(.T.)
oThread:Finalize()
nTotal:=0
aEval(aResults,{|r,i|ConOut("Result Index["+NToS(i)+"]",r,Replicate("-",20)),nTotal+=Val(r)})
ConOut("Total:",nTotal)
return

user function Sum(xValor1,xValor2)
local nValor1:=if(valType(xValor1)=="C",Val(xValor1),xValor1)
local nValor2:=if(valType(xValor2)=="C",Val(xValor2),xValor2)
//-----------------------------------------------------------
//OBS.: NAO ESPERE QUE ESSA INFOMACAO SEJA IMPRESSA NA ORDEM
// AFINAL: MT
ConOut(;
Replicate("-",20),;
"[ProcName(2)]",ProcName(2),;
"[ProcName(1)]",ProcName(1),;
"[ProcName(0)]",ProcName(),;
"[ThreadID]",ThreadID(),;
"[nValor1]",nValor1,;
"[nValor2]",nValor2,;
Replicate("-",20);
)
return((nValor1+nValor2))

[]s

иαldσ dj


P.S.: Não entendeu nadinha? Isso não é Problema! Que tal dar uma passadinha antes no TUDO EM ADVPL.

Comentários

Postagens mais visitadas