SAP BAPI是个啥

2022-09-15 11:07:09 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

BAPI是什么

  • BAPI是啥
      • 对象是啥
      • 类是啥
      • 继承是啥
      • 接口是啥
      • package是啥
  • BAPI怎么用

BAPI是啥

SAP BAPI(业务应用程序编程接口),是针对业务对象模型的标准接口。BAPI是客户代码和第三方应用程序和SAP交互的主要方法。BAPI封装了SAP业务对象模型的内部层,以确保在访问或者更改业务对象时正确执行所有的业务逻辑,验证和授权检查。 就是Business API.

接口有个封装的概念,好了,是时候把一波概念写一遍了。 要不然我都忘光了。

讲接口之前,先看看对象是啥,我依稀记得是Java课上讲的,但是Java我们就几节课。只记得几个字:基于对象。。。

对象是啥

object, 对象是有相关状态行为的。在开发里面的对象,通常用来指代(更准确的说用来建模)现实世界中的对象。把日常生活中的对象折射到开发世界,这些概念就好理解了。现实世界中,你我都是一个独立的对象,都是人,身高体重几何,一天吃三顿五顿,每天固定干啥。 那么这个软件世界中的对象,你就要表示出它的状态和行为。这里就要介绍到数据封装的概念。

抬眼看看,周围,我们的电动车,手机都是对象。只要是对象,都有两个特性:状态和行为。在开始考虑基于对象编程之前,先考虑现实对象:电动车状态:白色,两轮,有后备箱。行为:加速,刹车,减速,倒挡(没有)。想想你当下,周围,你目所能及的东西,有啥状态,能执行啥行为(功能)。你想想看,花花世界,复杂而多样,有些东西功能多,有些东西功能少。你的眼镜盒,只有开着和关着两种状态,被开和被关两种行为。你的耳机,打开,关闭,暂停,音量调节都可以。而你的手机,那就复杂了,它已经包含了太多的元器件,每个都有很多功能,一时间无从说起。

好了,到这里再来看,各种状态,我们用fields字段来表示,各种行为我们用methods方法来表示。也就是说一个对象把自己的状态存储在fields里面,并且用methods来表示自己的行为。 这个fields和methods呢,某些情况下也叫variable和function,都是一个意思。方法是基于对象的状态来执行,并且是对象与外部对象交互的主要机制。也就是你做了什么,和别人交互了啥,那只能是通过你的行为。对象封装就是表示隐藏了一个对象的内部状态,并且要求所有交互通过对象的方法执行。这就是基于对象编程的基本原理。

具体来说是怎样的呢?首先赋予一个对象状态,然后提供更改状态的方法。还来看咱的电动车,当前被赋予的状态:当前速度,当前挡位。那我可以通过提速和换挡的方法来改变我的当前状态。而且新国标的最大速度25km/h,也就是规定了,我再提速,也不能超过这个速度。也就是我提速这个方法是有限制的,需要小于25。这也就是说和外部的交互,有时候会被内部的状态限制。

在对象上写入方法的好处是啥呢?也就是将方法绑定到对象上,以下好处: 1.模块化:一个对象的源代码可以独立于其他对象的源代码来编写和维护。对象一旦创建,就可以在系统内部轻松地传递。

2. 信息隐藏:通过只与对象的方法交互,其内部实现的细节对外部世界保持隐藏。

3. 代码重用:如果一个对象已经存在(可能是由另一个软件开发人员编写的),则可以在程序中使用该对象。这允许专家实现/测试/调试复杂的任务特定对象,然后你可以信任这些对象在自己的代码中运行。

4. 可插拔性和调试简易性:如果某个特定对象出现问题,您可以简单地将其从应用程序中删除,然后插入另一个对象作为其替代对象。这类似于解决现实世界中的机械问题。如果螺栓坏了,你要更换它,而不是整个机器。

类是啥

所谓物以类聚,人以群分。这把class翻译成类的真是个人才,我搞一个模子,然后造了N个行李箱。所有的行李箱都是咱这一类。有相同的造型和功能。于是咱讲,你这个行李箱就是这个行李箱类的一个实例。所有对象呢,都是基于这一套蓝图包含相同的组件。类就是单个对象创建的蓝图。

代码语言:javascript复制
// class Bicycle {

    int cadence = 0;
    int speed = 0;
    int gear = 1;

    void changeCadence(int newValue) {
         cadence = newValue;
    }

    void changeGear(int newValue) {
         gear = newValue;
    }

    void speedUp(int increment) {
         speed = speed   increment;   
    }

    void applyBrakes(int decrement) {
         speed = speed - decrement;
    }

    void printStates() {
         System.out.println("cadence:"  
             cadence   " speed:"   
             speed   " gear:"   gear);
    }
}

以上是个Java语法,基于对象的定义,在类里有几个状态:cadence,speed,gear。还定义了几个方法:changeCadence,changeGear,speedUp等,定义了和外部世界的交互行为。 以上的类没有包含main这个方法。因为它不是一个完整的应用。只是个可能被用到应用中的bicycle的蓝图。创建和使用新bicycle对象的职责在别的类里。 下面有个类,创建了两个bicycle对象,并且引用了他们的方法。

代码语言:javascript复制
class BicycleDemo {
    public static void main(String[] args) {

        // Create two different Bicycle objects
        Bicycle bike1 = new Bicycle();
        Bicycle bike2 = new Bicycle();

        // Invoke methods on those objects
        bike1.changeCadence(50);
        bike1.speedUp(10);
        bike1.changeGear(2);
        bike1.printStates();

        bike2.changeCadence(50);
        bike2.speedUp(10);
        bike2.changeGear(2);
        bike2.changeCadence(40);
        bike2.speedUp(10);
        bike2.changeGear(3);
        bike2.printStates();
    }
}

运行的结果如下:

代码语言:javascript复制
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3

继承是啥

不同种类的对象呢,有时候是由很多组件或者特性是一样的。 就拿经典自行车来举例子,山地车,城市车,一般自行车,都有一些相同的特性,都有属性当前速度,当前挡位。然后还得有些不同的特性,要不然咋区分价格。山地车有些还带记速器,夜灯,还有一个链条盘。一般的车还得带个车篓子。 基于对象编程允许类来继承共用的状态和行为。也就是说自行车作为老子,儿子有山地车,城市车,公共自行车。在Java里面,每个类都可以有一个直接的父类,父类可以有无限多的子类。用extends来定义子类,后面是要继承的父类。

代码语言:javascript复制
class MountainBike extends Bicycle {

    // 子类新字段和方法new fields and methods defining a mountain bike would go here

}

已经继承了父类的字段和方法,子类的实现里只要写出自己独特的字段和方法。

接口是啥

好了现在回到接口是啥,现在咱知道了,对象通过定义自己的方法来和外界交互。方法就形成了对象和外界的接口。通过打开电脑电源开关,我们获得了和塑料外壳包裹的一系列计算组件的交互。这个开关就是个接口。 接口就是一组相关的方法的空主体

代码语言:javascript复制
interface Bicycle {

    //  wheel revolutions per minute
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}

为了实现这个接口,类的名字可能会改变,比如说针对某个品牌的自行车:在类声明中使用这个关键字:implements

代码语言:javascript复制
class ACMEBicycle implements Bicycle {

    int cadence = 0;
    int speed = 0;
    int gear = 1;

   // The compiler will now require that methods
   // changeCadence, changeGear, speedUp, and applyBrakes
   // all be implemented. Compilation will fail if those
   // methods are missing from this class.

    void changeCadence(int newValue) {
         cadence = newValue;
    }

    void changeGear(int newValue) {
         gear = newValue;
    }

    void speedUp(int increment) {
         speed = speed   increment;   
    }

    void applyBrakes(int decrement) {
         speed = speed - decrement;
    }

    void printStates() {
         System.out.println("cadence:"  
             cadence   " speed:"   
             speed   " gear:"   gear);
    }
}

实现接口可以使类对它承诺提供的行为变得更加正式。接口在类和外部世界之间形成一个契约,这个契约在编译时由编译器强制执行。如果你的类声明实现接口,则该接口定义的所有方法必须出现在其源代码中,然后类才能成功编译。

要实际编译ACMEBicycle类,需要在实现的接口方法的开头添加public关键字。

package是啥

是一个组织了一组类和接口的命名空间。类似文件夹,一个程序可能有几千个类,那我们把同一类的类和接口放到一个怕卡个里。方便查找。 类库就是很多个package。Java平台提供了很多类库,被称作API,应用程序接口。 它的packages里是通用编程最常见的任务。例如,字符串对象包含字符串的状态和行为;文件对象允许程序员轻松地创建、删除、检查、比较或修改文件系统上的文件;套接字对象允许创建和使用网络套接字;各种GUI对象控制按钮和复选框以及与图形用户界面相关的任何内容。实际上有成千上万的类可供选择。咱们可以专注于特定应用程序的设计,而不是使其工作所需的基础设施。

BAPI怎么用

BAPI是以function module的形式实现,来调用SAP的内部代码。根据所使用的BAPI集,可以调用使用Business Objects Processing Framework(这玩意我也不知道是啥)定义的业务对象模型,或者调用使用程序,表和功能模块定义的旧模型。 BAPI公开的正式而稳定的接口,客户和第三方代码的开发人员可以使用他们来访问SAP业务对象,并与之建立接口。SAP也保证了这个方式未来一直可用。 也有其他接口访问SAP基础表和非BAPI功能模块,程序,类。但是SAP不保证代码在未来一直可用,或者被访问的对象会一直存在。 像上述的非BAPI接口使用会导致万一内部功能模块的签名更改,则升级过程中的会有小问题或者需要小补丁,从而使基于盖接口的代码失效。

BAPI只能在发布后才能使用,也就是说SAP指定说这些接口可用,并且保证以后稳定。可以通过查看功能模块BAPI的“属性”部分中的“发布日期”来检查发布状态。如果该字段为空,那么BAPI尚未由SAP发布,因此不应使用。 为了在高级业务应用程序编程(ABAP)语言中使用BAPI,开发人员使用ABAP的call function来调用function module。另外,大多数bapi都支持远程,这意味着可以通过远程函数调用(remote function call ,RFC)、web服务或SAP的Java连接器来调用它们。

在基于ABAP平台的每个SAP产品中,有一些bapi可以实现大多数业务流程的完全自动化。每个SAP产品的文档提供了有关可用BAPI的一些信息。在SE37和se80或ABAP for Eclipse中搜索以BAPI开头的功能模块可以查询到相关信息。

每个BAPI功能模块都应具有多种语言的广泛文档,可通过SE37中的function module documentation选项访问。仔细阅读文档非常重要,因为bapi的结构和行为差异很大,而且它们有时会以意想不到的方式工作,或者在不满足其需求的情况下失败,并显示隐藏的错误消息。

许多BAPI具有复杂的结构,这些结构模仿底层的业务对象结构。如上图用于修改业务伙伴地址的BAPI包含多个导入结构以及大量表参数,这些参数可以向BAPI传递附加信息,也可以从BAPI传递附加信息。 图中两个重要参数是ADDRESSDATA和ADDRESSDATA_X。这种类型的配对是bapi的典型类型,其中第二个结构是一组标志,精确地指示哪些字段应该更新。

因为bapi是作为function module来实现的,所以它们不适合ABAP面向对象编程(OOP)的类、方法和接口范例。尽管如此,它们通常是以面向对象的方式实现的,因为它们是SAP业务对象的接口。 在ABAP中,这些功能模块可以从程序、函数模块或类中调用。通常最好在数据访问对象(DAOs)中包装BAPI调用,DAO是封装对BAPI调用的类。这样做可以使用DAO的模拟版本进行单元测试,从而允许对开发人员代码的测试与BAPI调用本身的测试分开。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163927.html原文链接:https://javaforall.cn

0 人点赞