De applicatiestructuur voor een eigen gebruikersinterface staat beschreven in Structuur.
In dit voorbeeld worden facturen geladen in een staging-tabel vanuit SAP en vervolgens verwerkt in de applicatie.
Er is gekozen om dit voorbeeld in SQL en PL/SQL uit te voeren, maar identieke functionaliteit kan bereikt worden met een willekeurige ontwikkelomgeving (bijvoorbeeld Microsoft .Net, Informatica PowerCenter of Pentaho Data Integration) die gegevens in de database kan laden.
Maak een tabel die de volledige verzameling van facturen zal bevatten:
create table xxsap_in_ftr
( ftr_nummer number(15) not null
, ftr_datum_gefactureerd date not null
, lvr_nummer number(15) not null
, ftr_orig_system_reference varchar2(240 char)
, laad_status char(1 byte)
, laad_melding varchar2(2000 char)
, datum_geladen date not null
, datum_aangemaakt date not null
)
tablespace xxsap
/
create index xxsap_ifr_n1 on xxsap_in_ftr
( ftr_nummer
)
tablespace xxsap
/
create unique index xxsap_ifr_nk on xxsap_in_ftr
( ftr_orig_system_reference
)
tablespace xxsap
/
Maak een stored package in Oracle PL/SQL die de geladen gegevens in de zojuist aangemaakte tabel probeert toe te voegen aan de bestaande gegevens:
create or replace package xxsap#in_ftr
as
/*
* $Header: http://svn.invantive.com/repos/p104/trunk/help/nl/manual/Topics/interfacing-voorbeeld.xml 19891 2012-10-09 13:23:03Z gle3 $
*
* (C) Copyright 2004-2012 Invantive Software BV, the Netherlands. All rights reserved.
*/
procedure verwerk
;
end;
/
create or replace package body xxsap#in_ftr
as
/*
* $Header: http://svn.invantive.com/repos/p104/trunk/help/nl/manual/Topics/interfacing-voorbeeld.xml 19891 2012-10-09 13:23:03Z gle3 $
*
* (C) Copyright 2004-2012 Invantive Software BV, the Netherlands. All rights reserved.
*/
--
-- Verwerkt facturen.
--
-- Niet bestaande facturen worden toegevoegd.
-- Verwijderde facturen blijven bestaan.
-- Van gewijzigde facturen wordt niks overgenomen, aangezien de onderliggende tabel
-- grootboek mutaties geen wijzigingen kan bevatten.
--
procedure verwerk
is
--
-- Alle facturen die nog toegevoegd moeten worden op basis van nummer.
--
cursor c_ftr
is
select lfr.*
, lfr.urowid lfr_urowid
from xxsap_in_ftr lfr
where not exists
( select 1
from bubs_facturen_v ftr
where 1=1
and ftr.ftr_nummer = lfr.ftr_nummer
)
--
-- Nog niet aangeboden voor laden.
--
and laad_status is null
;
l_cnt_ftr number(15, 0);
l_cnt_ftr_bad number(15, 0);
l_cnt_ftr_upd number(15, 0);
l_cnt_ftr_upd_bad number(15, 0);
l_laad_status xxsap_in_ftr.laad_status%type;
l_laad_melding xxsap_in_ftr.laad_melding%type;
l_start_tijd date := sysdate;
l_job_seq bubs_jobs_v.job_seq%type;
begin
--
-- Meldingen voor facturen die gewijzigd zijn na verwerking.
--
for r_changed in
( select ftr.ftr_nummer ftr_nummer_old
, lfr.ftr_datum_gefactureerd ftr_datum_gefactureerd_old
, ftr.ftr_datum_gefactureerd ftr_datum_gefactureerd_new
, lfr.lvr_nummer lvr_nummer_old
, ftr.lvr_nummer lvr_nummer_new
, ftr.ftr_orig_system_reference ftr_orig_system_reference_old
, ftr.ftr_datum_intrf_geladen ftr_datum_intrf_geladen_old
from xxsap_in_ftr lfr
join bubs_facturen_v ftr
on lfr.ftr_nummer = ftr.ftr_nummer
where 1=1
and lfr.laad_status is null
and ( lfr.ftr_datum_gefactureerd <> ftr.ftr_datum_gefactureerd
or
lfr.lvr_nummer <> ftr.lvr_nummer
)
)
loop
bubs_job_logging.create_job_melding
( substr
( 'De factuur met nummer '
|| r_changed.ftr_nummer_old
|| ' is gewijzigd in de primaire administratie na verwerking. Zie de volgende meldingen voor meer informatie.'
, 1
, 250
)
, 'Y'
);
bubs_job_logging.create_job_melding
( substr
( 'Datum gefactureerd was '
|| to_char(r_changed.ftr_datum_gefactureerd_old, 'dd-mm-yyyy')
|| ', nu '
|| to_char(r_changed.ftr_datum_gefactureerd_new, 'dd-mm-yyyy')
|| ', leverancier was '
|| r_changed.lvr_nummer_old
|| ' nu '
|| r_changed.lvr_nummer_new
|| '. Oorspronkelijke referentie '
|| r_changed.ftr_orig_system_reference_old
|| ', uitgewisseld '
|| to_char(r_changed.ftr_datum_intrf_geladen_old, 'dd-mm-yyyy hh24:mi:ss')
, 1
, 250
)
, ‘N’
);
end loop;
--
-- Daadwerkelijke toevoeging.
--
<<ftr>>
l_cnt_ftr := 0;
l_cnt_ftr_bad := 0;
l_cnt_ftr_upd := 0;
l_cnt_ftr_upd_bad := 0;
l_job_seq := bubs_job_logging.get_current_job_seq;
for r_ftr in c_ftr
loop
bubs_job_logging.create_job_melding('Laden factuur met nummer ' || r_ftr.ftr_nummer, 'N');
begin
insert into bubs_facturen_v
( ftr_nummer
, ftr_datum_gefactureerd
, lvr_nummer
, ftr_orig_system_reference
, ftr_datum_intrf_geladen
, ftr_job_seq_geladen
)
values
( r_ftr.ftr_nummer
, r_ftr.ftr_datum_gefactureerd
, r_ftr.lvr_nummer
, r_ftr.ftr_orig_system_reference
, l_start_tijd
, l_job_seq
);
l_laad_status := ‘V’;
l_laad_melding := '';
exception
when others
then
bubs_job_logging.create_job_melding(substr('Laden mislukt voor factuur met nummer: ' || r_ftr.ftr_nummer || '. Foutmelding is ' || sqlerrm, 1, 250), 'Y');
l_cnt_ftr_bad := l_cnt_ftr_bad + 1;
l_laad_status := ‘F’;
l_laad_melding := sqlerrm; /* Of dbms_utility.format_error_stack || dbms_utility.format_error_backtrace voor een volledige call stack en foutmelding. */
end;
--
-- Bijwerken laadstatus met uitkomsten van het toevoegen.
--
update xxsap_in_ftr
set laad_status = l_laad_status
, laad_melding = l_laad_melding
, datum_geladen = l_start_tijd
where urowid = r_ftr.lfr_urowid
;
l_cnt_ftr := l_cnt_ftr + 1;
end loop ftr;
--
-- Alle niet relevante data verwijderen, evenals succesvol verwerkte data.
-- Foutief verwerkte records worden na 1 maand verwijderd.
--
delete xxsap_in_ftr where laad_status is null;
delete xxsap_in_ftr where laad_status = ‘V’;
delete bubs_exact_laad_lvr where datum_geladen < add_months(sysdate, -1);
commit;
bubs_job_logging.create_job_melding('Succesvol verwerkte gegevens, evenals niet gewijzigde gegevens zijn verwijderd.', 'N');
--
-- Status overzicht.
--
bubs_job_logging.create_job_melding('Facturen toegevoegd: ' || to_char(l_cnt_ftr, '999G999G990'), 'N');
bubs_job_logging.create_job_melding('- met foutmeldingen: ' || to_char(l_cnt_ftr_bad, '999G999G990'), 'N');
bubs_job_logging.create_job_melding('Facturen gewijzigd : ' || to_char(l_cnt_ftr_upd, '999G999G990'), 'N');
bubs_job_logging.create_job_melding('- met foutmeldingen: ' || to_char(l_cnt_ftr_upd_bad, '999G999G990'), 'N');
commit;
end;
/
De volgende stappen dienen uitgevoerd te worden om de nieuwe facturen toe te voegen:
•Laad de gegevens in de staging-tabel xxsap_in_ftr vanuit SAP, bijvoorbeeld met een ETL tool zoals Kettle (open source), Microsoft Integration Services of Informatica PowerCenter.
•Start een query tool, bijvoorbeeld SQL*Plus, Quest TOAD of Microsoft Access.
•Meld je aan met een stored procedure aanroep, bijvoorbeeld als gebruiker ‘system’ die toegang heeft tot alle gegevens. Het is ook mogelijk een andere gebruiker te kiezen, maar dan mogen uiteraard alleen gegevens geladen worden van projecten waar de desbetreffende gebruiker schrijfrechten op heeft:
begin
bubs_session.set_session_info
( 'xxsap#in_ftr' /* Module. Invullen indien bekend. */
, 'interface' /* Actie. Invullen indien bekend. */
, 'system' /* Aanmeldcode van de gebruiker. */
, 'various' /* Momentele query. Invullen indien bekend. */
, sys_Filter('userenv', 'ip_address') /* IP adres. Invullen indien bekend. */
, sys_Filter('userenv', 'host') /* Hostnaam. Invullen indien bekend. */
, 'n/a' /* URL gekoppeld aan verwerking. Invullen indien bekend. */
, to_char(sysdate,'yyyymmddhh24miss') /* Sessie ID. Invullen indien bekend. */
);
end;
/
•Maak een job aan met een aanroep van bubs_job_logging.create_job.
begin
bubs_job_logging.job_logging
( 'xxsap.exe' /* Executable bestandsnaam. Invullen indien bekend. */
, 'Interface die gegevens vanuit SAP overbrengt naar Invantive Estate.' /* Omschrijving. Invullen indien bekend. */
, 'xxsap_code' /* Code. Invullen indien bekend. */
)
;
end;
/
•Verwerk de facturen met een aanroep van xxsap#in_ftr.verwerk.
begin
xxsap#in_ftr.verwerk;
end;
/
•Controleer de resultaten van de verwerking:
select *
from xxsap_in_ftr
where laad_status = ‘F’
/