wtorek, 23 lipca 2013

Dynamiczne usuwanie rekordu z raportu


Podczas tworzenia aplikacji, w niektórych przypadkach zachodzi potrzeba dynamicznego usuwania danych z raportu. Implementuje się to głównie w raportach przedstawiających  powiadomienia, nowe wiadomości lub w momentach kiedy strona jest za duża aby odświeżać ją całą. Przy wykorzystaniu i połączeniu odpowiednich komponentów Oracle APEX jesteśmy w stanie w dość prosty sposób wykonać tę operację.

Poniższy przykład oparty jest na domyślnych tabelach Oracle EMP i DEPT.
Niezbędne rzeczy do dynamicznego usuwania rekordu z raportu.

  1. Report – raport typu classic lub interactive będący listą pracowników
  2. Item typu Hidden– item przechowujący id usuwanego pracownika
  3. Application process - proces aplikacyjny, usuwający danego pracownika.
  4. Javascript function – odpowiada za wywołanie procesu aplikacyjnego i odświeżenie raportu


Krok 1. Tworzymy raport oparty na tabeli EMP

Następnie edytujemy kolumnę EMPNO na raporcie. Jako target wybieramy URL, w którym wpisujemy javascript:deleteEmp(#EMPNO#) , a w polu  Link Text wpisujemy Usuń.

Po kliknięciu w Usuń wywoływana będzie funkcja javascript o nazwie „deleteEmp”.

Krok 2. Hidden item
Dodajemy Item typu Hidden (:P2_EMP_ID), który będzie przechowywać id usuwanego pracownika.

Krok 3. Application process

Shared components -> Application Processes -> Create
Tworzymy Application process, w którym jako wyzwalacz (Process Point) wybieramy 

“On Demand: Run this application process when requested by a page process” i nazywamy go “AP_DEL_EMP”. Jako źródło podajemy poniższy kod PL/SQL odpowiadający usunięcie
pracownika.

begin
if :P2_EMP_ID is not null then
            delete from emp
            where empno = :P2_EMP_ID;
            :P2_EMP_ID:=’’;
            commit;
end if;
end;

Krok 4. Javascript
Ważne jest, aby dodać Static Id do naszego raportu, który wykorzystany zostanie do odświeżania raportu. Zrobimy to edytując Raport i w Region Definition w polu Static ID wpisując R_EMPLOYEES.

Finalnie, przechodzimy do edycji strony i w sekcji HTML Header dodajemy poniższy kod Javascript.

<script language="Javascript" type="text/javascript">
   
    function deleteEmp(EMPID){    
        var sqlQuery = new htmldb_Get(null,&APP_ID., 'APPLICATION_PROCESS=AP_DEL_EMP',&APP_PAGE_ID.);
        sqlQuery.add('P2_EMP_ID',EMPID); 
        var gReturn = sqlQuery.get();
        $('#R_EMPLOYEES').trigger('apexrefresh');
    }

</script>

var sqlQuery = new htmldb_Get(null,$APP_ID., 'APPLICATION_PROCESS=AP_DEL_EMP', &APP_PAGE_ID.);  - wywołanie Ajax

sqlQuery.add('P2_EMP_ID',EMPID); - ustawia ukryty item (:P2_EMP_ID) wartością klikniętą w raporcie będącą ID pracownika

var gReturn = sqlQuery.get(); - wykonuje wcześniej zdefiniowany proces aplikacyjny

$('#R_EMPLOYEES').trigger('apexrefresh'); - odświeża raport o Static ID “R_EMPLOYEES”.


Jeśli wszystko zrobiliśmy zgodnie z powyższymi krokami to teraz możemy przejść do raportu i po kliknięciu w „Usuń” wybrany pracownik zostanie usunięty przy czym strona nie zostanie przeładowana.

2 komentarze:

  1. Fajna sprawa z tym ajax i javascript.

    OdpowiedzUsuń
  2. Czy da się też uruchomić z przycisku ?

    OdpowiedzUsuń