当前位置: 首页 > news >正文

SAP-ABAP:条件判断与循环控制语句(7篇) 第三篇:循环基础:for、while、do-while三种循环的差异与适用场景

条件判断与循环控制语句7篇第三篇循环基础for、while、do-while三种循环的差异与适用场景编程中有一句经典名言“当一件事情需要重复做就用循环。”无论是遍历内表、累加求和还是反复请求用户输入循环都是最基础的控制结构。ABAP提供了多种循环语句DO条件循环/计数循环、WHILE前置条件循环以及通过LOOP...ENDLOOP实现的内表遍历。虽然没有传统的for关键字但DO配合TIMES可以完美替代计数循环。本文将逐一解析这些循环的语法结构、执行流程并结合遍历内表、累加计数、用户输入校验等场景给出选型标准助你写出简洁高效的循环逻辑。一、ABAP中的三种循环结构总览结构语法关键字特点适用场景计数循环DO [n TIMES].明确知道循环次数遍历固定范围的数字、处理已知行数的数组条件循环WHILE condition.进入前检查条件可能一次都不执行条件未知需依赖外部状态变化内表遍历LOOP AT itab [INTO wa].专用于内表自动处理索引遍历内表所有行模拟do-whileDO... EXIT.至少执行一次后判断条件需要先执行一次逻辑再决定是否继续注意ABAP没有原生的for和do-while关键字但可以用DO和EXIT灵活模拟。同时WHILE只支持前置条件判断后置条件需手动实现。二、计数循环DO [n TIMES]2.1 基本语法 固定次数循环 DO 10 TIMES. WRITE / sy-index. sy-index 从1开始递增 ENDDO. 无限循环需配合 EXIT 退出 DO. IF sy-index 10. EXIT. ENDIF. WRITE / sy-index. ENDDO.sy-index是系统字段记录当前循环的次数从1开始。DO...TIMES是最常见的计数循环。2.2 典型场景遍历固定范围示例1输出九九乘法表DO 9 TIMES. DATA(lv_i) sy-index. DO lv_i TIMES. DATA(lv_j) sy-index. WRITE: / lv_i, *, lv_j, , lv_i * lv_j. ENDDO. SKIP. ENDDO.示例2累加1到100DATA(lv_sum) 0. DO 100 TIMES. lv_sum lv_sum sy-index. ENDDO. WRITE lv_sum. 输出50502.3 注意事项sy-index在循环内是只读的不应手动修改。当循环次数为变量时确保变量为整数且非负。如果循环次数非常大如百万级考虑性能影响避免循环体内频繁数据库操作。三、条件循环WHILE3.1 基本语法WHILE condition. 当 condition 为真时执行 ENDWHILE.条件在每次循环开始前判断若为假则直接跳过循环体可能一次都不执行。示例读取用户输入直到输入正确PARAMETERS: p_num TYPE i. WHILE p_num 0. WRITE: 请输入大于0的数字. READ p_num. ENDWHILE.3.2 典型场景条件控制的不确定次数循环场景计算某个数除以2直到小于1的次数DATA(lv_value) 100. DATA(lv_count) 0. WHILE lv_value 1. lv_value lv_value / 2. lv_count lv_count 1. ENDWHILE. WRITE: 共除, lv_count, 次结果为, lv_value.3.3WHILE与DO的对比特性WHILEDO无限EXIT条件判断时机每次循环开始前循环体内部通过EXIT控制至少执行次数0次1次如果EXIT在末尾适用场景条件自然决定是否开始需要先执行一次再判断四、内表遍历LOOP AT4.1 基本语法DATA lt_ekpo TYPE TABLE OF ekpo. 方式1INTO 工作区复制数据 LOOP AT lt_ekpo INTO DATA(ls_ekpo). WRITE: / ls_ekpo-ebeln. ENDLOOP. 方式2ASSIGNING 字段符号直接引用性能好 LOOP AT lt_ekpo ASSIGNING FIELD-SYMBOL(fs_ekpo). fs_ekpo-menge fs_ekpo-menge * 2. ENDLOOP.4.2 典型场景处理内表所有行或部分行场景1计算内表金额总和DATA(lv_total) 0. LOOP AT lt_orders INTO DATA(ls_order). lv_total lv_total ls_order-netwr. ENDLOOP.场景2使用WHERE条件过滤LOOP AT lt_mara INTO DATA(ls_mara) WHERE mtart ROH. WRITE: / ls_mara-matnr, 是原材料. ENDLOOP.场景3按索引循环不推荐除非特殊需求DATA(lv_tabix) 1. WHILE lv_tabix lines( lt_data ). READ TABLE lt_data INDEX lv_tabix INTO ls_data. 处理... lv_tabix lv_tabix 1. ENDWHILE.通常直接LOOP AT即可无需手动索引。五、模拟do-while至少执行一次的后置条件循环在某些语言中do-while保证循环体至少执行一次。ABAP中没有原生支持但可以通过DO...EXIT轻松模拟。模板DO. 循环体至少执行一次 IF exit_condition. EXIT. ENDIF. ENDDO.实例用户输入密码至少显示一次提示DATA: lv_password TYPE string, lv_input TYPE string. 预设正确密码 lv_password 123456. DO. WRITE: 请输入密码:. READ lv_input. IF lv_input lv_password. WRITE 密码正确欢迎登录.. EXIT. ELSE. WRITE 密码错误请重试.. ENDIF. ENDDO.六、循环控制语句提前结束与跳过6.1EXIT立即退出循环DO 100 TIMES. IF sy-index 10. EXIT. 当循环到第10次时直接退出 ENDIF. ENDDO.6.2CONTINUE跳过本次循环剩余部分进入下一次DO 10 TIMES. IF sy-index MOD 2 0. CONTINUE. 跳过偶数次不输出 ENDIF. WRITE / sy-index. 只输出奇数 ENDDO.6.3CHECK类似于CONTINUE但常用于LOOP AT的条件过滤LOOP AT lt_ekpo INTO ls_ekpo. CHECK ls_ekpo-ebelp 5. 只处理行项目号大于5的行 处理... ENDLOOP.七、循环选型决策树是否需要遍历内表 ├─ 是 → LOOP AT ... ENDLOOP. └─ 否 → 循环次数已知 ├─ 是 → DO ... TIMES. └─ 否 → 需要至少执行一次 ├─ 是 → DO ... EXIT (模拟do-while) └─ 否 → WHILE八、常见错误与避坑8.1 无限循环错误忘记在WHILE循环中修改条件变量DATA lv_cnt TYPE i VALUE 1. WHILE lv_cnt 10. WRITE / lv_cnt. 忘记增加 lv_cnt死循环 ENDWHILE.解决在循环体内确保条件最终变为假。8.2 在LOOP AT中使用SY-TABIX时混淆SY-TABIX在LOOP AT中代表当前行的索引但在DO循环中代表循环次数。不要混用。8.3 循环内提交事务COMMIT WORK在循环内使用COMMIT WORK会破坏事务的原子性且每次提交都消耗大量资源。应尽量在循环外提交。8.4 使用READ TABLE逐行访问代替LOOP AT 错误方式效率极低 DO lines( lt_itab ) TIMES. READ TABLE lt_itab INDEX sy-index INTO ls_wa. ... ENDDO. 正确方式直接 LOOP AT LOOP AT lt_itab INTO ls_wa. ... ENDLOOP.九、性能提示**使用字段符号ASSIGNING**在LOOP AT中修改内表数据避免MODIFY语句。减少循环内的数据库操作尽量在循环外批量读取数据循环内仅做内存计算。大数据量内表优先使用LOOP AT而不是WHILE手动控制索引。提前退出当找到目标后立即EXIT避免无谓的后续循环。十、总结循环类型适用场景示例DO n TIMES明确次数如1…100求和DO 100 TIMES.WHILE前置条件不确定可能零次执行读取文件直到结束LOOP AT遍历内表处理所有行项目DO...EXIT至少执行一次的后置条件输入密码重试循环是程序中最常见的控制结构选对了类型代码既简洁又高效。下一篇将聚焦循环控制中的break、continue、return的用法边界帮你精准控制循环的执行流程避开逻辑陷阱。下篇预告避坑指南循环控制中break、continue、return的用法边界作者你的ABAP学习伙伴版本记录2026年5月 你是否有过在WHILE循环中忘记更新条件导致死循环的经历欢迎留言分享。
http://www.gsyq.cn/news/1406241.html

相关文章:

  • 量子优化实战:带复杂约束的多维背包问题QUBO建模与求解
  • 设计模式(类的拓扑结构)(为什么会产生设计模式,以及什么是设计模式)
  • 【限时解密】ChatGPT冥想引导生成黄金公式:Prompt×呼吸节律×EEG反馈闭环(仅开放72小时技术文档)
  • chatgpt参考过往聊天有什么作用?——还可以设置自己的说法风格,如专业型——chat登入用国内手机无法登入,说查找不到手机——可以采用microsoft账号登入,如邮箱登入,点赞不错——也可以点击
  • 如何轻松获取Windows最高权限:终极提权工具RunAsTI完整指南
  • 量子混合支持向量机在工业异常检测中的应用与优化
  • 三步极速下载:国家中小学智慧教育平台电子课本解析工具完整指南
  • 为什么说HLS Downloader重新定义了浏览器流媒体下载体验?
  • AI时代送礼新范式(2024最新实测数据支撑):ChatGPT如何将礼物匹配准确率从61%提升至94%?
  • 牛客网上点赞最高的Java后端面试题(含答案)
  • 【ChatGPT视频脚本写作黄金公式】:20年影视+AI专家亲授3步生成爆款脚本的底层逻辑
  • GPU加速视频编码架构设计:Hap QuickTime编解码器性能优化实战
  • iOS 15.4 + Windows 11 下用Charles抓HTTPS包的保姆级避坑指南(含证书信任失败解决方案)
  • DS4手柄固件升级:从警告到完美兼容的实用指南
  • 思源宋体实战指南:4种高效部署方案与跨平台字体配置深度解析
  • 告别论文熬夜!okbiye AI 毕业论文功能:从选题到定稿的 “懒人通关指南”
  • Fusion 360 3D打印螺纹终极指南:5分钟创建完美打印螺纹
  • 神经网络压缩新范式:低熵矩阵表示CER/CSER格式详解与工程实践
  • 保姆级教程:在ArmSoM-W3(RK3588)上配置UART7,让40PIN引脚变身串口调试利器
  • 51单片机仿真入门:Proteus 8 Professional最小系统搭建与调试
  • 实测 okbiye AI 毕业论文功能:把导师的 “格式重改” 警告彻底关掉
  • 【白盒测试辅助】丢给AI一段核心算法代码,自动输出完整的单元测试(Mocks)
  • 离散分数阶混沌映射:构建高安全性图像水印的密钥空间革命
  • ANSYS Meshing网格导入OpenFOAM:ASCII格式设置避坑指南
  • 英雄联盟智能助手Seraphine:提升游戏段位的终极解决方案
  • ceph简介及部署安装
  • Cortex-M加密算法性能实测:AES、SHA256、ECDSA在嵌入式安全中的选型指南
  • usm 魔术师安装系统纯净版
  • 百万学费几年收回?2026 美英加澳港新 IT 毕业生“净剩资产”真实财务测算「蒸汽求职分享」
  • 英港大厂AC群面:不当Leader怎么在小组辩论中拿高分?「蒸汽求职分享」