Histórico da Página
01. O QUE É UM BROWSE?
Browse é o componente que exibe uma lista de registros para a execução de ações como Incluir, Alterar, Excluir, etc, nas rotinas de cadastros.
Geralmente essas listagens são montadas considerando uma tabela, como SA1 no Cadastro de Clientes, e os campos para serem exibidos são carregados a partir do dicionário de campos, avaliando regras para exibir a coluna/campo.
02. COMO FUNCIONARÁ O OFUSCAMENTO DE COLUNAS NO BROWSE?
Os componentes tentarão associar as identificação de colunas do browse (geralmente o código dos campos) com o campos cadastrados no Dados Protegidos, quando isto acontecer com sucesso as colunas serão então ofuscadas e não terão seu conteúdo exibido.
...
Com isso o ofuscamento de dados no browse acontece utilizando esta propriedade. Para os componentes que utilizam dicionário esta marcação para o ofuscamento acontece utilizando o conteúdo das propriedades cId
ou cReadVar
, comparando com os nomes dos campos registrados nas tabelas de Dados Protegidos no momento que acontece a atribuição das colunas para o browse.
Para criar os recursos fundamentais no sistema é necessário a aplicação da lib, atualizada com label mínimo 20200214, e atualização do sistema com upddistr.
A aplicação do UPDDISTR pode acontecer com:
- pacote diferencial para upgrade para o Release 12.1.27;
- pacote específico para Dados Protegidos, nos Releases 12.1.23 e 12.1.25.
03. O QUE VAI ACONTECER QUANDO UM INICIALIZADOR DE BROWSE RETORNAR UM VALOR DE CAMPO SENSÍVEL OU PESSOAL?
Por padrão o conteúdo será apresentado. Os blocos de preenchimento de conteúdo não serão restringidos e portanto, os campos virtuais sendo exibidos no browse precisam ser cadastrados nos dicionários para Dados Protegidos ou a função de busca do conteúdo precisará ela mesma restringir o resultado deixando o conteúdo anônimo com asteriscos (*).
04. QUAIS SÃO OS COMPONENTES UTILIZADOS PARA MONTAGEM DE BROWSES?
Os componentes para construção de browses são separados em funções ou classes e divididas entre Baseada em Dicionário e Construídas Dinamicamente.
...
- FwFormBrowse e FwBrowse: também são classes, contudo a construção de browses com essas classes é dinâmica, permitindo browses de array, resultado de query, tabelas temporárias ou alias/dicionário.
05. O QUE PRECISA SER FEITO COM MBROWSE E MARKBROW PARA OFUSCAR AS COLUNAS?
Para os browses criados utilizando alias e a configuração padrão, nada precisa ser realizado, pois na construção do browse será feita a avaliação das colunas a serem ofuscadas, conforme o cadastro para Dados Protegidos.
Para os browses construídos utilizando tabela temporária "TRB", será exigida alteração para informar os nomes das colunas que precisam ser ofuscadas. Esta alteração será adicionar um array com o formato lista de campos ({“CAMPO1”,“CAMPO2”}) na chamadas da função que monta o browse.
Exemplo:
Bloco de código | ||||
---|---|---|---|---|
| ||||
aOfuscar := {"CAMPO1","CAMPO2"} |
...
MBrowse(par1, par2…. aOfuscar) |
...
MarkBrow(par1, par2…. aOfuscar) |
06. O QUE PRECISA SER FEITO COM FWMBROWSE E FWMARKBROWSE?
Estes browses possuem comportamento similar ao das funções MBrowse/MarkBrow, sendo:
...
- A construção baseada em tabela temporária, precisa da informação da lista dos campos através de método e não parâmetro (o que diferencia das funções que recebe por parâmetro).
Exemplos:
Bloco de código | ||||
---|---|---|---|---|
| ||||
oBrowse := FWMBrowse():New() |
...
oBrowse:SetAlias(cAliasTmp) |
...
oBrowse:SetTemporary(.T.) |
...
// Define os campos |
...
aAdd(aBrowse, {"Filial","FILIAL","C",006,0,"@!",,,,,,"FILIAL"}) |
...
aAdd(aBrowse, {"Numero","NUMERO","C", 006, 0, "@!",,,,,,"NUMERO"}) |
...
aAdd(aBrowse, {"Tipo","TIPO","C", 001, 0, "@!",,,,,,"TIPO"}) |
...
aAdd(aBrowse, {"Cliente","CLIENTE","C", 006, 0,"@!",,,,,,"CLIENTE"}) |
...
aAdd(aBrowse, {"Pedido Exp.","PEDEXP","C",020,0,"@!",,,,,,"PEDEXP"}) |
...
aEval := {"FILIAL", "NUMERO", "TIPO", "CLIENTE", "PEDEXP"} |
...
// Define os campos que serão ofuscados |
...
aOfuscar := FwProtectedDataUtil():UsrNoAccessFieldsInList(aEval) |
...
oBrowse:SetObfuscFields(aOfuscar) |
...
oBrowse:SetFields(aBrowse) |
...
oBrowse:Activate() |
No código de demonstração acima, a variável aBrowse é a lista de colunas para o browse, e a partir dela que são descobertas as colunas para serem ofuscadas.
A alteração na construção padrão das colunas é para informar o ID da coluna, que permite posteriormente a associação do que deve ser ofuscado.
07. O QUE PRECISA FAZER PARA FWFORMBROWSE E FWBROWSE?
Essas duas classes estão associadas com a construção personalizada das colunas e dados a serem exibidos, portanto são casos em que é exigido que aconteça a definição e informação das colunas que precisam ser ofuscadas no objeto.
...
Lista de campos para ofuscar
Bloco de código | ||||
---|---|---|---|---|
| ||||
oBrowse := FWBrowse():New() |
...
oBrowse:SetDataArray() |
...
oBrowse:SetArray(aDataArray) |
...
aEval := {"C5_NUM", "C5_CLIENTE", "C5_LOJA", "C5_DATA", "C5_PEDEXP", "C5_TIPO", "C5_CONDPG"} |
...
aOfucar:= {} //FwProtectedDataUtil():UsrNoAccessFieldsInList(aEval) |
...
aAdd( aOfucar, "C5_CLIENTE" ) |
...
aAdd( aOfucar, "C5_PEDEXP" ) |
...
aAdd( aOfucar, "C5_TIPO" ) |
...
oBrowse:SetObfuscFields(aObsFields) |
...
oBrowse:SetColumns(aColumns) |
...
oBrowse:Activate() |
Coluna marcada para ofuscar
Bloco de código | ||||
---|---|---|---|---|
| ||||
oBrowse := FWBrowse():New() |
...
. |
...
. |
...
. |
...
aOfuscar := FwProtectedDataUtil():UsrNoAccessFieldsInList(aEval) |
...
For nContFlds := 1 To Len( aFields ) |
...
nCol := Len(aColumns) |
...
lObfuscate := aScan(aOfuscar,{|x|x:cField == aFields[nContFlds]}) > 0 |
...
AAdd( aColumns, FWBrwColumn():New() ) |
...
aColumns[nCol]:SetData(&("{||(cTemp)->"+aFields[nContFlds]+"}")) |
...
aColumns[nCol]:SetData(&("{||(cTemp)->" + aFields[nContFlds]+"}")) |
...
aColumns[nCol]:SetTitle( aFields[nContFlds] ) |
...
aColumns[nCol]:SetSize( 15 ) |
...
aColumns[nCol]:SetID( aFields[nContFlds] ) |
...
aColumns[nCol]:SetObfuscateCol( lObfuscate ) |
...
Next nContFlds |
...
oBrowse:SetColumns(aColumns) |
...
oBrowse:Activate() |
Templatedocumentos |
---|
HTML |
---|
<style> div.theme-default .ia-splitter #main { margin-left: 0px; } .ia-fixed-sidebar, .ia-splitter-left { display: none; } #main { padding-left: 10px; padding-right: 10px; overflow-x: hidden; } .aui-header-primary .aui-nav, .aui-page-panel { margin-left: 0px !important; } .aui-header-primary .aui-nav { margin-left: 0px !important; } .aui-tabs.horizontal-tabs>.tabs-menu>.menu-item.active-tab a::after { background: #FF9900; !important } .menu-item.active-tab { border-bottom: none !important; } </style> |