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 :: PowerShell TotvsRestart.ps1

#Script Name TotvsRestart.ps1

#Force Stop/Start
(get-service|where{$_.status -eq "running" -and $_.Name.ToLower().Contains("totvs")}|%{(Stop-Service -force -name $_.Name);Start-Service -Name $_.Name})

#Force Start
(get-service|where{$_.status -ne "running" -and $_.Name.ToLower().Contains("totvs")}|%{(Stop-Service  - force -name $_.Name);Start-Service -Name $_.Name})

Comentários

  1. Naldo parabéns pelo blog, queria te mandar um e-mail não encontrei em nenhum lugar.
    Quero tirar uma dúvida que não tem a ver com esse post, é a seguinte:
    Qual a diferença em usar a função ASCAN do advpl ou procurar o que eu quero utilizando laço FOR?
    Essa função tem alguma mágica, é mais rápida?

    ResponderExcluir
    Respostas
    1. Jackson,

      Nas aulas que ministro costumo mostrar, usando AdvPL, uma simulação do funcionamento das funções aEval e aSort... Vou montar um exemplo da aScan e publicar.

      Mas uma afirmativa é certa: Utilize aScan, vai rodar em C++, no server, muito mais rápida do que um laço For/Next.

      Como exemplo:


      #include "rwmake.ch"
      #include "protheus.ch"
      #xtranslate MsgOut([]) => (ConOut([]),MsgBox([]))
      //-----------------------------------------------------------------------------
      //BlackTDN :: Simulando aSort e aEval
      //-----------------------------------------------------------------------------
      User Function aOrdena()

      Local aArray := {10,9,7,4,3,2,5,6,78,89,0,43,2,4,65}
      Local aCopy := aClone(aArray)
      Local cMsg := ""
      Local cCRLF := CRLF

      //-----------------------------------------------------------------------------
      //Usando a funcao padrao
      //-----------------------------------------------------------------------------

      //-----------------------------------------------------------------------------
      //Função aEval() : http://tdn.totvs.com/display/tec/AEVal
      //-----------------------------------------------------------------------------
      aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
      MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Não Ordenado"),"INFO")
      cMsg := ""

      //-----------------------------------------------------------------------------
      //Função aSort() : http://tdn.totvs.com/pages/viewpage.action?pageId=23889126
      //-----------------------------------------------------------------------------
      aSort(aArray,NIL,NIL,{|nMenor,nMaior|nMenornMaior})
      aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
      MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Ordem Decrescente"),"INFO")
      cMsg := ""

      //-----------------------------------------------------------------------------
      //Usando a funcao customizada
      //-----------------------------------------------------------------------------

      aSize(aArray,0)
      __aEval(aCopy,{|e|aAdd(aArray,e)})

      __aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
      MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Não Ordenado"),"INFO")
      cMsg := ""

      __aSort(aArray,NIL,NIL,{|nMenor,nMaior|nMenornMaior})
      __aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
      MsgOut(cMsg,OemToAnsi("__aEval|__aSort Customizadas : Resultado Ordem Decrescente"),"INFO")
      cMsg := ""

      Return(NIL)

      //-----------------------------------------------------------------------------
      //Simulando aSort padrao
      //-----------------------------------------------------------------------------
      Static Function __aSort(aArray,nStart,nCount,bEval)

      Local nD
      Local nJ

      Local uTmp

      DEFAULT nStart := 1
      DEFAULT nCount := Len( aArray )

      For nD := nStart To nCount
      For nJ := nD To nCount
      IF Eval(bEval,aArray[nJ],aArray[nD])
      uTmp := aArray[nD]
      aArray[nD] := aArray[nJ]
      aArray[nJ] := uTmp
      EndIF
      Next nJ
      Next nI

      Return(aArray)

      //-----------------------------------------------------------------------------
      //Simulando aEval padrao
      //-----------------------------------------------------------------------------
      Static Function __aEval(aArray,bEval,nStart,nCount)

      Local nD
      Local nJ

      DEFAULT nStart := 1
      DEFAULT nCount := Len(aArray)

      nJ := nCount
      For nD := nStart To nJ
      //Função Eval() :: http://tdn.totvs.com.br/pages/viewpage.action?pageId=24346635
      Eval(bEval,aArray[nD],nD)
      Next nD

      Return(aArray)

      Excluir
  2. Beleza Naldo obrigado!
    Você poderia montar um post com dicas sobre essas funções que são mais rápidas hein.. hehe
    Valeu abs!

    ResponderExcluir

Postar um comentário

Postagens mais visitadas