Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Bloco de código
titleExemplo de código
PROCEDURE pi-get-monitor-data-detail: /* O nome da procedure de detalhe sempre precisará ser esse. */
    DEFINE INPUT  PARAM TABLE FOR ttVisaoMonitor.
    DEFINE INPUT  PARAM iPage             AS INTEGER    NO-UNDO.
    DEFINE INPUT  PARAM cSerie            AS CHARACTER  NO-UNDO.
    DEFINE INPUT  PARAM cCategory         AS CHARACTER  NO-UNDO.
    DEFINE OUTPUT PARAM detailJsonOutput  AS JsonObject NO-UNDO.
    DEFINE OUTPUT PARAM TABLE FOR RowErrors.
    
    DEFINE VARIABLE DetailBuilder  AS DetailBuilder  NO-UNDO.
    
    DEFINE VARIABLE lHasNext   AS LOGICAL INITIAL FALSE  NO-UNDO.
    
    DetailBuilder = NEW DetailBuilder(). // Classe utilitária que ajudará na montagem do objeto de detalhe
    
    
    FIND FIRST ttVisaoMonitor.
   
    /* Procedure local que cria a temp-table das colunas que serão apresentadas na janela de detalhe */
    RUN pi-get-colunas-detalhe(OUTPUT TABLE ttColunaDetalhe).
    
    /* Opcionalmente, também podemos montar cabeçalhos (headers) para a janela de detalhe */
    RUN pi-get-headers-detalhe(INPUT cSerie,
                               OUTPUT TABLE ttHeadersDetalhe).
    
    /**
       Executar o método que irá retornar a temp-table contendo os dados a serem apresentados no detalhe. Dessa vez não serão os totais,
       e sim os registros individuais. Pode ser aproveitado o mesmo método de query que gera o gráfico do monitor, porém ele precisará
       ser ajustado para levar em consideração qual fatia/coluna do gráfico o usuário clicou (variáveis cSerie e cCategory) e também precisará gerar 
       a tabela com os registros individuais, e não somente calcular os totais
    **/
    RUN pi-get-itens-detalhe(INPUT iPage,
                             INPUT cSerie,
                             OUTPUT lHasNext,
                             OUTPUT TABLE ttOrdemProducao).
    
    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".

    // Setamos as colunas, tags, headers e itens que serão exibidos
    DetailBuilder:setTags(INPUT TABLE ttTags).
    DetailBuilder:setColumns(INPUT TABLE ttColunaDetalhe).
    DetailBuilder:setHeaders(INPUT TABLE ttHeadersDetalhe).
    DetailBuilder:setItems(JsonAPIUtils:convertTempTableToJsonArray(TEMP-TABLE ttOrdemProducao:HANDLE, FALSE)). //O método convertTempTableToJsonArray transforma nossa temp-table em um Array, contendo os campos conforme os SERIALIZE-NAME definidos
    
    /**
       Se a consulta for paginada e tiver mais resultados além dos que estão sendo retornados, podemos setar a variável 'hasNext' como TRUE. Desse modo o botão
       'Carregar mais resultados' ficará habilitado na janela de detalhe para que o usuário possa consultar os registros da próxima página. Recomendamos utilizar paginação
       caso exista a possibilidade da consulta geral demorar mais que um minuto
    **/
    DetailBuilder:setHasNext(lHasNext).
    DetailBuilder:setCanExportXLS(TRUE). // Determina se o botão de exportação para planilha ficará habilitado (TRUE) ou não (FALSE)
    DetailBuilder:setModalMaxWidth("1440px"). // Tamanho máximo que a janela terá em tela
    
    ASSIGN detailJsonOutput = DetailBuilder:createDetail(). //Gera o objeto de detalhe
    
    /**
       A temp-table RowErrors pode ser utilizada para retornar mensagens de erro, caso necessário:
       
       CREATE RowErrors.
       ASSIGN RowErrors.ErrorNumber = 17006
              RowErrors.ErrorDescription = "ERRO DE EXEMPLO"
              RowErrors.ErrorSubType = "ERROR".
    **/

END PROCEDURE.

PROCEDURE pi-get-headers-detalhe:
    DEFINE INPUT   PARAM cSerie   AS CHARACTER  NO-UNDO.
    DEFINE OUTPUT PARAMETER TABLE FOR ttHeadersDetalhe.
    
    CREATE ttHeadersDetalhe.
    ASSIGN ttHeadersDetalhe.texto-header = "Listando Ordens com Situação:"
           ttHeadersDetalhe.classe-header = "po-sm-12 po-font-subtitle blue-text" //Classes de tipografia do PO-UI estão disponíveis em: https://po-ui.io/guides/typography
           ttHeadersDetalhe.estilo-header = "".
    
    CREATE ttHeadersDetalhe.
    ASSIGN ttHeadersDetalhe.texto-header = IF cSerie <> "" THEN cSerie ELSE "Todos"
           ttHeadersDetalhe.classe-header = "po-sm-12 po-font-text-large-bold" //Classes de tipografia do PO-UI estão disponíveis em: https://po-ui.io/guides/typography
           ttHeadersDetalhe.estilo-header = "".
    
END PROCEDURE.

PROCEDURE pi-get-colunas-detalhe:
    DEFINE OUTPUT PARAMETER TABLE FOR ttColunaDetalhe.

    /* Atenção! O campo 'propriedade' da ttColunaDetalhe deve conter o mesmo nome que consta no SERIALIZE-NAME do campo que será apresentado,
    conforme definição da temp-table. Estamos utilizando a temp-table ttOrdemProducao neste exemplo, veja que estamos usando os nomes em inglês que 
    foram definidos para cada propriedade: */

    CREATE ttColunaDetalhe.
    ASSIGN ttColunaDetalhe.cod-label   = "Ordem"
           ttColunaDetalhe.propriedade = "productionOrderNumber" //productionOrderNumber equivale ao campo nr-ord-produ na temp-table ttOrdemProducao
           ttColunaDetalhe.formato     = "1.0-0"
           ttColunaDetalhe.tipo        = "number"
           ttColunaDetalhe.largura     = "180px".

    CREATE ttColunaDetalhe.
    ASSIGN ttColunaDetalhe.cod-label   = "Item"
           ttColunaDetalhe.propriedade = "itemCode". //itemCode equivale ao campo it-codigo na temp-table ttOrdemProducao
           
    CREATE ttColunaDetalhe.
    ASSIGN ttColunaDetalhe.cod-label   = "Data de Emissão"
           ttColunaDetalhe.propriedade = "creationDate" //creationDate equivale ao campo dt-emissao na temp-table ttOrdemProducao
           ttColunaDetalhe.tipo        = "date".

    CREATE ttColunaDetalhe.
    ASSIGN ttColunaDetalhe.cod-label   = "Quantidade"
           ttColunaDetalhe.propriedade = "quantity" //quantity equivale ao campo qt-ordem na temp-table ttOrdemProducao
           ttColunaDetalhe.tipo        = "number"
           ttColunaDetalhe.formato     = "1.4-4".
           
END PROCEDURE.

PROCEDURE pi-get-itens-detalhe:
    DEFINE INPUT   PARAM iPage       AS INTEGER    NO-UNDO.
    DEFINE INPUT   PARAM cSerie      AS CHARACTER  NO-UNDO.
    DEFINE OUTPUT  PARAM lHasNext    AS LOGICAL    NO-UNDO.
    DEFINE OUTPUT  PARAMETER TABLE   FOR ttOrdemProducao.
    
    DEFINE VARIABLE cQuery   AS CHARACTER  NO-UNDO.
    DEFINE VARIABLE iCount   AS INTEGER    NO-UNDO.
    
    
    DEFINE VARIABLE cFiltroEstab      AS CHARACTER    NO-UNDO.
    DEFINE VARIABLE dFiltroData       AS DATE         NO-UNDO.
    
    ASSIGN cFiltroEstab   = fn-get-valor-propriedade(INPUT "cod-estabel")
           dFiltroData    = TODAY - INTEGER(fn-get-valor-propriedade(INPUT "qtd-dias-atras")).
           
    
    ASSIGN cQuery = 'FOR EACH ord-prod NO-LOCK':U.
    ASSIGN cQuery = cQuery + ' WHERE ord-prod.cod-estabel = "' + cFiltroEstab + '"'.
    ASSIGN cQuery = cQuery + ' AND ord-prod.dt-emissao >= ' + STRING(dFiltroData) + ''.
    
    /* 
        Caso a cSerie esteja preenchido, irá significar que a tela de detalhes foi acionada através de uma interação 
        com o gráfico e deverá ser filtrado os dados de acordo com a série clicada
    */
    IF cSerie <> "" THEN DO:
        IF cSerie = "Em Aberto" THEN 
            ASSIGN cQuery = cQuery + ' AND ord-prod.estado < 3'.
        ELSE IF cSerie = "Em Andamento" THEN 
            ASSIGN cQuery = cQuery + ' AND ord-prod.estado >= 3 AND ord-prod.estado <= 6'.
        ELSE IF cSerie = "Concluídas" THEN 
            ASSIGN cQuery = cQuery + ' AND ord-prod.estado >= 7'.
    END.
    
    DEFINE QUERY findQuery FOR ord-prod SCROLLING.

    QUERY findQuery:QUERY-PREPARE(cQuery).
    QUERY findQuery:QUERY-OPEN().
    QUERY findQuery:REPOSITION-TO-ROW(iPage).
    
    REPEAT:
    
        GET NEXT findQuery.
        IF QUERY findQuery:QUERY-OFF-END THEN LEAVE.

        IF iCount >= 50 THEN DO:
            ASSIGN lHasNext = TRUE.
            LEAVE.
        END.

        CREATE ttOrdemProducao.
        TEMP-TABLE ttOrdemProducao:HANDLE:DEFAULT-BUFFER-HANDLE:BUFFER-COPY(
            BUFFER ord-prod:HANDLE
        ).
		
		FOR FIRST item FIELDS(desc-item)
			WHERE item.it-codigo = ttOrdemProducao.it-codigo NO-LOCK:
		END.
		
		ASSIGN ttOrdemProducao.desc-item  = IF AVAIL item THEN item.desc-item ELSE ''.
        
        ASSIGN iCount = iCount + 1.
    END.
    
END PROCEDURE.

...