matinal:SAP ABAP Native SQL的基本用法

本文介绍了NativeSQL在ABAP中的特性,包括其与标准SQL的区别,如何处理数据库特定SQL、长列和MANDT字段,以及事务控制和游标的使用。同时提到了一些限制,如不能以句点结尾、无注释和参数占位符的使用方式。

Native SQL允许你针对数据库来使用原生的SQL,这些SQL可能是标准的SQL,也可以是某数据库特定的SQL。如果使用database-specific SQL语句,则数据库不能更换,否则请使用Open SQL。

本地SQL会绕过R/3 database interface,操作时不会记录日志,不会同步应用服务器上的database buffer。另外,使用ABAP Dictionary定义的类型为LCHR or LRAW的长列时,这些列需要使用Open SQL来读取,因为读取这些字段时,还需要使用另外存储此类型长列的长度信息,才能准确读出。最后,本地SQL是不会自动能客户端字段MANDT字段进行处理,该字段会像普通字段那样对待。

为了事务的一致性,在本地SQL中不要使用事务控制的语句(如COMMIT, ROLLBACK WORK),以及事务设置语句(如级别设置)

普通SQL

EXEC SQL [PERFORMING <form>].
<Native SQL statement>[;]

ENDEXEC.

Native SQL statement后面的分号是可选的,但不能是“.”

如果Native SQL 是一个从表里SELECT statement时,你可以通过PERFORMING选项的<form>里来一行行读取,如果不需要处理返回结果,或者是UPDATE、DELETE语句时,可以省略选项。

在ENDEXEC执行完后,SY-DBCNT存储了处理的数据行数。在几乎所有情况下,在执行ENDEXEC 后,SY-SUBRC都会为0,但是游标除外,在After FETCH之后,如果没有读取到数据,SY-SUBRC将会为4。

DATA: BEGIN OF wa,
  connid TYPE spfli-connid,
  cityfrom TYPE spfli-cityfrom,
  cityto TYPE spfli-cityto,
END OF wa.
DATA c1 TYPE spfli-carrid VALUE 'LH'.

"Native SQL语句不能以句点号结尾;

"不能在EXEC SQL…ENDEXEC间有注释,即不能有星号与双引号的出现;

"另外还要注意数据库系统大小写是否敏感;

"参数占位符使用冒号,而不是问号;
EXEC SQL PERFORMING loop_output.
  SELECT connid, cityfrom, cityto
    INTO :wa
    FROM spfli
    WHERE carrid = :c1
ENDEXEC.
FORM loop_output.
  WRITE: / wa-connid, wa-cityfrom, wa-cityto.
ENDFORM

或者将上面的INTO :wa替换为:

INTO :wa-connid ,:wa-cityfrom ,:wa-cityto

调用存储过程

EXECUTE PROCEDURE<name> ( <parameter list> )

参数以逗号分隔,并需要IN、OUT 来指定是输入还是输出参数,或者是使用INOUT来表示即是输入也是输出参数

EXEC SQL.
  EXECUTE PROCEDURE proc1 ( IN :x, OUT :y )
ENDEXEC.

游标处理:

•OPEN<cursor name>FOR<statement>

•FETCH NEXT <cursor name>INTO<target(s)>.

•CLOSE<cursor name>

 

DATA: arg1 TYPE string VALUE '800'.
TABLES: t001.
"打开游标
EXEC SQL.
  OPEN c1 FOR SELECT MANDT, BUKRS FROM T001
              WHERE MANDT = :arg1 AND BUKRS >= 'ZA01'
ENDEXEC.
DO.
  "读取游标
  EXEC SQL.
    FETCH NEXT c1 INTO :t001-mandt, :t001-bukrs
  ENDEXEC.
  IF sy-subrc <> 0.
    EXIT.
  ELSE.
    WRITE: / t001-mandt, t001-bukrs.
  ENDIF.
ENDDO.
"关闭游标
EXEC SQL.
  CLOSE c1
ENDEXEC.

<think>好的,我现在需要处理用户关于SAP系统中车间和仓库盘盈盘亏处理方式及差异的问题。首先,我要回忆之前用户提到的内容,用户之前问过车间库负库存的设置,引用了matinalSAP FICO的资料。现在用户进一步询问盘盈盘亏的具体处理方法和区别,需要结合之前的引用信息,同时可能需要补充其他相关知识。 首先,盘盈盘亏通常涉及库存差异的处理,这在SAP中可能通过不同的移动类型和会计科目来体现。根据引用[1],车间库是虚拟库,允许负库存,而实体仓库不允许。这可能影响盘点的处理方式。例如,车间库的差异可能通过生产订单调整,而实体仓库的差异可能直接通过库存调整科目处理。 然后,引用[2]提到KO88结算生产订单时产生的会计凭证,涉及生产成本和材料成本差异科目。这说明生产相关的差异可能通过生产订单结算流程处理,而仓库的差异可能直接调整库存科目。 接下来,我需要区分车间和实体仓库的处理步骤。车间库作为虚拟库,可能与生产订单相关,盘盈盘亏可能通过调整生产订单的投入或产出来处理,使用特定的移动类型如701/702。而实体仓库的差异可能使用移动类型701/702,并直接过账到差异科目,影响库存价值。 另外,会计处理方面,车间库的差异可能关联到生产成本科目,而实体仓库差异可能对应库存调整科目。需要注意系统配置中是否允许负库存对处理方式的影响,车间库允许负库存可能意味着差异处理更灵活,而实体仓库需要及时调整避免负库存。 用户可能还想知道具体的操作事务代码,比如MI07用于库存盘点,MI20查看差异,以及KO88结算生产订单。同时,需要说明两者的核心区别在于库存类型、会计科目和处理流程。 最后,生成相关问题需要考虑用户可能进一步的问题,比如配置步骤、会计凭证差异、生产订单影响等。确保问题覆盖用户可能的兴趣点,帮助他们深入理解处理机制。</think>### SAP车间与仓库盘盈盘亏处理方法及区别 #### 一、车间库(虚拟库)盘盈盘亏处理 1. **业务背景** 车间库作为配合生产回冲扣料的虚拟库,允许负库存[^1],其差异通常与生产订单执行相关。例如:生产投料未完全消耗或退库未及时记录。 2. **处理步骤** - **差异确认**:通过事务代码`MI07`进行库存盘点,系统生成差异清单。 - **调整方式**: - 盘盈:使用移动类型`701`(库存增加)关联生产订单,冲减生产成本。 - 盘亏:使用移动类型`702`(库存减少)关联生产订单,增加生产成本。 - **会计处理**:差异通过生产订单结算(事务代码`KO88`)转入成本中心或差异科目,例如: ``` 借:生产成本-差异调整 贷:库存-车间库 ``` [^2] #### 二、实体仓库盘盈盘亏处理 1. **业务限制** 实体仓库禁止负库存[^1],差异需立即处理,通常由物料管理模块触发。 2. **处理步骤** - **差异过账**:使用移动类型`701`/`702`直接调整库存,系统自动生成会计凭证: ``` 借/贷:库存商品 贷/借:库存盘盈盘亏科目 ``` - **权限控制**:需审批流程(通过审批码或电子工作流)。 #### 三、核心区别对比 | **维度** | **车间库** | **实体仓库** | |----------------|-----------------------------------|--------------------------------| | **库存类型** | 虚拟库(允许负库存)[^1] | 实物库(禁止负库存) | | **差异来源** | 生产订单执行偏差 | 收发存操作误差 | | **会计科目** | 关联生产成本科目[^2] | 直接使用库存调整科目 | | **处理流程** | 需结合生产订单结算(KO88)[^2] | 独立过账,无需关联订单 | #### 四、配置要点 1. **车间库**:在物料主数据中设置“特殊库存标识”(如生产库存),并配置移动类型与生产订单的关联。 2. **实体库**:在物料管理(MM)模块定义库存调整科目,并设置审批策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值