我有一个程序,除其他外,它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 代码有效:
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,所以这只是示例查询。
有没有办法获得当前用户可以看到的所有BUKRS列表?
我想在open sql中使用此列表作为过滤器.想象一下我搜索存储结果的方法的结果bk_list
.然后我可以bk_list
像这样使用:
SELECT * FROM some_table WHERE bukrs IN bk_list
Run Code Online (Sandbox Code Playgroud) 我是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)
如果您对如何使用内部表格有任何建议和想法,请给我看一个示例.我真的很想学.谢谢你和上帝保佑.
我从透明表和簇表中选择数据并将结果放入内部表中。由于不能连接簇表,我使用了两个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) 我正在寻找一个解决方案,我想从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
我尝试使用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)
当客户合作伙伴角色在其他表(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)
谢谢.
我对 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)
那么,我首先是否以正确的方式接近这个问题,我如何才能实现我刚刚描述的目标?
我想问问是否可以将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)