Qual a diferença entre TCQuery e PLSQuery?

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, 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:

Na esquerda com ChangeQuery e na direita sem ChangeQuery

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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta