Abap 语法错误“;“无法访问对账单”;

Abap 语法错误“;“无法访问对账单”;,abap,Abap,我的程序第22行出现以下语法错误: 语句不可访问 为什么以及如何解决 代码: REPORT zabap01_sue02. START-OF-SELECTION. DO 3 TIMES. PERFORM call_subr01. ENDDO . FORM call_subr01. DATA: lv_val TYPE I. lv_val = lv_val + 1. WRITE:/ 'local variable', lv_val. ENDFORM. WRITE

我的程序第22行出现以下语法错误:

语句不可访问

为什么以及如何解决

代码:

REPORT zabap01_sue02. 

START-OF-SELECTION. 

DO 3 TIMES. 
  PERFORM call_subr01. 
ENDDO . 

FORM call_subr01.
  DATA: lv_val TYPE I. 
  lv_val = lv_val + 1. 
  WRITE:/ 'local variable', lv_val. 
ENDFORM.

WRITE: /'1111111111111111111111111'. "<========= line 22

*INCLUDE zabap01_sue02_zll.
报告zabap01\u sue02。
开始选择。
做3次。
执行调用subr01。
恩多。
表格call_subr01。
数据:lv_val I型。
lv_val=lv_val+1。
写入:/“局部变量”,lv_val。
尾型。

写入:/“1111111111111111”。“您的问题是:您可以在subrutine之后编写任何代码。将第22行上的代码移动到FORM指令之前。

为了使其工作,您将这部分代码放入主程序中:(应将
INCLUDE X
放在底部)

然后创建一个包含函数的Include

*---------------------------------------------------------------------*    
* ZABAP01_SUE02_ZLL   
*---------------------------------------------------------------------* 
FORM call_subr01. 

DATA: lv_val TYPE I. 

lv_val = lv_val + 1. 
WRITE:/ 'local variable', lv_val. 

ENDFORM.
或者,根本不使用Include,只需在程序中包含以下代码:

REPORT zabap01_sue02.

START-OF-SELECTION.

  DO 3 TIMES.
    PERFORM call_subr01.
  ENDDO.

  WRITE: /'1111111111111111111111111'.

*&---------------------------------------------------------------------*
*&      Form  call_subr01
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM call_subr01.

  DATA: lv_val TYPE i.

  lv_val = lv_val + 1.
  WRITE:/ 'local variable', lv_val.

ENDFORM.                    "call_subr01
不能在子例程之后编写任何代码的原因是程序的结构。由于窗体只能在调用时执行,因此第一个
窗体X
向程序发出信号,表示它下面没有需要执行的任何内容。因此,如果有代码,编译器将显示语法错误r


无论如何,将子例程放在代码之间不是一个好主意,因为这样会造成混乱和难以阅读。只要您给出的表单名称易于理解,代码就会更容易阅读。您可以通过单击子例程来快速转到子例程的代码。

下次请将英文错误消息添加到您的问题。请将代码、错误和数据添加为文本(),而不是图像。图像:A)不允许我们复制和粘贴代码/错误/数据以进行测试;B)不允许基于代码/错误/数据内容进行搜索;以及。通常,文本格式的代码/错误/数据>>>>>代码/错误/数据作为图像>>无任何内容。如果图像添加了一些内容,则除了代码格式的文本之外,还应使用图像G的重要性不受文本代码/错误/数据的影响。我已经让您的问题符合StAcExpLoad规则。请阅读Surviv.After FAQ。但是我不明白为什么不能在中间写子程序?可能不清楚在子程序之间读取代码。所以ABAP不允许。保持代码干净,拆分您的ReP。ort to INCLUDE等。报告zabap01\U sue02。选择开始。执行3次。执行调用\u subr01.ENDDO。包含zabap01\u sue02\u zll。写入:/“1111111111111111111”。&---------------------------------------------------------------------------------------------&包含 ZABAP01_SUE02_ZLL*&-------------------------------------------------------------------表单调用_subr01.数据:lv_val TYPE I.lv_val=lv_val+1.WRITE://“local variable”,lv_val.ENDFORM.同样错误的是,我必须编写include begin或endYou不需要包含在这个示例中。我尝试给出一些透视图。因此表单被直接调用在中间的任何东西都会被跳过,对吗?是的,当一个窗体被调用时,<代码>之间的每件事都执行X <代码> >跳过“代码>表单X/CODE >。然后,当表单中的代码完成后,它回到<代码>执行X < /代码>的行。如果你使用我给你的最后一个代码,你可以看看它是如何工作的。通过在调试器中一步一步地调试它。我已经调整了这个问题,使其“符合stackoverflow”“。除了作为注释行之外,它没有引用INCLUDE。问题更多的是关于语法错误。我知道我的编辑使你答案的第一部分脱离了上下文,对此我很抱歉。如果你不介意的话,也许调整一下会更好?(可能只是删除了关于包含的第一部分,我觉得其余部分保持一致)。如果你看他在另一个答案下写的评论,他取消了包含行的评论。所以我觉得我应该给他一个在Include中工作的代码的例子。OP提出该代码只是因为他被告知最好的做法是将代码拆分为几个Include程序,但该建议与主要问题无关(大概是为什么不接受表单外的代码)。
REPORT zabap01_sue02.

START-OF-SELECTION.

  DO 3 TIMES.
    PERFORM call_subr01.
  ENDDO.

  WRITE: /'1111111111111111111111111'.

*&---------------------------------------------------------------------*
*&      Form  call_subr01
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM call_subr01.

  DATA: lv_val TYPE i.

  lv_val = lv_val + 1.
  WRITE:/ 'local variable', lv_val.

ENDFORM.                    "call_subr01