You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将S/4HANA事务码生成的数据导出至GCP/BigQuery

从本地S/4HANA导出事务码数据到GCP存储桶/BigQuery的Python实现

一、前提准备

  • 安装必要Python库:pyrfc(SAP系统连接)、pandas(数据处理)、google-cloud-storage、google-cloud-bigquery
  • SAP侧:确认账号拥有读取目标事务码对应底层表/调用相关BAPI的权限,收集SAP系统连接参数(服务器地址ASHOST、系统编号SYSNR、客户端编号CLIENT、用户名、密码)
  • GCP侧:创建服务账号,赋予存储桶写入权限和BigQuery数据编辑权限,下载服务账号密钥JSON文件

二、连接S/4HANA获取数据

事务码的报表数据本质来自SAP底层表或BAPI,优先使用BAPI(符合SAP标准调用规范),无对应BAPI时直接读取底层表。

1. 通过BAPI获取数据(示例:物料主数据事务码MM03对应BAPI_MATERIAL_GET_DETAIL)

import pyrfc
import pandas as pd

# 建立SAP连接
sap_conn = pyrfc.Connection(
    ashost="你的SAP服务器地址",
    sysnr="00",
    client="100",
    user="你的SAP账号",
    passwd="你的SAP密码"
)

# 调用BAPI获取指定物料数据
result = sap_conn.call(
    "BAPI_MATERIAL_GET_DETAIL",
    MATERIAL="M-001",
    PLANT="1000"
)

# 将返回的结构化数据转换为DataFrame(可根据BAPI返回结构调整字段)
material_df = pd.DataFrame([result["MATERIAL_GENERAL_DATA"]])
sap_conn.close()

2. 直接读取底层表(示例:读取物料主数据表MARA)

import pyrfc
import pandas as pd

sap_conn = pyrfc.Connection(
    ashost="你的SAP服务器地址",
    sysnr="00",
    client="100",
    user="你的SAP账号",
    passwd="你的SAP密码"
)

# 调用RFC_READ_TABLE读取表数据,支持过滤条件
table_result = sap_conn.call(
    "RFC_READ_TABLE",
    QUERY_TABLE="MARA",
    DELIMITER="|",
    OPTIONS=[{'TEXT': 'MATNR LIKE \'M%\''}]  # 过滤物料编码以M开头的数据
)

# 解析返回的字段和数据行
columns = [col["FIELDNAME"] for col in table_result["FIELDS"]]
rows = [row["WA"].split("|") for row in table_result["DATA"]]
mara_df = pd.DataFrame(rows, columns=columns)
sap_conn.close()

三、导出数据到GCP存储桶

from google.cloud import storage
import pandas as pd
import os

# 设置GCP服务账号密钥路径
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/path/to/your/service-account-key.json"

# 初始化存储桶客户端
storage_client = storage.Client()
bucket = storage_client.get_bucket("your-gcp-bucket-name")

# 将DataFrame保存为CSV(大数据量推荐用Parquet格式)
local_temp_path = "/tmp/sap_material_data.csv"
material_df.to_csv(local_temp_path, index=False)

# 上传文件到存储桶指定路径
blob = bucket.blob("sap_export/material_data.csv")
blob.upload_from_filename(local_temp_path)

四、导出数据到BigQuery

1. 直接从DataFrame上传(适合小数据量)

from google.cloud import bigquery
import pandas as pd
import os

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/path/to/your/service-account-key.json"

bq_client = bigquery.Client()
target_table_id = "your-gcp-project.your-dataset.sap_material_table"

# 上传DataFrame到BigQuery,支持追加或覆盖模式
load_job = bq_client.load_table_from_dataframe(
    material_df,
    target_table_id,
    job_config=bigquery.LoadJobConfig(
        write_disposition="WRITE_APPEND"  # 可选WRITE_TRUNCATE覆盖现有数据
    )
)
load_job.result()  # 等待加载任务完成

2. 从存储桶加载到BigQuery(适合大数据量)

from google.cloud import bigquery
import os

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/path/to/your/service-account-key.json"

bq_client = bigquery.Client()
target_table_id = "your-gcp-project.your-dataset.sap_material_table"

# 配置加载规则
job_config = bigquery.LoadJobConfig(
    source_format=bigquery.SourceFormat.CSV,
    skip_leading_rows=1,
    write_disposition="WRITE_APPEND"
)
# 指定存储桶文件路径
file_uri = "gs://your-gcp-bucket-name/sap_export/material_data.csv"

# 启动加载任务
load_job = bq_client.load_table_from_uri(
    file_uri, target_table_id, job_config=job_config
)
load_job.result()

关键注意事项

  • 事务码数据映射:若不确定事务码对应表/BAPI,可通过SAP事务码SE93查看事务码关联程序,再用SE16N/SE11定位底层表;或通过事务码BAPI打开BAPI Explorer查找对应业务对象的接口。
  • 大数据量优化:读取SAP数据时,可通过RFC_READ_TABLE的ROWSKIPS和ROWCOUNT参数分批获取,避免内存溢出。
  • 权限验证:SAP账号需拥有S_RFC(调用RFC/BAPI)和S_TABU_DIS(读取表)权限;GCP服务账号需绑定roles/storage.objectCreator(存储桶写入)和roles/bigquery.dataEditor(BigQuery编辑)角色。
  • 格式转换:SAP返回的日期(YYYYMMDD格式)、数值格式需转换为标准格式后再导出,可通过Pandas的to_datetime、astype等方法处理。

内容的提问来源于stack exchange,提问作者Sandeep Mohanty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:47:33