标签: opensql

手动设置SELECT-OPTIONS?

我有一个程序,除其他外,它RESB根据bdter字段(一种 DATS 类型)从表中检索数据。在选择屏幕上,用户指定范围或使用标准范围(月初 - 今天)。

但是,如果我尝试在未填写日期的情况下(用户未输入日期范围)尝试重新使用我为日期创建的选择选项,则我对该工作区的更改似乎无法识别在我的选择语句中使用它。

相关代码段如下。经过一些测试,我得出结论:

  • 如果s_bdter没有被用户修改并随后在代码中设置,则不会过滤任何记录

  • 如果s_bdter被用户修改,记录被正确过滤

  • 如果s_bdter被用户修改并随后在代码中修改,记录将被正确过滤

     SELECT-OPTIONS: s_bdter FOR ls_itab-bdter MODIF ID sbd.
    
     START-OF-SELECTION.
     " Set the interval.
     s_bdter-sign = 'I'.
     s_bdter-option = 'BT'.
     s_bdter-low = lc_bdter_start.
     s_bdter-high = sy-datum + 30.
    
     " This select doesn't filter on bdter unless the selection parameter was set by the user.
     SELECT r~aufnr p~psphi
         FROM resb AS r
         INNER JOIN afpo AS o ON o~aufnr = r~aufnr
         INNER JOIN …
    Run Code Online (Sandbox Code Playgroud)

abap opensql sap-selection-screens

2
推荐指数
1
解决办法
2万
查看次数

在子查询中选择多个字段

此 ABAP 代码有效:

  select *
   into table <sub_result>
  from ADRC
  WHERE ADDRNUMBER
  in ( select ADRNRA from AUFK where (cond_string) ).
Run Code Online (Sandbox Code Playgroud)

但这不会:

  select *
   into table <sub_result>
  from ADRC
  WHERE (ADDRNUMBER, MANDT)
  in ( select ADRNRA, MANDT from AUFK where (cond_string) ).
Run Code Online (Sandbox Code Playgroud)

AFAIK元组语法(ADDRNUMBER, MANDT)对SQL有效。这在 ABAP 的 Open SQL 中无效吗?

如果不允许元组语法,我该怎么办?

PS在 Open SQL 中不需要检查 MANDT,所以这只是示例查询。

abap opensql

2
推荐指数
1
解决办法
1543
查看次数

允许当前用户查看的BUKRS列表

有没有办法获得当前用户可以看到的所有BUKRS列表?

我想在open sql中使用此列表作为过滤器.想象一下我搜索存储结果的方法的结果bk_list.然后我可以bk_list像这样使用:

SELECT * FROM some_table WHERE bukrs IN bk_list
Run Code Online (Sandbox Code Playgroud)

sap abap opensql

2
推荐指数
1
解决办法
441
查看次数

如何获取数据库表的行数

我是abap语言的新手,我正在尝试练习内部连接语句,但我不知道在输出之前我是否能够获得select语句的行数.

这就是我想要达到的目标.

<--------------------------------------- >

<总行数>找到的记录|

Column Header 1|Column Header 2 ..

<data .... retrieve>

<--------------------------------------- >

以下是我的选择声明:

 SELECT spfli~carrid scarr~carrname sflight~planetype sflight~fldate sflight~price spfli~cityfrom spfli~cityto
   INTO (g_carrid ,g_carrname ,g_planetype,g_fldate ,g_price ,g_cityfrom ,g_cityto) FROM spfli
  INNER JOIN sflight
     ON spfli~carrid = sflight~carrid AND spfli~connid = sflight~connid
  INNER JOIN scarr
     ON scarr~carrid = spfli~carrid
  WHERE spfli~carrid = s_carrid-low.

  WRITE: / g_carrname ,g_planetype,g_fldate ,g_price ,g_cityfrom ,g_cityto.

 ENDSELECT.
Run Code Online (Sandbox Code Playgroud)

如果您对如何使用内部表格有任何建议和想法,请给我看一个示例.我真的很想学.谢谢你和上帝保佑.

sap abap opensql

1
推荐指数
1
解决办法
2万
查看次数

带有选择的循环内的意外结果

我从透明表和簇表中选择数据并将结果放入内部表中。由于不能连接簇表,我使用了两个select single从簇表中检索数据。

问题是,在循环中,每个输出行都被分配了与内部表中第一行相同的信息(D在每一行)。可能是因为 where 条件的字段从BELNR列中检索了 3 行具有相同值的行。

首先,这里是代码:

FORM select_data1 CHANGING lt_data LIKE gt_map1.   
  FIELD-SYMBOLS: <fs_main> TYPE zimposto_consumo.

  SELECT a~belnr d~spart a~bldat a~waers c~wrbtr a~hwaer c~dmbtr  
    INTO CORRESPONDING FIELDS OF TABLE lt_data
          FROM ( ( bkpf AS a
      INNER JOIN bsis AS c ON c~belnr = a~belnr )
      INNER JOIN vbrk AS d ON d~xblnr = c~belnr )
      WHERE a~belnr IN belnr.


  LOOP AT lt_data ASSIGNING <fs_main>.
      SELECT SINGLE kbetr fwste hwste FROM bset …
Run Code Online (Sandbox Code Playgroud)

abap opensql

1
推荐指数
1
解决办法
1810
查看次数

根据ABAP Open SQL中的列值,仅从数据库表中选择一行

我正在寻找一个解决方案,我想从DB表中只选择一行,具体取决于像标志一样的列.

示例DB表如下所示:

C1 | C2 | C3
-----------------
A1 | N1 | 

A1 | N2 | X

A1 | N3 |

A2 | N21 | X

A2 | N22 |
Run Code Online (Sandbox Code Playgroud)

其中C1和C2是关键字段.在这个例子中,A1有3个条目,其中一个有一个标志为真('X').

我想选择带有flag ='X'的条目或C2值的最小值.

这在ABAP Open SQL中是否可行?我尝试使用case语句,但没有给我所需的结果.

编辑1:

在上面的例子中:结果将是

A1 | N2

A2 | N21

当标志为假或空时,则:

A1 | N1

A2 | N21

sql database sap abap opensql

1
推荐指数
1
解决办法
1285
查看次数

SELECT FROM @itab 导致语法错误。为什么?

我尝试使用SAP 文档中的SELECT FROM @itab解释here

我从未使用过此功能,但认为这很棒。您可以查询仅存在于解释器 RAM 中的内部数据结构,就像它是数据库中的真实表一样。我很佩服。

这是ABAP代码:

data: lt_get_auth_values TYPE STANDARD TABLE OF US335.

CALL FUNCTION 'GET_AUTH_VALUES'
     EXPORTING
            OBJECT1 = 'Z:FOO'
            USER    = sy-uname
     TABLES
            VALUES  = lt_get_auth_values.

SELECT highval from @lt_get_auth_values as mytab WHERE field = 'WERKS' 
        INTO TABLE @DATA(static_perm_filter_fields).
Run Code Online (Sandbox Code Playgroud)

我无法激活该功能,因为根据我的系统,“来自@lt_get_auth_values”是语法错误。

这条线有什么问题?

SAP 版本:740(抱歉,我一开始以为是 752)

abap opensql

1
推荐指数
1
解决办法
1834
查看次数

选择和内部连接条件

当客户合作伙伴角色在其他表(vbpa)中为"WE"时,我想从一个表(kna1)获取客户地址(街道).

我已经这样做了,但它从错误的客户那里返回了完全不同的地址.我究竟做错了什么?

SELECT SINGLE stras
FROM kna1
INNER JOIN vbpa ON (vbpa-kunnr)
WHERE parvw EQ 'WE'
INTO @zadrwe.
Run Code Online (Sandbox Code Playgroud)

谢谢.

sap abap opensql

1
推荐指数
1
解决办法
195
查看次数

SELECT 进入深层结构

我对 ABAP 比较陌生,所以我仍然需要习惯内部表等,所以目前我对如何在 ABAP 中使用 SQL 来填充嵌套结构有点苦恼。

例如:

TYPES: BEGIN of <<mystructure>>,
         someID type sometype,
         relatedItemsInDataModel type table of sometabletype,
       END of <<mystructure>>.
DATA wa type <<mystructure>>.

<<SELECT INTO STATEMENT>>

DATA(lv_json) = /ui2/cl_json=>serialize( data = wa compress abap_true ... ).
Run Code Online (Sandbox Code Playgroud)

所以基本上,我在字典中有一个表(A),它与另一个表(B)有一对多的关系,我想选择 A 中的所有项目,对于 AI 中的每个项目想要选择所有相关的该记录的 B 中的项目。

我想这样做的原因是因为我稍后想将该数据转换为 JSON,如下所示:

[
 {
  "someID": "someValue",
  "relatedItemsInDataModel": [{...}, {...}]
 },
 {
  "someID": "someValue2",
  "relatedItemsInDataModel": [{...}, {...}, {...}, ...]
 },
 ...
]
Run Code Online (Sandbox Code Playgroud)

那么,我首先是否以正确的方式接近这个问题,我如何才能实现我刚刚描述的目标?

abap opensql

1
推荐指数
1
解决办法
605
查看次数

WHERE条件下的OpenSQL语法CASE语句

我想问问是否可以将CASE语句直接写入WHERE子句(我知道WHERE子句也可以通过字符串传递),例如 

 SELECT * FROM db_table INTO TABLE @mt_table[]
     WHERE key1 = @l_key1
          AND key2 = @l_key2
          AND key3 = @l_key3
          AND key4 = @l_key4
          AND ( WHEN l_auth = 'A' THEN username = @sy-uname
                WHEN l_auth = 'U' THEN username = @sy-uname OR username = @space 
                END ). 
Run Code Online (Sandbox Code Playgroud)

sap abap opensql

0
推荐指数
1
解决办法
333
查看次数

标签 统计

abap ×10

opensql ×10

sap ×5

database ×1

sap-selection-screens ×1

sql ×1