小编Lil*_*hal的帖子

数据传输对象中的公共字段

在我多年的编程中,我经常创建一些类,只需将一些变量与setter和getter组合在一起.我已经看到这些类型的对象被称为值对象,域对象或模型对象,具体取决于它们使用它们的上下文.通用用法的最合适术语似乎是数据传输对象(DTO).这描述了仅包含访问器和增变器的POJO.

我刚刚编写了一个这样的对象,其中包含用于在图表上设置主题参数的大约50个字段.现在我想知道如果不是生成一百个getter和setter,我应该将这些字段声明为public.这样做违背了我编程本能告诉我的一切,但我不能否认它会大大增加我的代码的易读性并减少类中的样板代码量.

我可以看到使用公共字段的唯一原因是我需要对这些字段执行任何类型的验证.如果我们假设类型验证足以满足我的目的,那么在这种情况下使用公共字段是否可以接受面向对象设计?公共DTO在大批量操作中表现更好吗?

java coding-style

26
推荐指数
4
解决办法
7523
查看次数

ABAP开发的首选布尔类型

SAP没有布尔值的核心数据类型.此外,SAP中更高级别的布尔类型通常具有三种状态:true('X'),false('')和unknown(' - ').

现在很明显,布尔值是我开发工作的基石,但我意识到我的类型(数据元素)用法并不是非常一致.到目前为止,我认为这些是最常见的:

  • abap_bool:在abap类型池中定义,不受约束但常量定义为true,false,unknown,yes和no
  • os_boolean:数据元素,是('X')或否('')
  • xfeld:data element,True('X')或False('')缺少字段标签,描述为复选框

在我的代码中我主要使用,abap_bool因为我可以使用常量而不是字符值,而不是我无法分配abap_truexfeld.但是,我被警告过,这种类型的池可能并不总是可用.

我现在想知道布尔值的最佳实践,特别是:

  • 我应该使用哪种首选类型?
  • 使用abap类型池会导致某些模块或场景出现问题吗?
  • abap_bool包含未知或任何字符值的可能性是否重要?

sap abap

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

从循环中的内部表中删除当前行

在循环内部表时,我可以安全地删除活动行吗?

例如,请考虑以下代码:

LOOP AT lt_itab INTO ls_wa.
    IF [...] . " A check that can't be done inside a 'DELETE lt_itab WHERE'
        DELETE lt_itab INDEX sy-tabix
        " OR
        DELETE lt_itab FROM ls_wa.
    ENDIF.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

删除这样的记录是否安全,或者这种逻辑不按预期行事?

我应该在临时itab中存储行的唯一标识符并DELETE lt_itab WHERE在循环后运行吗?

我假设对当前迭代中加载的记录以外的记录执行删除操作肯定会引起问题,但我不确定这是否是有效的,更不用说是好的做法.

sap abap

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

三元运营商(替代方案)

ABAP语法中是否有三元或条件运算符?我没有找到一个,所以假设答案是否定的,那么我是否有一个替代方案可以用来清理IF我经常使用的常见"哑" 语句?

例如,考虑一种使用可选消息参数记录消息的方法.要决定使用导入的参数还是默认值,我必须像这样检查值:

IF iv_class IS INITIAL.
    lv_message_class = 'DEFAULT'.
ELSE.
    lv_message_class = iv_class.
ENDIF.
IF iv_number IS INITIAL.
    lv_message_number = '000'.
ELSE.
    lv_message_number = iv_number.
ENDIF.
IF iv_type IS INITIAL.
    lv_message_type = 'E'.
ELSE.
    lv_message_type = iv_type.
ENDIF.
Run Code Online (Sandbox Code Playgroud)

三元运算符会将这五行语句中的每一个都减少为单行,如下面的代码块所示.当操作员在线使用时,它甚至可以不需要使用临时变量.

lv_message_class  = iv_class  IS INITIAL ? 'DEFAULT' : iv_class.
lv_message_number = iv_number IS INITIAL ? '000'     : iv_number .
lv_message_type   = iv_type   IS INITIAL ? 'E'       : iv_type   .
Run Code Online (Sandbox Code Playgroud)

有没有办法在ABAP中近似这种编程风格,还是我陷入了混乱?

sap abap

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

调试器中的ABAP内存ID或PARAMETER值

我必须调试的一些ABAP程序使用系统内存使用以下语法将数据传递到其他程序:

EXPORT: VARIABLE_NAME  TO MEMORY ID 'NAME_OF_MEMORY_OBJECT'.
Run Code Online (Sandbox Code Playgroud)

如何在调试器中检查这些内存ID的值?


相关地,如何查看参数集的值:

SET PARAMETER 'ZPR' FIELD lv_project.
Run Code Online (Sandbox Code Playgroud)

debugging sap abap

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

选择表A的所有字段但选择表B的字段

有没有办法在ABAP的OpenSQL中简化选择列,JOIN当我想要获取一个表的所有字段但只选择其他表中的选定字段时?

例如,在mysql中我们可以简单地做到:

SELECT  tb1.*, tb2.b, tb2.d
FROM       tableA tb1
INNER JOIN tableB tb2 ON tb1.x = tb2.a
Run Code Online (Sandbox Code Playgroud)

但是,OpenSQL似乎不允许选择tb1~*, tb2~b, tb2~d所以我必须诉诸于此:

SELECT  tb1.x, tb1.y, tb1.z, tb2.b, tb2.d
FROM       tableA tb1
INNER JOIN tableB tb2 ON tb1.x = tb2.a
Run Code Online (Sandbox Code Playgroud)

对于非常大的表,尤其是标准表,这变得难以处理,难以阅读且维护起来更烦人.

有没有更好的方法来选择tb1的所有字段和tb2中的某些字段?

abap opensql

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

读取当前LUW中已更改的表的原始值

在当前LUW中更改但尚未提交的表时,是否可以检索表的旧值或原始值?

我正在实现一个BAdI,它应该用于根据对象执行的更改来引发消息,但SAP实际上并没有在BAdI中提供原始对象数据.尝试使用SELECT语句读取数据不起作用,因为此时已应用挂起的更改,而不是已提交.

如果我调试代码,我可以看到旧的值很好,SE16但似乎未提交的更改值是由SELECTs我在此BAdI中执行的任何返回.

有没有办法阅读这些原始数据?

sap abap

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

ABAP中的断言

多年来,我已经用各种语言和环境编写代码,但是一个常数似乎是关于断言使用的共识.据我所知,当你想要识别"不可能"的错误以及你的第一反应是"无法正确"并且无法正常处理的其他情况时,它们就在那里用于开发过程,使系统保持原状一个国家,它别无选择,只能终止.断言易于理解且编码速度快,但由于其快速失败性质不适合开发代码.理想情况下,断言用于发现所有开发错误,然后在发送代码时删除或关闭.输入或编程状态错误,

但是,对于编写SAP的ABAP代码而言,这似乎都不适用.我花了大约一小时的时间试图追踪断言给我一个难以理解的错误的确切位置.事实证明,标准的SAP代码中有五个级别,这显然充满了ASSERT陈述.我现在知道标识一个表的某个变量,IS NOT INITIAL而它的伴随变量标识一个字段.

这没告诉我什么.运行此代码的Web Dynpro组件实际上"捕获"此断言,向我显示一条通用错误消息,该消息仅用于防止调试器在断言时启动.

因此,我的问题是在ABAP中使用断言的准则或最佳实践.这个SAP写错了代码吗?使用断言填充自定义代码并在发送代码时将它们保留在一起是否是公认的做法?如果是这样,我们将如何在运行时处理这些断言,以便应用程序不会崩溃和刻录,同时仍然能够识别错误的原因?

sap abap assert

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

异常会自动传播吗?

我对ABAP开发相对较新,并且拥有更多Java和类似语言的经验.在Java中,任何抛出和未捕获的异常都会自动传播到调用链中,以便您可以决定如何在程序的最高(面向用户)级别处理它.

我现在想在我的一些ABAP报告中做同样的事情,我使用类方法或函数调用,其中一些深入了几个层次.特别是对于要在作业中运行的报表,我想确保处理所有异常.只要在方法的raise或exception块中指定每个可能的异常,这都可以正常工作.然而,我意识到我经常使用会引发某个异常的函数或方法,我在调用它们的方法的定义中没有明确提到这个异常.我假设这些只会传播,但ABAP文档的一部分似乎表明情况并非如此.

我现在的问题是TRY [...] CATCH cx_root在报告中使用块是否有意义.虽然这种正确捕捉在块抛出的异常没有特定的CATCH语句,文件似乎表明,在一个方法定义未明确提及的异常将抛出一个短转储未处理的异常,而不是向上移动调用链看看是否在那里处理异常.谁能证实这一点?

sap abap exception

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

表格表达式的最佳实践(NW 7.4)

在NetWeaver 7.4(CD261)中讨论新的ABAP编程功能的官方SAP演示文稿对表表达式做了大量工作,将旧语法替换为从内部表中读取:

READ TABLE lt_aufk INTO ls_aufk WITH KEY aedat = sy-datum.
lv_order = ls_aufk-aufnr.
Run Code Online (Sandbox Code Playgroud)

单线 lv_order = lt_aufk[ aedat = sy-datum ]-aufnr.

但是,它没有提到如果表表达式找不到行,它将引发异常CX_SY_ITAB_LINE_NOT_FOUND,所以实际上该表示法应该是:

TRY.
        lv_order = lt_aufk[ aedat = sy-datum ]-aufnr.
    CATCH cx_sy_itab_line_not_found.
ENDTRY.
Run Code Online (Sandbox Code Playgroud)

哪个更长,并且使任何简单的读取逻辑看起来非常复杂且难以阅读.由于每个单独阅读可能需要单独失败或成功,因此这种快速气球不成比例:

TRY.
        wa1 = lt_itab[ col1 = ... ].
    CATCH cx_sy_itab_line_not_found.
ENDTRY.
TRY.
        wa2 = lt_itab[ col2 = ... ].
    CATCH cx_sy_itab_line_not_found.
ENDTRY.
TRY.
        wa3 = lt_itab[ col3 = ... ].
    CATCH cx_sy_itab_line_not_found.
ENDTRY.
TRY.
        wa4 = lt_itab[ col4 = ... ].
    CATCH …
Run Code Online (Sandbox Code Playgroud)

abap

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

标签 统计

abap ×9

sap ×7

assert ×1

coding-style ×1

debugging ×1

exception ×1

java ×1

opensql ×1