The application structure for an own user interface is described in Structure.
In this example invoices are loaded into a staging table from SAP nad then incorporated into the application.
We chose in this example to implement SQL and PL/SQL, but similar functionality can be achieved with any development environment (for example, Microsoft .Net, Informatica PowerCenter or Pentaho Data Integration) which can load data into the database.
Make a table that will contain the full collection of invoices:
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
/
Make a stored package in Oracle PL/SQL which will try to add the data in the just created table to the existing data:
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;
/
The following steps need to be taken in order to add new invoices:
•Load the data to the staging table xxsap_in_ftr from SAP, using an ETL tool like, for example, Kettle (open source), Microsoft Integration Services or Informatica PowerCenter.
•Start a query tool, such as SQL * Plus, Quest TOAD or Microsoft Access.
•Sign in with a stored procedure call, such as user ‘system’ that has access to all data. It is also possible to choose a different user, but then only data can be loaded from projects to which the respective user has write rights to:
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;
/
•Create a job by loading 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;
/
•Process the invoices by loading xxsap#in_ftr.verwerk.
begin
xxsap#in_ftr.verwerk;
end;
/
•Check the results of the process:
select *
from xxsap_in_ftr
where laad_status = ‘F’
/