Postagem em destaque
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
- Gerar link
- Outros aplicativos
Postado por
иαldσ dj
BlackTDN :: ADVPL ~ PARAMTYPE
Dessa forma é possível atribuir valor “DEFAULT” a uma variável do tipo “OBJECT”, quando “OPTIONAL”, e ainda testar se o objeto passado corresponde à Classe Definida em “ParamType”. O mesmo podemos dizer para os demais tipos. No include padrão, quando o parâmetro é opcional com valor “DEFAULT” podemos, passar no “DEFAULT”, qualquer tipo que ele “engole”; já a versão BlackTDN não: a atribuição do “DEFAULT” é feita antes da verificação do tipo da variável. O arquivo “parmtype.ch” modificado poderá ser obtido ao clicar aqui e, para o código do exemplo, aqui. |
ei-la:
1: #ifndef __PARAMTYPE_CH
2: #define __PARAMTYPE_CH
3: #xcommand PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text> [ MESSAGE <message> ] ;
4: => ;
5: [ UserException(<message>) ] ;;
6: [ UserException("argument #"+<"param">+" error, expected "+<text>) ] ;;
7: UserException("argument error in parameter "+<"varname">+", expected "+<text>)
8:
9: #xcommand CLASSPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text,...> [ MESSAGE <message> ] ;
10: => ;
11: [ UserException(<message>) ] ;;
12: [ UserException("argument #"+<"param">+" error, class expected "+\"<text>\") ] ;;
13: UserException("argument error in parameter "+<"varname">+", class expected "+\"<text>\")
14:
15: #xcommand BLOCKPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text> [ MESSAGE <message> ] ;
16: => ;
17: [ UserException(<message>) ] ;;
18: [ UserException("argument #"+<"param">+" error , return expected "+<text>) ] ;;
19: UserException("argument error in block "+<"varname">+", return expected "+<text>)
20:
21: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS <type: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ;
22: [ , <typeN: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ] ;
23: [ MESSAGE <message> ] ;
24: [ <optional: OPTIONAL> ] ;
25: [ DEFAULT <uVar> ] ;
26: => ;
27: if (<.optional.>);;
28: <varname> := If(<varname> == nil,<uVar>,<varname>);;
29: endif;;
30: If !(<.optional.> .and. ValType(<varname>) == "U") .and. !(ValType(<varname>) $ Subs(<"type">,1,1) [ + Subs(<"typeN">,1,1) ]) ;;
31: PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT Subs(<"type">,1,1) [ + "," + Subs(<"typeN">,1,1) ]+"->"+ValType(<varname>) [ MESSAGE <message> ] ;;
32: EndIf ;;
33:
34: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS BLOCK EXPECTED <expected: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ;
35: [ MESSAGE <message> ] ;
36: [ <optional: OPTIONAL> ] ;
37: => ;
38: If ValType(<varname>) == "B" ;;
39: __block := Eval(<varname>) ;;
40: If ValType(__block) <> Subs(<"expected"> ,1,1) ;;
41: BLOCKPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT Subs(<"expected">,1,1) + "->"+ValType(__block) [ MESSAGE <message> ] ;;
42: EndIf ;;
43: ElseIf !(<.optional.> .and. ValType(<varname>) == "U") ;;
44: PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT "B->"+ValType(<varname>) [ MESSAGE <message> ] ;;
45: EndIf
46:
47: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS OBJECT CLASS <classname,...> ;
48: [ MESSAGE <message> ] ;
49: [ <optional: OPTIONAL> ] ;
50: [ DEFAULT <uVar> ] ;
51: => ;
52: if (<.optional.>);;
53: <varname> := If(<varname> == nil,<uVar>,<varname>);;
54: endif;;
55: If ValType(<varname>) == "O" ;;
56: __erro := ErrorBlock({|| "UNDEFINED"}) ;;
57: BEGIN SEQUENCE ;;
58: __classname := Upper(<varname>:ClassName()) ;;
59: END SEQUENCE ;;
60: ErrorBlock(__erro) ;;
61: If !(__classname $ Upper(\"<classname>\")) ;;
62: CLASSPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <classname> [ MESSAGE <message> ] ;;
63: EndIf ;;
64: ElseIf !(<.optional.> .and. ValType(<varname>) == "U") ;;
65: PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT "O->"+ValType(<varname>) [ MESSAGE <message> ] ;;
66: EndIf ;;
67:
68: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS <type: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL> ;
69: [ , <typeN: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL> ] ;
70: OR OBJECT CLASS <classname,...> ;
71: [ MESSAGE <message> ] ;
72: [ <optional: OPTIONAL> ] ;
73: => ;
74: If ValType(<varname>) == "O" ;;
75: PARAMTYPE [ <param> VAR ] <varname> AS OBJECT CLASS <classname> [ MESSAGE <message> ] [ <optional> ] ;;
76: Else ;;
77: PARAMTYPE [ <param> VAR ] <varname> AS <type> [, <typeN>] [ MESSAGE <message> ] [ <optional> ] ;;
78: EndIf
79: #endif
um pequeno exemplo:
1: #include "parmtype.ch"
2: User Function ParamType()
3: Return(ParamType())
4: Static Function ParamType(cVar,nVar,lVar,dVar,bVar,uVar,aVar,oVar)
5:
6: PARAMTYPE 1 VAR cVar AS CHARACTER OPTIONAL DEFAULT ""
7: PARAMTYPE 2 VAR nVar AS NUMERIC OPTIONAL DEFAULT 0
8: PARAMTYPE 3 VAR lVar AS LOGICAL OPTIONAL DEFAULT .T.
9: PARAMTYPE 4 VAR dVar AS DATE OPTIONAL DEFAULT Date()
10: PARAMTYPE 5 VAR bVar AS BLOCK OPTIONAL DEFAULT { || .F. }
11: PARAMTYPE 6 VAR uVar AS CHARACTER,NUMERIC OPTIONAL DEFAULT "0"
12: PARAMTYPE 7 VAR aVar AS ARRAY OPTIONAL DEFAULT Array(0)
13: PARAMTYPE 8 VAR oVar AS OBJECT CLASS THASH OPTIONAL DEFAULT THASH():New() //CUSTOMIZED BY BLACKTDN
14:
15: Return( NIL )
[]s
иαldσ dj
Postagens mais visitadas
Postado por
Rleg
BlackTDN :: RLeg ~ Desvendando a Função ParamBox
- Gerar link
- Outros aplicativos
Postado por
иαldσ dj
Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login
- Gerar link
- Outros aplicativos
Comentários
Postar um comentário