Oracle Apex - jak pobrać wartość własnie zaktualizowanej kolumny widoku Interactive Grid za pomocą Java Script

Kiedy aktualizujęsz pole kolumny [zdarzenie „zmiana”] często musisz odczytać dane z tej komórki. Domyślnie działa to TYLKO dla komórek, które mają wartości po załadowaniu grid/strony. Nie działa w przypadku świeżych wartości które właśnie wprowadziłeś. Zmienna jest pusta. Jeśli wrócisz do tego pola, nowa wartość się pojawi. Wygląda na to, że pole nie jest tak naprawdę aktualizowane przed wywołaniem zdarzenia.

Odczyt i zapis wartości aktywnego rekordu Interactive Grid

Możesz nazwać to funkcją, możesz nazwać to błędem, ale ostatecznie jest to nieoczekiwane i niepożądane zachowanie. Rozwiązaniem jest wywołanie metody lockActive a następnie SetActiveRecordValue po wpisaniu nowej wartości. Po wykonaniu danej operacji za pomocą Java Script, w tym przypadku ustawieniu nowej wartości dla kolumny, odblokowanie aktywnego rekordu metodą unlockActive.

Wykonaj JavaScript z następującym kodem:

//Zapisz wlasnie wprowadzona wartosc. 'edycja_oferty' to Static ID
var grid$ = apex.region( "edycja_oferty" ).call( "getCurrentView" ).view$;
grid$.grid("lockActive");
grid$.grid( "setActiveRecordValue", "ARTICLE_QUANTITY" )

//Odczytaj właśnie wprowadzoną wartość:
var $te = $(this.triggeringElement);
var rowId = $te.closest('tr').data('id');

var ig$ = apex.region("edycja_oferty").widget();
var model = ig$.interactiveGrid("getViews", "grid").model;


//Odczytaj wartości kolumn rekordu
var record = model.getRecord(rowId);
var article_quantity = model.getValue( record, "ARTICLE_QUANTITY");
var article_price = model.getValue( record, "ARTICLE_PRICE");

//Oblicz nowa wartość:
var new_article_total = article_price * article_quantity;


//Zapisz nową wartość i zwolnij blokadę:
model.setValue(record, "ARTICLE_TOTAL", new_article_total.toFixed(2));
grid$.grid("unlockActive");

Kod Java Script może być wykonany jako część Dynamic Actions komórki. Np. Event 'change' kolumny który ma ustawiony powyższy kod akcji Execute JavaScript Code dla True.