Um arquivo IDSV pode retornar um objeto literal com a definição ou a instância de uwl.dsv.VisualizationDef(). Essa última opção é útil para criar relatórios que precisem ser configurados programaticamente ou para criar réplicas de um mesma visualização em vários locais da árvore de processos do menu Bematech.
Por exemplo, o conteúdo do arquivo IDSV "/Admin/Segurança/Grupos Papéis e Usuários/Usuários habilitados.idsv" é:
__include('ufs:/admin/modules/Admin/Seguranca/Grupos e usuarios/Usuarios Habilitados.js');
Para criar um atalho para o mesmo relatório, em outro diretório, basta criar um outro arquivo IDSV na Virtual File System com o mesmo conteúdo.
Um arquivo IDSV declarado de forma programática deve retornar uma instância uwi.dsv.VisualizationDef ou uma classe filha, como uwi.dsv.ReportDef. Um exemplo de um relatório declarado dessa forma encontra-se no arquivo "ufs:/admin/modules/Admin/Segurança/Grupos e usuarios/Usuarios habilitados.js". Segue exemplo:
__includeOnce('ufs:/uwi/dsv/reportdef.js');
__includeOnce('ufs:/uwl/keys/classes.js');
__includeOnce('ufs:/admin/keys/datasources.js');
var def = new uwi.dsv.ReportDef();
def.dataSourceQuery = {
dataSource: admin.keys.DataSources.ENABLED_USERS,
filters: [
{name: "xValidity_START"},
{name: "xValidity_END"}
],
columns: [
{name: "U_iKey"},
{name: "U_iName"},
{name: "U_iFullName"},
{name: "U_iClass.NOME"},
{name: "U_iStatus.iName"},
{name: "U_iBegin"},
{name: "U_iEnd"}
]
};
def.filters = [
{name: "xValidity_START", label: "Data inicial", required: true},
{name: "xValidity_END", label: "Data final", required: true}
];
def.columns = [
{name: "U_iClass.NOME", label: "Classe", useToGroup: true},
{name: "U_iName", label: "Nome do usuário"},
{name: "U_iFullName", label: "Nome completo do usuário"},
{name: "U_iStatus.iName", label: 'Estado atual do usuário'},
{name: "U_iBegin", label: "Início"},
{name: "U_iEnd", label: "Fim", simpleLayoutAggregate: "count"}
];
var notes = '<b>Estados dos usuários:</b><br>';
var userStatutes = classes.getCachedDataSet(uwl.keys.Classes.USER_STATUSES);
userStatutes.indexFieldNames = 'iCode';
for (userStatutes.first(); !userStatutes.eof; userStatutes.next()) {
notes += ' - <b>' + userStatutes.icode + '</b>: ' +
userStatutes.idescription + '<br>';
}
notes += '<br><b>Importante</b>: um usuário será considerado habilitado por ' +
'este relatório se a conta dele estiver vigente em pelo menos um dia ' +
'do período analisado. O estado do usuário não é levado em ' +
'consideração nessa classificação.';
def.footer.complement = notes;
var r = def;