No artigo de hoje, vamos ver o que pode ocasionar quando uma query em AdvPL não traz alguns campos.
Recentemente estava conversando com um amigo, e ele me passou uma situação em que algumas colunas não estavam aparecendo no resultado da query de uma tabela fora da estrutura do Protheus.
Fizemos diversos testes (TCQuery, PLSQuery, TCGenQry, entre outros), e chegamos num resultado, que nesse artigo pode ajudar outros analistas caso passem pelo mesmo.
O primeiro passo, é executar a query nativa no SQL e ver o resultado, conforme abaixo:
Agora que sabemos que tem dados, vamos reproduzir o cenário em AdvPL, aqui vamos utilizar o TCQuery, conforme exemplo abaixo:
//Bibliotecas #Include "TOTVS.ch" #Include "TopConn.ch" /*/{Protheus.doc} User Function zTestar Função de teste @type Function @author Atilio @since 20/06/2023 /*/ User Function zTestar() Local aArea := FWGetArea() Local cQuery := "" //Efetua a busca das informações cQuery := " SELECT " + CRLF cQuery += " CODIGO, " + CRLF cQuery += " NOME, " + CRLF cQuery += " APELIDO, " + CRLF cQuery += " DATA_HORA, " + CRLF cQuery += " OBSERVACAO " + CRLF cQuery += " FROM TAB_TESTE " + CRLF TCQuery cQuery New Alias "QRY_TST" //Se houver dados If ! QRY_TST->(EoF()) FWAlertInfo("Há dados!", "Atenção") EndIf QRY_TST->(DbCloseArea()) FWRestArea(aArea) Return
Porém, notem se formos ver o DbStruct dessa query, ou se formos ver os dados dela, o campo “NOME” não veio:
Então vamos ver como que esta a estrutura da tabela no banco de dados:
O que houve então, é que alguns campos, podem não ter compatibilidade com a interpretação do DbAccess, nesse caso aqui o campo NOME tem o tamanho máximo (VARCHAR MAX ou VARCHAR de -1). Então como podemos tratar essa situação?
Temos que ou fazer uma conversão (por exemplo se for de tipos diferentes como NCHAR) e limitar a quantidade de dados (que até o momento desse artigo é um pouco mais de 8000 bytes). Abaixo como ficou o exemplo em AdvPL:
//Bibliotecas #Include "TOTVS.ch" #Include "TopConn.ch" /*/{Protheus.doc} User Function zTestar Função de teste @type Function @author Atilio @since 20/06/2023 /*/ User Function zTestar() Local aArea := FWGetArea() Local cQuery := "" //Efetua a busca das informações cQuery := " SELECT " + CRLF cQuery += " CODIGO, " + CRLF cQuery += " CAST(NOME AS VARCHAR(1024)) AS NOME, " + CRLF cQuery += " APELIDO, " + CRLF cQuery += " DATA_HORA, " + CRLF cQuery += " OBSERVACAO " + CRLF cQuery += " FROM TAB_TESTE " + CRLF TCQuery cQuery New Alias "QRY_TST" //Se houver dados If ! QRY_TST->(EoF()) FWAlertInfo("Há dados!", "Atenção") EndIf QRY_TST->(DbCloseArea()) FWRestArea(aArea) Return
Vocês perceberam que usamos o CAST e delimitamos para que seja no máximo 1024 bytes né. Agora vejam, a coluna começou a aparecer:
Referências:
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Isso que é uma análise bem feita. Mostrando que programação não é só escrever código.
Parabéns!!
Bom dia Mano Súlivan, tudo joia?
Opa, obrigado pelo comentário, é muita generosidade sua.
Tenha uma ótima e abençoada quinta feira.
Um grande abraço.