internal table 的一些操作

本文详细介绍ABAP中内部表的使用方法,包括定义、填充、读取、修改及删除等基本操作,并演示了不同场景下的应用实例。

 *internal table with work area

DATA: BEGIN  OF  LINE,
  COL1 TYPE  I,
  COL2 TYPE  I,
END  OF  LINE.
DATA  ITAB like  LINE  occurs  10.
DO  TIMES.
  LINE-COL1 = SY-INDEX.
  LINE-COL2 = SY-INDEX ** 2.
  APPEND  LINE  TO  ITAB.
ENDDO.
LOOP  AT  ITAB INTO  LINE.
  WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.

 

*internal table with type
types: begin  of  tline,
  col1 type  i,
  col2 type  i,
end  of  tline.
types  tItab type  tline occurs  10.

data: dline type  tline,
      dItab type  tItab.
do  times.
  dline-col1 = sy-index.
  dline-col2 = sy-index ** 2.
  append  dline to  dItab.
enddo.
loop  at  dItab into  dline.
  write: / dline-col1, dline-col2.
endloop.

skip.

*internal table without work area
DATA: BEGIN  OF  ITAB2 OCCURS  10,
      COL1 TYPE  I,
      COL2 TYPE  I,
      END  OF  ITAB2.
DO  TIMES.
  ITAB2-COL1 = SY-INDEX.
  ITAB2-COL2 = SY-INDEX ** 2.
  APPEND  ITAB2. "新增至内表中
ENDDO.
LOOP  AT  ITAB2. "ITAB2 总共有两个行
  WRITE: / ITAB2-COL1, ITAB2-COL2.
ENDLOOP.

skip.

append  lines  of  dItab from  to  to  itab2.
LOOP  AT  ITAB2. "ITAB2 总共有4行
  WRITE: / ITAB2-COL1, ITAB2-COL2.
ENDLOOP.

DATA: BEGIN  OF  ITAB3 OCCURS  3,
      COL1(3) TYPE  C,
      COL2 TYPE  I,
      END  OF  ITAB3.
ITAB3-COL1 = 'ABC' . ITAB3-COL2 = 10.
COLLECT  ITAB3.
ITAB3-COL1 = 'XYZ' . ITAB3-COL2 = 20.
COLLECT  ITAB3.
ITAB3-COL1 = 'ABC' . ITAB3-COL2 = 30.
COLLECT  ITAB3. "汇总 COL2 至 COL1=ABC 的元素上
LOOP  AT  ITAB3.
  WRITE: / ITAB3-COL1, ITAB3-COL2.
ENDLOOP.

DATA: BEGIN  OF  line4,
      COL1 TYPE  I,
      COL2 TYPE  I,
      END  OF  line4.
DATA  itab4 LIKE  line4 OCCURS  10  with  header  line.
DO  TIMES.
  line4-COL1 = SY-INDEX * 10.
  line4-COL2 = SY-INDEX * 20.
  APPEND  line4 TO  itab4.
ENDDO.
line4-COL1 = 100.
line4-COL2 = 200.
INSERT  line4 INTO  itab4 index  2.  "插入在位置2 之前
LOOP  AT  itab4 INTO  line4.
  WRITE: / SY-TABIX, line4-COL1, line4-COL2. "SY-TABIX 为Table 位置
ENDLOOP.

skip.

LOOP  AT  ITAB4 INTO  LINE4 WHERE  COL1 >= 100.
  WRITE: / SY-TABIX, LINE4-COL1.
ENDLOOP.

skip.
read  table  itab4 into  line4 index  2.
WRITE: / SY-TABIX, LINE4-COL1, LINE4-COL2.

skip.
LINE4-COL1 = 4.
write  / LINE4-COL1.
LINE4-COL2 = 100.
MODIFY  ITAB4 FROM  LINE4 INDEX  2.
read  table  itab4 into  line4 index  2.
WRITE: / SY-TABIX, LINE4-COL1, LINE4-COL2.

skip.
LINE4-COL1 = 10.
MODIFY  ITAB4 FROM  LINE4 INDEX  TRANSPORTING  COL1.
read  table  itab4 into  line4 index  3.
WRITE: / SY-TABIX, LINE4-COL1, LINE4-COL2.

skip.
write  'delete internal table use index:' .
delete  ITAB4 index  2.
loop  at  itab4 into  line4.
  write: / line4-col1, line4-col2.
endloop.

skip.
write  'delete internal table by condition.' .
delete  itab4 where  col2 = 40.
loop  at  itab4 into  line4.
  write: / line4-col1, line4-col2.
endloop.

skip.
line4-col1 = 100.
line4-col2 = 400.
append  line4 to  itab4.

line4-col1 = 100.
line4-col2 = 200.
append  line4 to  itab4.

write  'sort internal table' .
*sort itab4 descending by col1 col2.
sort  itab4 by  col1 descending  col2 ascending.
loop  at  itab4 into  line4.
  write: / line4-col1, line4-col2.
endloop.

skip.
write  'calc numeric field sum.' .
LOOP  AT  ITAB4 INTO  LINE4.
  SUM.
ENDLOOP.
WRITE: / LINE4-COL1, LINE4-COL2.

skip.
write  'refresh internal table.' .
clear  ITAB3[].
LOOP  AT  ITAB3.
  WRITE: / ITAB3-COL1, ITAB3-COL2.
ENDLOOP.
free  itab3.

 

span { font-family: "Courier New"; font-size: 10pt; color: rgb(0, 0, 0); background: none repeat scroll 0% 0% rgb(217, 217, 217); }.L0S32 { color: rgb(51, 153, 255); }.L0S33 { color: rgb(77, 166, 25); }.L0S52 { color: rgb(0, 0, 255); } write  'internal table with header line.' .
TYPES: BEGIN  OF  LINE5,
         COL1 TYPE  I,
         COL2 TYPE  I,
       END  OF  LINE5.

DATA  ITAB5 TYPE  HASHED  TABLE  OF  LINE5 WITH  UNIQUE  KEY  COL1
               WITH  HEADER  LINE.

DO  TIMES.
  ITAB5-COL1 = SY-INDEX.
  ITAB5-COL2 = SY-INDEX ** 2.
  INSERT  TABLE  ITAB5.
ENDDO.

write 'read table.' .
ITAB5-COL1 = 2.
READ  TABLE  ITAB5 FROM  ITAB5.
WRITE: / ITAB5-COL1, ITAB5-COL2.

write 'modify table.' .
ITAB5-COL2 = 100.
MODIFY  TABLE  ITAB5.
LOOP  AT  ITAB5.
  WRITE: / ITAB5-COL1, ITAB5-COL2.
ENDLOOP.

write 'delete table.' .
ITAB5-COL1 = 4.
DELETE  TABLE  ITAB5.
LOOP  AT  ITAB5.
  WRITE: / ITAB5-COL1, ITAB5-COL2.
ENDLOOP.

skip.
write  'internal table without header line.' .
TYPES: BEGIN  OF  LINE6,
         COL1 TYPE  I,
         COL2 TYPE  I,
       END  OF  LINE6.

DATA: ITAB6 TYPE  HASHED  TABLE  OF  LINE6 WITH  UNIQUE  KEY  COL1,
      WA LIKE  LINE  OF  ITAB6.

DO  TIMES.
  WA-COL1 = SY-INDEX.
  WA-COL2 = SY-INDEX ** 2.
  INSERT  WA INTO  TABLE  ITAB6.
ENDDO.

WA-COL1 = 2.
READ  TABLE  ITAB6 FROM  WA INTO  WA.

WA-COL2 = 100.
MODIFY  TABLE  ITAB6 FROM  WA.

WA-COL1 = 4.
DELETE  TABLE  ITAB6 FROM  WA.

LOOP  AT  ITAB6 INTO  WA.
  WRITE: / WA-COL1, WA-COL2.
ENDLOOP.

### ABAP 中 ALSM_EXCEL_TO_INTERNAL_TABLE 函数报错解决方案 在 ABAP 编程环境中,`ALSM_EXCEL_TO_INTERNAL_TABLE` 是用于将 Excel 文件中的数据导入到内部表的一个常用函数模块。然而,在实际应用过程中可能会遇到各种错误情况。以下是针对该函数常见报错的原因分析及其对应的解决方案。 #### 1. **OLE2 技术依赖引发的错误** 由于 `ALSM_EXCEL_TO_INTERNAL_TABLE` 的实现基于 OLE2 技术,因此其运行环境受到一定限制[^1]。如果目标系统未安装 Microsoft Office 或者缺少必要的组件,则可能导致函数调用失败。 **解决方案**: 确保服务器端已正确配置并支持 OLE 自动化功能。对于无法通过 GUI 执行的任务,可以考虑使用其他替代方法(如 RFC 或文件传输协议)来完成批量操作。 #### 2. **特殊字符处理问题** 当 Excel 表格中含有特殊字符(例如换行符、转义序列或多字节编码字符串),这些内容可能被截断或者显示异常[^1]。这种情况下需要自定义扩展逻辑以适配复杂场景需求。 **建议措施**: 封装一个新的 FM (Function Module),命名为 `ZFM_AT_ALSM_EXCEL2ABAP` ,此新版本能够更好地兼容非标准输入格式的数据流转换过程[^2]。 #### 3. **内存溢出风险** 加载超大尺寸的工作簿时容易触发系统资源耗尽警告甚至崩溃现象。为了避免此类状况发生,推荐采用分页机制逐步提取所需记录而不是一次性全部读入内存之中。 ```abap DATA: lv_row_count TYPE i, lt_data TYPE TABLE OF zyour_table. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = p_file_name sheet = p_sheet_index row_offset = c_zero col_offset = c_one IMPORTING data = lt_data. IF sy-subrc EQ 0 AND lines( lt_data ) GT max_rows_per_batch. PERFORM process_in_batches USING lt_data CHANGING lv_row_count. ENDIF. ``` #### 4. **路径访问权限不足** 有时尽管提供了合法有效的文件名参数但仍会收到打开文档失败的消息提示。这通常是因为当前用户的账户缺乏足够的权利去触达指定位置上的对象实例所致。 **修正办法**: 检查相关目录结构以及共享设置是否允许程序进程顺利获取外部存储介质里的资料;必要时候联系管理员授予额外许可权限给执行主体身份角色。 --- ### 总结 综上所述,要成功运用好 `ALSM_EXCEL_TO_INTERNAL_TABLE` 需要注意多个方面因素的影响关系,并采取适当预防手段加以规避潜在隐患。具体而言可以从以下几个角度出发改进现有流程设计: - 加强底层基础设施建设保障; - 提升算法灵活性应对多样化业务诉求; - 控制消耗水平维持高效稳定运转状态。 希望以上信息对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值