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:
#----------------------------# 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: