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 :: Validando Expressões Regulares em ADVPL usando PowerShell

Em BlackTDN :: Expressões Regulares ~ RegExp via Ezzy Learning Validation vimos como validar Expressões Regulares usando uma aplicação WEB através de Socket, HTTPGet e Post.
 
Neste novo exemplo, veremos a validação através do Windows® PowerShell®.
powershell Para que o "script" possa ser executado faz-se necessário autoriza-lo através do Windows® PowerShell® , sendo assim, execute o Windows® PowerShell® e digite o seguinte comando: get-help about_signing. Esse comando irá listar as opções de "Diretivas de Assinatura e de Execução" de "Script", leia-as atentamente. Mas se quiser pular esse passo (eu não recomendo)digite o seguinte comando no Windows® PowerShell® : Set-ExecutionPolicy Unrestricted. Esse comando fará que qualquer "Script" seja executado em sua máquina (mas atente para os ítens de segurança listados à partir do comando get-help about_signing).
 
Segue o Fragmento do código que faz a validação:
/*/
    Funcao: PSRegEx
    Autor:  Marinaldo de Jesus
    Data:   03/04/2012
    Uso:    Exemplo de Uso de RegExp via PowerShell
/*/
Static Function PSRegEx( cString , cPattern )
    Local cMatch            := ""
    Local cPSScript         := ""
    Local cPSOutPath        := GetTempPath()
    Local cPSOutFile        := CriaTrab(NIL,.F.)
    Local cPSOutPathFile    := ( cPSOutPath + cPSOutFile+".ini" )
    Local cPSFileScript        := cPSOutFile
    Local cPSScriptPathFile    := ( cPSOutPath + cPSFileScript+".ps1" )
    Local oTFIni
    Local lMatch            := .F.
    BEGIN SEQUENCE
        While File( cPSOutPathFile ) .or. File( cPSScriptPathFile )
            cPSOutFile          := CriaTrab(NIL,.F.)
            cPSOutPathFile        := ( cPSOutPath + cPSOutFile+".ini" )
            cPSFileScript        := cPSOutFile
            cPSScriptPathFile    := ( cPSOutPath + cPSFileScript+".ps1" )
        End While
        cPSScript += '"'
        cPSScript += '[PS_REGEX]'
        cPSScript += '`r`n'
        cPSScript += 'match='
        cPSScript += '"'
        cPSScript += '+'
        cPSScript += '([regex]::ismatch("'+cString+'","'+cPattern+'")).ToString()
        cPSScript += ' | '
        cPSScript += 'Out-File -Encoding "ASCII" "' + cPSOutPathFile + '"'
        MemoWrite( cPSScriptPathFile , cPSScript )
        IF !File( cPSScriptPathFile )
            BREAK
        EndIF
        WaitRun( "POWERSHELL " + cPSScriptPathFile  )
        IF !File( cPSOutPathFile )
            BREAK
        EndIF
        oTFIni    := TFINI():New( cPSOutPathFile )
        cMatch    := oTFIni:GetPropertyValue("PS_REGEX","match")
        DEFAULT cMatch := "FALSE"
        cMatch    := Upper( cMatch )
        lMatch    := ( cMatch == "TRUE" )
        oTFIni    := FreeObj( oTFIni )
    END SEQUENCE
    IF File( cPSScriptPathFile )
        fErase( cPSScriptPathFile )
    EndIF
    IF File( cPSOutPathFile )
        fErase( cPSOutPathFile )
    EndIF
Return( lMatch )
 
Usei a Classe TFIni para Carregar informações salvas pelo Windows® PowerShell® e, em função disso, as dependências para a execução dos testes aumentaram.
 
Com esse novo exemplo teremos as seguintes saídas no Console do Protheus Server:

RegExp: [SoapRegExp][1.1][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [SoapRegExp][1.2][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [HttpGetRegExp][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [HttpPostRegExp][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [PSRegEx][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]

RegExp: [SoapRegExp][1.1][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [SoapRegExp][1.2][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [HttpGetRegExp][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [HttpPostRegExp][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [PSRegEx][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]

RegExp: [SoapRegExp][1.1][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpGetRegExp][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpPostRegExp][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [PSRegEx][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpGetRegExp][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpPostRegExp][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [PSRegEx][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [SoapRegExp][1.2][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [HttpGetRegExp][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [HttpPostRegExp][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [PSRegEx][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]

RegExp: [SoapRegExp][1.1][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpGetRegExp][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpPostRegExp][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [PSRegEx][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpGetRegExp][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpPostRegExp][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [PSRegEx][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpGetRegExp][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpPostRegExp][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [PSRegEx][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [SoapRegExp][1.2][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [HttpGetRegExp][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [HttpPostRegExp][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [PSRegEx][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]

RegExp: [SoapRegExp][1.1][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [SoapRegExp][1.2][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [HttpGetRegExp][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [HttpPostRegExp][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [PSRegEx][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]

 
Para obter a nova versão do Programa de teste, agora com validação de RegEx via Windows® PowerShell® clique aqui.
 
Para consultar o código, clique aqui.
 
Obs.:
 
1) No exemplo Utilizei WaitRun, logo a validação se dará no Client. Para que a validação ocorra no server consulte:

2) Leia “Password Strength Validation with Regular Expressions” para entender como validar senhas com expressões complexas.

[]s
иαldσ dj

Comentários

  1. Opa obrigado naldo... farei meus testes... eu quase nao uso power shell em meu cotidiano, mas essa solução me pareceu muito mais interessante do que acessar um webservice externo.... o jeito é treinar...

    Israel Neves.

    ResponderExcluir
  2. Israel,

    Obviamente que são soluções paliativas. Dada a minha criatividade poderia implementa-las de n formas.
    Considerando que a Totvs usa a biblioteca QT da Nokia para desenvolver o Client a implementação de RegEx seria muito fácil se ela exportasse a classe QRegExp (http://qt-project.org/doc/qt-4.8/QRegExp.html) do QT para uso no Protheus.

    ResponderExcluir
  3. Parabéns!

    taí um bom site para testar suas criações..

    http://myregexp.com/signedJar.html

    ResponderExcluir

Postar um comentário

Postagens mais visitadas