确定ABAP中的活动格式设置

确定ABAP中的活动格式设置,abap,Abap,正如秘书长解释的那样: 格式设置如下所示: DATA(current_number_format) = SWITCH usr01-dcpfm( |{ 1000 NUMBER = ENVIRONMENT DECIMALS = 1 }| WHEN '1.000,00' THEN ' ' WHEN '1,000.00'

正如秘书长解释的那样:

格式设置如下所示:

DATA(current_number_format) = SWITCH usr01-dcpfm( 
                              |{ 1000 NUMBER = ENVIRONMENT DECIMALS = 1 }| 
                              WHEN '1.000,00' THEN ' '
                              WHEN '1,000.00' THEN 'X'
                              WHEN '1 000,00' THEN 'Y' ).
  • 在内部会话开始时,它们由当前用户的用户主记录中的固定值中的相关默认设置决定

  • 使用语句集COUNTRY,可以使用特定于国家/地区的格式覆盖当前内部会话的默认设置

但是,正如声明中明确指出的那样,无法查询此语句实际设置了什么:

不要将语句集国家/地区与用于设置文本环境的语句集区域设置语言的过时添加国家/地区混淆。特别是,它没有相应的GET COUNTRY语句

事实上,报告提到:

添加国家是为了明确阅读当前文本环境的国家密钥。cntry需要一个类似字符的数据对象。此添加的功能未完全实现,结果未定义

语句GET LOCALE的addition COUNTRY不提取可以使用set COUNTRY设置的格式设置

这让我有点困惑。我可以用FM
SUSR\u GET\u user\u defaults
确定我的用户默认值。我可以从表
T005X
中计算出国家/地区的设置但我无法确定设置了哪种特定的国家/地区格式,甚至无法确定是否在活动会话中设置了一种格式

如何确定哪些格式设置当前处于活动状态?
附加问题:有没有办法在调试器中解决这个问题?

也许您可以使用功能模块
CLSE\u SELECT\u USR01

下面是一个例子:

REPORT test.

START-OF-SELECTION.
  DATA: decimal_sign , separator.

  PERFORM output.
  SET COUNTRY 'US'.
  PERFORM output.


FORM output.
  CALL FUNCTION 'CLSE_SELECT_USR01'
*   EXPORTING
*     USERNAME               = sy-uname
*     IV_DELETE_BUFFER       = ' '
    IMPORTING
*     X_USR01      =
*     DATE_FORMAT  =
      decimal_sign = decimal_sign
      separator    = separator.
  WRITE: / 'DECIMAL_SIGN', decimal_sign, 'separator', separator.
ENDFORM.
显示:

我的默认语言环境是DE,因此我得到小数的实际设置

根据您的评论:

不幸的是,我必须解析和分析为屏幕显示准备的输出数据,这些数据可能来自几十个不同的表单源


您是在运行时还是在上一次运行时获得输出?因为过去没有时间机器从调用中获取区域设置:)

也许您可以使用功能模块
CLSE\u SELECT\u USR01

下面是一个例子:

REPORT test.

START-OF-SELECTION.
  DATA: decimal_sign , separator.

  PERFORM output.
  SET COUNTRY 'US'.
  PERFORM output.


FORM output.
  CALL FUNCTION 'CLSE_SELECT_USR01'
*   EXPORTING
*     USERNAME               = sy-uname
*     IV_DELETE_BUFFER       = ' '
    IMPORTING
*     X_USR01      =
*     DATE_FORMAT  =
      decimal_sign = decimal_sign
      separator    = separator.
  WRITE: / 'DECIMAL_SIGN', decimal_sign, 'separator', separator.
ENDFORM.
显示:

我的默认语言环境是DE,因此我得到小数的实际设置

根据您的评论:

不幸的是,我必须解析和分析为屏幕显示准备的输出数据,这些数据可能来自几十个不同的表单源

您是在运行时还是在上一次运行时获得输出?因为过去没有时间机器可以从调用中获取区域设置:)

ABAP语句可能会更改日期格式、时间格式(自ABAP 7.02起)和数字格式,但是官方没有相反的方法来获取当前活动的国家代码(如您在问题中引用的,基于ABAP文档)。这是非常合乎逻辑的,因为,例如,当前的数字格式可能与当前的国家代码不同,因此最好直接测试您需要使用的格式,如下所示

  • 要检测当前的日期格式,请使用返回字符的官方方式,其可能的值在中描述:

  • 要检测当前的时间格式,请使用返回字符的官方方式:

    DATA(current_time_format) = CL_ABAP_TIMEFM=>GET_ENVIRONMENT_TIMEFM( ).
    
    它返回以下值之一,示例值对应于中午+5分10秒(如果输出至少11个字符,则给出示例值):

    • 0:12:05:10(0至23)
    • 下午1:12:05:10(0至12)
    • 下午2:12:05:10(0至12)
    • 下午3:00:05:10(0至11)
    • 下午4:00:05:10(0至11)
  • 要根据@Gert Beukema的想法检测当前的数字格式,您可以执行以下操作:

    DATA(current_number_format) = SWITCH usr01-dcpfm( 
                                  |{ 1000 NUMBER = ENVIRONMENT DECIMALS = 1 }| 
                                  WHEN '1.000,00' THEN ' '
                                  WHEN '1,000.00' THEN 'X'
                                  WHEN '1 000,00' THEN 'Y' ).
    
    注意:此表达式返回的值
    X
    Y
    与表列
    USR01-DCPFM
    T005X-XDEZP
    中使用的值相同

  • ABAP声明可能会更改日期格式、时间格式(自ABAP 7.02起)和数字格式,但官方没有相反的方式来获取当前活动的国家代码(正如您在问题中引用的,基于ABAP文档)。这是非常合乎逻辑的,因为,例如,当前的数字格式可能与当前的国家代码不同,因此最好直接测试您需要使用的格式,如下所示

  • 要检测当前的日期格式,请使用返回字符的官方方式,其可能的值在中描述:

  • 要检测当前的时间格式,请使用返回字符的官方方式:

    DATA(current_time_format) = CL_ABAP_TIMEFM=>GET_ENVIRONMENT_TIMEFM( ).
    
    它返回以下值之一,示例值对应于中午+5分10秒(如果输出至少11个字符,则给出示例值):

    • 0:12:05:10(0至23)
    • 下午1:12:05:10(0至12)
    • 下午2:12:05:10(0至12)
    • 下午3:00:05:10(0至11)
    • 下午4:00:05:10(0至11)
  • 要根据@Gert Beukema的想法检测当前的数字格式,您可以执行以下操作:

    DATA(current_number_format) = SWITCH usr01-dcpfm( 
                                  |{ 1000 NUMBER = ENVIRONMENT DECIMALS = 1 }| 
                                  WHEN '1.000,00' THEN ' '
                                  WHEN '1,000.00' THEN 'X'
                                  WHEN '1 000,00' THEN 'Y' ).
    
    注意:此表达式返回的值
    X
    Y
    与表列
    USR01-DCPFM
    T005X-XDEZP
    中使用的值相同


  • 为什么您需要知道这一点-任何特殊的应用程序需求或只是一般开发人员的好奇心?在我见过的大多数情况下,这不是一个检查设置的问题,只要拿起大锤并执行您需要的设置:-)@vwegert True,我知道我需要它的原因是因为我正在做我应该做的事情