Olá a todos,
Estou enfrentando um problema com um cenário Mestre-Detalhe em cadeia usando Interactive Grids (IGs) no Oracle APEX e gostaria de saber qual é a boa prática ou padrão recomendado para resolver isso.
Estrutura da Página
- Page Items: Dois PopUp LOVs (
:P110_FILTRO_1, :P110_FILTRO_2) e um botão de atualizar (BTN_ATUALIZAR).
- Interactive Grids: Uma cadeia de regiões Mestre-Detalhe:
IG-1 (Mestre)
IG-2 (Detalhe da IG-1)
IG-3 (Detalhe da IG-2)
- ...e assim por diante.
Comportamento das Consultas (SQL)
Reforço que todas as queries SQL das IGs foram testadas diretamente no banco de dados Oracle e os valores estão 100% corretos. As consultas filtram perfeitamente com base nos PopUp LOVs e nas chaves do grid mestre. O problema ocorre exclusivamente na sincronização/cache do lado do cliente (JavaScript/APEX Engine).
O Problema
Quando altero os PopUp LOVs e clico no botão BTN_ATUALIZAR:
- A
**IG-1** (Mestre principal) atualiza normalmente com os novos dados filtrados.
- A
**IG-2** (Detalhe) apresenta um comportamento inconsistente:
- Ela costuma atualizar os dados apenas para a linha que já estava selecionada na
IG-1.
- Quando clico em outras linhas da
IG-1, a IG-2 exibe dados antigos/em cache (anteriores ao clique do botão de atualizar).
- Às vezes funciona, às vezes não.
- Se tento usar uma Dynamic Action no evento Selection Change da
IG-1 para forçar o Refresh na IG-2, preciso clicar pelo menos 2 vezes na mesma linha da mestre para que o grid detalhe busque e exiba os novos valores.
O que já foi testado
- Refresh apenas na
**IG-1** no clique do botão: Esperando que a cascata nativa Mestre-Detalhe do APEX cuidasse das filhas (as filhas continuam mostrando dados antigos ao alternar as linhas).
- Refresh em todas as IGs no clique do botão: Causa problemas de concorrência assíncrona (race conditions) e lentidão na tela.
- Refresh disparado via Selection Change: Exige clicar duas vezes na linha para trazer o dado certo e gera requisições desnecessárias ao alternar seleções normalmente.
- Dynamic Action de
**After Refresh** na **IG-1**: O evento de DOM apexafterrefresh não dispara de forma confiável em IGs Mestre devido ao controle interno de modelo do APEX.