Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: JSON Schema Validation: A Comprehensive Guide

# JSON Schema Validation: A Comprehensive Guide ## Understanding JSONSchemaValidator Ensuring the integrity and compliance of JSON data is crucial for modern applications. **JSONSchemaValidator** is a powerful class designed to validate JSON data against a specified JSON Schema. It provides robust methods to check types, patterns, numerical constraints, required properties, and both internal and external schema references. This guide breaks down the key features and functionalities of JSONSchemaValidator, making it easier for developers to implement schema validation effectively. 🔗 **GitHub Repository:** [JSONSchemaValidator](https://github.com/naldodj/naldodj-hb-jsonschema-validator) --- ## Key Features ✅ **Schema-Based Validation** – Ensures JSON data conforms to a predefined schema. ✅ **Error Handling & Logging** – Captures validation errors for debugging. ✅ **Fast Mode Support** – Stops validation upon detecting the first error. ✅ **Internal & External Reference ...

BlackTDN :: Tips & Tricks ~ ADVPL : Query View & dbGoTop

gotop

Segundo o TDN a Função: DBGoTop tem o propósito de posicionar o “ponteiro” da tabela corrente em seu primeiro registro: físico e/ou lógico.

Mas, quando executada sobre uma “View”, seu propósito é diferente: DBGoTop quando executada em uma consulta “SQL” remonta-a. Então é um desperdício usar DBGoTop logo que uma “View” é retornada pela TCGenQry em dbUseArea. DbUseArea sempre garantirá o posicionamento no primeiro registro da “View” usar dbGoTop logo após o retorno forçará o sistema a tentar  uma segunda consulta ao SGBD (ainda bem que o programador do dbAcces é um cara esperto e, prevendo isso, verifica a necessidade de reprocessar ou não a consulta).

Evite, como boa prática, o uso de dbGoTop em uma “View” a não ser que seu real intento seja remontá-la.

Um exemplo prático:

   1: #include "protheus.ch"
   2: #include "topconn.ch"
   3: #include "tbiconn.ch"
   4:  
   5: User Function GoTopView()
   6:  
   7:     /*
   8:         Constante CRLF Chr(13)+Chr(10) para inline. 
   9:         Um desperdicio usa-la varias vezes. Obtenha seu valor uma unica vez 
  10:         e reutilize-o.
  11:     */    
  12:     Local cCRLF            := CRLF 
  13:  
  14:     Local cQuery        := ""
  15:  
  16:     /*
  17:         GetNextAlias() uma boa pratica para obter o proximo Alias temporario 
  18:         disponivel para uso
  19:     */    
  20:     Local cAliasVSC7    := GetNextAlias()
  21:  
  22:     Local nRegs            := 0
  23:  
  24:     RpcSetType(3)
  25:  
  26:     /*
  27:         RetSqlName necessita da Preparacao do Ambiente para consulta ao SX2    
  28:     */
  29:     PREPARE ENVIRONMENT EMPRESA "01" FILIAL "01"
  30:  
  31:         /*
  32:             PtInternal(1,cPTMsg) Informa mensagem a ser Mostrada no Monitor do appServer
  33:         */
  34:         PtInternal(1,"dbGoTop View BlackTDN Sample")
  35:     
  36:         /*
  37:             TCInternal(1,cTCMsg) Informa mensagem a ser Mostrada no Monitor do dbAccess
  38:         */
  39:         TCInternal(1,"dbGoTop View BlackTDN Sample")
  40:  
  41:         cQuery += "SELECT" + cCRLF
  42:         cQuery += "        SC7.R_E_C_N_O_ SC7RECNO" + cCRLF
  43:         cQuery += "FROM" + cCRLF
  44:         cQuery += "        " + RetSqlName("SC7") + " SC7" + cCRLF
  45:         cQuery += "WHERE" + cCRLF
  46:         cQuery += "        SC7.D_E_L_E_T_ = ' '" + cCRLF
  47:         cQuery += "AND" + cCRLF
  48:         cQuery += "        SC7.C7_FILIAL = '" + xFilial("SC7") + "'" + cCRLF
  49:         cQuery += "ORDER BY" + cCRLF
  50:         cQuery += "        SC7.C7_FILIAL"
  51:         
  52:         TCQUERY ( cQuery ) ALIAS ( cAliasVSC7 ) NEW
  53:  
  54:         /*
  55:             TcSetField informa ao dbAccess o tipo do campo 
  56:         */    
  57:         TcSetField( cAliasVSC7 , "SC7RECNO" , "N" , 15 , 0 )
  58:  
  59:         /*
  60:             Um desperdicio aqui: uma vez que dbUseArea me garantira o posicionamento
  61:             no primeiro registro da View. EVITE ISSO
  62:         */    
  63:         ( cAliasVSC7 )->( dbGoTop() ) 
  64:     
  65:         While ( cAliasVSC7 )->( !Eof() )
  66:             ++nRegs
  67:             ( cAliasVSC7 )->( dbSkip() )
  68:         End While //Tudo que vem Logo apos um END/NEXT eh considerado comentario por isso que End While
  69:     
  70:         /* Se eu precisar reprocessar a View dbGoTop garante a sua remontagem */    
  71:         ( cAliasVSC7 )->( dbGoTop() )
  72:  
  73:     RESET ENVIRONMENT
  74:  
  75: Return( nRegs )


Vamos executar o exemplo em modo “debug” e usar o dbMonitor para “rastrear” a execução da “Query” e constatar o DESPERDÍCIO de dbGoTop logo após o retorno de uma consulta.










TotvsDevStudio Debug Mode

“Pontos de Parada” em locais estratégicos no programa garantirão um melhor rastreamento.

Vamos monitorar:

a chamada a TCGenQry em TCQUERY;

a primeira chamada a dbGoTop logo após a abertura da View por dbUseArea em TCQUERY

a segunda chamada a dbGoTop logo após o processamento da “View”.

Com isso constataremos o quão dispendioso é um dbGoTop logo após o retorno de uma “View”.







TotvsDbMonitor : Conectar ServidorAbrimos o Monitor do dbAcces para “Rastrear” e “Monitorar” a execução da Query.





TotvsDevStudio/dbMonitor : Rastrear

Em nosso primeiro “Break Point” obtemos a conexão a ser “Rastreada/Monitorada”.

Observe, em comentários, a mensagem: "dbGoTop View BlackTDN Sample" enviada pela TCInternal.

TotvsDbMonitor : RastrearO rastreamento terá inicio ao selecionarmos a conexão e clicarmos no botão “Rastrear”.






TotvsDevStudio/dbMonitor : Rastrear

TotvsDbMonitor : Rastrear Ao chegar ao segundo “Break Point” poderemos verificar o retorno da primeira consulta ao SGBD efetuada pelo dbAccess.






TotvsDevStudio/dbMonitor : Rastrear

Observe uma grande sacada do dbAccess: Mesmo utilizando indiscriminadamente dbGoTop, ao constatar que a “View” esta Posicionada no Primeiro registro ele não a “Remonta”. Dessa forma o dbAccess garantirá que, mesmo o programador chamando dbGoTop desnecessariamente logo após o retorno da View, que a consulta não será reprocessada.

TotvsDbMonitor : Rastrear






TotvsDevStudio/dbMonitor : Rastrear Rastreamos o “processamento” da Tabela no Laço While.

 TotvsDbMonitor : Rastrear





TotvsDevStudio/dbMonitor : Rastrear

TotvsDbMonitor : Rastrear Observe que na próxima chamada a dbGoTop (depois do processamento dos registros da “View”) uma nova consulta é efetuada do SGBD.


 

Fica a dica: Evite chamar, desnecessariamente, dbGoTop logo após o retorno de uma consulta.


[]s
иαldσ dj

Comentários

  1. DbUseArea sempre garantirá o posicionamento no primeiro registro da “View”

    Eu sempre afirmei isso para outros programadores,
    ninguem acreditava.

    Então toma aí agora rapaziada!

    ResponderExcluir

Postar um comentário

Postagens mais visitadas