240 likes | 396 Views
Report poziv arhitektura III. Kratki opis interakcije report/forms servisa u 10g. Stari način pozivanja reporta – 6i. param_list_id_L := Get_Parameter_List('INPUT_PARAMS');. ADD_PARAMETER(param_list_id_l, 'P_DATUM_OD', TEXT_PARAMETER, datum1_l); /* P - PLAN */
E N D
Report poziv arhitektura III Kratki opis interakcije report/forms servisa u 10g
param_list_id_L := Get_Parameter_List('INPUT_PARAMS'); ADD_PARAMETER(param_list_id_l, 'P_DATUM_OD', TEXT_PARAMETER, datum1_l); /* P - PLAN */ ADD_PARAMETER(param_list_id_l, 'P_DATUM_DO', TEXT_PARAMETER, datum2_l); Forma datum1_l := TO_CHAR(:parametri.datum1, 'DD.MM.RRRR.'); datum2_l := TO_CHAR(:parametri.datum2, 'DD.MM.RRRR.'); Param_lista report_l := RUN_REPORT_OBJECT ('NEKI_REPORT', param_list_id_l); Pozovi report, poziv ide na report server
Sav kod zajedno • param_list_id_L := Get_Parameter_List('INPUT_PARAMS'); • datum1_l := TO_CHAR(:parametri.datum1, 'DD.MM.RRRR.'); • datum2_l := TO_CHAR(:parametri.datum2, 'DD.MM.RRRR.'); • ADD_PARAMETER(param_list_id_l, 'P_DATUM_OD', TEXT_PARAMETER, datum1_l); /* P - PLAN */ • ADD_PARAMETER(param_list_id_l, 'P_DATUM_DO', TEXT_PARAMETER, datum2_l); • report_l := RUN_REPORT_OBJECT ('NEKI_REPORT', param_list_id_l);
Zašto uopće mijenjati kod? • Report sada radi kao web servis. • Kako radi kao web servis, tako i forme više nisu usko vezane za reporte(i ostali programi mogu pristupati). • Parametarska forma koja je ponuđena ne radi kako bismo htjeli – potpuno je nefleksibilna. Savjetovanjem sa Uljanikom i sa Login-om, došli smo do zaključka da ćemo koristiti Custom parametarsku formu. • “The most secure approach for calling Reports from Forms on theWeb is to use the Oracle Application Server 10g reports Services in combination with RUN_REPORT_OBJECT. Because the user’s database connection is implicitly passed from Forms to Reports on the server, there is no risk of interception as if it were passed in a URL.” – iz Oracle Application Server 10J - Integrating Oracle Reports in Oracle Forms Services applications
Primjer • report_id Report_Object; • ReportServerJob VARCHAR2(100); • BEGIN • report_id:= find_report_object(‘MyReport1’); • SET_REPORT_OBJECT_PROPERTY(report_id,REPORT_COMM_MODE,SYNCHRONOUS); • SET_REPORT_OBJECT_PROPERTY(report_id,REPORT_DESTYPE,CACHE); • SET_REPORT_OBJECT_PROPERTY(report_id,REPORT_SERVER,’Repsrv’); • SET_REPORT_OBJECT_PROPERTY(report_id,REPORT_OTHER,'p_deptno='||:Dept.De • ptno||' paramform=no'); • ReportServerJob:=run_report_object(report_id); • END; • Vidimo da se parametri prenose zajedno sa report “objektom”
Parametarska forma Forma Prijenos parametra? Report
Library migracija Podaci???? data_mode NO_SHARE_LIBRARY_DATA (The default.) At runtime, Oracle Forms will not share data between forms that have identical libraries attached (at design time). SHARE_LIBRARY_DATA At runtime, Oracle Forms will share data between forms that have identical libraries attache.
desetg.add___parameter(param_list_id_l, 'P_DATUM_OD', TEXT_PARAMETER, datum1_l); desetg.add___parameter(param_list_id_l, 'P_DATUM_DO', TEXT_PARAMETER, datum2_l); desetg.postavi_param_listu(param_list_id_l); CALL_FORM(lower('param_forma'), HIDE, DO_REPLACE, NO_QUERY_ONLY, SHARE_LIBRARY_DATA); --Generirano iz JDAPI-a... desetg.postavi_report_ime(lower('GAS5540')); param_list_id_L := Get_Parameter_List('INPUT_PARAMS'); Library migracija Param_lista
Pročitaj parametre CALL_FORM(lower('param_forma'), HIDE, DO_REPLACE, NO_QUERY_ONLY, SHARE_LIBRARY_DATA); --Generirano iz JDAPI-a... Poziva report SET_REPORT_OBJECT_PROPERTY(report_id,REPORT_OTHER,hidden_action||'¶mform=no');
Što je postignuto? • Sada se svi report objekti nalaze u jednoj formi – param_forma.fmb • Postignuta je velika brzina prijenosa parametra u odnosu na druge solucije • Postignuta je modularnost, dobili smo još jedan abstraktni modul kojim “pomičemo” odgovornosti sa obje strane na domenu na kojoj treba biti. Ovo se prvobitno odnosi na forme koje pozivaju reporte. Sada, ako nastane neka promjena na reportima, nema potrebe pretraživati po svim formama, nego je sve na jednom mjestu • Smanjen je utjecaj mogućih grešaka – ako postoji greška u pozivu nije u nikakvom triggeru niti bug-u forme – moguće ali manje vjerovatno • Zadržan je isti format/dizajn formi od prije tako da se sada mogu migrirati forme sa 6i direktno dok mogu još uvijek izmjene biti “ubačene” kroz alat za migraciju
Problematika URL encodinga • Problem nastaje kada se neki posebni znakovi šalju preko tih URL-ova • U svim primjerima koje Oracle daje šalju jednostavne parametre • U MISH aplikaciji, na drugu ruku, potpuno je uobičajeno poslati skoro pa čitav where uvijet • Neke su forme ispravljane na način da se where uvijeti “prebace” u report. Time se izbjegava slanje “posebnih znakova” preko URL-a • To nije moguće svugdje!
Zaključak? • Riješiti problem URL encodinga... Time se omogućuje slobodno slanje “biblija” preko parametra(što ne znači da je to dobro). • Primjer je GAS5380 – Ulaz/Izlaz artikala. (Primjer na desktopu) • Postoji još puno formi koje koriste čitave where uvijete za poziv reporta
RWWebService • Web servis “Interface” • Omogućava par jendnostavnih metoda: • getAPIVersion() • getServerInfo(String serverName, String authId) • getJobInfo(Integer jobId, String serverName, String authId) • killJob(Integer jobId, String serverName, String authId) • runJob(String commandLine, Boolean synchronous)
Zašto nova implementacija? • “Zastarijela” tehnologija – PL/SQL, treba puno više vremena potrošiti na izradu/održavanje/testiranje library-a. • Nedostatak dokumentacije Oracle-a – ne postoji dokument koji spominje “URL encoding”, kamoli još da je vezan za report server. • Jedna izmjena/testiranje zahtijeva sljedeće: • Zagasiti browser • Napraviti izmjenu • Kompajlirati • Napraviti executable • Kopirati u folder gdje se pokreće • Pokrenuti “attach debugger” • Pokrenuti browser sa opcijom “&debug=yes” • Ponovno u formi upisati detalje vezane za “konekciju” na debugger • Upisati user podatke • Ići na formu • Vratiti se na debugger • Doći na problematični slog • Pogledati vrijednosti(za neke vrijednosti niti ne postoji “watch”)
Zašto nova implementacija? • JavaBean se puno lakše testira – imamo TDD, sve što forma treba je poslati par parametra • Nakon par napisanih testova možemo lako ustanoviti gdje je greška/bug • “Logika” poziva povučena je u Bean
Primjer pozivanja • server=rep_iii-server-2_as10g report=test.rdf destype=file desname=output.pdf desformat=pdf userid=hnbgastro/hnbgastro@iii-11g • Problema je vidljiv. Sve se šalje preko XML-a. Da li je sa sigurnosne strane ovo dobra solucija? Sigurno da je lakše i jednostavnije, ali da li je i sigurnije?