eksport do excela z Oracle Forms
mcinek@gmail.com - 16-03-2007 00:02
eksport do excela z Oracle Forms
Witam.
Chciałbym zrobić następującą rzecz: na formularzu umieścić przycisk, którego kliknięcie spowoduje utworzenie pliku w formacie excela (bądź jakimś łatwo importowalnym, np. csv) z danymi aktualnie pokazywanymi w formularzu, czyli uwzględniającymi zapytania określone już podczas budowy formularza, a jeszcze lepiej wprowadzone przez użytkownika w trybie zapytań. Czy da się zrobić coś takiego?
Wiem, że można zrobić eksport po prostu z tabeli. Ale czy można wtedy 'pobrać' jakoś zapytanie używane aktualnie w formularzu?
Mam nadzieję, że dość jasno przedstawiłem mój nietypowy problem:)
Pozdrawiam Marcin
Pudel - 17-03-2007 00:02
mcinek@gmail.com napisał(a): > Witam. > > Chciałbym zrobić następującą rzecz: na formularzu umieścić przycisk, > którego kliknięcie spowoduje utworzenie pliku w formacie excela > (bądź jakimś łatwo importowalnym, np. csv) z danymi aktualnie > pokazywanymi w formularzu, czyli uwzględniającymi zapytania > określone już podczas budowy formularza, a jeszcze lepiej wprowadzone > przez użytkownika w trybie zapytań. Czy da się zrobić coś takiego? > > Wiem, że można zrobić eksport po prostu z tabeli. Ale czy można > wtedy 'pobrać' jakoś zapytanie używane aktualnie w formularzu? > > Mam nadzieję, że dość jasno przedstawiłem mój nietypowy problem :) > > Pozdrawiam > Marcin >
Witam, Załączam przykładowy plik wysyłający dane do excela. Zmienna z_plik zawiera nazwę pliku excel (ścieżkę). Z_str zawiera ścieżkę do pliku excel.exe. EXCEL_INV w rejestrze powinno zawierac położenie pliku excel.exe
Na początku trzeba rozpocząć prace excela
appid := dde.app_begin (z_str, dde.app_mode_normal);
póżniej inicjuje się konwersację
convid := dde.initiate ('excel', 'system');
póżniej się otwiera plik
dde.EXECUTE (convid, '[Open("' || z_plik || '")]', 60000);
póżniej się otwiera konwersację z dokumentem
docid := dde.initiate ('excel', z_plik);
Te etapy można trkatować jako zło konieczne. Rozumienie ich nie jest wymagane.
Poterzebne jest znaczenie procedur: Oblicz współrzędne - przeksztalca współrzedną w formacie XX999 an wiersz i kolumnę. Na przykład A1 wiersz 1 kolumna 1. Ta procedura jest kiepska była sklecona "na chybcika" ale powinna wystarczyć, bo obejmuje przypadki do 800 kolumn i nieograniczonej ilości wierszy.
Następna jest "Przekaz". Wysyła dane ascii pod wskazany adres na arkuszu (dane inne niż ascii trzeba przekształcic na ascii).
Procedura zmień_arkusz zmienia arkusz na wskazany w parametrze.
aby zakończyć przekazywanie danych trzeba wykonać
dde.EXECUTE (convid, '[Save]', 60000); dde.TERMINATE (docid); dde.TERMINATE (convid);
procedure oblicz_wspolrzedne(znaki varchar2,p_wiersz in out number,p_kolumna in out number ) is
wiersz number:=0; kolumna number:=1; /* format współrzędnej - jedna lub dwie duże litery ASCII, po których liczba */ begin /* pierwsza musi być litera */ kolumna:= ascii(substr(znaki,1,1))-ascii('A')+1; if substr(znaki,2,1) not between 'A' and 'Z' then wiersz:=wiersz*10+ascii(substr(znaki,2,1))-ascii('0'); else kolumna:= kolumna*26+ascii(substr(znaki,2,1))-ascii('A')+1; end if; for i in 3..NVL(length(znaki), 0) loop wiersz:=wiersz*10+ascii(substr(znaki,i,1))-ascii('0'); end loop; p_wiersz:=wiersz; p_kolumna:=kolumna; end;
/* Formatted on 2004/04/28 23:23 (Formatter Plus v4.8.0) */ PROCEDURE excel IS /* Declare variables */ z_str VARCHAR2 (100); z_plik VARCHAR2 (100); appid PLS_INTEGER; convid PLS_INTEGER; docid PLS_INTEGER; conv_established BOOLEAN := FALSE; z_wspolrzedna VARCHAR2 (10) := NULL; z_arkusz VARCHAR2 (30);
PROCEDURE zmien_arkusz (p_arkusz VARCHAR2) IS BEGIN /* zmieniamy aruksz w razie potrzeby */ IF p_arkusz IS NOT NULL THEN dde.TERMINATE (docid); /* to zabawne gówno lubi mieć nazwę arkusza dłuższĹĄ niż 4 znaki, ha,ha,ha */ docid := dde.initiate ('excel', z_plik || ':' || p_arkusz); /* progress indication */ dde.EXECUTE (convid, '[workbook.select("' || p_arkusz || '", "' || p_arkusz || '")]', 60000 ); END IF; END;
PROCEDURE przekaz (p_wspolrz VARCHAR2, p_dane VARCHAR2) IS z_wiersz NUMBER; z_kolumna NUMBER; BEGIN IF p_wspolrz IS NULL THEN RETURN; END IF;
oblicz_wspolrzedne (p_wspolrz, z_wiersz, z_kolumna); /*================================================= =================== Nie będzie progress indication bo excel XP lubi mieć WK DDE.EXECUTE(convid, '[formula.goto("R'||to_char(z_wiersz)||'C'|| to_char(z_kolumna)||'")]', 60000); ================================================== =====================*/ dde.poke (docid, 'W' || TO_CHAR (z_wiersz) || 'K' || TO_CHAR (z_kolumna), p_dane, dde.cf_text, 60000 ); END;
PROCEDURE transfer_daty IS z_wspolrz mr_spr.wspolrz_okr%TYPE; z_arkusz mr_spr.arkusz_okr%TYPE; BEGIN SELECT s.wspolrz_okr, s.arkusz_okr INTO z_wspolrz, z_arkusz FROM mr_spr s WHERE ID = :mr_spr.ID;
/* Mamy podane wspolrzedne? */ IF z_wspolrz IS NULL THEN RETURN; END IF;
/* zmieniamy arkusz w razie potrzeby */ zmien_arkusz (z_arkusz); przekaz (z_wspolrz, :okres.id_okres); END;
PROCEDURE transfer IS z_wartosc VARCHAR2 (40);
CURSOR wyr_cur IS SELECT s.wspolrz, s.arkusz, s.ID FROM mr_spr_wyr s WHERE s.id_spr = :mr_spr.ID AND (s.wspolrz IS NOT NULL OR s.arkusz IS NOT NULL) ORDER BY s.ID; BEGIN FOR wyr_rec IN wyr_cur LOOP /* Warto�ci */ z_wspolrzedna := wyr_rec.wspolrz; z_arkusz := wyr_rec.arkusz; zmien_arkusz (wyr_rec.arkusz);
BEGIN SELECT TO_CHAR (w.wartosc) wartosc INTO z_wartosc FROM mr_wartosc w WHERE w.id_zest = para.id_zest AND w.id_spr_wyr = wyr_rec.ID;
przekaz (wyr_rec.wspolrz, z_wartosc); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; END LOOP; END; BEGIN pobierz_id_zest; z_plik := :mr_spr.plik;
/* jak krótszy niż 5 to uzupełnij extension */ IF NVL (LENGTH (z_plik), 0) < 5 THEN z_plik := z_plik || '.xls'; END IF;
/* jak extension nie ma to dopisz */ IF SUBSTR (z_plik, NVL (LENGTH (z_plik), 0) - 3, 1) <> '.' THEN z_plik := z_plik || '.xls'; END IF;
/* Start Excel */ tool_env.getvar ('EXCEL_INV', z_str);
IF z_str IS NULL THEN blad ('Wpisz ciĹĄg excel_inv do rejestru'); END IF;
appid := dde.app_begin (z_str, dde.app_mode_normal);
/* Establish a conversation with Excel */ /* The following loop will not end until a conversation with Excel has been established. Therefore, it can result in a endless loop, so use with caution. */ WHILE NOT conv_established LOOP BEGIN convid := dde.initiate ('excel', 'system'); conv_established := TRUE; EXCEPTION WHEN dde.dmlerr_no_conv_established THEN conv_established := FALSE; END; -- loop END LOOP;
/* Open Excel document */ /* This assumes that you have an Excel spreadsheet named ddetest.xls in the root of e: */ dde.EXECUTE (convid, '[Open("' || z_plik || '")]', 60000); /* Initiate conversation with Excel document */ docid := dde.initiate ('excel', z_plik); -- dde.app_focus(appid); transfer_daty; transfer; dde.EXECUTE (convid, '[Save]', 60000); komunikat ('Operacja wykonana'); /*End transfer to Excel */ dde.TERMINATE (docid); dde.TERMINATE (convid); -- DDE.APP_END(appid); /* if z_wspolrzedna is null then blad('Nie było danych do przekazania.'); end if; */ /* Handle exceptions */ EXCEPTION WHEN dde.dde_app_failure THEN MESSAGE ('Aplikacja Excel nie może wystartować.'); WHEN dde.dde_param_err THEN MESSAGE ('A NULL VALUE WAS PASSED TO DDE'); WHEN dde.dmlerr_no_conv_established THEN MESSAGE ('Nie mogę rozpoczĹĄć konwersacji. Sprawdďż˝ nazwę pliku.'); WHEN dde.dmlerr_notprocessed THEN blad ( 'Nie mogłem przekazać danych do komórki ' || z_wspolrzedna || ' Na arkuszu ' || z_arkusz ); /* End of trigger */ END;
ZepZoSo - 20-03-2007 00:02
Użytkownik brzdąka pod nosem: > Chciałbym zrobić następującą rzecz: na formularzu umieścić przycisk, > którego kliknięcie spowoduje utworzenie pliku w formacie excela
Spróbuj obczaić takie coś co się OLE2 zowie.
-- Z
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|