Página 1 de 1

Tbrowse com ADO: não exibir um campo

Enviado: 16 Ago 2020 01:01
por cjp
Alguém sabe me dizer se tem como não exibir um determinado campo num Tbrowse usando ADO?

Preciso incluir esse campo no select, porque vou usá-lo para algumas funções.

Mas preciso que o campo não apareça no Tbrowse.

É possível suprimi-lo do Tbrowse? Como faço isso?

Tbrowse com ADO: não exibir um campo

Enviado: 16 Ago 2020 12:18
por JoséQuintas
O array do tbrowse contém título e conteúdo, de cada coluna que vai ser mostrada.
Está usando aquela rotina automática, que acrescenta TODOS os campos.
Altere pra rotina receber o array por parâmetro, e só criar o array se o parâmetro estiver vazio.

Apenas exemplo de como se faz isso:

Código: Selecionar todos

FUNCTION teste( p1, p2, p3 )

   IF p1 == NIL
      // rotina atual de criar o array p1
   endif

Tbrowse com ADO: não exibir um campo

Enviado: 16 Ago 2020 13:56
por cjp
Desculpe, mas não te entendi bem.

Sim, estou usando o padrão que venho usando, herdado deste post: https://pctoledo.org/forum/viewto ... se+com+ado.

Nesse post eu até já tinha questionado algo parecido, e vc respondeu
Caso não tenha percebido, o browse deste post é pra isso.
Eu não entendi e deixei pra lá na época.

Voltei a pesquisar esse post agora, e continuo não entendendo.

Entendi que o browse pode passar os campos como parâmetros e daí eu poderia tratar os campos. Mas não entendi como fazer isso.

Poderia me explicar mais detalhadamente, por favor?

Tbrowse com ADO: não exibir um campo

Enviado: 16 Ago 2020 20:22
por JoséQuintas
O array tratado no browse é um array multidimensional, tem titulo e conteúdo.

Código: Selecionar todos

aList := { ;
   { "CODIGO", { || tabela->Codigo } }, ;
   { "NOME",  { || tabela->Campo } }, ;
   { "ENDERECO", { || tabela->Endereco } } }
Se as colunas vão tratar DBF, ADO, ou Array, precisam rotinas adequadas.
O detalhe importante aqui é que trata-se de título e conteúdo.

Pra facilitar, em DBF o default é todo conteúdo do DBF.
No caso da sua rotina, que vém usando, é todo conteúdo do retorno do ADO.
Tem aí um FOR/NEXT que pega a lista de campos do ADO pra criar esse array, essa lista de títulos e conteúdos.

Então, o que precisa fazer é alterar a rotina pra poder receber a lista como parâmetro, e só criar a lista completa quando o parâmetro for vazio.
Lembrando que a lista do tbrowse usa certas conversões durante a montagem.

Eu adotei passar sempre um array desse jeito, e criar o array do tbrowse a partir daí.

Acaba tendo vantagens, porque pode criar formatações diferentes da automática.

Exemplos:

Código: Selecionar todos

aList := { ;
   { "CODIGO", { || Str( tabela->Codigo, 6 ) }, ;
   { "CODIGO", { || Transform( tabela->Codigo, "@E 999,999" ) } }, ;
   { "CODIGO", { || Str( tabela->Codigo / 1000, 7, 3 ) } }, ;
   { "NOME", { || Pad( tabela->texto, 1, 15 ) } } , ;
   { "STATUS", { || iif( tabela->Valor < 0, "NEGATIVO", "POSITIVO" ) } } }
Vai poder fazer o browse com informações formatadas diferentes do gravado, apenas parte das informações, ou até informação que nem existe na tabela original.
Isso deixa tudo bem flexível.

Tbrowse com ADO: não exibir um campo

Enviado: 16 Ago 2020 20:28
por JoséQuintas
Aproveitando e mostrando o link que indicou.

Código: Selecionar todos

 oConexao := ConexaoMySql()
 oConexao:Open()
 oTemporario := oConexao:Execute( "SELECT CODIGO, NOME, ENDERECO FROM CLIENTES ORDER BY NOME" )
 oTBrowse := { ;
   { "CODIGO", { || Pad( oTemporario:Fields( "CODIGO" ):Value, 10 ) } }, ;
   { "NOME",  { || Pad( oTemporario:Fields( "NOME" ):Value, 30 ) } }, ;
   { "ENDERECO", { || Pad( oTemporario:Fields( "ENDERECO" ):Value, 30 ) } } }
 BrowseADO( oTemporario, oTBrowse )
Tá exatamente como mostrei aqui.
A lista em OTBrowse é o que vai mostrar, não é obrigatório que seja igual ao SELECT.
Mas lógico... o que usa na lista precisa existir, no SELECT ou em algum lugar.

Código: Selecionar todos

 oConexao := ConexaoMySql()
 oConexao:Open()
 oTemporario := oConexao:Execute( "SELECT CODIGO, NOME, ENDERECO FROM CLIENTES ORDER BY NOME" )
 oTBrowse := { ;
   { "NOME",  { || Pad( oTemporario:Fields( "NOME" ):Value, 30 ) } } }
 BrowseADO( oTemporario, oTBrowse )
Pronto, agora só vai mostrar o nome, não importa que o SELECT tem mais coisas.

Tbrowse com ADO: não exibir um campo

Enviado: 17 Ago 2020 00:03
por cjp
Entendi. Muito obrigado. Resolvido.