Histórico da Página
CONTEÚDO
- Cadastrando um novo Monitor exclusivo
- Criando uma nova Api de negócio
- Implementando procedure de modo Gráfico
- Implementando procedure de modo Detalhe
01. CADASTRANDO UM NOVO MONITOR EXCLUSIVO
Primeiro O primeiro passo para criar o seu Monitor Exclusivo é acessar no menu do ERP Datasul o programa Gestão à Vista - Monitores ÚnicosExclusivos (ou pelo código html.supply.Monitor.Custom).
Acessando o programa Nesta rotina é possível visualizar os monitores Exclusivos já cadastrado cadastrados e /ou realizar o cadastro de um novo monitor:
...
Informações | ||
---|---|---|
| ||
Pode-se notar que indicamos como nossa Api de Negócio o programa cpp/exclusivo/statusOrdem.p. Esse programa ainda não existe (iremos construí-lo em breve), porém precisamos informar seu futuro caminho no momento da criação do monitor. Se porventura o nome da API for alterado ou ela seja movida para um novo diretório, não se preocupe com isso agora, iremos construir esse .p nos passos adianteesqueça de atualizar esse cadastro com o novo caminho/nome. |
No nosso exemplo, iremos cadastrar apenas dois filtros, Estabelecimento e Desde quando (que irá representar o número de dias no passado que iremos buscar as ordens de produção de acordo com a sua data de criação).
...
Nota | ||
---|---|---|
| ||
Note que os filtros possuem como código de propriedade os valores cod-estabel e qtd-dias-atras respectivamente, isso será importante para o momento em que criaremos a Api de negócio. |
02. CRIANDO UMA NOVA API DE NEGÓCIO
Para criar a Api de negócio o primeiro passo é realizar a importação de classes do Progress que permitem a utilização de objetos do tipo JSON, além disso também é importante definir as includes disponibilizadas pelo Gestão à Vistaimportante definir as includes disponibilizadas pelo Gestão à Vista.
Além da importação dos objetos Progress e definição de includes, também sugerimos criar uma função para verificar se existem RowErrors, essa função será útil para reaproveitamento de código posteriormente.
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
BLOCK-LEVEL ON ERROR UNDO, THROW. USING PROGRESS.json.*. USING PROGRESS.json.ObjectModel.*. USING cdp.services.gestaoavista.*. //A classe ChartBuilder está definida aqui. {method/dbotterr.i} {cdp/services/gestaoavista/builder-utils.i} {cdp/services/gestaoavista/monitor-utils.i} FUNCTION fn-has-row-errors RETURNS LOGICAL (): FOR EACH RowErrors WHERE UPPER(RowErrors.ErrorType) = 'INTERNAL':U: DELETE RowErrors. END. RETURN CAN-FIND(FIRST RowErrors WHERE UPPER(RowErrors.ErrorSubType) = 'ERROR':U). END FUNCTION. |
Além da importação dos objetos Progress e definição de includes, também sugerimos criar uma função para verificar se existem RowErrors, essa função será útil para reaproveitamento de código posteriormente.
Após essa etapa, será necessário definir as procedures de acordo com a forma que o seu monitor exclusivo foi cadastrado, por exemplo:
Monitores do tipo gráfico, devem implementar a procedure pi-get-monitor-data-chart.
Monitores do tipo texto, devem implementar a procedure pi-get-monitor-data-info.
Ambos os tipos de monitores suportam o modo de detalhe das informações através da procedure pi-get-monitor-detail.
Informações | ||
---|---|---|
| ||
Neste guia vamos considerar dar continuidade com a construção de um monitor do tipo Gráfico com modo Detalhe. |
02.
...
a. IMPLEMENTANDO A PROCEDURE DE MODO GRÁFICO
No bloco de código abaixo, iremos criar a procedure pi-get-monitor-data-chart (maiores detalhes sobre ela podem ser consultados aqui), para o nosso exemplo neste guia, iremos realizar uma query dinâmica na tabela ord-prod para realizar a contagem de Ordens x Situação aplicando os filtros de estabelecimento e desde quando que é calculado em número de dias retroativos a hoje.
...
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
PROCEDURE pi-get-monitor-data-chart: DEFINE INPUT PARAMETER TABLE FOR ttVisaoMonitor. DEFINE OUTPUT PARAMETER monitorJsonOutput AS JsonObject. DEFINE OUTPUT PARAMETER TABLE FOR RowErrors. DEFINE VARIABLE cFiltroEstab AS CHARACTER NO-UNDO. DEFINE VARIABLE dFiltroData AS DATE NO-UNDO. DEFINE VARIABLE iStatusAberto AS INTEGER NO-UNDO. DEFINE VARIABLE iStatusAndamento AS INTEGER NO-UNDO. DEFINE VARIABLE iStatusEncerrado AS INTEGER NO-UNDO. DEFINE VARIABLE ChartBuilder AS ChartBuilder NO-UNDO. // Classe utilitária que ajudará na montagem do gráfico FIND FIRST ttVisaoMonitor. EMPTY TEMP-TABLE RowErrors. fn-validate-properties(). // Método interno que valida automaticamente se todos os filtros marcados como obrigatórios foram preenchidos. IF fn-has-row-errors() THEN RETURN "NOK":U. /* Instanciar a classe passando como parâmetro a ttVisaoMonitor, que contém as informações do monitor e visão que estão sendo processados nesse instante */ ChartBuilder = NEW ChartBuilder(INPUT TABLE ttVisaoMonitor). /** Pega os valores que o usuário digitou nos filtros do monitor. O valor é sempre gravado como STRING, portanto deve-se fazer a conversão dos dados caso exista necessidade. Importante: Os valores passados como parâmetro devem ser os mesmos informados no campo "Propriedade" no cadastro de cada filtro **/ ASSIGN cFiltroEstab = fn-get-valor-propriedade(INPUT "cod-estabel") dFiltroData = TODAY - INTEGER(fn-get-valor-propriedade(INPUT "qtd-dias-atras")). FOR EACH ord-prod NO-LOCK WHERE ord-prod.cod-estabel >= cFiltroEstab AND ord-prod.dt-emissao >= dFiltroData: IF ord-prod.estado < 3 THEN ASSIGN iStatusAberto = iStatusAberto + 1. ELSE IF ord-prod.estado <= 6 THEN ASSIGN iStatusAndamento = iStatusAndamento + 1. ELSE ASSIGN iStatusEncerrado = iStatusEncerrado + 1. END. CREATE ttSeries. ASSIGN ttSeries.titulo = "Pendentes" ttSeries.valor = STRING(iStatusAberto) ttSeries.cor = "#A0B9BF". CREATE ttSeries. ASSIGN ttSeries.titulo = "Em Andamento" ttSeries.valor = STRING(iStatusAndamento) ttSeries.cor = "#007acc". CREATE ttSeries. ASSIGN ttSeries.titulo = "Concluídas" ttSeries.valor = STRING(iStatusEncerrado) ttSeries.cor = "#26BA41". CREATE ttTags. ASSIGN ttTags.valor = "Tag de Exemplo" ttTags.icone = "po-icon-calendar" ttTags.cor-texto = "#f5f5f5" ttTags.cor-tag = "#080707". CREATE ttTags. ASSIGN ttTags.valor = "Tag de Exemplo 2" ttTags.icone = "po-icon-manufacture" ttTags.cor-texto = "#f5f5f5" ttTags.cor-tag = "#080707". /* Depois que todas as entidades estão criadas, basta setá-las no objeto ChartBuilder */ ChartBuilder:setTags(INPUT TABLE ttTags). ChartBuilder:setSeries(INPUT TABLE ttSeries). /* Chama o método para criar e devolver o gráfico completo e guarda o resultado na variável monitorJsonOutput */ monitorJsonOutput = ChartBuilder:createChart(). DELETE OBJECT ChartBuilder. /* Exibe o resultado no Log do AppServer, se estiver ativo */ RUN displayJsonObject(monitorJsonOutput). CATCH eSysError AS Progress.Lang.Error: CREATE RowErrors. ASSIGN RowErrors.ErrorNumber = 17006 RowErrors.ErrorDescription = eSysError:getMessage(1) RowErrors.ErrorSubType = "ERROR". END. FINALLY: IF fn-has-row-errors() THEN DO: UNDO, RETURN 'NOK':U. END. END FINALLY. END. |
Após a inclusão dessa procedure na api, já é possível adicionar esse monitor exclusivo em uma Visão e observar o resultado espero conforme abaixo:
...
Exemplos de outros tipos de gráficos podem ser consultados em: Exemplos adicionais de monitores.
02.
...
b. IMPLEMENTANDO A PROCEDURE DE MODO DETALHE
No bloco de código abaixo, iremos criar a procedure pi-get-monitor-data-detail (maiores detalhes sobre ela podem ser consultados aqui), através da definição dessa procedure é possível fazer o retorno do schema e dados da modal de detalhe para detalhar as informações que estão sendo mostradas no monitor (por exemplo, lista de registros que foram considerados para montar o gráfico do monitor).
...
Com o código exemplificado acima teremos o resultado abaixo ao clicar no gráfico:
Em anexo também estamos disponibilizando o código completo utilizado neste passo a passo:
View file | ||||
---|---|---|---|---|
|
Para mais exemplos, consulte a página Exemplos adicionais de monitores.