No artigo de hoje, vou falar um pouco sobre duas variáveis famosas em grids no Protheus, o aHeader e o aCols.
Se você já desenvolveu pontos de entrada, ou já trabalhou com grids no Protheus no modelo tradicional (sem ser em MVC), já deve ter se deparado com essa dupla dinâmica, aHeader e aCols.
Sem essas duas variáveis, a grid não irá funcionar corretamente, sendo que as duas são fundamentais para a montagem da estrutura do objeto.
Então abaixo iremos ver um pouco mais sobre essas variáveis.
aHeader:
O aHeader é um array multidimensional, que armazena as definições e configurações das colunas, vinculando ou não a campos do dicionário.
Dessa forma, cada linha desse array, possui configurações como:
- Título da Coluna
- Tamanho da coluna em caracteres (e se for numérico, tamanho de decimais)
- Máscara da coluna (por exemplo: @!, !E 999.99, etc)
- Validação da coluna
- Entre outros
Existem algumas funções de apoio, como GDFieldPos, que procura a posição da coluna no aHeader. Uma outra forma de buscar também, é utilizar um aScan da posição 2 que é o nome do campo, por exemplo:
nPosUM := aScan(aHeader, {|x| AllTrim(Upper(x[2])) == "D1_UM" })
Na linha acima, estamos percorrendo o aHeader, e quando a posição 2 for igual a D1_UM, irá armazenar na variável nPosUM.
aCols:
Já o aCols, é o array com o conteúdo que foi inserido pelo usuário ou que já foi gravado no Banco de Dados.
A composição dele é de linhas e colunas. Sendo que as linhas são quando o usuário aperta para baixo e preenche as informações (ai será criado uma linha no aCols).
E as colunas são feitas conforme o tamanho do aHeader. Por exemplo, se o aHeader tem 2 campos parametrizados, como código e nome. Cada linha no aCols terá essas duas colunas de código e nome, e uma coluna que fica invisível na tela, que define se a linha está excluída ou não (com .T. ou com .F.).
Resumindo e Exemplos:
aHeader -> é um array com as definições dos campos que serão usadas na grid, por exemplo, o campo de produto será o C7_PRODUTO do tipo caractere, o item será o C7_ITEM do tipo caractere, o valor total será o C7_TOTAL do tipo numérico com a máscara @E 999,999.99.
aCols -> são as linhas da grid, sendo que cada coluna é referente a um campo que foi criado no aHeader.
Então supondo que, o aHeader[2] for referente ao C7_PRODUTO, se você pegar o aCols[7][2], você está pegando a linha 7 da grid, na coluna 2 que é o campo de produto.
Esse tema foi uma sugestão do internauta Marcelo Silva.
Bom pessoal, por hoje é só.
Abraços e até a próxima.
ahhh…se tivesse um post desse quando comecei com o protheus lá em 2010, precisei fazer um ponto de entrada na tela de pedido de venda, para preencher a grid de itens do pedido de venda, até entender esse aheader e acols, foi uma luta..varias noites sem dormir, muito boa a explicação dan.
Grande Will, tudo joia?
Obrigado pelo comentário e feedback jovem.
Grande abraço.
Muito bom parabéns pelo conhecimento, caso eu for imprimir o conteúdo dentro do aheader e acols você iria inserir mais uma linha de código ali ?
Bom dia Edson, tudo joia?
Você poderia sim adicionar outras linhas para manipular o aCols. Segue dois vídeos de exemplo:
Preencher aCols de uma tela padrão: https://terminaldeinformacao.com/2023/03/20/preencher-o-acols-de-uma-tela-padrao-ti-responde-048/
Exemplo das funções GDFieldPos, GDFieldGet, GDFieldPut, GDDeleted e GetDRefresh – https://terminaldeinformacao.com/2024/02/28/usando-as-gddeleted-gdfieldget-gdfieldpos-gdfieldput-e-getdrefresh-maratona-advpl-e-tl-262/
Um grande abraço.