从sap获取数据写入数据库操作

一、什么是从sap获取数据?

每个公司拉sap数据方法不一样,有些还需要验证,具体问题,具体分析,这边大致给一个思路

SAP,为“System Applications and Products”的简称,是SAP公司的产品——企业管理解决方案的软件名称。SAP公司(纽交所代码:SAP)成立于1972年。
简而言之就是写一个接口,让别人调用,你发送一个json格式数据过去,对面响应并且返回数据,再写入数据库

二、如何是从sap获取数据?

这种情况下,数据库是不会优先建立的,需要你先得到数据,再去写数据库,最后插入数据

1.先在controller层写出接口

@Slf4j
@RestController
@RequestMapping("接口")
public class TabZmmo3110MaterialDataController {
   
   
    @PostMapping("地址")
    @ResponseBody
    public void getHistoryBill(@RequestBody String object) {
   
   
        System.out.print(object);
        log.info("------------call------------");
    }
}

2.在call层写出方法(call层为请求层)

@RestController
@RequestMapping("接口")
@Slf4j
public class Zmmo3110MaterialDataCall {
   
   
    @GetMapping("/地址")
    public int execute() throws Exception {
   
   
        log.info("call---------------");
        Map<String, Object> params = new HashMap<String, Object>();
        Map<String, Object> p = new HashMap<String, Object>();
        p.put("abcde", "122");
        p.put("abcdef", "121");
        p.put("abcdefg", "222");
        p.put("abcdefgh", "111");
        p.put("a", "211");
        p.put("ab", "2121");
        p.put("abc", "1212");
        params.put("", p);

        String url = "这边写你sap的地址"; //测试
        int code = run(params, url);
        if (code == 202 || code == 200 || code == 204) {
   
   
            log.info("请求成功!");
            return code;
        } else {
   
   
            log.info("程序异常!");
            return code;
        }
    }

    public int run(Map<String, Object> params, String url) {
   
   
        Gson gson = new Gson();
        String pars = gson.toJson(params);
        String userName = "test";
        String password = "123456";

        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(userName, password));
        CloseableHttpClient createDefault = HttpClients.custom()
                .setDefaultCredentialsProvider(credsProvider)
                .build();

        HttpPost post = new HttpPost(url);

        StringEntity entity = new StringEntity(pars.toString(), "utf-8");
        entity.setContentEncoding("UTF-8");
        entity.setContentType("application/json");

        post.setEntity(entity);

        CloseableHttpResponse result = null;
        try {
   
   
            result = createDefault.execute(post);
        } catch (IOException e) {
   
   
            e.printStackTrace();
        }

        int code = result.getStatusLine().getStatusCode();
        return code;
    }
}

(1)Gson工具包

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.google.gson;

import com.google.gson.internal.ConstructorConstructor;
import com.google.gson.internal.Excluder;
import com.google.gson.internal.Primitives;
import com.google.gson.internal.Streams;
import com.google.gson.internal.bind.ArrayTypeAdapter;
import com.google.gson.internal.bind.CollectionTypeAdapterFactory;
import com.google.gson.internal.bind.DateTypeAdapter;
import com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory;
import com.google.gson.internal.bind.JsonTreeReader;
import com.google.gson.internal.bind.JsonTreeWriter;
import com.google.gson.internal.bind.MapTypeAdapterFactory;
import com.google.gson.internal.bind.ObjectTypeAdapter;
import com.google.gson.internal.bind.ReflectiveTypeAdapterFactory;
import com.google.gson.internal.bind.SqlDateTypeAdapter;
import com.google.gson.internal.bind.TimeTypeAdapter;
import com.google.gson.internal.bind.TypeAdapters;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import com.google.gson.stream.MalformedJsonException;
import java.io.EOFException;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicLongArray;

public final class Gson {
   
   
    static final boolean DEFAULT_JSON_NON_EXECUTABLE = false;
    static final boolean DEFAULT_LENIENT = false;
    static final boolean DEFAULT_PRETTY_PRINT = false;
    static final boolean DEFAULT_ESCAPE_HTML = true;
    static final boolean DEFAULT_SERIALIZE_NULLS = false;
    static final boolean DEFAULT_COMPLEX_MAP_KEYS = false;
    static final boolean DEFAULT_SPECIALIZE_FLOAT_VALUES = false;
    private static final TypeToken<?> NULL_KEY_SURROGATE = TypeToken.get(Object.class);
    private static final String JSON_NON_EXECUTABLE_PREFIX = ")]}'\n";
    private final ThreadLocal<Map<TypeToken<?>, Gson.FutureTypeAdapter<?>>> calls;
    private final Map<TypeToken<?>, TypeAdapter<?>> typeTokenCache;
    private final ConstructorConstructor constructorConstructor;
    private final JsonAdapterAnnotationTypeAdapterFactory jsonAdapterFactory;
    final List<TypeAdapterFactory> factories;
    final Excluder excluder;
    final FieldNamingStrategy fieldNamingStrategy;
    final Map<Type, InstanceCreator<?>> instanceCreators;
    final boolean serializeNulls;
    final boolean complexMapKeySerialization;
    final boolean generateNonExecutableJson;
    final boolean htmlSafe;
    final boolean prettyPrinting;
    final boolean lenient;
    final boolean serializeSpecialFloatingPointValues;
    final String datePattern;
    final int dateStyle;
    final int timeStyle;
    final LongSerializationPolicy longSerializationPolicy;
    final List<TypeAdapterFactory> builderFactories;
    final List<TypeAdapterFactory> builderHierarchyFactories;

    public Gson() {
   
   
        this(Excluder.DEFAULT, FieldNamingPolicy.IDENTITY, Collections.emptyMap(), false, false, false, true, false, false, false, LongSerializationPolicy.DEFAULT, (String)null, 2, 2, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
    }

    Gson(Excluder excluder, FieldNamingStrategy fieldNamingStrategy, Map<Type, InstanceCreator<?>> instanceCreators, boolean serializeNulls, boolean complexMapKeySerialization, boolean generateNonExecutableGson, boolean htmlSafe, boolean prettyPrinting, boolean lenient, boolean serializeSpecialFloatingPointValues, LongSerializationPolicy longSerializationPolicy, String datePattern, int dateStyle, int timeStyle, List<TypeAdapterFactory> builderFactories, List<TypeAdapterFactory> builderHierarchyFactories, List<TypeAdapterFactory> factoriesToBeAdded) {
   
   
        this.calls = new ThreadLocal();
        this.typeTokenCache = new ConcurrentHashMap();
        this.excluder = excluder;
        this.fieldNamingStrategy = fieldNamingStrategy;
        this.instanceCreators = instanceCreators;
        this.constructorConstructor = new ConstructorConstructor(instanceCreators);
        this.serializeNulls = serializeNulls;
        this.complexMapKeySerialization = complexMapKeySerialization;
        this.generateNonExecutableJson = generateNonExecutableGson;
        this.htmlSafe = htmlSafe;
        this.prettyPrinting = prettyPrinting;
        this.lenient = lenient;
        this.serializeSpecialFloatingPointValues = serializeSpecialFloatingPointValues;
        this.longSerializationP
<think>首先,用户的问题是:“我想获取SAP系统中报工状态的数据 请问SAP BAPI 获取报工状态数据的方法”。这涉及到SAP系统中的报工状态数据,我需要提供使用BAPI的方法。 根据系统级指令: - 所有行内数学达式使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:引用[1], [2], [3], [4]。 站内引用内容: - 引用[1]: 关于BAPI清单、SE37测试过程等。 - 引用[2]: BAPI是业务对象函数,RFC是远程函数调用。 - 引用[3]: 物料主数据BAPI示例。 - 引用[4]: 销售订单和生产订单相关的BAPI。 用户需求是获取报工状态数据。在SAP中,报工通常与生产订单相关,比如确认生产活动(如工时、数量等)。报工状态可能涉及生产订单的状态。 关键BAPI:在SAP PP模块中,报工(Confirmation)相关的BAPI可能包括: - BAPI_ALM_CONF_GETDETAIL:获取确认详情。 - BAPI_PRODORD_GET_DETAIL:获取生产订单详情,包括状态。 - 或者特定于报工的BAPI。 我需要回忆或推断合适的BAPI。基于引用,引用[4]提到“销售订单自动产生生产订单,对生产订单进行下达”,这暗示生产订单相关。报工状态可能在生产订单的确认部分。 标准BAPI: - 获取生产订单状态:BAPI_PRODORD_GET_STATUS - 获取确认数据:BAPI_ALM_CONF_GETLIST 或类似。 更精确地,BAPI用于报工(Confirmation): - BAPI_PRODORDCONF_GETDETAIL:获取生产订单确认详情。 - 或 BAPI_ALM_CONF_GETDETAIL。 为了准确,我应该建议用户使用SE37事务码查找BAPI,或者提供常见BAPI。 回答结构: 1. 理解需求:解释报工状态在SAP中的含义。 2. 推荐BAPI:列出可能的BAPI。 3. 使用步骤:如何测试和使用BAPI。 4. 注意事项:如提交事务等。 5. 生成相关问题。 参考引用: - 引用[1]提到SE37测试过程和COMMIT BAPI写入数据。 - 引用[2]解释BAPI和RFC。 - 引用[3]给出BAPI参数示例。 - 引用[4]提到生产订单。 在回答中,自然地添加引用标识。 生成相关问题: - 例如:如何测试BAPI?BAPI调用后如何提交?其他相关BAPI? 最终回答用中文。</think>### SAP BAPI 获取报工状态数据的方法 在SAP系统中,报工状态(Confirmation Status)通常与生产订单(Production Order)相关,示生产活动(如工时、数量完成情况)的确认状态。获取这些数据可以使用SAP提供的BAPI(Business Application Programming Interface)函数,这些函数基于RFC(Remote Function Call)实现,能安全地访问业务对象数据[^2]。下面我将逐步指导您如何获取报工状态数据。 #### 步骤1: 理解报工状态数据 报工状态数据存储在SAP的生产订单确认相关中,例如: - `AFRU` :存储生产订单确认记录。 - `AUFK` :存储订单主数据,包括状态。 关键字段包括: - 订单号(`AUFNR`) - 确认号(`RSNUM`) - 状态码(`STATUS`,如CNF示已确认) - 完成数量(`ISMNW`)等。 BAPI函数可以直接查询这些数据,无需直接访问数据库,确保数据一致性[^1]。 #### 步骤2: 推荐使用的BAPI函数 以下是获取报工状态数据的常用BAPI函数。您可以在SAP事务码SE37中测试这些函数(参考引用[1]的SE37测试过程)。 1. **BAPI_PRODORDCONF_GETDETAIL** - **功能**:获取生产订单确认的详细信息,包括状态、数量、时间等。 - **关键参数**: - `CONFIRMATION`:输入确认号或订单号。 - `RETURN`:输出错误信息。 - `CONF_DETAIL`:输出确认详情,包括状态字段。 - **示例代码(ABAP调用)**: ```abap DATA: lt_return TYPE TABLE OF bapiret2, lt_conf_detail TYPE TABLE OF bapi_alm_conf_detail. CALL FUNCTION 'BAPI_PRODORDCONF_GETDETAIL' EXPORTING confirmation = '100000001' " 输入生产订单号或确认号 TABLES conf_detail = lt_conf_detail return = lt_return. " 检查返回状态 IF lt_return IS INITIAL. COMMIT WORK. " 提交事务以确保数据写入(参考引用[1]的COMMIT处理) ELSE. ROLLBACK WORK. " 回滚错误 ENDIF. ``` - 输出`lt_conf_detail`包含状态字段如`CONF_STATUS`(例如:'CNF'示已确认)。 2. **BAPI_PRODORD_GET_DETAIL** - **功能**:获取生产订单整体详情,包括报工状态(通过状态对象链接)。 - **关键参数**: - `NUMBER`:输入生产订单号。 - `STATUS`:输出订单状态,包括报工状态码。 - `RETURN`:输出错误信息。 - **适用场景**:当您需要订单级状态时使用(引用[4]提到生产订单相关逻辑)。 3. **BAPI_ALM_CONF_GETLIST** - **功能**:批量获取多个确认记录的状态列。 - **关键参数**: - `CONFIRMATION_RANGE`:输入订单号范围。 - `CONF_LIST`:输出确认列,包括状态字段。 - 适合处理大量数据。 #### 步骤3: 使用SE37测试BAPI(推荐方法) 1. 打开事务码SE37,输入BAPI函数名(如`BAPI_PRODORDCONF_GETDETAIL`)。 2. 在测试界面输入参数: - 例如,`confirmation`字段填入生产订单号(如从`AUFK`获取)。 3. 执行测试(F8),检查输出(如`conf_detail`)中的状态字段。 4. 如果数据写入后台,使用`COMMIT WORK`命令提交事务(参考引用[1]的COMMIT BAPI处理)。 5. 测试完成后,可导出参数结构用于ABAP程序开发。 #### 注意事项 - **权限要求**:确保用户有生产模块(PP)的访问权限,否则BAPI调用可能失败。 - **错误处理**:BAPI返回`RETURN`包含错误码(如类型'E'示错误),需在代码中处理回滚(引用[1])。 - **性能优化**:对于大批量数据,使用范围参数(如`CONFIRMATION_RANGE`)减少调用次数。 - **数据一致性**:BAPI直接操作业务对象,避免直接修改数据,确保系统稳定[^2]。 - 如果报工状态与特定模块(如CO模块的成本确认)相关,可能需要组合其他BAPI,如`BAPI_ACC_ACTIVITY_ALLOC_POST`。 通过以上方法,您可以高效获取报工状态数据。如果遇到具体错误,可提供订单号示例,我会进一步协助分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值