Páginas filhas
  • LGX - Função de carga de dados para zoom


No cadastro de um zoom metadado via programa FRM1008 é possível determinar que os dados a serem apresentados no zoom são provenientes de uma função 4GL desenvolvida e compilada no RPO em uso e não resultantes de uma consulta ao banco de dados com uma query SQL diretamente registrada no cadastro do zoom, que é montada de forma dinâmica respeitando a lista de colunas, tabelas e filtros informados. 

Mas como deve-se desenvolver o código de uma função para que o zoom reconheça e assuma corretamente os dados a partir de uma função 4GL?

A resposta é simples, basta definir uma variável do tipo ARRAY OF RECORD onde os nomes dos elementos sejam os mesmos das colunas definidas no cadastro do zoom (FRM1008), respeitando também os tipos das respectivas colunas e ai então desenvolver uma função 4GL que alimentará dados nesta variável, que ao final é registrada como o array de dados do zoom usando a função _ADVPL_set_metadata_zoom_array_record(<ARRAY OF RECORD 4GL>) e, deve ter como retorno a quantidade de linhas de dados preenchidas nesta variável array.


Veja um exemplo prático do código de uma função de carga de dados de zoom metadado:


Exemplo
#----------------------------#
FUNCTION zoom_data_load_test()
#----------------------------# 
  #Considerando neste caso que o zoom do metadado possui 2 colunas nomeadas como 'coluna1_zoom' e 'coluna2_zoom'
  DEFINE la_record_data ARRAY[] OF RECORD
                                   coluna1_zoom CHAR(10),
                                   coluna2_zoom CHAR(50)
                                   END RECORD
  DEFINE l_idx INTEGER

  #Eliminar todas linhas do array of record 
  CALL arrayDeleteItem(la_record_data)
  #Adicionar a 1a linha do array para receber dados
  LET l_idx = 1
  CALL arrayAddItem(la_record_data,1)

  WHENEVER ERROR CONTINUE
  DECLARE cq_zoom_data_test CURSOR FOR 
   SELECT <column1>, <column2> FROM <table1> WHERE <where_condition_table1> 
    UNION ALL 
   SELECT <column1>, <column2> FROM <table2> WHERE <where_condition_table2>
    ORDER BY 2 DESC

  FOREACH cq_zoom_data_test INTO la_record_data[l_idx].*
     IF sqlca.sqlcode < 0 THEN
        EXIT FOREACH
     END IF
 	 LET l_idx = l_idx + 1
     CALL arrayAddItem(la_record_data,1)
  END FOREACH
  FREE cq_zoom_data_test    
  WHENEVER ERROR STOP
 
  #Eliminar a última linha do array que estará vazia
  LET l_idx = l_idx - 1
  CALL arrayDeleteItem(la_record_data,1)

  #Aqui é o momento onde é feito o registro dos dados do array de record como o array de dados do zoom
  CALL _ADVPL_set_metadata_zoom_array_record(la_record_data)
  
  RETURN l_idx #quantidade total de registros carregados no array
END FUNCTION


Com esta função de carga de dados de zoom desenvolvida, agora basta informar o nome da função no cadastro do zoom (FRM1008) no campo Carga conforme imagem abaixo: