Campo B5_DESCNFE para relatório

Preciso criar uma relatório que pega alguns campos do B1 e também do B5 mas especificamente o campo B5_DESCNFE porem como é um campo MEMO gostaria de saber como buscar a informação deste campo.

Bom dia Prezado!

Você consegue montar o relatório pegando B1 e B5 normalmente, e tratar o campo B5_DESCNFE na própria consulta.

Esse campo é do tipo MEMO no Protheus, e no banco ele costuma ser gravado como um tipo binário grande (no SQL Server, por exemplo, vem como IMAGE/VARBINARY), então, se você fizer um SELECT direto, o conteúdo não vai aparecer legível. microsigadvpl.blogspot.com

A ideia é converter o MEMO para VARCHAR na query.

Exemplo para SQL Server

Algo nesse sentido (ajuste os JOINs de acordo com a sua modelagem):

    -- Converte o MEMO (IMAGE) para texto legível
    ISNULL(
        CAST(CAST(B5.B5_DESCNFE AS VARBINARY(8000)) AS VARCHAR(8000)),

No SQL Server essa abordagem de CAST duplo (MEMO → VARBINARY → VARCHAR) é a forma padrão de exibir o conteúdo de campos MEMO em consultas. Terminal de Informação+1

Outros bancos (Oracle / PostgreSQL)

Se o ambiente não for SQL Server, a lógica é a mesma, mas muda a função de conversão:

  • Oracle: usar algo como utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(B5_DESCNFE, 4000, 1)) para transformar o LOB em texto. Epvconsulting
  • PostgreSQL: costuma-se usar convert_from(B5_DESCNFE, 'UTF8') quando o campo é gravado como bytea. Terminal de Informação

E aí você pode complementar com o que já tinha:

Para a parte de produto (campos da B1), dá pra seguir o passo a passo desta documentação:
Adicionando um campo novo a uma query já existente - TOTVS Fast Analytics - TDN

Para o campo B5_DESCNFE, por ser MEMO, é necessário fazer essa conversão na query, de acordo com o SGBD que você estiver usando (ex.: exemplo acima para SQL Server).

Agradecemos o contato.

Atenciosamente.

1 curtida