Search  
Saturday, June 24, 2017 ..:: Articole ::.. Register  Login
 Article Details
Generare raport Word din APEX(Oracle Application Express) via Visual FoxPro 9.0

Autor: George Chisălescu * Soluţie de generare a unui raport Word dintr-o aplicaţie APEX 4.2 cu 12c via VFP 9.0 SP2, cu diacritice

Am avut de rezolvat următoarea cerinţă: • Să se creeze un raport Word cu datele stocate într-o bază de date Oracle, prin intermediul unei aplicaţii scrisă cu Oracle Application Express. Baza de date este 12c şi are următoarele caracteristici: PARAMETER VALUE NLS_RDBMS_VERSION 12.1.0.1.0 NLS_NCHAR_CONV_EXCP FALSE NLS_LENGTH_SEMANTICS BYTE NLS_COMP BINARY NLS_DUAL_CURRENCY $ NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_SORT BINARY NLS_DATE_LANGUAGE AMERICAN NLS_DATE_FORMAT DD-MON-RR NLS_CALENDAR GREGORIAN NLS_NUMERIC_CHARACTERS ., NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_CHARACTERSET AL32UTF8 NLS_ISO_CURRENCY AMERICA NLS_CURRENCY $ NLS_TERRITORY AMERICA NLS_LANGUAGE AMERICAN În această bază am o tabelă cu câmpuri caracter, numeric şi de tip dată calendaristică. În aplicaţie există un program executabil, scris cu Visual Fox Pro 9 SP2 care prin intermediul ODBC-ului instalat pe staţia clientului, preia datele din tabelă şi le scrie într-un document Word. Dacă nu ai pretenţii la diacritice atunci problema este simplă. Dacă doreşti şi diacritice atunci trebuie să urmezi următorii paşi care la mine a funcţionat. În tabela Oracle câmpurile de tip caracter se dublează cu altele de tip ”RAW”. Astfel dacă în tabelă avem printre alte câmpuri, NUME VARCHAR2(100) şi PRENUME VARCHAR2(100) , adăugăm două câmpuri noi de tip RAW, RAW_NUME RAW(2000) şi RAW_PRENUME RAW(2000). La introducerea datelor în tabelă am folosit următoarea procedură: DECLARE -- Declarăm variabilele de memorie. M_NRINREG NUMBER := 0 ; CURSOR Naveta is SELECT nrinreg FROM PERSONALITATI_NAVETA ORDER BY nrinreg ; BEGIN -- Ştergem toate înregistrările din Tampon. DELETE FROM PERSONALITATI_NAVETA ; -- Aducem toate înregistrările din tabela PERSONALITATI în tabela PERSONALITATI_NAVETA filtrate pe luna selectată de utilizator. INSERT INTO PERSONALITATI_NAVETA (NRINREG, NUME, PRENUME, DATA_NASTERII, ......) Select NRINREG, NUME,PRENUME, DATA_NASTERII,...... from PERSONALITATI where TO_CHAR(DATA_NASTERII,'MM') = :P75_LUNA; -- Numărăm înregistrările din tabela PERSONALITATI_NAVETA SELECT COUNT(*) INTO M_NRINREG FROM PERSONALITATI_NAVETA; -- Acum înlocuim câmpurile ”XnumeCâmp”, de tip RAW(hexa) cu echivalentul de tip caracter, adică toate câmpurile de tip caracter vor avea o oglindă de tip hexa. OPEN Naveta; FOR i IN 1..M_NRINREG LOOP FETCH Naveta INTO M_NRINREG; UPDATE PERSONALITATI_NAVETA SET XNUME = (SELECT UTL_RAW.CAST_TO_RAW(NUME) FROM PERSONALITATI_NAVETA WHERE NRINREG = M_NRINREG), XPRENUME = (SELECT UTL_RAW.CAST_TO_RAW(PRENUME) FROM PERSONALITATI_NAVETA WHERE NRINREG = M_NRINREG), XINSTITUTIE = (SELECT UTL_RAW.CAST_TO_RAW(INSTITUTIE) FROM PERSONALITATI_NAVETA WHERE NRINREG = M_NRINREG), XCOMISIE = (SELECT UTL_RAW.CAST_TO_RAW(COMISIE) FROM PERSONALITATI_NAVETA WHERE NRINREG = M_NRINREG), XFUNCTIE = (SELECT UTL_RAW.CAST_TO_RAW(FUNCTIE) FROM PERSONALITATI_NAVETA WHERE NRINREG = M_NRINREG), XOBSERVATII = (SELECT UTL_RAW.CAST_TO_RAW(OBSERVATII) FROM PERSONALITATI_NAVETA WHERE NRINREG = M_NRINREG) WHERE NRINREG = M_NRINREG; COMMIT; END LOOP; CLOSE Naveta; END; În acest moment în baza de date Oracle avem stocate date care pot fi preluate de VFP. Trebuie precizat că VFP (cel puţin în cazul meu) nu recunoşte toate tipurile de caractere româneşti. Astfel ”șȘțȚ” scrise cu virgulă le vede ca ”sStT”. În schimb, caracterele cu sedilă ”şŞţŢ” le vede perfect. Evident odată cu ele vede şi ”ĂăîÎâ” tot din setul (Română – standard cu sedilă) care trebuie să existe pe staţia clientului. Aşadar există constrângerea ca în baza de date Oracle să se scrie cu caracterele româneşti cu sedilă în loc de virgulă. Acum trecem la partea de VFP care are următorul cod(include şi transferul datelor în documentul Word care se presupune că există deja creat ca şi machetă): PROCEDURE ConectareServerOracle ******************************* VrfCnxSrv = 0 && Verificare Conexiune Server ( SQLCONNECT() ) VrfDcxSrv = 0 && Verificare Deconexiune Server ( SQLDISCONNECT() ) VrfCommit = 0 && Verificare executare corectă comandă SQL ( SQLCOMMIT() ) VrfExec = 0 && Verificare executare corectă comandă SQL ( SQLEXEC() ) VrfRollBack = 0 && Verificare executare corectă comandă SQL ( SQLROLLBACK() ) *Stabilim o conexiune cu baza de date aflata in schema Personalitati de unde trebuie preluate date dintr-o tabela. SYS(3101,1250) && Acest SYS spune cã toate datele aduse de pe server, sunt convertite la CP1250, adică Central European STORE SQLCONNECT('nume conexiune din TNSNAMES.ORA','utilizator','parolă') TO VrfCnxSrv IF VrfCnxSrv <= 0 MESSAGEBOX(" Conectare nereuşită !, cauze posibile : Credenţiale incorecte , legătura cu reţeaua întreruptă , Server indisponibil ",16," A T E N Ţ I E ") QUIT ENDIF STORE SQLEXEC(VrfCnxSrv,"SELECT * FROM INTERVAL_RAPORTARE","CursorulMeu1") TO VrfEXEC IF VrfEXEC > 0 SELECT CursorulMeu1 STORE ALLTRIM(LUNA) TO LunaP ENDIF STORE SQLEXEC(VrfCnxSrv,"SELECT * FROM PERSONALITATI_NAVETA","CursorulMeu") TO VrfEXEC IF VrfEXEC > 0 SELECT CursorulMeu COPY TO D:\Personalitati.DBF DO Cpzero.PRG WITH "d:\personalitati.dbf",1250 USE D:\Personalitati.DBF EXCLUSIVE INDEX ON ZIUA TAG ZINASTERE DO RAPORT ENDIF STORE SQLDISCONNECT(VrfCnxSrv) TO VrfDcxSrv && Deconectare de la server QUIT RETURN PROCEDURE RAPORT **************** oWord = CreateObject("Word.Application") && Creează obiectul Word oDocument = oWord.Documents.Open("D:\Macheta Personalitati V1.docx") && Deschide un anumit document Word oWord.Visible = .T. && Îl face vizibil pentru utilizator oRange = oWord.ActiveDocument.Range() && sau oRange = oWord.ActiveDocument.Range(1) oTable = oWord.ActiveDocument.Tables.Item(1) && Selectează tabelul 1 din documentul activ(deschis) WITH oTable .Cell[NrLinie,1].Range.InsertAfter(LunaP) FOR NrLinie = 1 TO nRecCount .Cell[NrLinie + 2,1].Range.InsertAfter(AllTrim(Str(Contor) + ".")) .Cell[NrLinie + 2,2].Range.InsertAfter(AllTrim(STRCONV(XPrenume,11,1250,1)) + " " + AllTrim(Nume)) .Cell[NrLinie + 2,3].Range.InsertAfter(DTOC(data_naste)) .Cell[NrLinie + 2,4].Range.InsertAfter(AllTrim(STRCONV(XInstituti,11,1250,1))) .Cell[NrLinie + 2,6].Range.InsertAfter(AllTrim(STRCONV(XComisie,11,1250,1))) .Cell[NrLinie + 2,4].Range.InsertAfter(AllTrim(STRCONV(XFunctie,11,1250,1))) .Cell[NrLinie + 2,7].Range.InsertAfter(AllTrim(STRCONV(Xobservati,11,1250,1))) IF NrLinie < nRecCount .Rows.Add() ENDIF SKIP Contor = Contor + 1 ENDFOR ENDWITH *------------------------------------------------------------------- *oWord.Application.ActiveDocument.Tables.Item(1).Rows.Add() && Adauga o linie la tabelul 1 din documentul deschis curent *------------------------------------------------------------------- ENDIF RETURN Documentul Word este deschis pe ecran iar utilizatorul poate face modificări, poate să-l salveze, apoi îl poate lista la imprimantă. Diacriticile ajung exact aşa cum au fost în baza de date(cu condiţia de mai sus legată de sedilă). Transferul se face repede şi este o alternativă la B.I. Oracle care poate scoate rapoarte Word din Apex. George Chisălescu 0723 370 940

Written By: GeorgeC
Date Posted: 1/26/2017
Number of Views: 174


Comments
You must be logged in to submit a comment.

Return

  

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement