从函数开始学习ABAP01

常用表

ZSDR001:
VBAP 销售订单行项目
VBAK 销售订单凭证信息
VBFA 销售订单的后继凭证
BSEG 会计凭证
LIPS 交货单行项目
LIKP 交货单抬头

函数接口创建步骤

  1. SE11定义接口导入导出参数的结构
  2. 创建函数,定义好接口参数等,写代码

实例1:供应商信息同步

SE11定义接口同步字段结构ZOA_VENDOR
供应商信息同步函数接口参数设置:
导入:BURKS TYPE BURKS
表:T_VENDOR LIKE ZOA_VENDOR

代码:
用到的表:LFA1,LFB1,LFBK,BANK

FUNCTION sync_vendor_info_by_company_code 

  DATA: 
    it_vendor TYPE TABLE OF zoa_vendor, " 供应商数据表
    is_vendor TYPE zoa_vendor. " 供应商数据结构,表头
    it_lfbk TYPE TABLE OF lfbk, " 供应商银行信息数据表
    is_lfbk TYPE lfbk. " 供应商银行信息数据结构,表头

*"----------------------------------------------------------------------
*" 通过公司代码获取供应商信息
*"----------------------------------------------------------------------
  SELECT DISTINCT
      lfa1~ lifnr
      lfa1~ name1 
      lfa1~bankl   
      lfa1~banka
    IN CORRESPONDING FIELDS OF TABLE it_vendor
    FROM lfa1 INNER JOIN lfb1 ON lfa1~bukrs=lfb1~bukrs
    WHERE lfb1~bukrs = lv_company_code.

*"----------------------------------------------------------------------
*" 根据输入参数已筛选出来的供应商信息查询银行信息
*"----------------------------------------------------------------------
  IF it_vendor[] IS NOT INNITIAL.
    SELECT * INTO TABLE it_lfbk
    FROM lfbk FOR ALL ENTRIES IN it_vendor
    WHERE lifnr=it_vendor~lifnr.

*"----------------------------------------------------------------------
*" 关联供应商的银行信息并将供应商信息存储到输出表
*"----------------------------------------------------------------------
  LOOP AT it_vendor INTO is_vendor.
    CLEAR lt_vendor_output.
    
    READ TABLE it_lfbk INTO is_lfbk WITH KEY lifnr=is_vendor_lifnr.
    IF SY-SUBRC=0.
     is_vendor~bankl=is_lfbk~bankl.
    ENDIF.
    IF is_vendor~bankl <> ''.
     SELECT SINGLE banka FROM bnka INTO is_vendor~bnka
     WHERE bankl=is_vendor~bankl.
    ENDIF.
    
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
       EXPORTING
         INPUT=is_vendor~lifnr
       IMPORTING
         OUTPUT=is_vendor~lifnr.
         
    APPEND it_vendor TO t_vendor.
  ENDLOOP.

ENDFUNCTION.

相关知识

函数的属性

导入(Importing):这个属性用于指定函数模块的输入参数。当函数模块被调用时,调用者可以向这些输入参数传递数值或数据。在函数模块内部,这些参数是只读的,用于接收外部传入的数据供函数模块内部使用。

导出(Exporting):这个属性用于指定函数模块的输出参数。当函数模块执行完毕后,它可以把一些计算结果或处理后的数据通过这些输出参数返回给调用者。在函数模块内部,这些参数是只写的,用于向外部返回数据。

正在更改(Changing):这个属性用于指定函数模块的输入输出参数。调用者可以向这些参数传递数据,并且函数模块内部也可以修改它们。这样的参数通常用于既是输入又是输出的情况。

表(Tables):这个属性用于指定函数模块的表参数,通常用于传递类似数据库表格的结构化数据。表参数可以是导入、导出或者正在更改的。

例外(Exceptions):这个属性用于指定函数模块可能会抛出的异常情况。如果函数模块在执行过程中遇到了某种错误或者不符合预期的情况,就可以抛出一个例外,以便在调用函数模块的地方进行适当的处理。

DATA定义时TYPE 和LIKE的区别

在ABAP中,TYPE和LIKE都是用于定义数据对象的关键字,它们有一些区别:

  1. TYPE:使用 TYPE 时,你可以将数据对象的类型声明为预定义的数据类型、表类型、结构或类。例如,你可以这样声明一个内部表:
TYPES: BEGIN OF ty_customer,
         customer_id TYPE c LENGTH 10,
         customer_name TYPE string,
       END OF ty_customer.

DATA: lt_customers TYPE TABLE OF ty_customer.

在这个例子中,我们使用了 TYPE 关键字将 lt_customers 声明为一个表类型的数据对象,其类型是我们在 TYPES 区块中预先定义的 ty_customer 结构类型。

  1. LIKE:使用 LIKE 时,你可以基于另一个数据对象的结构定义新的数据对象。例如,你可以这样声明一个变量:
DATA: ls_source TYPE ty_customer,
      ls_target LIKE ls_source.

在这个例子中,ls_target 被声明为与 ls_source 相同类型的结构。这意味着 ls_target 将具有与 ls_source 相同的字段和长度。

总的来说,TYPE 用于引用预定义的类型或自定义类型,而 LIKE 用于基于已存在对象的类型来定义新的对象。

IN CORRESPONDING FIELDS OF TABLE

是一种在 ABAP 编程语言中使用的特殊运算符,它用于在两个表之间进行比较和数据传输。当使用该运算符时,ABAP 会自动比较两个表的相应字段,并将值从一个表传输到另一个表中。

表连接

在 ABAP 中,表连接用于在 SELECT 语句中联接多个数据库表,以便检索相关联的数据。ABAP 提供了几种不同类型的表连接关键字,以满足不同的需求。以下是一些常用的表连接关键字及其用法:

  1. INNER JOIN:内连接,只返回两个表中共有的行。
  2. LEFT OUTER JOIN:左外连接,返回左表中的所有行,以及右表中与左表中行匹配的行(如果有的话)。
  3. RIGHT OUTER JOIN:右外连接,与左外连接相反,返回右表中的所有行,以及左表中与右表中行匹配的行(如果有的话)。
  4. FULL OUTER JOIN:全外连接,返回左表和右表中的所有行,无论是否有匹配的行。如果没有匹配的行,则对应的列会包含空值。

判断内表是否不为空

IF itab[] IS NOT INITIAL.
ENDIF.

少了中括号[] 就变成判断内表表头是否为空,如果该内表恰好没有表头,那么永远为空。

FOR ALL ENTRIES IN

FOR ALL ENTRIES ININNER JOIN 是用于在 ABAP 中检索数据的两种不同方法,它们有一些区别和适用场景。

  1. FOR ALL ENTRIES IN

    • FOR ALL ENTRIES IN 是一种在 SELECT 语句中使用的特殊语法,允许我们根据一个内部表中的值来动态地筛选另一个数据库表中的数据。
    • 适用于当我们需要根据一个动态的、不固定的条件来检索数据时,特别是当我们需要根据内部表中的值来进行筛选时,FOR ALL ENTRIES IN 是非常有用的。
    • 通常用于在不同表之间进行关联,但是关联的条件是动态的,而不是固定的字段之间的关系。
  2. INNER JOIN

    • INNER JOIN 是用于将两个表中相关联的数据连接在一起的操作,返回两个表中共有的行。
    • 适用于在已知两个表之间存在某种固定的关联条件,并且我们希望将这两个表中相关联的数据连接在一起时使用。
    • 通常用于在 SELECT 语句中直接执行表连接,从而一次性检索出相关联的数据。

总的来说,FOR ALL ENTRIES IN 适用于动态条件下的数据检索,而 INNER JOIN 适用于已知条件下的数据连接。在实际应用中,我们可以根据具体的需求和条件选择合适的方法来检索和处理数据。

READ TABLE

在ABAP中,读取内部表的数据可以通过以下几种常见的方法:

  1. 使用READ TABLE语句READ TABLE语句可以用于按行索引或按键值来检索内部表的数据。例如:

    READ TABLE itab INDEX 5 INTO wa.
    READ TABLE itab WITH KEY field1 = value1 INTO wa.
    
  2. 使用LOOP AT语句遍历内部表:通过LOOP AT语句,您可以遍历整个内部表并处理每个元素的数据。例如:

    LOOP AT itab INTO wa.
      " 在这里处理wa中的数据
    ENDLOOP.
    
  3. 使用ASSIGN语句ASSIGN语句可以将内部表的行赋值给一个字段符号或字段符号表。例如:

    ASSIGN itab[5] TO <fs>.
    
  4. 使用DESCRIBE TABLE语句DESCRIBE TABLE语句可以用于获取内部表的信息,如行数、行大小等。虽然它本身不直接用于读取内部表的数据,但可以用于确定循环的次数等信息。

SY-SUBRC

在ABAP中,SY-SUBRC是一个特殊的系统变量,用于表示最近一次数据操作的结果代码。当执行某些特定的数据操作后,系统会将相应的结果代码存储在SY-SUBRC中。而SY-SUBRC等于0表示最近的数据操作成功完成,没有发生错误。

下面是一些常见的情况,SY-SUBRC等于0的含义:

  • SELECT语句中,如果查询成功找到了匹配的数据行,SY-SUBRC会被设置为0。
  • READ TABLE语句中,如果成功找到了指定的行,SY-SUBRC也会被设置为0。
  • 在其他一些数据操作语句中,比如MODIFY, INSERT, DELETE等,如果操作成功完成,SY-SUBRC同样会被设置为0。

通过检查SY-SUBRC的值,程序可以根据数据操作的结果来采取相应的处理逻辑。通常,当SY-SUBRC等于0时,表示数据操作成功,可以继续进行后续的逻辑处理;而当SY-SUBRC不等于0时,表示可能出现了错误或者操作没有成功,需要进行相应的错误处理。

总之,SY-SUBRC=0表示最近的数据操作成功完成,这个特性在ABAP中经常被用来进行错误处理和流程控制。

SELECT 关键字

在ABAP中,SELECT语句用于从数据库表中检索数据。除了常规的SELECT语句外,还有一些相关的关键字可以增强SELECT语句的功能,其中包括以下几个常见的关键字:

  1. DISTINCTDISTINCT关键字用于指定只返回不同的值,即去重。在SELECT语句中使用DISTINCT关键字可以确保结果集中不含有重复的数据行。

  2. SINGLESINGLE关键字用于在SELECT语句中只获取一条符合条件的数据行。如果查询条件返回多条匹配数据,SINGLE将返回第一条匹配的数据行。

  3. FOR ALL ENTRIES INFOR ALL ENTRIES IN关键字用于在SELECT语句中使用内部表的值作为查询条件。通过FOR ALL ENTRIES IN可以实现根据内部表中的值来筛选数据库表中的数据。

  4. UP TO n ROWSUP TO n ROWS关键字用于限制SELECT语句返回的最大数据行数,其中n表示要返回的最大行数。

  5. ORDER BYORDER BY关键字用于在SELECT语句中指定排序顺序。通过ORDER BY可以按照指定的字段对结果集进行升序或降序排序。

  6. GROUP BYGROUP BY关键字用于在SELECT语句中对结果集进行分组。通常与聚合函数一起使用,用于对数据进行分组统计。

运算符

在ABAP中,有许多运算符可用于执行各种算术、逻辑和比较操作。以下是ABAP中常见的一些运算符及其功能:

算术运算符

  1. +-*/:加法、减法、乘法、除法运算符,用于执行基本的算术运算。

比较运算符

  1. =<><<=>>=:等于、不等于、小于、小于或等于、大于、大于或等于运算符,用于比较两个值的大小或相等性。

逻辑运算符

  1. ANDORNOT:逻辑与、逻辑或、逻辑非运算符,用于执行逻辑运算。

字符串连接运算符

  1. &:字符串连接运算符,用于连接两个字符串。

空值检查运算符

  1. IS INITIALIS NOT INITIAL:用于检查字段是否为空或初始化。

赋值运算符

  1. =:赋值运算符,用于将一个值赋给一个变量或字段。

类型转换运算符

  1. CAST:用于将一个值转换为另一种数据类型。

范围运算符

  1. BETWEENIN:用于检查值是否在指定范围内。

其他运算符

  1. MOD:取模运算符,用于获取除法的余数。
  2. **:幂运算符,用于计算一个数的指数。

这些是ABAP中常见的一些运算符,它们用于执行各种类型的操作,包括算术、逻辑、比较等。熟悉这些运算符可以帮助您更好地编写和理解ABAP程序。

CONVERSION_EXIT_ALPHA_OUTPUT

CONVERSION_EXIT_ALPHA_OUTPUT是一个标准的SAP函数,用于将输入的数据从内部格式转换为外部格式。通常情况下,这个函数用于将内部编号或代码转换为适合于显示或输出的格式。

这个函数在SAP中的主要作用是执行以下任务:

  1. 数据转换: 将输入的数据从内部格式转换为外部格式。例如,将一个内部编号转换为可读的、适合于显示的格式。

  2. 格式化输出: 将转换后的数据返回给调用程序,以便用于显示或输出。通常情况下,转换后的数据会更容易被用户理解或处理。

  3. 数据验证: 在转换数据之前,这个函数可能会对输入数据进行验证,以确保其符合特定的格式要求或规范。

代码中,CONVERSION_EXIT_ALPHA_OUTPUT函数被用于将is_vendor~lifnr字段的值从内部格式转换为外部格式,并将转换后的值存储回is_vendor~lifnr字段中。这样做的目的可能是为了确保供应商编号的格式符合特定的要求或标准,以便在显示或输出时能够正确地被处理和识别。

我们可以调这个函数来实现补0这个功能。

CONVERSION_EXIT_ALPHA_INPUT 对话退出ALPHA,外部->内部 这个是补0函数

CONVERSION_EXIT_ALPHA_OUTPUT 对话退出ALPHA,内部->外部 这个是除0函数

CALL FUNCTION

在function中,EXPORTINGIMPORTING关键字用于定义函数参数的传递方向。

  • EXPORTING关键字表示将参数的数值传递给被调用的函数。在函数调用时,这些参数的值会从调用者处传递给被调用的函数。

  • IMPORTING关键字表示将参数的数值从被调用的函数传递回调用者处。在函数调用之后,这些参数的值会从被调用的函数返回给调用者。

CALL FUNCTION适用于调用独立的函数模块,而PERFORM适用于在同一程序内部调用子例程或子程序

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值