ABAP Concept (πŸ“κ°œλ…)/Basic

|ABAP κ°œλ…μ •λ¦¬| AT NEW, AT LAST, AT FIRST, AT END OF

two_ssun 2022. 7. 4. 22:48

 

μ΄λ²ˆμ— μ„€λͺ…ν•  AT ~ ENDAT ꡬ문은 LOOP AT ꡬ문 내에 μ‚¬μš© κ°€λŠ₯ν•˜λ©°,

인터널 ν…Œμ΄λΈ”μ˜ μ‹œμž‘κ³Ό λ§ˆμ§€λ§‰ ν–‰, νŠΉμ • ν•„λ“œ κΈ°μ€€μœΌλ‘œ 데이터 λ³€κ²½μ˜ μ‹œμž‘κ³Ό λ§ˆμ§€λ§‰ 행을 Catch ν•˜μ—¬ μ›ν•˜λŠ” λ‘œμ§μ„ 넣을 수 μžˆλ‹€. 

 

μ‹€λ¬΄μ—μ„œλŠ” 주둜 이런 경우 많이 μ‚¬μš©λœλ‹€. 

  • νŠΉμ • ν•„λ“œ κΈ°μ€€μœΌλ‘œ 쀑간 합계 λ˜λŠ” 총합계 μ‚°μΆœ μ‹œ
  • νŠΉμ • ν•„λ“œ κΈ°μ€€μœΌλ‘œ Summary 인터널 ν…Œμ΄λΈ” μž¬κ΅¬μ„±μ‹œ
  • μ—‘μ…€ μ—…λ‘œλ“œ μ‹œ Row와 Col으둜 κ΅¬μ„±λœ μ—‘μ…€ 데이터λ₯Ό νŠΉμ • 인터널 ν…Œμ΄λΈ”λ‘œ 이관 μ‹œ

 


 LOOP AT ꡬ문 내에 μ‚¬μš©λ˜λŠ” AT ~ ENDAT ꡬ문은 λ‹€μŒκ³Ό 같이 4가지가 μ‘΄μž¬ν•˜λ©°,

ν•΄λ‹Ή ATꡬ문에 λ§žλŠ” 인터널 ν…Œμ΄λΈ”μ˜ 행이 Catch 되면, κ·Έ μ•ˆμ˜ μž‘μ„±ν•œ 둜직이 μˆ˜ν–‰μ΄ λ˜λŠ” ꡬ쑰닀. 

 

  AT FIRST.  ~  ENDAT. μΈν„°λ„ν…Œμ΄λΈ”μ˜ 첫번째 ν–‰ ( SY-TABIX = '1' )
  AT LAST.  ~  ENDAT. μΈν„°λ„ν…Œμ΄λΈ”μ˜ λ§ˆμ§€λ§‰ ν–‰ 
  AT NEW ν•„λ“œλͺ….  ~  ENDAT. μΈν„°λ„ν…Œμ΄λΈ”μ—μ„œ λͺ…μ‹œν•œ ν•„λ“œμ˜ 값이 변경이 μ‹œμž‘λœ ν–‰
  AT END OF ν•„λ“œλͺ….  ~  ENDAT. μΈν„°λ„ν…Œμ΄λΈ”μ—μ„œ λͺ…μ‹œν•œ ν•„λ“œμ˜ λ³€κ²½λœ 값이 λλ‚˜λŠ” ν–‰

 

< AT ꡬ문 예제 >

λ‹€μŒμ€ GT_ITAB에 ν‘œμ™€ 같이 데이터가 μžˆμ„ λ•Œ, AT ~ ENDAT κ΅¬λ¬Έμ—μ„œ Catch λ˜λŠ” 행을 보여주고 μžˆλ‹€. 

CARRID ν•„λ“œ 값이 'AC', 'AF', 'SQ'인 경우 데이터가 1건만 μ‘΄μž¬ν•˜λ―€λ‘œ 각 ν–‰λ§ˆλ‹€ at new CARRID와 at end of CARRID λ‘˜ λ‹€ μˆ˜ν–‰λ˜λ©°, 'LH'인 경우 μ‹œμž‘ν•˜λŠ” 3ν–‰μ—μ„œ at new CARRIDκ°€, λλ‚˜λŠ” 7ν–‰μ—μ„œ at end of CARRIDκ°€ μˆ˜ν–‰λœλ‹€. at firstλŠ” 첫째 ν–‰μ—μ„œ, at lastλŠ” λ§ˆμ§€λ§‰ 행인 8ν–‰μ—μ„œ μˆ˜ν–‰λœλ‹€. 

 

μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Ό ν•  점은 μ˜ˆμ‹œ 데이터 κΈ°μ€€μœΌλ‘œ λ§Œμ•½ at new CONNID ꡬ문을 μ‚¬μš©ν–ˆλ‹€λ©΄, 2행이 1ν–‰κ³Ό λ™μΌν•œ '820' κ°’μž„μ—λ„ at new CONNID ꡬ문이 μˆ˜ν–‰λœλ‹€λŠ” 점이닀. 이것은 at new CONNID ꡬ문이 CONNID ν•„λ“œλ§Œ λ³΄λŠ” 것이 μ•„λ‹ˆλΌ κ·Έ μ•žμ— μ„ μ–Έλœ ν•„λ“œ(λ“€) λ˜ν•œ κΈ°μ€€ ν•„λ“œλ‘œ μΈμ‹ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 즉, at new CONNIDλŠ” μ•ž ν•„λ“œκΉŒμ§€ ν¬ν•¨ν•œ at new CARRID + CONNID μ˜λ―Έλ‘œ λ³΄λ©΄ λœλ‹€.

 

λ”°λΌμ„œ at new ~와 at end of ~ μ‚¬μš© μ‹œμ—λŠ” λ‹€μŒ 사항을 κΌ­ μ²΄ν¬ν•˜λ„λ‘ ν•˜μž.

  • λͺ…μ‹œν•œ ν•„λ“œ κΈ°μ€€μœΌλ‘œ 인터널 ν…Œμ΄λΈ”μ„ μ •λ ¬ν•  것
  • λͺ…μ‹œλœ ν•„λ“œκ°€ 인터널 ν…Œμ΄λΈ” ν•„λ“œ 쀑 λͺ‡ 번째 μˆœμ„œμ— μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ‚¬μš©ν•  것

 


AT ~ ENDAT ꡬ문 λ‚΄μ—μ„œ LOOP AT ꡬ문의 Work areaλŠ” λ‹€μŒκ³Ό 같이 νŠΉλ³„ν•˜κ²Œ λ™μž‘ν•˜λ―€λ‘œ μ½”λ”© μ‹œ μœ μ˜ν•΄μ•Ό ν•œλ‹€. 

  • AT ꡬ문 λ‚΄μ—μ„œλŠ” Work area ν•„λ“œ 쀑 Character-type ν•„λ“œλŠ” 자릿수만큼 ' * ' 둜 λ³€ν™˜λ¨.
  • AT ꡬ문 λ‚΄μ—μ„œλŠ” Work area ν•„λ“œ 쀑 Character-type μ™Έ ν•„λ“œλŠ” 초기 κ°’(Initial Value)으둜 λ³€ν™˜λ¨.
  • at new ~ , at end of ~ μ—μ„œλŠ” λͺ…μ‹œν•œ ν•„λ“œ ν¬ν•¨ν•˜μ—¬ λ¨Όμ € μ„ μ–Έλœ ν•„λ“œλ“€μ€ κΈ°μ‘΄ κ°’ μœ μ§€. (λ³€ν™˜ μ—†μŒ)
  • LOOP AT ꡬ문 μ•ˆμ—μ„œ Work area 값을 변경해도 AT ꡬ문을 λ“€μ–΄κ°”λ‹€ λ‚˜μ˜€λ©΄ λ‹€μ‹œ κΈ°μ‘΄ κ°’μœΌλ‘œ 원볡 됨.

< at new CARRID μ—μ„œ Catch 된 Work area( GS_ITAB ) >

μ΄λŸ¬ν•œ μ œμ•½(?) μ‚¬ν•­μœΌλ‘œ μ‹€λ¬΄μ—μ„œλŠ” Work area와 λ™μΌν•œ ꡬ쑰체λ₯Ό λ³„λ„λ‘œ μ„ μ–Έ ν›„  AT ꡬ문 전에 Work area의 데이터λ₯Ό ν•΄λ‹Ή ꡬ쑰체에 λ‹΄μ•„ ATꡬ문 λ‚΄μ—μ„œ ν™œμš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

 

ν•˜λ‚˜ TIP이 μžˆλ‹€λ©΄ LOOP AT ꡬ문에 Work areaλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ASSIGNING <Field symbol>을 μ‚¬μš©ν•œλ‹€λ©΄ AT ~ ENDAT κ΅¬λ¬Έμ—μ„œ 이런 μ œμ•½μ‚¬ν•­ 없이 데이터λ₯Ό μ‰½κ²Œ μ œμ–΄ν•  수 μžˆλ‹€. 

 

μΆ”κ°€λ‘œ AT ~ ENDAT ꡬ문 내에 데이터 합계 μ‹œ μ‚¬μš©λ˜λŠ” " SUM. " 단독 ꡬ문이 μžˆλ‹€.  at first ~, at last ~ λŠ” 전체 데이터 κΈ°μ€€μœΌλ‘œ, at new ~, at end of ~ λŠ” λͺ…μ‹œν•œ ν•„λ“œμ˜ 데이터 κΈ°μ€€μœΌλ‘œ Numeric-type ν•„λ“œκ°€ ν•©μ‚°λ˜μ–΄ ν˜„μž¬ Work area에 λ°˜μ˜λœλ‹€. λ¬Όλ‘  μ•žμ„œ λ§ν•œ 것과 같이 κ³„μ‚°λœ 값은 at ꡬ문을 λΉ μ Έλ‚˜μ˜€λ©΄ κΈ°μ‘΄ κ°’μœΌλ‘œ λŒμ•„μ˜¨λ‹€.

 

λ˜ν•œ LOOP AT ꡬ문에 WHERE 쑰건을 λ„£μ—ˆμ„ κ²½μš°μ—” AT ꡬ문이 μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ„ 수 있기 λ•Œλ¬Έμ— ν”Όν•˜λŠ” 것이 μ’‹λ‹€. AT ꡬ문은 ν•΄λ‹Ή 인터널 ν…Œμ΄λΈ”μ˜ 전체 데이터 κΈ°μ€€μœΌλ‘œ 라인을 μ²΄ν¬ν•˜κΈ° λ•Œλ¬Έμ— WHERE 쑰건으둜 인해 AT ꡬ문에 ν•΄λ‹Ήν•˜λŠ” 행이 SKIP 될 수 μžˆλ‹€.