Hoje venho trazer um artigo sobre a diferença entre PLSQuery e TCQuery.
Algumas pessoas me perguntam sobre a diferença entre PLSQuery e TCQuery, se existe alguma, se uma é mais performática que a outra, ou algo do tipo. Pois bem jovens, abaixo irei detalhar as duas e suas diferenças, mas já aviso que em questão de performance não existe praticamente diferença entre elas.
Vamos conhecer um pouco sobre cada uma, o comando TCQuery ( https://tdn.totvs.com/display/tec/Comando+TCQUERY ) , ele basicamente executa uma query diretamente no Banco de Dados, sem alterações via AdvPL.
A grande diferença de ambas, é que a PLSQuery, ela trata com ChangeQuery (https://tdn.totvs.com/display/public/PROT/ChangeQuery) na consulta passada para ela, e depois ela executa via MPSysOpenQuery (https://tdn.totvs.com/display/framework/MPSysOpenQuery). Depois percorre todos os campos do resultado, e se ela encontrar algum no dicionário (como C5_EMISSAO, A1_PRICOM, etc), ela já define o tipo com TCSetField, sem precisar fazer manualmente. Essa função foi criada para ser usada no módulo PLS (plano de saúde), com o objetivo de ganhar tempo de desenvolvimento, sem ficar precisando tratar as queries com TCSetField e ChangeQuery.
Por ser uma função de um módulo, a TOTVS trata a PLSQuery como função interna, por isso não conseguimos encontrar a documentação dela no TDN.
Em questão de uso e performance, ambas são bem similares, onde você monta uma query e executa tratando o resultado. Se você quiser economizar tempo, você pode usar a PLSQuery, pois não irá precisar tratar com TCSetField campos que existem no dicionário.
Porém, se você precisar usar o recurso NOLOCK (ou algum outro específico de determinado banco de dados), o PLSQuery não irá executar a query devido ao ChangeQuery, ele irá retornar um erro dizendo Incorrect Syntax Near.
Talvez essa seja a grande diferença entre ambas. Caso você queira testar “a grosso modo dizendo” a diferença entre elas, basta abrir o APSDU, e ir na opção Query Analyzer, então digite a seguinte query:
SELECT A1_COD, A1_NOME FROM SA1010 SA1 WITH (NOLOCK) WHERE A1_FILIAL = '' AND A1_COD <= '000100' AND SA1.D_E_L_E_T_ = ' '
Agora teste com a opção ChangeQuery marcada e desmarcada, o resultado vai ser similar ao abaixo:
Veja que no print da esquerda, onde usamos o ChangeQuery marcado, ele retornou um erro, já no da direita sem o ChangeQuery ele executou normalmente.
Bom pessoal, por hoje é só.
Abraços e até a próxima.