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 :: Harbour CodeBlock

Observe o fragmento de código abaixo e deleite-se com uma das maravilhas da evolução da sintaxe xBase no Harbour: O CodeBlock é, de fato, um CodeBlock.

   1: METHOD start( xAction, ... ) CLASS THREAD
   2:  
   3:    IF ::active
   4:       RETURN .F.
   5:  
   6:    ELSE
   7:       ::pThreadID := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, ;
   8:             {| ... |
   9:                LOCAL nTime
  10:  
  11:                ThreadObject( Self )
  12:  
  13:                ::active := .T.
  14:                ::startCount++
  15:  
  16:                IF HB_ISNUMERIC( ::startTime )
  17:                   nTime := ::startTime - Seconds()
  18:                   IF nTime < 0
  19:                      nTime += 86400
  20:                   ENDIF
  21:                   hb_idleSleep( nTime )
  22:                   ::startTime := NIL
  23:                ENDIF
  24:  
  25:                ::atStart( ... )
  26:                IF HB_ISBLOCK( ::_atStart )
  27:                   Eval( ::_atStart, ... )
  28:                ENDIF
  29:  
  30:                WHILE .T.
  31:  
  32:                   nTime := hb_MilliSeconds()
  33:  
  34:                   BEGIN SEQUENCE
  35:                      IF ! Empty( xAction ) .AND. ValType( xAction ) $ "CBS"
  36:                         ::result := Do( xAction, ... )
  37:                      ELSE
  38:                         ::result := ::execute( ... )
  39:                      ENDIF
  40:                   ALWAYS
  41:                      __QuitCancel()
  42:                   ENDSEQUENCE
  43:  
  44:                   nTime := Int( ( hb_MilliSeconds() - nTime ) / 10 )
  45:                   ::deltaTime := nTime
  46:  
  47:                   /* TODO: when ::startTime is set execution is suspended
  48:                    *       but I do not know the exact conditions and how
  49:                    *       it can be resumed
  50:                    */
  51:  
  52:                   IF ! HB_ISNUMERIC( ::interval )
  53:                      EXIT
  54:                   ENDIF
  55:  
  56:                   nTime := ::interval - ::deltaTime
  57:                   IF nTime > 0
  58:                      hb_idleSleep( nTime / 100 )
  59:                   ENDIF
  60:                   ::startCount++
  61:  
  62:                ENDDO
  63:  
  64:                ::atEnd( ... )
  65:                IF HB_ISBLOCK( ::_atEnd )
  66:                   Eval( ::_atEnd, ... )
  67:                ENDIF
  68:                ::active := .F.
  69:  
  70:                RETURN NIL
  71:             }, ... )
  72:  
  73:       ::threadID := IIF( ::pThreadID == NIL, 0, hb_threadID( ::pThreadID ) )
  74:  
  75:    ENDIF
  76:  
  77: RETURN .T.

[]s
иαldσ dj

Comentários

Postagens mais visitadas