Fiz uma query em AdvPL mas não veio alguns campos, o que pode ser?

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:

Exemplo de execução da query no SQL

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:

Veio apenas 4 campos

 

Então vamos ver como que esta a estrutura da tabela no banco de dados:

Estrutura da tabela com 5 campos no SQL

 

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:

Exemplo com todos os 5 campos após fazer a tratativa

 

Referências:

 

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Súlivan Simões disse:

    Isso que é uma análise bem feita. Mostrando que programação não é só escrever código.
    Parabéns!!

Deixe uma resposta

Terminal de Informação