Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: SQL e a Teoria de Conjuntos

_Créditos das imagens: Grok ### 🚀 Você sabia? SQL e a Teoria de Conjuntos estão mais conectados do que imagina! A linguagem SQL (Structured Query Language) tem suas raízes na teoria de conjuntos, um conceito matemático que trata de coleções de objetos. Em bancos de dados relacionais, cada tabela é um conjunto de linhas (ou tuplas), e operações como SELECT, JOIN, UNION e INTERSECT são inspiradas em operações como união (∪), interseção (∩) e diferença (-). Vamos explorar como isso funciona? 👇 --- ### 🔍 Principais Operações de Conjuntos no SQL Imagine duas tabelas simples: Clientes (Conjunto A): ``` +----+-------+ | ID | Nome | +----+-------+ | 1 | Ana | | 2 | João | | 3 | Maria | +----+-------+ ``` Pedidos (Conjunto B): ``` +----+-----------+ | ID | Cliente_ID| +----+-----------+ | 1 | 1 | | 2 | 2 | | 3 | 1 | +----+-----------+ ``` #### 1. União (UNION) - O que faz: Junta tudo de A e B, sem duplicatas (A ∪ B). - Exemplo: ```sql SELECT id FROM cli...

BlackTDN :: FINC040 : Filtrando a mBrowse

 

Perguntaram-me: é possível filtrar uma mBrowse que “não suporta personalização de filtro”. Ex.: a mBrowse do programa FINC040?

Respondi: Tudo é possível, depende do quanto esteja disposto a pagar (rs). Mas, sim, é possível desde que entenda o funcionamento do sistema.

Disse-lhe: Se a mBrowse não aceita filtro, mas a rotina permite um “desvio” utilize o “desvio” para implementar a sua própria mBrowse com filtro.

Ex.:

//--------------------------------------------------------------------------------------------------------
#include "totvs.ch"
//--------------------------------------------------------------------------------------------------------
    /*
        Programa:uFinc040x
        Função:U_Finc040x
        Autor:Marinaldo de Jesus (http://blacktdn.com.br)
        Data:11/08/2016
        Descrição:Implementar "Filtro de Browse" customizado para a rotina FINC040
        Uso:Chamada a partir do Menu
*/   
//--------------------------------------------------------------------------------------------------------
User Function Finc040x(nPosArotina)
    local cFunName
    if .not.(IsInCallStack("FINC040"))
        cFunName:=SetFunName("FINC040")
        begin sequence
            Finc040(nPosArotina)
        end sequence
        SetFunName(cFunName)
    endif
return

//--------------------------------------------------------------------------------------------------------
    /*
        Programa:uFinc040x
        Função:U_FC040FIL
        Autor:Marinaldo de Jesus (http://blacktdn.com.br)
        Data:11/08/2016
        Descrição:PE executado antes da chamada da mBrowse padrão.
        Uso:Implementação do PE FC040FIL para mBrowse com FiltroImplementação do PE FC040FIL
*/   
//--------------------------------------------------------------------------------------------------------
User Function FC040FIL()
    local cExprFilTop
    local lA1XCOLLEC
    if (IsInCallStack("U_FINC040X"))
        cExprFilTop:="EXISTS"
        cExprFilTop+=" "
        cExprFilTop+="("
        cExprFilTop+=       "SELECT DISTINCT 1 FROM"
        cExprFilTop+=" "
        cExprFilTop+=           RetSQLName("SA1")
        cExprFilTop+=" "
        cExprFilTop+=           "SA1"
        cExprFilTop+=" "
        cExprFilTop+=       "WHERE"
        cExprFilTop+=" "
        cExprFilTop+=           "SA1.A1_COD=E1_CLIENTE"
        cExprFilTop+=" "
        cExprFilTop+=           "AND"
        cExprFilTop+=" "
        cExprFilTop+=           "SA1.A1_LOJA=E1_LOJA"
        lA1XCOLLEC:=SA1->(FieldPos("A1_XCOLLEC")>0)
        if (lA1XCOLLEC)
            cExprFilTop+=" "
            cExprFilTop+=       "AND"
            cExprFilTop+=" "
            cExprFilTop+=       "A1_XCOLLEC='"+cCodUser+"'"
        endif
        cExprFilTop+=" "
        cExprFilTop+=           "AND"
        cExprFilTop+=" "
        cExprFilTop+=           "SA1.D_E_L_E_T_=' '"
        cExprFilTop+=")"  
        mBrowse(6,1,22,75,"SE1",NIL,NIL,NIL,NIL,NIL,Fa040Legenda("SE1"),NIL,NIL,NIL,NIL,NIL,NIL,NIL,cExprFilTop)
        break
    endif
return
//--------------------------------------------------------------------------------------------------------

E com essa solução perco a funcionalidade padrão? Não. Manterá toda a compatibilidade do código antes da chamada do PE e posterior a ela. Único inconveniente é ter que incluir a opção no Menu.

E tem como contornar esse inconveniente? Sim. Mas não garanto o “salto” de BREAK (rs). No modelo acima, o “salto” de BREAK está controlado. Já no exemplo abaixo…. talvez vá para o “limbo”

Ex.:

//--------------------------------------------------------------------------------------------------------
#include "totvs.ch"
//--------------------------------------------------------------------------------------------------------
    /*
        Programa:uFinc040x
        Função:U_FC040FIL
        Autor:Marinaldo de Jesus (http://blacktdn.com.br)
        Data:11/08/2016
        Descrição:PE executado antes da chamada da mBrowse padrão.
        Uso:Implementação do PE FC040FIL para mBrowse com Filtro
*/   
//--------------------------------------------------------------------------------------------------------
User Function FC040FIL()
    local cExprFilTop
    local lA1XCOLLEC
    cExprFilTop:="EXISTS"
    cExprFilTop+=" "
    cExprFilTop+="("
    cExprFilTop+=       "SELECT DISTINCT 1 FROM"
    cExprFilTop+=" "
    cExprFilTop+=           RetSQLName("SA1")
    cExprFilTop+=" "
    cExprFilTop+=           "SA1"
    cExprFilTop+=" "
    cExprFilTop+=       "WHERE"
    cExprFilTop+=" "
    cExprFilTop+=           "SA1.A1_COD=E1_CLIENTE"
    cExprFilTop+=" "
    cExprFilTop+=           "AND"
    cExprFilTop+=" "
    cExprFilTop+=           "SA1.A1_LOJA=E1_LOJA"
    lA1XCOLLEC:=SA1->(FieldPos("A1_XCOLLEC")>0)
    if (lA1XCOLLEC)
        cExprFilTop+=" "
        cExprFilTop+=       "AND"
        cExprFilTop+=" "
        cExprFilTop+=       "A1_XCOLLEC='"+cCodUser+"'"
    endif
    cExprFilTop+=" "
    cExprFilTop+=           "AND"
    cExprFilTop+=" "
    cExprFilTop+=           "SA1.D_E_L_E_T_=' '"
    cExprFilTop+=")"  
    mBrowse(6,1,22,75,"SE1",NIL,NIL,NIL,NIL,NIL,Fa040Legenda("SE1"),NIL,NIL,NIL,NIL,NIL,NIL,NIL,cExprFilTop)
    break
return
//--------------------------------------------------------------------------------------------------------

E porque isso funciona? Aí é uma outra história…

[]s
иαldσ dj

#pirateandoConhecimentoComVocê

Comentários

Postar um comentário

Postagens mais visitadas