Please enable JavaScript to view this site.

Invantive Estate

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’

/