Skip to main content

BICS Protocol Deep Dive

This comprehensive guide covers the BICS (BI Consumer Services) protocol in ERPL. Learn how to execute SAP BW queries, extract cube data, and track end-to-end lineage from source tables to BEx queries.

What is BICS?

BICS (BI Consumer Services) is SAP's protocol for accessing SAP Business Warehouse (BW) data. It allows you to execute queries, extract cube data, access InfoProviders, and track complete data lineage from source ERP tables through transformations to final BEx queries.

BICS Architecture

Basic Querying

List Available Cubes and Queries

-- Show all InfoProviders (Cubes)
SELECT * FROM sap_bics_show('CUBE');

-- Show all queries
SELECT * FROM sap_bics_show('QUERY');

-- Show all InfoProviders
SELECT * FROM sap_bics_show('INFOPROVIDER');

Simple Query Execution

The basic BICS query pattern follows this flow:

  1. Begin - Start a query session
  2. Filter - Apply filters and selections
  3. Result - Execute and get data
-- Basic pattern: begin → filter → result
SELECT * FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
)
);

-- More complex example with multiple filters
SELECT * FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401',
'0CALYEAR', '2024',
'0MATERIAL', 'MAT001'
)
);

Column Selection

-- Select specific columns
SELECT * FROM sap_bics_result(
sap_bics_columns(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
),
'0CALMONTH',
'0CALYEAR',
'0MATERIAL',
'0SALES_AMOUNT'
)
);

Intermediate Querying

Working with Hierarchies

-- List available hierarchies
SELECT * FROM sap_bics_show_hierarchies();

-- Query hierarchy data
SELECT * FROM sap_bics_hierarchy(
'0MATERIAL_HIER',
'MAT001'
);

InfoObject Details

-- Describe InfoObject
SELECT * FROM sap_bics_describe_infoobject('0MATERIAL');

-- Get InfoObject details
SELECT
technical_name,
description,
data_type,
length
FROM sap_bics_describe_infoobject('0MATERIAL');

Query Descriptions

-- Describe cube structure
SELECT * FROM sap_bics_describe('0BWTESTCUBE');

-- Describe query
SELECT * FROM sap_bics_describe('0BWTESTCUBE', 'ZQUERY_SALES');

-- Describe persisted query
SELECT * FROM sap_bics_describe();

Advanced Querying

Complex Filtering

-- Multiple filter conditions
SELECT * FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401',
'0CALYEAR', '2024',
'0MATERIAL', 'MAT001',
'0SALES_ORG', '1000'
)
);

-- Range filters
SELECT * FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401',
'0SALES_AMOUNT', '1000', '5000' -- Range from 1000 to 5000
)
);

Query State Management

-- Begin query session
SELECT * FROM sap_bics_begin('0BWTESTCUBE');

-- Apply filters
SELECT * FROM sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
);

-- Get results
SELECT * FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
)
);

Advanced: Lineage Tracking (For SAP BW Experts)

For BI Administrators

This section covers advanced lineage tracking from ERP tables through DataSources, InfoProviders, and BEx queries.

Complete Query Lineage

The sap_bics_query_lineage() function provides complete end-to-end lineage from ERP source tables to BEx queries, aggregating all metadata into a flat edge list suitable for:

  • Impact Analysis - What happens if a source table changes?
  • Data Governance - Track data flow and transformations
  • Documentation - Automatic lineage documentation
  • Compliance - Audit data lineage for regulations
-- Get full lineage from source to query
SELECT * FROM sap_bics_query_lineage('0D_FC_NW_C01_Q0008');

-- Analyze lineage structure
SELECT
source_type,
source_name,
target_type,
target_name,
transformation_type
FROM sap_bics_query_lineage('0D_FC_NW_C01_Q0008')
ORDER BY source_type, target_type;

Lineage Graph Analysis

-- Get lineage edges for graph visualization
SELECT * FROM sap_bics_lineage_edges('0D_FC_NW_C01_Q0008');

-- Get lineage as JSON graph
SELECT * FROM sap_bics_lineage_graph_json('0D_FC_NW_C01_Q0008');

-- Trace specific path
SELECT * FROM sap_bics_lineage_trace('0D_FC_NW_C01_Q0008');

Metadata Mining

-- InfoProvider metadata
SELECT * FROM sap_bics_meta_providers();

-- DataSource metadata
SELECT * FROM sap_bics_meta_datasources();

-- Transformation metadata
SELECT * FROM sap_bics_meta_transformations();

-- Query metadata
SELECT * FROM sap_bics_meta_queries();

-- Query usage statistics
SELECT * FROM sap_bics_meta_query_usage();

-- Query elements
SELECT * FROM sap_bics_meta_query_elements();

-- Query statistics
SELECT * FROM sap_bics_meta_query_stats();

Field-Level Metadata

-- DataSource field metadata
SELECT * FROM sap_bics_meta_datasource_fields();

-- Provider field metadata
SELECT * FROM sap_bics_meta_provider_fields();

-- Transformation field metadata
SELECT * FROM sap_bics_meta_transform_fields();

-- HCPR (Hierarchy Change Pointer) metadata
SELECT * FROM sap_bics_meta_hcpr();

-- HCPR mapping metadata
SELECT * FROM sap_bics_meta_hcpr_mapping();

-- InfoObject metadata
SELECT * FROM sap_bics_meta_infoobjects();

-- Object cross-reference metadata
SELECT * FROM sap_bics_meta_objxref();

Real-World Examples

Daily Sales Report

-- Extract daily sales data from BW cube
WITH daily_sales AS (
SELECT
"0CALMONTH" AS sales_month,
"0MATERIAL" AS material,
"0SALES_AMOUNT" AS amount,
"0SALES_QTY" AS quantity
FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401',
'0SALES_ORG', '1000'
)
)
)
SELECT
sales_month,
COUNT(*) AS material_count,
SUM(amount) AS total_amount,
SUM(quantity) AS total_quantity,
AVG(amount) AS avg_amount
FROM daily_sales
GROUP BY sales_month
ORDER BY sales_month;

Material Analysis with Hierarchy

-- Analyze materials using hierarchy
WITH material_hierarchy AS (
SELECT * FROM sap_bics_hierarchy('0MATERIAL_HIER', 'MAT001')
),
sales_data AS (
SELECT
"0MATERIAL" AS material,
"0SALES_AMOUNT" AS amount
FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
)
)
)
SELECT
h.hierarchy_level,
h.material_name,
s.amount,
s.amount * 100.0 / SUM(s.amount) OVER() AS percentage
FROM material_hierarchy h
JOIN sales_data s ON h.material = s.material
ORDER BY s.amount DESC;

Cross-System Data Integration

-- Combine BW data with ERP data
WITH bw_sales AS (
SELECT
"0MATERIAL" AS material,
"0SALES_AMOUNT" AS bw_amount
FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
)
)
),
erp_materials AS (
SELECT
MATNR AS material,
MTART AS material_type,
MEINS AS base_unit
FROM sap_rfc_read_table('MARA', LIMIT => 10000)
)
SELECT
e.material,
e.material_type,
e.base_unit,
b.bw_amount,
CASE
WHEN b.bw_amount > 10000 THEN 'High Value'
WHEN b.bw_amount > 1000 THEN 'Medium Value'
ELSE 'Low Value'
END AS value_category
FROM erp_materials e
LEFT JOIN bw_sales b ON e.material = b.material
WHERE b.bw_amount IS NOT NULL
ORDER BY b.bw_amount DESC;

Performance Optimization

Query Optimization

-- Use column selection to reduce data transfer
SELECT * FROM sap_bics_result(
sap_bics_columns(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
),
'0CALMONTH',
'0SALES_AMOUNT' -- Only select needed columns
)
);

-- Apply filters early to reduce data volume
SELECT * FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401', -- Filter by month first
'0SALES_ORG', '1000' -- Then by sales org
)
);

Batch Processing

-- Process multiple queries in parallel
SELECT 'Q0001' AS query_name, COUNT(*) AS record_count
FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
)
)

UNION ALL

SELECT 'Q0002' AS query_name, COUNT(*) AS record_count
FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202402'
)
);

Troubleshooting

Common Issues

Query Not Found

-- Check available queries
SELECT * FROM sap_bics_show('QUERY');

-- Verify query name (case-sensitive)
SELECT * FROM sap_bics_describe('0BWTESTCUBE', 'ZQUERY_SALES');

Permission Denied

-- Check InfoProvider access
SELECT * FROM sap_bics_show('CUBE');

-- Verify user permissions in SAP BW
SELECT * FROM sap_bics_describe('0BWTESTCUBE');

Data Not Found

-- Check filter values
SELECT * FROM sap_bics_describe_infoobject('0CALMONTH');

-- Verify data exists
SELECT * FROM sap_bics_result(
sap_bics_begin('0BWTESTCUBE') -- No filters to see all data
);

Debugging Tips

-- Enable debug mode
SET debug_mode = true;

-- Check query structure
SELECT * FROM sap_bics_describe('0BWTESTCUBE');

-- Test basic query
SELECT * FROM sap_bics_begin('0BWTESTCUBE');

-- Monitor query performance
EXPLAIN SELECT * FROM sap_bics_result(
sap_bics_filter(
sap_bics_begin('0BWTESTCUBE'),
'0CALMONTH', '202401'
)
);

For SAP BW Experts

Advanced BICS Internals

This section covers BICS protocol internals for SAP BW administrators and developers.

BICS Protocol Details

BICS uses HTTP/HTTPS with XML payloads for communication:

  • Port: Usually 8080 or 8443 (HTTPS)
  • Protocol: HTTP/HTTPS with XML
  • Authentication: Basic Auth or SAML
  • Compression: Optional gzip compression
  • Unicode: Full Unicode support

Performance Considerations

  1. Query Optimization: Use filters and column selection
  2. Connection Pooling: Reuse connections for multiple queries
  3. Batch Processing: Process multiple queries in parallel
  4. Metadata Caching: Cache metadata for repeated access

Security Best Practices

  1. Network Security: Use HTTPS for all BICS connections
  2. Authentication: Use strong passwords or certificates
  3. Authorization: Implement proper BW user roles
  4. Audit Logging: Enable BICS audit logs in SAP BW

Lineage Tracking Best Practices

  1. Regular Updates: Refresh lineage data periodically
  2. Impact Analysis: Use lineage for change impact assessment
  3. Documentation: Generate automatic lineage documentation
  4. Compliance: Maintain lineage for regulatory requirements

Next Steps

🚀 Ready for More?

🔧 Advanced Topics

💡 Examples


Need help? Check our troubleshooting guide or browse more examples.