Anda di halaman 1dari 49

Rapid Marts packages XI 3.

2 for SAP solutions


Incremental Loads

Rapid Marts Implementation Highlights October 2009

Disclaimer

The information in this presentation is confidential and proprietary to SAP and may not be disclosed without the permission of SAP. This presentation is not subject to your license agreement or any other service or subscription agreement with SAP. SAP has no obligation to pursue any course of business outlined in this document or any related presentation, or to develop or release any functionality mentioned therein. This document, or any related presentation and SAP's strategy and possible future developments, products and or platforms directions and functionality are all subject to change and may be changed by SAP at any time for any reason without notice. The information on this document is not a commitment, promise or legal obligation to deliver any material, code or functionality. This document is provided without a warranty of any kind, either express or implied, including but not limited to, the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. This document is for informational purposes and may not be incorporated into a contract. SAP assumes no responsibility for errors or omissions in this document, except if such damages were caused by SAP intentionally or grossly negligent. All forward-looking statements are subject to various risks and uncertainties that could cause actual results to differ materially from expectations. Readers are cautioned not to place undue reliance on these forward-looking statements, which speak only as of their dates, and they should not be relied upon in making purchasing decisions.

SAP AG 2009. All rights reserved. / Page 2

Agenda

1. Overview
What is an Incremental Load? b) Identifying Changed Records c) Types of Incremental Load in Rapid Marts
a)

2. Financial Documents (Several Methods) 3. Standard & Special Ledgers (Partitioned Tables) 4. Material Documents (Date of Last Change) 5. Purchase Documents (Change History)

SAP AG 2009. All rights reserved. / Page 3

1a. Overview: What is an Incremental (or Delta) Load? The terms Incremental or Delta Load are interchangeable They are designed to minimize load time for Rapid Marts They load only records that have changed in the SAP source system since last update of the Rapid Mart
This is referred to as the Delta between source (SAP) and target (Rapid Mart) systems

They have a Prerequisite: They need a way of identifying changed records in the source (SAP) system

SAP AG 2009. All rights reserved. / Page 4

1b. Overview: Identifying Changed Records Rapid Marts use 2 basic ways of identifying changed records in the SAP source system:
Date of Last Change a date column in the source table Change History Entries in SAP table CDHDR

However:
There are many variations on how these 2 methods are implemented in the SAP source system Many SAP source tables use no method of identifying a changed record at all

This is challenging for Rapid Marts

SAP AG 2009. All rights reserved. / Page 5

1c. Overview: Types of Incremental Load in Rapid Marts


Rapid Marts handle this challenge in many ways Dimensions Small, low volume tables Most use no method to identify changed records Most are Fully Reloaded in Rapid Marts This is not a big impact on Rapid Marts Fact Tables Large, high volume tables Very inconsistent in identifying changed records Some use Date of Last Change Some use Change History Some use no method to identify changed records This has a BIG impact on Rapid Marts This presentation focuses on the various Incremental methods used to load the Fact tables

SAP AG 2009. All rights reserved. / Page 6

1c. Overview: Types of Incremental Load in Rapid Marts

The presentation shows examples for each method used:


Financial Documents
GL, AP, & AR Rapid Marts Various Methods

Standard & Special Ledgers


GL & Cost Rapid Marts Partitioned Tables Method

Material Documents (also called Material Movements)


Inventory Rapid Mart Date of Last Change Method

Purchasing Documents
Purchasing Rapid Mart Change History Method

SAP AG 2009. All rights reserved. / Page 7

Agenda

1. Overview 2. Financial Documents (Several Methods)


a) b) c) d) e)

Overview GL Rapid Mart AP Rapid Mart AR Rapid Mart Additional Suggestions

3. Standard & Special Ledgers (Partitioned Tables) 4. Material Documents (Date of Last Change) 5. Purchase Documents (Change History)

SAP AG 2009. All rights reserved. / Page 8

2a. Financial Documents: Overview


SAP does not have a method to identify changes in the source tables for Financial Documents:
BKPF - Accounting Document Header BSEG - Accounting Document Line Items BSEG_ADD - Accounting Document Line Items (Non-Leading) BSID - Secondary Index for Customers - Open Items BSAD - Secondary Index for Customers - Cleared Items BSIK - Secondary Index for Vendors - Open Items BSAK - Secondary Index for Vendors - Cleared Items

Furthermore, SAP allows:


Adjusting Entries in past fiscal periods Adjusting Entries in future fiscal periods

SAP AG 2009. All rights reserved. / Page 9

2a. Financial Documents: Overview


These conditions pose challenges for Incremental (or Delta) Loads in the Rapid Mart environment This section will explain
The Incremental Load Used in each Rapid Mart The Alternatives Available Additional Customization Suggestions Replication CDC (Change Data Capture)

SAP AG 2009. All rights reserved. / Page 10

2b. Financial Documents: General Ledger Rapid Mart


General Ledger: FINANCIAL_DOCUMENT_FACT Incremental Load Deletes & Reloads a range of fiscal years between
$G_SDATE-1 and $G_EDATE+1 $G_SDATE & $G_EDATE are typically a day or two apart for Incremental Load Example: $G_SDATE = 01-Oct-2009 $G_EDATE = 02-Oct-2009 Range of records deleted: Year of $G_SDATE 1 to Year of $G_EDATE + 1 FY 2008 to FY 2010
Note: $G_SDATE and $G_EDATE are Global Variables set in the Data Services Load Job. For incremental loads, values are typically: $G_SDATE = Date of Last Successful Load $G_EDATE = Current (Todays) Date
SAP AG 2009. All rights reserved. / Page 11

FY 2008 - 2010

Range of Fiscal Years Deleted and Reloaded

FINANCIAL DOCUMENT FACT

2b. Financial Documents: General Ledger Rapid Mart


Consider Changing Delta Load range if:
You post more than 1 Fiscal Year in the Past or Future Your Fiscal Year does not start on January 01 as fiscal year may not coincide with year in $G_SDATE and $G_EDATE

Consider Partitioning FINANCIAL_DOCUMENT_FACT


Partition by Fiscal Year Drop & Re-add Partitions is much faster than deleting range of Fiscal Years

SAP AG 2009. All rights reserved. / Page 12

2b. Financial Documents: General Ledger Rapid Mart Alternative Load


See additional Project in GL ATL called Example General Ledger Rapid Mart SAP
Uses Entry Date (BKPF.CPUDT) as basis for load Entry Date is only reliable timestamp date in Financial Documents Entry Date is date a financial document is created (system assigned) Uses Original Start Date and Absolute Start Date Global Variables to compute incremental range

SAP AG 2009. All rights reserved. / Page 13

2b. Financial Documents: General Ledger Rapid Mart Alternative Load


1. On First Run (Initial Load) of Rapid Mart, value of Global Variable $G_SDATE is stored in table AW_FIRST_RUN_DATE

Note: in First Run, $G_SDATE and $G_EDATE typically load many years of data

AW FIRST RUN DATE


(JOB START DATE = 01-Jan-2000)

Example: $G_SDATE = 01-Jan-2000 $G_EDATE = 31-Dec-2009 10 years of data

2. On Incremental Loads, this value is retrieved and stored in Global Variable $G_ORIG_SDATE $G_ORIG_SDATE = 01-Jan-2000

SAP AG 2009. All rights reserved. / Page 14

2b. Financial Documents: General Ledger Rapid Mart Alternative Load


3. On Incremental Loads, get earliest ENTRY DATE for Open Items from Financial Document Fact.

Select Min(ENTRY_DATE) FINANCIAL DOCUMENT FACT From FINANCIAL_DOCUMENT_FACT where CLEARED_FLAG = N

4. This is stored in Global Variable $G_ABSOLUTE_START_DATE Example: $G_ABSOLUTE_START_DATE = 04-May-2005 Note: BKPF.CPUDT (Entry Date) is stored as FINANCIAL_DOCUMENT_FACT.ENTRY_DATE in the Rapid Mart

SAP AG 2009. All rights reserved. / Page 15

2b. Financial Documents: General Ledger Rapid Mart Alternative Load


5. Delete records from Financial Document Fact. Delete where CLEARED_FLAG = Y and ENTRY_DATE >= $G_ABSOLUTE_START_DATE
Delete Closed records

FINANCIAL DOCUMENT FACT Delete All Open records

Delete where CLEARED_FLAG = N

This ensures records that were open but have closed since last load can be reloaded as closed items

SAP AG 2009. All rights reserved. / Page 16

2b. Financial Documents: General Ledger Rapid Mart Alternative Load


6. Reload From SAP solutions. Where BKPF.CPUDT >= $G_ABSOLUTE_START_DATE and BSEG.AUGDT <> 00000000

Load Closed

SAP Tables BKPF & BSEG

Load Open

Where BKPF.CPUDT >= $G_ORIG_SDATE and BSEG.AUGDT = 00000000

Note: BSEG.AUGDT is the Clearing Date. It is 0000000 for Open Records and set to the clearing (or closing) date for Closed Records.

SAP AG 2009. All rights reserved. / Page 17

2b. Financial Documents: General Ledger Rapid Mart Alternative Load


Advantage:

Loads all possibly changed records


Disadvantage:

Incremental Load can be almost as large as Initial (First) Load


Consider Partitioning Financial Document Fact table to mitigate this impact.

Partition by Fiscal Year Drop & Re-add Partitions is much faster than deleting range of Fiscal Years

SAP AG 2009. All rights reserved. / Page 18

2b. Financial Documents: General Ledger Rapid Mart Alternative Load


Note: You can override the setting of $ABSOLUTE_START_DATE if you are sure records before a certain date can be ignored.

Example: As computed, $G_ABSOLUTE_START_DATE = 14-Jan-2003. This is because you have some very old bad debts that cannot be collected. These are open financial documents. Without these bad debts, $G_ABSOLUTE_START_DATE would be set to 22-Feb-2009. Override the setting to 22-Feb-2009 in your job initialization script in Data Services. The Data Services job will use your override instead of the value in the Financial Document Fact table.

SAP AG 2009. All rights reserved. / Page 19

2c. Financial Documents: AP & AR Rapid Marts


Incremental Logic very similar to Alternate Incremental Logic for GL Rapid Mart on previous slides However some variation is introduced because of differing table architecture in SAP and the Rapid Marts Selection of $G_ABSOLUTE_START_DATE and $G_ORIG_SDATE is the same

SAP AG 2009. All rights reserved. / Page 20

2c. Financial Documents: AP Rapid Mart (1 of 2)


Accounts Payable: VENDOR_ITEM_FACT
BSIK Secondary Index for Vendors - Open Items BSAK Secondary Index for Vendors - Cleared Items These 2 tables only contain records with Account Type = K Source
Load Open: where BSIK.CPUDT >= $G_ORIG_SDATE

Data Services

Rapid Mart Target

BSIK VENDOR ITEM FACT


Delete

BSAK

Data Services

Delete Closed Load Closed: where BSAK.CPUDT >= $G_ABSOLUTE_START_DATE Where CLEARED_FLAG = C and ENTRY_DATE >= $G_ABSOLUTE_START_DATE Delete Open Where CLEARED_FLAG = O
SAP AG 2009. All rights reserved. / Page 21

2c. Financial Documents: AP Rapid Mart (2 of 2)


Accounts Payable: VENDOR_FIN_DOC_FACT BKPF - Accounting Document Header BSEG - Accounting Document Line Items Where Account Type = K or Purch Doc ID is not Blank.
Source
Load Open: where BSEG.AUGBL = and BKPF.CPUDT >= $G_ORIG_SDATE Load Closed: Where BSEG.AUGBL <> and BKPF.CPUDT >= $G_ABSOLUTE_START_DATE Delete Closed Where CLEARED_FLAG = C and ENTRY_DATE >= $G_ABSOLUTE_START_DATE Delete Open Where CLEARED_FLAG = O
SAP AG 2009. All rights reserved. / Page 22

Data Services

Rapid Mart Target

BKPF VENDOR FIN DOC FACT


Delete

Data Services

BSEG

2d. Financial Documents: AR Rapid Mart


Accounts Receivable: CUSTOMER_ITEM_FACT
BSIK Secondary Index for Customers - Open Items BSAK Secondary Index for Customers - Cleared Items These 2 tables only contain records with Account Type = D Source
Load Open: where BSID.CPUDT >= $G_ORIG_SDATE

Data Services

Rapid Mart Target

BSID CUSTOMER ITEM FACT


Delete

BSAD

Data Services

Delete Closed Load Closed: where BSAD.CPUDT >= $G_ABSOLUTE_START_DATE Where CLEARED_FLAG = C and ENTRY_DATE >= $G_ABSOLUTE_START_DATE Delete Open Where CLEARED_FLAG = O
SAP AG 2009. All rights reserved. / Page 23

2e. Financial Documents: Additional Suggestions


These are additional suggestions for optimizing Incremental Loads for Financial Documents
Replication (Mirror) CDC (Change Data Capture)

SAP AG 2009. All rights reserved. / Page 24

2e. Financial Documents: Mirror Replication


Near Real-Time replication (< 1 minute latency) Offered by DBMS or 3rd party software vendors Replicates SAP solutions base tables to a target mirror database The mirror is simply a database No SAP application layer. Usually done by reading database logs on SAP source system. Advantages
Minimal performance impact on source and mirror databases True incremental functionality

Disadvantages
Substantial cost for 3rd party software Need to write database triggers to capture date of last change for SAP base table (BKPF, BSEG, BSID, BSAD, etc) on mirror DB Extensive modification of Rapid Marts to use trigger derived data

SAP AG 2009. All rights reserved. / Page 25

2e. Financial Documents: CDC (Change Data Capture)


Publishes or streams history of transactions Offered by DBMS or 3rd party software vendors History available on demand Usually done by reading database logs on SAP source system into additional history tables or via an API Advantages
Minimal performance impact on source and target databases History can capture changes for financial documents in near real-time True incremental functionality Mirror Database & Triggers not needed

Disadvantages
Substantial cost for 3rd party software Extensive modification of Rapid Marts to use history derived data

SAP AG 2009. All rights reserved. / Page 26

Agenda

1. Overview 2. Financial Documents (Several Methods) 3. Standard & Special Ledgers (Partitioned Tables)
Overview b) Table Partition Example c) Additional Suggestions
a)

4. Material Documents (Date of Last Change) 5. Purchase Documents (Change History)

SAP AG 2009. All rights reserved. / Page 27

3a. Standard & Special Ledgers: Overview


SAP does not maintain a method to identify changes in these source tables for Ledgers in Classic GL:
GLFUNCT - Totals table with functional area for IDES GLPCT - EC-PCA: Totals Table GLT0 - GL Acct. master record transaction figures

This presentation will focus on Partitioned Tables used in Classic GL to accommodate the Incremental Load for these tables Partitioned tables technique is used in:
Cost Center Rapid Mart General Ledger Rapid Mart Plant Maintenance Rapid Mart Project Systems Rapid Mart

SAP AG 2009. All rights reserved. / Page 28

3a. Standard & Special Ledgers: Overview


Each DBMS uses a different architecture for Partitioned Tables Partitions are transparently implemented for 3 of the 4 target data DBMSs supported by Rapid Marts:
Oracle DB2 SQL-Server

The 4th DBMS (Teradata) optimizes the SQL Delete statement so no partitions are needed.

SAP AG 2009. All rights reserved. / Page 29

3a. Standard & Special Ledgers: Advantages of Partitions


They allow quick deletion of data by partition Typically the partition is dropped or truncated Details vary by DBMS Example: Delete Data for a Fiscal Year (Oracle syntax example)
With Non-partitioned table, SQL delete: Delete from table XYZ where FISCAL_YEAR = 2007; Database intensive & Slow With Partitioned table, Truncate: Alter Table XYZ truncate partition FY2007;

Not database intensive & Quick

SAP AG 2009. All rights reserved. / Page 30

3b. Standard & Special Ledgers: Table Partition Example


The target tables are Range partitioned by Fiscal Year
SAP Source Table: GLPCT (EC-PCA Ledger) Rapid Mart Target: PROFIT_CENTER_SUMMARY_FACT_VR

PROFIT CENTER SUMMARY FACT VR

Data for each Fiscal Year in a separate Partition

FISC YEAR 2005 FISC YEAR 2006 FISC YEAR 2007 FISC YEAR 2008
SAP AG 2009. All rights reserved. / Page 31

3b. Standard & Special Ledgers: Table Partition Example


Incremental Load Deletes & Reloads a range of fiscal years between
$G_SDATE and $G_EDATE $G_SDATE & $G_EDATE are typically a day or two apart for Incremental Load At year end this can be a 2 year range Example: $G_SDATE = 01-Oct-2007 $G_EDATE = 02-Oct-2007 Range of records deleted: Year of $G_SDATEto Year of $G_EDATE FY 2007 to FY 2007

PROFIT CENTER SUMMARY FACT VR

FISC YEAR 2005 FISC YEAR 2006 FISC YEAR 2007 FISC YEAR 2008

The incremental load starts by dropping or truncating the partition for the year specified

SAP AG 2009. All rights reserved. / Page 32

3b. Standard & Special Ledgers: Table Partition Example


Depending on target DBMS, a new empty partition may be added to the database for FY2007 However, for all DBMS targets, the end result is an empty Partition for FY2007, ready to receive new data.

PROFIT CENTER SUMMARY FACT VR

FISC YEAR 2005 FISC YEAR 2006

Ready for new Data

FISC YEAR 2007 (Empty) FISC YEAR 2008

SAP AG 2009. All rights reserved. / Page 33

3b. Standard & Special Ledgers: Table Partition Example


The Final step is to extract and reload data from the SAP Source system:
Source Data Services Rapid Mart Target

GLPCT FY 2007
PROFIT CENTER SUMMARY FACT VR

EC-PCA Ledger
FISC YEAR 2005
Data Services

FISC YEAR 2006 FISC YEAR 2007 (Reloaded) (Empty) FISC YEAR 2008

SAP AG 2009. All rights reserved. / Page 34

3c. Standard & Special Ledgers: Additional Suggestions


We recommend your DBA tune your target database for optimal performance with Partitioned tables As delivered, target tables have partitions defined for:
Fiscal Years 1999 2012 If you are loading data outside this range, adjust the target tables with the appropriate range

Consider Changing Delta Load range if:


You post more than 1 Fiscal Year in the Past or Future Your Fiscal Year does not start on January 01 as fiscal year may not coincide with year in $G_SDATE and $G_EDATE

SAP AG 2009. All rights reserved. / Page 35

Agenda

1. Overview 2. Financial Documents (Several Methods) 3. Standard & Special Ledgers (Partitioned Tables) 4. Material Documents (Date of Last Change)
Overview b) Date of Last Change Example
a)

5. Purchase Documents (Change History)

SAP AG 2009. All rights reserved. / Page 36

4. Material Documents

a. b.

Overview Date of Last Change Example

SAP AG 2009. All rights reserved. / Page 37

4a. Material Documents: Overview


SAP maintains date of last change to identify changed Material Documents
Two fields are used in source table MKPF (Material Document Header)

MKPF.CPUDT Entry Date (Created On Date) MKPF.AEDAT Date of Last Change

Both are compared to global variables $G_SDATE and $G_EDATE in the Data Services job

The target table in the Inventory Rapid Mart is


MATERIAL_MVMT_FACT
Note: the terms Material Document and Material Movement are synonymous

SAP AG 2009. All rights reserved. / Page 38

4b. Material Documents: Example


Incremental Load is for range of dates between Global variables $G_SDATE and $G_EDATE $G_SDATE & $G_EDATE are typically a day or two apart for Incremental Load Example: $G_SDATE = 01-Oct-2007 $G_EDATE = 02-Oct-2007 The incremental load selects records from MKPF and MSEG created or changed within this date range. Typically this is a very small set of records

SAP AG 2009. All rights reserved. / Page 39

4b. Material Documents: Example


Material Documents: MATERIAL_MVMT_FACT
MKPF Header: Material Document MSEG Document Segment: Material (Line Items) Source Data Services Rapid Mart Target

Selection Logic: (MKPF.CPUDT >= $G_SDATE AND MKPF.CPUDT <= $G_EDATE) OR (MKPF.AEDAT >= $G_SDATE AND MKPF.AEDAT <= $G_EDATE) MKPF MATERIAL MVMT FACT

Data Services

MSEG

Uses Table Comparison Transform to Insert or Update Target Table

SAP AG 2009. All rights reserved. / Page 40

Agenda

1. Overview 2. Financial Documents (Several Methods) 3. Standard & Special Ledgers (Partitioned Tables) 4. Material Documents (Date of Last Change) 5. Purchase Documents (Change History)
Overview b) Change History Example c) Additional Information
a)

SAP AG 2009. All rights reserved. / Page 41

5a. Purchase Documents: Overview


SAP maintains a set of records in table CDHDR Change History to identify changed Purchase Documents. Within CDHDR these fields are used: CDHDR.OBJECTCLAS = EINKBELEG Identifies the subset of Purchase Documents in CDHDR (Einkbeleg is German for Purchase Document) CDHDR.UDATE Identifies the date of last change CDHDR.OBJECTID The Purchase Document ID

SAP AG 2009. All rights reserved. / Page 42

5a. Purchase Documents: Overview


However, CDHDR entries only identify changes
They do not identify new Purchase Documents

To identify new documents, the item change date on the Purchase Document Line Item is used:
EKPO.AEDAT

Note: Although called change date in the SAP Data Dictionary, EKPO.AEDAT is actually set to the current (system) date when a new Purchase Document is created. Thus it serves as the creation date.

SAP AG 2009. All rights reserved. / Page 43

5a. Purchase Documents: Overview


Therefore, the incremental load uses two ABAP data flows to identify new or changed Purchase Documents
1st pass to identify NEW Purchase Documents 2nd pass to identify CHANGED Purchase Documents

The Rapid Mart uses a text file (flat file) on the SAP server to store the list of changed or new Purchase Documents The text file contains only a list of Purchase Document IDs A 3rd pass reads the text file as input, and collects the remaining fields needed to load Purchase Documents to the Rapid Mart target table.

SAP AG 2009. All rights reserved. / Page 44

5a. Purchase Documents: Change History Example


Incremental Load is for range of dates between Global variables $G_SDATE and $G_EDATE $G_SDATE & $G_EDATE are typically a day or two apart for Incremental Load Example: $G_SDATE = 01-Oct-2007 $G_EDATE = 02-Oct-2007 The incremental load selects records from CDHDR and EKPO created or changed within this date range. Typically this is a very small set of records

SAP AG 2009. All rights reserved. / Page 45

5b. Purchase Documents: Change History Example


1st Pass: Collect New Purchase Document IDs
Input: - EKPO - Purchasing Document Line Items Output: PurchDoc.dat (Text File) SAP Server

PurchDoc.dat EKPO
Data Services

(Delete)
Any existing data (from previous loads) is deleted before new data is added.

Where: EKPO.AEDAT >= $G_SDATE and EKPO.AEDAT <= $G_EDATE

SAP AG 2009. All rights reserved. / Page 46

5b. Purchase Documents: Change History Example


2nd Pass: Collect Changed Purchase Document IDs
Input: - CDHDR - Change document header (Change History Header) Output: PurchDoc.dat (Text File) SAP Server

PurchDoc.dat CDHDR
Data Services

(Append)
Purch. Doc. IDs Appended to results of 1st Data Flow

Where: CDHDR.OBJECTCLAS = 'EINKBELEG' and CDHDR.UDATE >= $G_SDATE and CDHDR.UDATE <= $G_EDATE

SAP AG 2009. All rights reserved. / Page 47

5b. Purchase Documents: Change History Example


3rd Pass: Extract New and Changed Purchase Documents
Input: PurchDoc.dat (Text File) Input: EKKO Purchase Document Header Input: EKPO Purchase Document Line Items Output: PURCH_DOC_FACT Purchase Documents Source Where: PurchDoc.dat.EBELN = EKKO.EBELN and EKKO.EBELN = EKPO.EBELN EKPO
Data Services

Data Services

Rapid Mart Target

EKKO PURCH DOC FACT

Note: EBELN is the SAP column name for Purchase Doc. ID


SAP AG 2009. All rights reserved. / Page 48

PurchDoc.dat (Input)

Uses Table Comparison Transform to Insert or Update Target Table

5c. Purchase Documents: Additional Information


Table CDPOS (Change History Details):
Additional Table for Change History Carries details (which field changed? What was previous value? etc.) This is a clustered table in SAP solutions Very cumbersome to use Slows load performance dramatically We recommend you DO NOT use it

Table CDHDR can be used to identify changes to other documents by using different values for OBJECTCLAS column:
EINKBELEG Purchase Document VERKBELEG Sales Document (used in Sales Rapid Mart) MELDUNG Notifications (Plant Maintenance) MATERIAL Material Master LIEFERUNG Vendor Master

However, to the best of our knowledge:


No definitive list of all possible OBJECTCLAS values exists Many values are in German and can require translation.
SAP AG 2009. All rights reserved. / Page 49

Anda mungkin juga menyukai