Páginas filhas
  • 5. Widget de consulta rápida

Versões comparadas

Chave

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

...

O nome da consulta deve seguir o padrão composto pelo código do sistema Logix, a letra "i" e a sequencia de identificação do indicador.

Desenvolvimento

Após criado o identificadora criação, deve ser desenvolvido um o fonte 4gl 4GL com as funções padrões para a execução da consulta rápida no Fluig. Atualmente são necessárias três funções para cada indicador, uma função sendo:

  1. START: função responsável por retornar dados iniciais da consulta rápida

...

  1. ;
  2. SEARCH: função responsável para retornar os dados

...

  1. da consulta

...

  1. ; e
  2. AUTO_COMPLETE: função responsável por retornar as informações do auto-completar do widget no Fluig.

Função de START

A primeira função que deve ser criada no fonte de indicador é a função de start. No 4gl No 4GL o nome desta função deve ter o sufixo _indicator_startnão possui poderá possuir parâmetros e deverá retornar para o Fluig uma variável RECORD com as informações de montagem do widget de consulta rápida, como:

  • os filtros que poderão ser realizados

...

  • ;
  • as colunas que irão compor a grade com os dados da consulta

...

  • ;
  • a lista de filtros pré-definidos que poderão ser utilizados

...

  • ; e
  • a lista com o nome dos programas que poderão ser executados a partir da consulta

...

  • .
Exemplo
Bloco de código
themeEclipse

...

code
languagenonelinenumberstrue
#------------------------------#
FUNCTION logi1_indicator_start()
#------------------------------#
    DEFINE lr_start RECORD
                        filters   ARRAY[2] OF RECORD
                                      table_name  LIKE frm_column.table_name,
                                      column_name LIKE frm_column.column_name
                                  END RECORD,
                                  
                        columns   ARRAY[3] OF RECORD
                                      table_name  LIKE frm_column.table_name,
                                      column_name LIKE frm_column.column_name,
                                      can_order   SMALLINT
                                  END RECORD,
                                  
                        selection ARRAY[3] OF
                                  RECORD
                                      code        CHAR(03),
                                      label       CHAR(50)
                                  END RECORD,
                                  
                        actions   ARRAY[2] OF
                                  RECORD
                                      code        CHAR(08),
                                      label       CHAR(50)
                                  END RECORD
                    END RECORD
                    
    IF  LOG_initApp("PADRAO") > 0 THEN
        RETURN
    END IF
                           
    #Define as colunas de filtro da consulta rápida
    LET lr_start.filters[1].table_name  = 'log_grupos'
    LET lr_start.filters[1].column_name = 'grupo'
    
    LET lr_start.filters[2].table_name  = 'log_grupos'
    LET lr_start.filters[2].column_name = 'des_grupo'
    
    #Define as colunas da consulta rápida
    LET lr_start.columns[1].table_name  = 'usuarios'
    LET lr_start.columns[1].column_name = 'cod_usuario'
    LET lr_start.columns[1].can_order   = TRUE
    
    LET lr_start.columns[2].table_name  = 'usuarios'
    LET lr_start.columns[2].column_name = 'nom_funcionario'
    LET lr_start.columns[2].can_order   = TRUE
    
    LET lr_start.columns[3].table_name  = 'usuarios'
    LET lr_start.columns[3].column_name = 'ind_admlog'
    LET lr_start.columns[3].can_order   = FALSE
    
    #Define quais valores estarão na seleção de filtros
    LET lr_start.selection[1].code  = '*'
    LET lr_start.selection[1].label = 'Todos os usuários'
    
    LET lr_start.selection[2].code  = 'S'
    LET lr_start.selection[2].label = 'Somente administradores'
    
    LET lr_start.selection[3].code  = 'N'
    LET lr_start.selection[3].label = 'Somente usuários comuns'
    
    #Define quais programas poderão ser chamados pela consulta
    LET lr_start.actions[1].code  = 'log02700'
    LET lr_start.actions[1].label = 'Usuários'
    
    LET lr_start.actions[2].code  = 'log02720'
    LET lr_start.actions[2].label = 'Grupos do usuário'
    
    RETURN lr_start
END FUNCTION

A eexecução execução da função acima irá permitir a inicialização do widget de consulta rápida e irá criá-lo semelhante a tela abaixo:

Função de SEARCH

A função de search é responsável por retornar as informações recuperadas pela consulta no banco de dados. No 4gl No 4GL o nome desta função deve ter o sufixo _indicator_search e deve esperar por parâmetro: a coluna e o , deve ter como parâmetros:

  1. nome da coluna de filtro selecionada pelo usuário;
  2. valor do filtro informado pelo usuário

...

  1. ;
  2. valor do filtro pré-definido selecionado

...

  1. ;
  2. nome da coluna de ordenação;
  3. tipo de ordenação

...

  1. ;
  2. quantidade de linhas por página; e

...

  1. número da página de consulta atual.

Todos estes parâmetros devem ser considerados ao executar a consulta no banco de dados e o retorno deve ser uma variável RECORD com:

  1. os dados da consulta

...

  1. ;
  2. quantidade total de registros encontrados no banco de dados

...

  1. ;
  2. quantidade total de registros que serão retornado para o Fluig

...

  1. ;
  2. número total de páginas conforme a consulta efetuada; e

...

  1. número da página atual de consulta.

...

Exemplo
code
Bloco de código
themeEclipse
languagenonelinenumberstrue
#---------------------------------------------------------------------------------------------------------------#
FUNCTION logi1_indicator_search(l_filter_column,l_filter_value,l_selection,l_sort_col,l_sort_order,l_rows,l_page)
#---------------------------------------------------------------------------------------------------------------#
    DEFINE l_filter_column CHAR(50),  #Coluna de filtro (opcional)
           l_filter_value  CHAR(300), #Valor do filtro da coluna acima (opcional)
           l_selection     CHAR(01),  #Valor selecionado na lista de filtros (opcional)
           l_sort_col      CHAR(50),  #Coluna de ordenação (opcional)
           l_sort_order    CHAR(04),  #Tipo de ordenação ASC ou DESC (opcional)
           l_rows          SMALLINT,  #Máximo de registros por página
           l_page          SMALLINT   #Página atual de pesquisa
    
    DEFINE l_sql_stmt      CHAR(500),
           l_sql_count     CHAR(500),
           l_where_clause  CHAR(250)
           
    DEFINE l_ind           SMALLINT,
           l_position      INTEGER
    
    DEFINE lr_search       RECORD
                               data  ARRAY[60] OF 
                                     RECORD     #Lista com os resultados da consulta
                                         cod_usuario     LIKE usuarios.cod_usuario,
                                         nom_funcionario LIKE usuarios.nom_funcionario,
                                         ind_admlog      LIKE usuarios.ind_admlog
                                     END RECORD,
                               count SMALLINT,  #Total de registros que serão retornados
                               total INTEGER,   #Total de registros encontrados na consulta (sem a paginação)
                               cpage INTEGER,   #Página de registros atual
                               pages SMALLINT   #Total de páginas resultantes da consulta
                           END RECORD
                           
    IF  LOG_initApp("PADRAO") > 0 THEN
        RETURN
    END IF
                           
    INITIALIZE lr_search.* TO NULL
                           
    #Verifica a coluna e o filtro informado por parâmetro
    IF  l_filter_column IS NOT NULL AND l_filter_value IS NOT NULL THEN
        LET l_where_clause = "UPPER(g."||l_filter_column CLIPPED||") LIKE '%"||UPSHIFT(l_filter_value) CLIPPED||"%'"
    ELSE
        LET l_where_clause = "1=1"
    END IF
    
    #Adiciona o filtro conforme selecionado
    IF  l_selection IS NOT NULL AND l_selection <> "*" THEN
        LET l_where_clause = l_where_clause CLIPPED," AND u.ind_admlog = '",l_selection CLIPPED,"'"
    END IF
    
    #Monta o SQL da consulta rápida
    LET l_sql_stmt = "SELECT DISTINCT",
                           " u.cod_usuario,",
                           " u.nom_funcionario,",
                           " u.ind_admlog",
                      " FROM usuarios u",
                      " LEFT OUTER JOIN log_usu_grupos l",
                        " ON l.usuario = u.cod_usuario",
                      " LEFT OUTER JOIN log_grupos g",
                        " ON g.grupo   = l.grupo",
                     " WHERE ",l_where_clause
    
    #Monta o SQL de COUNT (é necessário ser sem ORDER BY)
    LET l_sql_count = "SELECT COUNT(*) FROM ("||l_sql_stmt CLIPPED||") t"
    
    #Atribui o ORDER BY para o SQL da consulta rápida
    IF  l_sort_col IS NOT NULL AND l_sort_order IS NOT NULL THEN
        LET l_sql_stmt  = l_sql_stmt CLIPPED||" ORDER BY "||l_sort_col CLIPPED||" "||l_sort_order
    ELSE
        LET l_sql_stmt  = l_sql_stmt CLIPPED||" ORDER BY 1"
    END IF
    
    WHENEVER ERROR CONTINUE
    PREPARE var_indicator_count FROM l_sql_count
    WHENEVER ERROR STOP
    IF  sqlca.sqlcode <> 0 THEN
        CALL QS_consoleDebugMessage(l_sql_count)
        CALL log0030_processa_err_sql("PREPARE SQL","var_indicator_count",1)
        RETURN NULL
    END IF
    
    WHENEVER ERROR CONTINUE
    EXECUTE var_indicator_count INTO lr_search.total
    WHENEVER ERROR STOP
    IF  sqlca.sqlcode <> 0 THEN
        CALL log0030_processa_err_sql("EXECUTE SQL","var_indicator_count",1)
        FREE var_indicator_count
        RETURN NULL
    END IF
    
    #Conta a quantidade de página que resultou a consulta
    LET lr_search.pages = LOG_round(lr_search.total/l_rows,0)
    
    #Verifica se a página informada ultrapassou o total de páginas
    IF  lr_search.pages > 0 THEN
        IF  l_page > lr_search.pages THEN
            LET lr_search.cpage = lr_search.pages
        ELSE
            LET lr_search.cpage = l_page
        END IF
    ELSE
        LET lr_search.pages = 1
        LET lr_search.cpage = l_page
    END IF
    
    WHENEVER ERROR CONTINUE
    FREE var_indicator_count
    PREPARE var_indicator_search FROM l_sql_stmt
    WHENEVER ERROR STOP
    IF  sqlca.sqlcode <> 0 THEN
        CALL QS_consoleDebugMessage(l_sql_stmt)
        CALL log0030_processa_err_sql("PREPARE SQL","var_indicator_search",1)
        RETURN NULL
    END IF
    
    WHENEVER ERROR CONTINUE
    DECLARE cq_indicator_search CURSOR FOR var_indicator_search
    WHENEVER ERROR STOP
    IF  sqlca.sqlcode <> 0 THEN
        CALL log0030_processa_err_sql("DECLARE CURSOR","cq_indicator_search",1)
        FREE var_indicator_search
        RETURN NULL
    END IF
    
    WHENEVER ERROR CONTINUE
    OPEN cq_indicator_search
    WHENEVER ERROR STOP
    IF  sqlca.sqlcode <> 0 THEN
        CALL log0030_processa_err_sql("OPEN CURSOR","cq_indicator_search",1)
        FREE var_indicator_search
        RETURN NULL
    END IF
    
    #Calcula a posição do registro atual conforme a página e a quantidade de
    #linhas por página
    LET l_ind = 1
    LET l_position = ((l_rows * l_page) - l_rows) + 1
    
    WHILE TRUE
        WHENEVER ERROR CONTINUE
        FETCH ABSOLUTE l_position cq_indicator_search INTO lr_search.data[l_ind].*
        WHENEVER ERROR STOP
        IF  sqlca.sqlcode <> 0 THEN
            IF  sqlca.sqlcode <> NOTFOUND THEN
                CALL log0030_processa_err_sql("FETCH CURSOR","cq_indicator_search",1)
            END IF
            
            EXIT WHILE
        END IF
        
        LET l_ind = l_ind + 1
        LET l_position = l_position + 1
        
        #Não pode ultrapassar o limite de registros por página
        IF  l_ind > l_rows THEN
            EXIT WHILE
        END IF
    END WHILE
    
    WHENEVER ERROR CONTINUE
    CLOSE cq_indicator_search
    FREE  cq_indicator_search
    WHENEVER ERROR STOP
    
    LET lr_search.count = l_ind - 1
    RETURN lr_search
END FUNCTION

Função AUTO-COMPLETE

A última função que deve ser desenvolvida é a função que permite o auto-complete no widget de consulta rápida. No 4gl No 4GL o nome desta função deve ter o sufixo _indicator_autocomplete e , deve esperar por ter como parâmetro: a coluna

  1. nome da coluna selecionado para filtro;
  2. e o valor do filtro informado pelo usuário. O retorno deve ser uma variável RECORD com os dados da consulta e o total de registros encontrados no banco de dados. Esta função é executada quando o usuário informa algum filtro na consulta, conforme mostra o exemplo abaixo:

Um código de exemplo desta função pode ser visualizado abaixo:

...