čtvrtek 21. října 2010

ODI 11g a SAP ERP - Extrakt dat ze SAPu

Fakta:
  • Zákazník provozuje SAP ERP
  • Do datového skladu je potřeba čerpat data přímo ze SAPu ERP na logické úrovni
  • Využit ODI SAP ERP aplikační konektor a SAP JCO konfigurovaný v předchozím článku
  • Nainstalované ODI11g, master i workrepository, Standalone Agent
  • Protože jsme prováděli na vývoji SAPu, neotestovali jsme zatím zda funguje při sadě oprávnění definované v práva
  • ODI Studio na win32 (windows 7 64 bit), DB Server a Standalone Agent Linux 64
  • Pro přenos extraktů jsme zvolili cestu, kdy máme zprovozněný FTP server (vsftpd), kam bude SAP ukládat extrakty a odkud je my budeme číst (ftp server běží na stejném HW jako DB resp. ODI agent kvůli rychlosti)
  • Infrastruktura (firewall) umožňuje konektivitu ze SAP serveru na náš server (pozor, nezapomenout), stejně tak náš FTP server resp. server má vypnutý firewall resp. nastavené porty (google help) – pozor, když testujete na své lokální mašině, musíte mít povolené na svém firewallu (a nebo ho na dobu otestování vypnout jako já)
  • Verze SAP JCO : sapjco30P_6-win_32bit_10005324 a stejná verze JCO pro linux 64 server
  • Verze LKM pro SAP ERP: Version: 11.1.2.24, Compatability:ODI 11.1.2 and above
  • Ze SAPu bereme celé tabulky (full snapshotů, ale s případným ořezáním na účetní okruh - filtry fungují, join jsme nezkoušel)

Zdroje:

(1) Dokumentace ODI 11g
(2) Dokumentace SAP ABAP ERP
(3) Google – pro konfiguraci vsftpd

Upozornění:
Oproti předchozímu článku si zjistěte od admina SAPu ještě jednu zásadní věc a to kódování, které SAP používá. Tady mají SAP ERP s kódováním SAP CP 1401, což je ISO 8859-2 (budeme je potřebovat později).


Postup na straně ODI:
1. Předpokladem je provedená a otestovaná konfigurace prostředí popsaná v předchozím článku

2. V topologii, jsem u SAP_ABAP Data serveru nastavil ve flexfiledu s názvem SAP CharakterSet hodnotu předanou adminem, tj. ISO-8859-2, aby mi to správně kódovalo řetězce

3. Pomocí Reverse engineeringu jsem ze SAPu reverzoval metadata několika tabulek (BKPF) (platí dále upozornění, že tento revers můžete provést pouze pomocí lokálního agenta v ODI Studiu, a musíte mít na daném počítači instalované SAP JCO) – viz. předchozí díl. Toto proběhlo nad očekávání naprosto bez problému, dotáhl i popis sloupců.

4. Vytvořil a otevřel jsem model resp. diagram (na Oracle DB), kam jsem přetáhl tabulku BKPF, takže mi konvertoval datové typy.

A tady už se dostáváme k jádru pudla :o). Bohužel opět platí, že metadata jsou jedna věc a reálná data druhá věc. Konverze jako taková pracuje v pohodě, ale metadata SAPu nesouhlasí s tím, co je reálně v datech (při importu přetéká rozsahu sloupců atd). Tady máte dvě možnosti:

a) Věřit a pak postupně upravovat cílovou tabulku tak, aby se tam rozsahy vlezly (iterativní a hodně nasírající smyčka)

b) Změnit v cílové tabulce datový typy na obecný VARCHAR2(60) a při loadu ořezávat prázdné mezery

Já si pro tento test vybral první cestu, ale tak mě to naštvalo, že už chystám speciální RKM, který půjde druhou cestou i s dalšími featurami (až bude ve zveřejnitelné podobě, publikuji tento KM jako přílohu u tohoto článku).

Pozor!!! Připomínám, toto přetažení nezkopíruje PK a UK, ty musíte vytvořit ručně.

5. Vytvořil jsem Interface, kde je zdrojem SAP tabulka a cílem Oracle DB, nastavení:

a. Filtr na zdrojové tabulce BKPF.BUKRS = '5000' – identifikace účetního okruhu, pokud je v SAPu najednou vedeno více firem. Zpracování na straně zdroje.

POZOR!!! U podmínek je důležitá jedna věc a to, že musí být s mezerami, tj. BKPF.BUKRS='5000' (hodnoty se uzavírají do apostrofu, v jiné formě háže ABAP chybu)
b. LKM KM – LKM SAP ERP To Oracle (SQLLDR) (Pozn. upravený dle postupu v tomto článku), konfigurace defaultní pro LKM

c. IKM KM – IKM Oracle Incremental Update


6. Opravy resp. zásahy do LKM SAP ERP To Oracle (SQLLDR)

a. Default option: FIELD_ SEPARATOR zvolil jsem pipe | ale záleži na Vás

b. Default option: FTP_PASSIVE_MODE=true – jen zkontrolujte, důležité kvůli firewallu, protože Passive mode běží na stejném portu, aktive vytváří spojení na vyšších portech (což Vám neprojde bez úpravy firewall nastavení). Passive bohatě stačí.

c. Klíčový je FTP_TRANSFER_METHOD=NONE – a zde jsem našel poměrně zásadní chybu resp. rozpor mezi dokumentací KM a kódem KM. Podle dokumentace v KM je nutné tuto hodnotu (FTP_TRANSFER_METHOD=NONE ) nastavit, aby SAP uploadoval na server (vždy přes FTP) a ODI už nic nepřetahuje (podmínkou je FTP server na stejném železe jako běží ODI agent a je i dostupný sqlldr). Asi po dvou dnech pátrání jsem našel chybu. Když dáte NONE, tak se Vám v generovaném ABAP kódu přestanou generovat příkazy na ftp přenos (upload souboru ze SAPu na FTP server), takže Vám sice ABAP vytvoří soubor, ale u sebe na lokále a vy máte smůlu :o). Jinou hodnotu pro připravenou infrastrukturu není možné použít, jinak bych musel přes ODI regulerně znovu stahovat ten samý file a nebo stejně šahat do kódu KM). Takže jsem ponechal NONE (dle dokumentace) a změnil jeden řádek v KM:

Změna je v Details, order 190 – název Extrakt Data v Command on Target najděte tuto sekvenci příkazů a nahraďte ji za tu níže uvedenou (je tam přidán jeden příkaz bUseFTP = true; )
<% // Init code gen vars boolean bUseFTP = false; if (odiRef.getOption("FTP_TRANSFER_METHOD").equals("FTP") || odiRef.getOption("FTP_TRANSFER_METHOD").equals("SFTP") || odiRef.getOption("FTP_TRANSFER_METHOD").equals("SCP")) { bUseFTP = true; }; %>

Nahraďte za sekvenci
<% // Init code gen vars boolean bUseFTP = false; bUseFTP = true; if (odiRef.getOption("FTP_TRANSFER_METHOD").equals("FTP") || odiRef.getOption("FTP_TRANSFER_METHOD").equals("SFTP") || odiRef.getOption("FTP_TRANSFER_METHOD").equals("SCP")) { bUseFTP = true; }; %>

Uložte změnu a máte hotovo z pohledu SAPu…


d. A pak tu máme další změnu (optional) – nevím, zda je to tím, že to běží na unixu, ale když se generuje CTL file, tak mi to tam dělalo psí kusy s uvozovkami a apostrofy. Protože já to měl na Linuxu, musel jsem upravit ještě další kousek KM, ale můžete zkusit, zda Vám to předtím neprojde bez této změny. Jedná se o datové typy DATE a asi i další, já šel cestou nejmenšího odporu, tj. měnil jsem jen to co mi bránilo:

Sekvence 210 Generate Loader Script
Řádek 93, původní verze:
return " DATE " + (char)34 + "YYYYMMDD" + (char)34 + " NULLIF " + colName + " = " +(char)34 + "00000000" + (char)34;

nahraďte:
return " DATE 'YYYYMMDD' NULLIF " + colName + " = '00000000'";

Pro zvídavé, je to proto, že SAP nezná null hodnotu, místo ní používá samé nuly, datum vede vždy ve formátu YYYYMMDD, takže ekvivalentně 00000000
Uložte změny

7. Zkontrolujte u interface, zda se promítly změny v default parametrech LKM SAP ERP to Oracle (SQLLDR)

8. A můžete spouštět…pozor, pokud používáte Standalone Agenta, musíte v něm mít nainstalované SAP JCO adaptéry (viz předchozí článek)


9. Další špek související s kódovou stránkou – pokud použivate UTF-8 nebo jinou codepage, jejíž pojmenování je stejné na SAPu i v Oracle DB, tak nemusíte řešit. Protože ale my máme na SAPu ISO-8859-2, tak máme problém. KM totiž tuto kódovou stranku doplní do parametru CHARACTERSET v ctl file pro SQL*Loader, který ji takto nezná. Ekvivalent je EE8ISO8859P2.

a. Abych toto ad hoc ošetřil, přidal jsem další flexfield pro technologii SAP ABAP (Security, Objects – Data Server, editovat, založka FlexFields, přidat položku a vyplnit viz. obrázek


b. V kódu s order 150 – Get SAP Info je nutné rozšíření kódu následovně (načtení hodnoty TARGET_DB_CHARACTERSET do proměnné sDBCharacterset):
Originál:


Nový kód:


c. V kódu 200-Generate Loader Script pak úprava kódu (jeden řádek) viz níže:
Originál

Nový kód

11. Aby se změny projevili, doporučuji restart ODI Studia

12. A pak už jen znovu start Interface

Protože píšu tento postup ex post, tak doufám, že jsme na nic nezapomněl … a tím končí éra placení šílených pěněz implementátorovi SAPu za přípravu extraktů pro DWH :o))))


V poslední článku mě čeká přechod na inkrementální načítání dat, už mám připraveno, ale musím ještě otestovat, abych Vás nekrmil bludy.


Petr Šimbera (BI/DW Architekt - Freelancer)

čtvrtek 14. října 2010

ODI 11g a SAP ERP - Reverse engineering modelu SAPu

Fakta:
  • Zákazník provozuje SAP ERP
  • Do datového skladu je potřeba čerpat data přímo ze SAPu ERP na logické úrovni
  • Využit ODI SAP ERP aplikační konektor
  • Nainstalované ODI11g a Standalone Agent
  • Protože jsme vše prováděli na vývoji SAPu, neotestovali jsme zatím zda funguje při sadě oprávnění definované v práva
  • ODI Studio na win32 (windows 7 64 bit), DB Server a Standalone Agent Linux 64
  • Pro přenos extraktů jsme zvolili cestu, kdy máme zprovozněný FTP server (vsftpd), kam bude SAP ukládat extrakty a odkud je my budeme číst (ftp server běží na stejném železe jako DB kvůli rychlosti)

Zdroje:
  1. Dokumentace ODI 11g
  2. Dokumentace SAP ABAP ERP

Upozornění:
Pro test připojení a revers engineering metadat prostřednictvím GUI je nutné použít agenta, který je integrován v ODI Studiu - zobrazuje speciální GUI pro výběr tabulek k reverzu


Postup:


Na straně SAP ERP:
1. Vytvořit uživatele pro připojení do SAPu s právy definovanými v dokumentaci 2

2. Dodat instalační soubory pro SAP JCO konektor pro platformy, kde běží ODI studio a Standalone Agent (použit sapjco30P_6-win_32bit_10005324 a sapjco3-linuxx86_64-3.0.6.tgz)

3. Dodat identifikační udaje pro připojení do SAPu:
  • Název resp. IP adresa aplikačního serveru
  • User name
  • Heslo uživatele
  • SAP Systém number
  • SAP klient number
  • SAP Systém ID
  • Zbytek ponechán defaultně
  • Nad rámec si vyžádejte i identifikátor transportation layer pro SAP (identifikátor pro rolování verzí z DEVu na Test a produkci), defaultně je SAP, což není nejvhodnější (zadává se až jako parametr v RKM SAP ERP do parametru SAP_TRANSPORT_LAYER_NAME=ZCD1

Konfigurace ODI:
1. Instalace SAP JCO konektoru:
  • ODI Studio (win32): Rozbalit a dodat soubory sapjco3.jar, sapjco3.dll, sapjcomanifest.mf do ODI_HOME/odi_misc
  • Standalone Agent (lx64): soubory sapjco3.jar, libsapjco3.so do ORA_HOME/oracledi/agent/drivers, přidat cestu k libsapjco3.so do LD_LIBRARY_PATH v profilu uživatele
2. Restartovat ODI studio i všechny použité agenty

3. Dle dokumentace vytvořit topologii, vydefinovat data server

4. Instalovat ODI Open Tools – ODI studio, menu ODI – Add/Remove open Tools, v dialogovén okně zadat Open Tool class name: oracle.odi.sap.km._OdiSapAbapExecute a stisknout zelené plus.


5. Vytvořte projekt

6. Do projektu naimportujte knowledge moduly (Pozor: KM pro aplikace jsou umístěny na companion CD v zip souboru /oracledi-xml_reference.zip):
  • RKM SAP ERP
  • RKM SAP ERP Connection Test
  • LKM SAP ERP to Oracle (SQLLDR)
7. Vytvořte model, např. SAP_test
  • Záložka Definition:

  • Záložka Reverse Engineer:

8. Spusťte revers engeneering. V případě úspěchu se vám otevře okno viz screenshot. V případě neúspěchu se zkuste podívat do operátoru a identifikovat chybu


9. Po úspěšném ověření konektivity otevřete znovu project a nastavte změny na záložce Reverse engeneering (ostatní beze změny) – viz screenshot


Pozor: V rámci prvního spuštění musí být UPLOAD_ABAP_CODE nastaven na true, aby do SAPu mohl negenerovat skupinu funkcí ZODI_FGR, která umožňuje číst SAP metadata. Při dalším spuštění je pak nutné zkontrolovat, že je nastaven na False, jinak generuje chybu, že už RPC existují.

10. Spusťte znovu reverse engineering a objeví se Vám následující okno:


11. Doubleclick na oblasti Vám umožní rozpad až na jednotlivé tabulky – pozor, nelekejte se je to celkem pomalé (hodně objektů v tree). Jdou vidět i jednotlivé sloupce. Pokud jsou objekty komentovány v SAPu, je zde vidět i popis. Pozn. „Z“ tabulky jsou umístěny v hlavní složce UNDEFINED a podložce Z-Category.

12. Po označení zvolených tabulek je proveden reverze metadat, negeneroval mi žádné chyby.


V dalším článku bude popis postupu pro generování interface a problémy, na které jsem narazil.


Petr Šimbera (BI/DW Architekt - Freelancer)

pondělí 11. října 2010

Návštěvnost BI/DW Blogu za Q3/2010

Seznam článků za Q3/2010 (červenec - září 2010), seřazeno dle kategorie

GoldenGate 11g

OBI EE - FAQ | OBI SE ONE - FAQ


OBI EE 11g

OBI EE 11g - FAQ

ODI 11g

ODI 11g - FAQ

středa 29. září 2010

Registrační link na seminář "Nové verze platforem pro datovou integraci" je již dostupný

Registrační link na seminář Nové verze platforem pro datovou integraci - Oracle Data Integrator 11g a Oracle GoldenGate 11g je k dispozici zde.

V případě zájmu se prosím registrujte co nejdříve, počet míst je omezen! Registrace je bezplatná.

čtvrtek 23. září 2010

Upgrade ODI repository z verze 10g na 11g

Předchozí články:

Upgrade ODI repository na verzi 11g nelze provádět pomocí ODI Studia, ale musí se použít Oracle Fusion Middleware Upgrade Assistant pro Data Integrator (je součástí ODI adresáře v Oracle Fusion Middleware instalaci).

Podmínkou upgrade na 11g je
  • mít repository uložené v podporované databázové platformě a verzi (viz. ODI 11g certification matrix)
  • všechna Work repository patřící k jednomu Master repository musí být uložena ve stejné databázi (ODI podporuje distribuování repository do různých databází, ale pro upgrade musí být v jedné).
Před spuštěním upgrade procesu je doručené klonovat všechna 10g repository do nového schématu. V případě, že upgrade z nějakého důvodu neproběhne, pak 10g i 11g repository nebudou funkční.

Dále je vhodné spustit Repository Consistency Checker (RCC) Utility, která zkontroluje strukturu a integritu ODI Repository. RCC Utility je k dispozici na support.oracle.com pod ID 1058107.1.

Moje ODI 10g prostředí
Jedno Master repository:
  • MASTER, dbuser: odi_rep
Čtyři Work repository (DEV, TEST, QA, PROD)
  • ORACLEDI_PRODREP01, dbuser: odi_rep_prod
  • ORACLEDI_WORKREP01, dbuser: odi_rep
  • ORACLEDI_WORKREP02_TST, dbuser: odi_rep_work2
  • ORACLEDI_WORKREP03_QA, dbuser: odi_rep_qa

Klonování
Protože databáze ve které mám uloženy 10g repository nepatří mezi podporované, klonuji je do Oracle 11gR2:

Export uživatelů vlastnící ODI 10g Master a Work repository
exp userid=odi_rep/odi_rep file=c:\odi_rep.dmp
exp userid=odi_rep_prod/odi_rep_prod file=c:\odi_rep_prod.dmp
exp userid=odi_rep_work2/odi_rep_work2 file=c:\odi_rep_work2.dmp
exp userid=odi_rep_qa/odi_rep_qa file=c:\odi_rep_qa.dmp


Založení uživatelů pro upgrade na 11g v 11g db
create user odi11_rep identified by odi11_rep
default tablespace users temporary tablespace temp
quota unlimited on users;

create user odi11_rep_prod identified by odi11_rep_prod
default tablespace users temporary tablespace temp
quota unlimited on users;

create user odi11_rep_work2 identified by odi11_rep_work2
default tablespace users temporary tablespace temp
quota unlimited on users;

create user odi11_rep_qa identified by odi11_rep_qa
default tablespace users temporary tablespace temp
quota unlimited on users;

grant connect,resource to odi11_rep, odi11_rep_prod, odi11_rep_work2, odi11_rep_qa;


Import ODI 10g Master a Work repository do nových schématů v 11g db
imp userid='system/manager' touser=odi11_rep fromuser=odi_rep file=c:\odi_rep.dmp
imp userid='system/manager' touser=odi11_rep_prod fromuser=odi_rep_prod file=c:\odi_rep_prod.dmp
imp userid='system/manager' touser=odi11_rep_work2 fromuser=odi_rep_work2 file=c:\odi_rep_work2.dmp
imp userid='system/manager' touser=odi11_rep_qa fromuser=odi_rep_qa file=c:\odi_rep_qa.dmp



Upgrade pomocí Oracle Fusion Middleware Upgrade Assistant
Upgrade Assistant (ua.bat|sh) je součástí ODI adresáře v Oracle Fusion Middleware instalaci, více viz. zde.


V dalším kroku jsou na výběr dvě možnosti:

Upgrade Middle Tier Instance – zajistí zkopírování konfiguračních souborů a startovacích skriptů pro ODI Standalone Agenta, lze udělat později manuálně (viz. níže v části Po instalační kroky).

Upgrade ODI Repositories
  • Update Topology and Security Metadata - aktualizuje objekty v Topologii a Security pro podporu nových vlastností 11g verze

  • Replace KMs with Mandatory Updates - aktualizuje pouze 10g Knowledge Moduly, které nebudou fungovat v 11g verzi. Jde o následující KM:
    • LKM File to Oracle (EXTERNAL TABLE)
    • LKM File to Netezza (EXTERNAL TABLE)
    • LKM File to Oracle (SQLLDR)
    • LKM File to SAS
    • LKM File to DB2 UDB (LOAD)
    • LKM SAS to SQL
    • LKM SQL to Teradata (TTU)
    • IKM SQL to Teradata (TTU)
    • LKM File to Teradata (TTU)
    • IKM File to Teradata (TTU)
    • IKM Teradata to File (TTU)
    • LKM File to MSSQL (BCP)
    • LKM File to Sybase IQ (LOAD TABLE)

    KM jsou aktualizovány na základě jména, tzn. pokud jste duplikovali a přejmenovali výše uvedené KM, pak jeho úpravu musíte provést manuálně.

    V 11g verzi je opraveno ODIRef API pro getTargetTable a getTableList. V ODI 10g verzi jsou v API prohozeny oddělovače polí a řádků (XFILE_SEP_FIELD, XFILE_SEP_ROW, FILE_SEP_FIELD, FILE_SEP_ROW) a 10g KM s tím počítají. V ODI11g verzi je to opraveno a proto KM musí být aktualizovány.

    KM, které jsou aktualizovány se zálohují do adresáře ...\Middleware\ODI1111\upgrade\odi\KM10g\...

  • Check that Upgrade Occurs Only on Cloned Repositories - provede kontrolu zda upgrade probíhá nad klonovaným repository

Potvrdíme volby


Nastavíme připojení na databázi s klony Master a Work repository, vyplníme vlastníka klonovaného Master repository a aplikačního správce ODI


Installer načte všechna Work repository, vyplníme jména db uživatelů a hesla


Kontrola


Shrnutí


Úspěšné dokončení upgrade repository za cca 5 minut



Po instalační kroky

Standalone Agent
Pokud jste nevybrali Upgrade Middle Tier Instance, pak manuálně překopírujte / upravte skripty pro Standalone Agenta, hlavně odiparams.bat|sh, případně startovací skript.

Poznámka: startovací skript pro Agenta v módu scheduler nekopírujte/nevytvářejte (v 11g již není potřeba). Jen nakonfigurujte v odiparams.bat|sh připojení do Master repository a po startu Agenta se automaticky nastartuje i Scheduler pro jednotlivá repository:


Login pro ODI Studio
Přidejte logovací profil do ODI Studia pro připojení do migrovaných repository. Stačí jej vytvořit pouze na jedné vývojářské stanici a poté rozkopírovat na další. Soubor s loginy je uložen v ?:\Documents and Settings\[uživatel]\Application Data\odi\oracledi\snps_login_work.xml


ODI Open Tools nebo dodatečné JDBC ovladače
Pokud používáte ODI Open Tools nebo dodatečné JDBC ovladače, tak je musíte manuálně nakopírovat do nových adresářů:
  • pro ODI Studio do adresáře na Windows ?:\Documents and Settings\[uživatel]\Application Data\odi\oracledi\userlib\, na UNIXu/LINUXu USER_HOME/.odi/oracledi/userlib

  • pro Standalone Agenta do adresáře na Windows ODI_HOME\oracledi\agent\drivers, na UNIXu/LINUXu ODI_HOME/oracledi/agent/drivers/

Oracle technologie je standardně nastavena s Non-Ordered Joins
Jak v ODI 10g, tak i po upgrade na ODI 11g je v Topologii u technologie Oracle nastaveno Non-Ordered syntaxe pro join (Oracle databáze od verze 10g podporuje jak klasický zápis joinu, tak i ISO zápis). Pro plné využívání nových vlastností ODI 11g je Ordered syntaxe doporučenou syntaxí pro technologii Oracle.


ODI DEMO prostředí (volitelné)
ODI Demo již není součástí standardní instalace ODI, ale volitelnou v ODI Companion CD, viz. zde.

Jakmile ODI Companion stáhnete, rozpalte oracledi-demo.zip do ...\ODI11g\oracledi\demo a poté v ODI Studiu vytvořte na demo profil:


Demo se spouští pomocí ...\ODI1111\oracledi\demo\bin\startdemo.bat, Getting Started Guide pro ODI 11g najdete zde.


Shrnutí
Upgrade mých čtyř work repository proběhl úspěšně a veškeré projekty (i ty u kterých došlo k upgrade KM) fungují jako v 10g verzi. Nefungují mi pouze nově generované Data Services do AXIS2 a to z důvodu, že místo AXIS2 je v ODI 11g pro WS podporován standard JAX-WS.

PS: v případě úpravy technologií a KM nezapomeňte regenerovat Scénáře.



Erik Eckhardt