<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>셜록이2</title>
    <link>https://sherlock0105.tistory.com/</link>
    <description>안녕하세요 다양한 소식을 저와 함께 알아가요</description>
    <language>ko</language>
    <pubDate>Sat, 20 Jun 2026 20:07:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>셜록누나</managingEditor>
    <item>
      <title>[ABAP] TOP OF PAGE</title>
      <link>https://sherlock0105.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SAP Module Pool 프로그램에서 ALV Grid 상단에 요약 정보를 표시할 때 cl_dd_document를 사용합니다. HTML의 &amp;lt;div&amp;gt; 영역처럼 텍스트, 아이콘, 테이블, 링크 등을 자유롭게 배치할 수 있는 동적 문서 오브젝트입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 전역 변수 선언&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;abap&lt;/p&gt;
&lt;pre id=&quot;code_1780142280317&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DATA: gcl_top_con  TYPE REF TO cl_gui_container,  &quot; 상단 컨테이너 (Splitter에서 꺼낸 것)
      gcl_doc_top  TYPE REF TO cl_dd_document.     &quot; TOP OF PAGE 문서 오브젝트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 오브젝트 생성 (FORM create_top_doc)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cl_dd_document는 프로그램 시작 시 한 번만 CREATE OBJECT 합니다.&lt;br /&gt;set_top_page에서는 매번 initialize_document()로 초기화 후 재사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;abap&lt;/p&gt;
&lt;pre id=&quot;code_1780142305771&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FORM create_top_doc.

  CREATE OBJECT gcl_doc_top
    EXPORTING
      style            = 'ALV_GRID'   &quot; ALV 스타일 적용
      background_color = 1            &quot; 배경색 코드 (아래 표 참조)
      no_margins       = space.       &quot; space = 여백 있음, 'X' = 여백 없음

ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;background_color 코드표&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 코드로 배경색을 지정합니다. SAP GUI 테마에 따라 실제 색상은 다를 수 있습니다.&lt;/p&gt;
&lt;div id=&quot;code_1780142331608&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
&amp;lt;style&amp;gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; text-align: left; font-weight: 600; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
  .swatch { display: inline-block; width: 18px; height: 18px; border: 1px solid #ccc; border-radius: 3px; vertical-align: middle; margin-right: 8px; }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;table&amp;gt;
  &amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;코드&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;색상&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;설명&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;
  &amp;lt;tbody&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#ffffff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;흰색&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;기본 흰색 배경&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#c8e6c9&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;연두&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ALV_GRID 기본 헤더 배경&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#fff9c4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;연노랑&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;노란 배경&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#bbdefb&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;하늘&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;연파랑&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#ffe0b2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;연주황&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;오렌지 계열&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#f8bbd0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;연분홍&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;핑크 계열&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#e1bee7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;연보라&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;보라 계열&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;swatch&amp;quot; style=&amp;quot;background:#eceff1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;연회색&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;그레이 계열&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&quot;&gt;
&lt;style&gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; text-align: left; font-weight: 600; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
  .swatch { display: inline-block; width: 18px; height: 18px; border: 1px solid #ccc; border-radius: 3px; vertical-align: middle; margin-right: 8px; }
&lt;/style&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;코드&lt;/th&gt;
&lt;th&gt;색상&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #ffffff;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;흰색&lt;/td&gt;
&lt;td&gt;기본 흰색 배경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #c8e6c9;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;연두&lt;/td&gt;
&lt;td&gt;ALV_GRID 기본 헤더 배경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #fff9c4;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;연노랑&lt;/td&gt;
&lt;td&gt;노란 배경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #bbdefb;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;하늘&lt;/td&gt;
&lt;td&gt;연파랑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #ffe0b2;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;연주황&lt;/td&gt;
&lt;td&gt;오렌지 계열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #f8bbd0;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;연분홍&lt;/td&gt;
&lt;td&gt;핑크 계열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #e1bee7;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;연보라&lt;/td&gt;
&lt;td&gt;보라 계열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background: #eceff1;&quot; class=&quot;swatch&quot;&gt;&lt;/span&gt;연회색&lt;/td&gt;
&lt;td&gt;그레이 계열&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 문서 구성 메서드 전체 정리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1. 기본 텍스트 &amp;amp; 줄바꿈&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;1c&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;&quot; 텍스트 추가
gcl_doc_top-&amp;gt;add_text(
  text         = '텍스트 내용'
  sap_fontsize = 'LARGE'    &quot; SMALL / MEDIUM / LARGE / X-LARGE
  sap_emphasis = 'STRONG'   &quot; 굵게. 'X' = 기본 강조, 'STRONG' = 두껍게
  sap_color    = '5' ).     &quot; 글자 색상 코드 (아래 표 참조)

&quot; 줄바꿈 (HTML의 &amp;lt;br&amp;gt;)
gcl_doc_top-&amp;gt;new_line( ).&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;sap_color 글자 색상 코드표&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code_1780142440462&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
&amp;lt;style&amp;gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; text-align: left; font-weight: 600; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
  .preview { font-size: 14px; font-weight: 600; padding: 2px 8px; border-radius: 4px; }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;table&amp;gt;
  &amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;코드&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;미리보기&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;설명&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;
  &amp;lt;tbody&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'1'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;preview&amp;quot; style=&amp;quot;color:#1976D2&amp;quot;&amp;gt;샘플텍스트&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;파랑 (Key/Link 강조)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'2'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;preview&amp;quot; style=&amp;quot;color:#388E3C&amp;quot;&amp;gt;샘플텍스트&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;초록 (긍정/성공)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'3'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;preview&amp;quot; style=&amp;quot;color:#E53935&amp;quot;&amp;gt;샘플텍스트&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;빨강 (경고/오류)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'4'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;preview&amp;quot; style=&amp;quot;color:#F57C00&amp;quot;&amp;gt;샘플텍스트&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;주황 (주의)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'5'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;preview&amp;quot; style=&amp;quot;color:#6A1B9A&amp;quot;&amp;gt;샘플텍스트&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;보라&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'6'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;preview&amp;quot; style=&amp;quot;color:#00838F&amp;quot;&amp;gt;샘플텍스트&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;청록&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'7'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span class=&amp;quot;preview&amp;quot; style=&amp;quot;color:#757575&amp;quot;&amp;gt;샘플텍스트&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;회색 (보조 텍스트)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&quot;&gt;
&lt;style&gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; text-align: left; font-weight: 600; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
  .preview { font-size: 14px; font-weight: 600; padding: 2px 8px; border-radius: 4px; }
&lt;/style&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;코드&lt;/th&gt;
&lt;th&gt;미리보기&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;'1'&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #1976d2;&quot; class=&quot;preview&quot;&gt;샘플텍스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;파랑 (Key/Link 강조)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'2'&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #388e3c;&quot; class=&quot;preview&quot;&gt;샘플텍스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;초록 (긍정/성공)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'3'&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #e53935;&quot; class=&quot;preview&quot;&gt;샘플텍스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;빨강 (경고/오류)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'4'&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #f57c00;&quot; class=&quot;preview&quot;&gt;샘플텍스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;주황 (주의)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'5'&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #6a1b9a;&quot; class=&quot;preview&quot;&gt;샘플텍스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;보라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'6'&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #00838f;&quot; class=&quot;preview&quot;&gt;샘플텍스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;청록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'7'&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #757575;&quot; class=&quot;preview&quot;&gt;샘플텍스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;회색 (보조 텍스트)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;sap_fontsize / sap_emphasis 조합&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;code_1780142456826&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
&amp;lt;style&amp;gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; font-weight: 600; text-align: left; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;table&amp;gt;
  &amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;파라미터&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;값&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;결과&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;
  &amp;lt;tbody&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td rowspan=&amp;quot;4&amp;quot;&amp;gt;sap_fontsize&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;'SMALL'&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;font-size:11px&amp;quot;&amp;gt;작은 글자&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'MEDIUM'&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;font-size:13px&amp;quot;&amp;gt;기본 크기&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'LARGE'&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;font-size:16px&amp;quot;&amp;gt;큰 글자&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'X-LARGE'&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;font-size:20px&amp;quot;&amp;gt;매우 큰 글자&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td rowspan=&amp;quot;3&amp;quot;&amp;gt;sap_emphasis&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;'' (공백)&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;font-weight:400&amp;quot;&amp;gt;일반&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'X'&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;font-weight:600&amp;quot;&amp;gt;강조&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'STRONG'&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;font-weight:800&amp;quot;&amp;gt;굵게&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&quot;&gt;
&lt;style&gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; font-weight: 600; text-align: left; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
&lt;/style&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;파라미터&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;4&quot;&gt;sap_fontsize&lt;/td&gt;
&lt;td&gt;'SMALL'&lt;/td&gt;
&lt;td style=&quot;font-size: 11px;&quot;&gt;작은 글자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'MEDIUM'&lt;/td&gt;
&lt;td style=&quot;font-size: 13px;&quot;&gt;기본 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'LARGE'&lt;/td&gt;
&lt;td style=&quot;font-size: 16px;&quot;&gt;큰 글자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'X-LARGE'&lt;/td&gt;
&lt;td style=&quot;font-size: 20px;&quot;&gt;매우 큰 글자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;3&quot;&gt;sap_emphasis&lt;/td&gt;
&lt;td&gt;'' (공백)&lt;/td&gt;
&lt;td style=&quot;font-weight: 400;&quot;&gt;일반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'X'&lt;/td&gt;
&lt;td style=&quot;font-weight: 600;&quot;&gt;강조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'STRONG'&lt;/td&gt;
&lt;td style=&quot;font-weight: 800;&quot;&gt;굵게&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-2. 테이블 (다단 레이아웃)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;DATA: lcl_table TYPE REF TO cl_dd_table_element,
      lcl_c1    TYPE REF TO cl_dd_area,
      lcl_c2    TYPE REF TO cl_dd_area.

&quot; 테이블 생성
gcl_doc_top-&amp;gt;add_table(
  EXPORTING
    no_of_columns = 2    &quot; 열 개수
    border        = '0'  &quot; '0' = 테두리 없음, '1' = 테두리 있음
  IMPORTING
    table = lcl_table ).

&quot; 각 열 컬럼 추출 (width는 픽셀 단위 문자열)
lcl_table-&amp;gt;add_column( EXPORTING width = '100' IMPORTING column = lcl_c1 ).
lcl_table-&amp;gt;add_column( EXPORTING width = '200' IMPORTING column = lcl_c2 ).

&quot; 각 컬럼에 내용 추가
lcl_c1-&amp;gt;add_text( text = '라벨' sap_emphasis = 'X' ).
lcl_c2-&amp;gt;add_text( text = '값' ).

&quot; 다음 행으로 이동
lcl_table-&amp;gt;new_row( ).

&quot; 두 번째 행 내용 추가
lcl_c1-&amp;gt;add_text( text = '라벨2' sap_emphasis = 'X' ).
lcl_c2-&amp;gt;add_text( text = '값2' ).&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의:&lt;/b&gt; new_row() 이후에도 lcl_c1, lcl_c2 레퍼런스를 그대로 재사용합니다. 새로운 변수를 선언할 필요 없습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-3. 아이콘&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;DATA: lcl_icon_area TYPE REF TO cl_dd_area.

lcl_table-&amp;gt;add_column( IMPORTING column = lcl_icon_area ).

&quot; 아이콘 추가 (SE37 &amp;rarr; ICON_* 상수로 검색)
lcl_icon_area-&amp;gt;add_icon( 'ICON_LED_GREEN' ).  &quot; 초록 LED
lcl_icon_area-&amp;gt;add_icon( 'ICON_LED_RED' ).    &quot; 빨강 LED
lcl_icon_area-&amp;gt;add_icon( 'ICON_DOC' ).        &quot; 문서 아이콘
lcl_icon_area-&amp;gt;add_icon( 'ICON_OKAY' ).       &quot; 체크 아이콘
lcl_icon_area-&amp;gt;add_icon( 'ICON_CANCEL' ).     &quot; X 아이콘&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-4. 링크 (Hotspot)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;DATA: lcl_link_area TYPE REF TO cl_dd_area.

lcl_link_area-&amp;gt;add_link(
  text    = '자세히 보기'
  href    = 'LINK_DETAIL'     &quot; PAI에서 sy-ucomm으로 잡힘
  tooltip = '클릭하면 상세 조회' ).&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAI에서 WHEN 'LINK_DETAIL'으로 이벤트 처리합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-5. 가로줄 (Horizontal Rule)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;gcl_doc_top-&amp;gt;add_gap( width = 100 ).  &quot; 가로 여백 (픽셀)
gcl_doc_top-&amp;gt;add_hr( ).               &quot; 구분선 (HTML의 &amp;lt;hr&amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 문서 렌더링 (display_document)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용 구성이 끝나면 반드시 아래 두 메서드를 순서대로 호출합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;1c&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;&quot; ① merge_document: 내부 버퍼 병합 (필수)
gcl_doc_top-&amp;gt;merge_document( ).

&quot; ② display_document: 실제 화면에 출력
gcl_doc_top-&amp;gt;display_document(
  EXPORTING
    reuse_control = 'X'       &quot; 'X' = 기존 컨트롤 재사용 (깜빡임 방지)
    parent        = gcl_top_con ).&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;reuse_control = 'X'&lt;/b&gt; 를 반드시 넣어야 ALV 재조회 시 TOP OF PAGE가 깜빡이지 않습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 초기화 패턴 (재사용 시)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set_top_page처럼 데이터가 바뀔 때마다 다시 그려야 하는 경우, initialize_document()로 초기화 후 재구성합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;FORM set_top_page.

  CHECK pa_check NE 'X'.

  &quot;*-- 변수 선언
  DATA: lcl_table TYPE REF TO cl_dd_table_element,
        lcl_icon  TYPE REF TO cl_dd_area,
        lcl_c1    TYPE REF TO cl_dd_area,
        lcl_c2    TYPE REF TO cl_dd_area.

  &quot;*-- 집계 로직
  DATA: lv_total_price TYPE p DECIMALS 2,
        lv_total_accum TYPE p DECIMALS 2,
        lv_depr_rate   TYPE p DECIMALS 1.

  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(&amp;lt;fs&amp;gt;).
    lv_total_price += &amp;lt;fs&amp;gt;-aprice.
    lv_total_accum += &amp;lt;fs&amp;gt;-accum.
  ENDLOOP.

  IF lv_total_price &amp;gt; 0.
    lv_depr_rate = lv_total_accum / lv_total_price * 100.
  ENDIF.

  &quot;*-- 문서 초기화 (매번 재호출 시 필수)
  gcl_doc_top-&amp;gt;initialize_document( ).

  &quot;*-- 타이틀
  gcl_doc_top-&amp;gt;add_text(
    text         = |{ pa_gjahr }년 자산관리 현황|
    sap_fontsize = 'LARGE'
    sap_emphasis = 'STRONG'
    sap_color    = '1' ).
  gcl_doc_top-&amp;gt;new_line( ).
  gcl_doc_top-&amp;gt;new_line( ).

  &quot;*-- 테이블 구성
  gcl_doc_top-&amp;gt;add_table(
    EXPORTING no_of_columns = 3 border = '0'
    IMPORTING table = lcl_table ).
  lcl_table-&amp;gt;add_column( EXPORTING width = '24'  IMPORTING column = lcl_icon ).
  lcl_table-&amp;gt;add_column( EXPORTING width = '120' IMPORTING column = lcl_c1 ).
  lcl_table-&amp;gt;add_column( EXPORTING width = '100' IMPORTING column = lcl_c2 ).

  &quot;*-- 행 1
  lcl_icon-&amp;gt;add_icon( 'ICON_LED_GREEN' ).
  lcl_c1-&amp;gt;add_text( text = '감가상각율' sap_emphasis = 'X' ).
  lcl_c2-&amp;gt;add_text( text = |{ lv_depr_rate DECIMALS = 1 }%| sap_color = '3' ).
  lcl_table-&amp;gt;new_row( ).

  &quot;*-- 렌더링
  gcl_doc_top-&amp;gt;merge_document( ).
  gcl_doc_top-&amp;gt;display_document(
    EXPORTING reuse_control = 'X' parent = gcl_top_con ).

ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. initialize_document vs CREATE OBJECT 차이&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;code_1780142503153&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
&amp;lt;style&amp;gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; font-weight: 600; text-align: left; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
  .bad  { color: #E53935; font-weight: 700; }
  .good { color: #388E3C; font-weight: 700; }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;table&amp;gt;
  &amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;구분&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;CREATE OBJECT&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;initialize_document&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;
  &amp;lt;tbody&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;시점&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;프로그램 최초 실행 1회&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;데이터 변경 후 재렌더링마다&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;역할&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;오브젝트 인스턴스 생성&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;내부 버퍼 초기화 (내용 비움)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FORM&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;create_top_doc&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;set_top_page 상단&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;누락 시 문제&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;bad&amp;quot;&amp;gt;오브젝트 없음 &amp;rarr; DUMP&amp;lt;/td&amp;gt;&amp;lt;td class=&amp;quot;bad&amp;quot;&amp;gt;이전 내용 누적 &amp;rarr; 중복 표시&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&quot;&gt;
&lt;style&gt;
  body { font-family: 'Segoe UI', sans-serif; padding: 16px; background: #fff; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; }
  th { background: #f5f5f5; padding: 8px 12px; border: 1px solid #ddd; font-weight: 600; text-align: left; }
  td { padding: 8px 12px; border: 1px solid #ddd; }
  .bad  { color: #E53935; font-weight: 700; }
  .good { color: #388E3C; font-weight: 700; }
&lt;/style&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;CREATE OBJECT&lt;/th&gt;
&lt;th&gt;initialize_document&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;시점&lt;/td&gt;
&lt;td&gt;프로그램 최초 실행 1회&lt;/td&gt;
&lt;td&gt;데이터 변경 후 재렌더링마다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;td&gt;오브젝트 인스턴스 생성&lt;/td&gt;
&lt;td&gt;내부 버퍼 초기화 (내용 비움)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FORM&lt;/td&gt;
&lt;td&gt;create_top_doc&lt;/td&gt;
&lt;td&gt;set_top_page 상단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;누락 시 문제&lt;/td&gt;
&lt;td class=&quot;bad&quot;&gt;오브젝트 없음 &amp;rarr; DUMP&lt;/td&gt;
&lt;td class=&quot;bad&quot;&gt;이전 내용 누적 &amp;rarr; 중복 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 호출 순서 정리&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;FORM create_alv.
  PERFORM create_dock_con.    &quot; 1. 도킹 컨테이너 생성
  PERFORM create_splitter.    &quot; 2. 화면 분할
  PERFORM create_top_doc.     &quot; 3. cl_dd_document 오브젝트 생성 (1회)
  PERFORM create_tree.        &quot; 4. 트리 생성
  PERFORM create_grid.        &quot; 5. 그리드 생성
ENDFORM.

&quot; 이후 데이터 조회/변경 시마다:
PERFORM set_top_page.         &quot; initialize &amp;rarr; 구성 &amp;rarr; merge &amp;rarr; display&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ABAP</category>
      <category>ABAP</category>
      <category>TOPOFPAGE</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/35</guid>
      <comments>https://sherlock0105.tistory.com/35#entry35comment</comments>
      <pubDate>Sat, 30 May 2026 21:02:09 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] SPLITTER 정리</title>
      <link>https://sherlock0105.tistory.com/34</link>
      <description>&lt;style&gt;
:root {
  --mono: 'Courier New', monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }

body { font-family: var(--font-sans); color: var(--color-text-primary); }

.article { max-width: 680px; padding: 2rem 0; }

.hero { margin-bottom: 2.5rem; }
.hero h1 { font-size: 26px; font-weight: 500; line-height: 1.3; margin-bottom: 0.5rem; }
.hero .sub { font-size: 14px; color: var(--color-text-secondary); }
.tag { display: inline-block; background: var(--color-background-info); color: var(--color-text-info); font-size: 11px; padding: 2px 8px; border-radius: 4px; margin-right: 6px; }

.section { margin-bottom: 2.5rem; }
.section h2 { font-size: 18px; font-weight: 500; margin-bottom: 0.75rem; padding-bottom: 6px; border-bottom: 0.5px solid var(--color-border-tertiary); }
.section h3 { font-size: 15px; font-weight: 500; margin: 1.25rem 0 0.5rem; color: var(--color-text-secondary); }
.section p { font-size: 14px; line-height: 1.75; color: var(--color-text-secondary); margin-bottom: 0.75rem; }
.section ul { padding-left: 1.25rem; margin-bottom: 0.75rem; }
.section ul li { font-size: 14px; line-height: 1.75; color: var(--color-text-secondary); }

.diagram-wrap { background: var(--color-background-secondary); border-radius: var(--border-radius-lg); padding: 1.5rem; margin: 1rem 0; display: flex; justify-content: center; }

.code-block { background: var(--color-background-secondary); border: 0.5px solid var(--color-border-tertiary); border-radius: var(--border-radius-md); overflow-x: auto; margin: 1rem 0; }
.code-block .code-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; border-bottom: 0.5px solid var(--color-border-tertiary); }
.code-block .code-lang { font-size: 11px; color: var(--color-text-tertiary); font-family: var(--mono); text-transform: uppercase; letter-spacing: 0.05em; }
.copy-btn { font-size: 12px; color: var(--color-text-secondary); background: none; border: 0.5px solid var(--color-border-tertiary); border-radius: 4px; padding: 2px 8px; cursor: pointer; }
.copy-btn:hover { background: var(--color-background-primary); }
.code-block pre { padding: 1rem 1.25rem; font-size: 12.5px; line-height: 1.7; font-family: var(--mono); overflow-x: auto; }

.kw { color: #7c5cbf; }
.cm { color: var(--color-text-tertiary); font-style: italic; }
.str { color: #2e7d32; }
.num { color: #1565c0; }

.callout { background: var(--color-background-warning); border-left: 2px solid; border-color: var(--color-border-warning); border-radius: 0 var(--border-radius-md) var(--border-radius-md) 0; padding: 10px 14px; margin: 1rem 0; font-size: 13px; color: var(--color-text-warning); }
.callout-info { background: var(--color-background-info); border-color: var(--color-border-info); color: var(--color-text-info); }

.prop-table { width: 100%; border-collapse: collapse; font-size: 13px; margin: 1rem 0; }
.prop-table th { text-align: left; font-weight: 500; padding: 6px 10px; background: var(--color-background-secondary); border: 0.5px solid var(--color-border-tertiary); }
.prop-table td { padding: 6px 10px; border: 0.5px solid var(--color-border-tertiary); color: var(--color-text-secondary); vertical-align: top; }
.prop-table code { font-family: var(--mono); font-size: 12px; background: var(--color-background-secondary); padding: 1px 4px; border-radius: 3px; color: var(--color-text-primary); }

.divider { border: none; border-top: 0.5px solid var(--color-border-tertiary); margin: 2rem 0; }
&lt;/style&gt;

&lt;div class=&quot;article&quot;&gt;

  &lt;div class=&quot;hero&quot;&gt;
    &lt;div style=&quot;margin-bottom:10px&quot;&gt;
      &lt;span class=&quot;tag&quot;&gt;ABAP&lt;/span&gt;
      &lt;span class=&quot;tag&quot;&gt;GUI&lt;/span&gt;
      &lt;span class=&quot;tag&quot;&gt;Module Pool&lt;/span&gt;
    &lt;/div&gt;
    &lt;h1&gt;SAP ABAP Splitter Container 완벽 가이드&lt;/h1&gt;
    &lt;p class=&quot;sub&quot;&gt;cl_gui_splitter_container로 화면을 상하·좌우·중첩 분할하는 모든 방법&lt;/p&gt;
  &lt;/div&gt;

  &lt;div class=&quot;section&quot;&gt;
    &lt;h2&gt;개요&lt;/h2&gt;
    &lt;p&gt;SAP Module Pool 프로그램에서 하나의 화면을 여러 영역으로 나눌 때 &lt;code&gt;cl_gui_splitter_container&lt;/code&gt;를 사용합니다. 이 클래스는 HTML의 grid/flex 레이아웃과 유사하게, rows × columns 격자로 화면을 분할하고 각 셀에서 컨테이너를 꺼내 자식 GUI 오브젝트(ALV Grid, Tree, Chart 등)를 붙이는 방식으로 동작합니다.&lt;/p&gt;
    &lt;div class=&quot;callout callout-info&quot;&gt;
      &lt;strong&gt;핵심 원칙:&lt;/strong&gt; Splitter는 부모 컨테이너를 분할하는 도구입니다. 최상위 부모는 보통 &lt;code&gt;cl_gui_docking_container&lt;/code&gt; 또는 SE51에서 정의한 &lt;code&gt;cl_gui_custom_container&lt;/code&gt;입니다.
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class=&quot;section&quot;&gt;
    &lt;h2&gt;1. 기본 구조 이해&lt;/h2&gt;
    &lt;p&gt;Splitter를 생성하면 rows × columns 개의 셀이 만들어집니다. &lt;code&gt;get_container&lt;/code&gt;로 원하는 셀의 컨테이너 레퍼런스를 꺼내 사용합니다.&lt;/p&gt;

    &lt;div class=&quot;diagram-wrap&quot;&gt;
      &lt;svg width=&quot;440&quot; height=&quot;180&quot; viewBox=&quot;0 0 440 180&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Splitter container 기본 구조 다이어그램&quot;&gt;
        &lt;rect x=&quot;20&quot; y=&quot;20&quot; width=&quot;400&quot; height=&quot;140&quot; rx=&quot;6&quot; fill=&quot;none&quot; stroke=&quot;#B4B2A9&quot; stroke-width=&quot;1.5&quot;/&gt;
        &lt;text x=&quot;30&quot; y=&quot;14&quot; font-size=&quot;11&quot; fill=&quot;#888780&quot; font-family=&quot;Courier New, monospace&quot;&gt;cl_gui_docking_container (부모)&lt;/text&gt;

        &lt;rect x=&quot;40&quot; y=&quot;35&quot; width=&quot;360&quot; height=&quot;110&quot; rx=&quot;4&quot; fill=&quot;none&quot; stroke=&quot;#7c5cbf&quot; stroke-width=&quot;1.5&quot; stroke-dasharray=&quot;5,3&quot;/&gt;
        &lt;text x=&quot;50&quot; y=&quot;50&quot; font-size=&quot;10&quot; fill=&quot;#7c5cbf&quot; font-family=&quot;Courier New, monospace&quot;&gt;cl_gui_splitter_container  rows=2, columns=1&lt;/text&gt;

        &lt;rect x=&quot;50&quot; y=&quot;58&quot; width=&quot;340&quot; height=&quot;35&quot; rx=&quot;3&quot; fill=&quot;#EEEDFE&quot; stroke=&quot;#AFA9EC&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;220&quot; y=&quot;80&quot; text-anchor=&quot;middle&quot; font-size=&quot;12&quot; fill=&quot;#3C3489&quot; font-family=&quot;Courier New, monospace&quot;&gt;row=1 col=1 → gcl_top_con&lt;/text&gt;

        &lt;rect x=&quot;50&quot; y=&quot;98&quot; width=&quot;340&quot; height=&quot;35&quot; rx=&quot;3&quot; fill=&quot;#E1F5EE&quot; stroke=&quot;#5DCAA5&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;220&quot; y=&quot;120&quot; text-anchor=&quot;middle&quot; font-size=&quot;12&quot; fill=&quot;#085041&quot; font-family=&quot;Courier New, monospace&quot;&gt;row=2 col=1 → lcl_bottom_con&lt;/text&gt;

        &lt;text x=&quot;405&quot; y=&quot;78&quot; font-size=&quot;10&quot; fill=&quot;#888780&quot;&gt;height%&lt;/text&gt;
        &lt;text x=&quot;405&quot; y=&quot;118&quot; font-size=&quot;10&quot; fill=&quot;#888780&quot;&gt;height%&lt;/text&gt;
      &lt;/svg&gt;
    &lt;/div&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-lang&quot;&gt;ABAP — 기본 상하 2분할&lt;/span&gt;
        &lt;button class=&quot;copy-btn&quot; onclick=&quot;copyCode(this)&quot;&gt;copy&lt;/button&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;cm&quot;&gt;&quot; 1) Splitter 오브젝트 생성 (부모 컨테이너에 붙임)&lt;/span&gt;
&lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; gcl_splitter
  &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
    parent  = gcl_dock_container  &lt;span class=&quot;cm&quot;&gt;&quot; 부모 컨테이너&lt;/span&gt;
    rows    = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;                  &lt;span class=&quot;cm&quot;&gt;&quot; 행 개수&lt;/span&gt;
    columns = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;                  &lt;span class=&quot;cm&quot;&gt;&quot; 열 개수&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

&lt;span class=&quot;cm&quot;&gt;&quot; 2) 각 셀에서 컨테이너 레퍼런스 추출&lt;/span&gt;
gcl_splitter-&gt;get_container(
  &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_top_con ).   &lt;span class=&quot;cm&quot;&gt;&quot; 상단&lt;/span&gt;

gcl_splitter-&gt;get_container(
  &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = lcl_bottom_con ). &lt;span class=&quot;cm&quot;&gt;&quot; 하단&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;&quot; 3) 비율 설정 (합산 100 권장)&lt;/span&gt;
gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;20&lt;/span&gt; ). &lt;span class=&quot;cm&quot;&gt;&quot; 상단 20%&lt;/span&gt;
gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;80&lt;/span&gt; ). &lt;span class=&quot;cm&quot;&gt;&quot; 하단 80%&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class=&quot;section&quot;&gt;
    &lt;h2&gt;2. 비율 설정 메서드&lt;/h2&gt;
    &lt;p&gt;행/열 크기는 절댓값(px)이 아닌 상대 비율입니다. 합산이 100이 되도록 설정하는 것이 일반적입니다.&lt;/p&gt;
    &lt;table class=&quot;prop-table&quot;&gt;
      &lt;thead&gt;
        &lt;tr&gt;&lt;th&gt;메서드&lt;/th&gt;&lt;th&gt;파라미터&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;&lt;td&gt;&lt;code&gt;set_row_height&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;&lt;/td&gt;&lt;td&gt;id번째 행의 높이 비율 설정&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;&lt;code&gt;set_column_width&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt;&lt;/td&gt;&lt;td&gt;id번째 열의 너비 비율 설정&lt;br&gt;나머지 열은 자동으로 채움&lt;/td&gt;&lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;div class=&quot;callout&quot;&gt;
      &lt;strong&gt;주의:&lt;/strong&gt; &lt;code&gt;set_column_width&lt;/code&gt;는 지정한 열 하나만 설정하면 나머지가 자동으로 균등 배분됩니다. 모든 열을 명시적으로 설정하려면 각각 호출하세요.
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;hr class=&quot;divider&quot;&gt;

  &lt;div class=&quot;section&quot;&gt;
    &lt;h2&gt;3. 패턴별 전체 코드&lt;/h2&gt;

    &lt;h3&gt;패턴 A — 좌우 2분할 (트리 + 그리드)&lt;/h3&gt;
    &lt;div class=&quot;diagram-wrap&quot;&gt;
      &lt;svg width=&quot;380&quot; height=&quot;110&quot; viewBox=&quot;0 0 380 110&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
        &lt;rect x=&quot;10&quot; y=&quot;10&quot; width=&quot;360&quot; height=&quot;90&quot; rx=&quot;6&quot; fill=&quot;none&quot; stroke=&quot;#B4B2A9&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;rect x=&quot;20&quot; y=&quot;20&quot; width=&quot;115&quot; height=&quot;70&quot; rx=&quot;3&quot; fill=&quot;#EEEDFE&quot; stroke=&quot;#AFA9EC&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;77&quot; y=&quot;57&quot; text-anchor=&quot;middle&quot; font-size=&quot;12&quot; fill=&quot;#3C3489&quot; font-family=&quot;Courier New, monospace&quot;&gt;col=1&lt;/text&gt;
        &lt;text x=&quot;77&quot; y=&quot;72&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; fill=&quot;#534AB7&quot;&gt;gcl_tree_con&lt;/text&gt;
        &lt;rect x=&quot;145&quot; y=&quot;20&quot; width=&quot;215&quot; height=&quot;70&quot; rx=&quot;3&quot; fill=&quot;#E1F5EE&quot; stroke=&quot;#5DCAA5&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;252&quot; y=&quot;57&quot; text-anchor=&quot;middle&quot; font-size=&quot;12&quot; fill=&quot;#085041&quot; font-family=&quot;Courier New, monospace&quot;&gt;col=2&lt;/text&gt;
        &lt;text x=&quot;252&quot; y=&quot;72&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; fill=&quot;#0F6E56&quot;&gt;gcl_right_con&lt;/text&gt;
        &lt;text x=&quot;190&quot; y=&quot;98&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; fill=&quot;#888780&quot;&gt;width=35%  /  width=65% (자동)&lt;/text&gt;
      &lt;/svg&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-lang&quot;&gt;ABAP — 좌우 2분할&lt;/span&gt;
        &lt;button class=&quot;copy-btn&quot; onclick=&quot;copyCode(this)&quot;&gt;copy&lt;/button&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;kw&quot;&gt;DATA&lt;/span&gt;: lcl_lr_splitter &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_splitter_container.

&lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; lcl_lr_splitter
  &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
    parent  = lcl_bottom_con  &lt;span class=&quot;cm&quot;&gt;&quot; 분할할 부모 컨테이너&lt;/span&gt;
    rows    = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    columns = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

lcl_lr_splitter-&gt;get_container(
  &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_tree_con ).  &lt;span class=&quot;cm&quot;&gt;&quot; 좌측: 트리&lt;/span&gt;

lcl_lr_splitter-&gt;get_container(
  &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_right_con ). &lt;span class=&quot;cm&quot;&gt;&quot; 우측: 그리드&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;&quot; 좌측 35%, 우측은 자동으로 65%&lt;/span&gt;
lcl_lr_splitter-&gt;set_column_width( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; width = &lt;span class=&quot;num&quot;&gt;35&lt;/span&gt; ).&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;패턴 B — 중첩 스플리터 (상단 Header + 하단 좌우 분할)&lt;/h3&gt;
    &lt;p&gt;실무에서 가장 많이 쓰이는 구조입니다. 외부 스플리터로 상하를 나누고, 하단 컨테이너를 다시 내부 스플리터로 좌우로 분할합니다.&lt;/p&gt;
    &lt;div class=&quot;diagram-wrap&quot;&gt;
      &lt;svg width=&quot;420&quot; height=&quot;175&quot; viewBox=&quot;0 0 420 175&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
        &lt;rect x=&quot;10&quot; y=&quot;8&quot; width=&quot;400&quot; height=&quot;160&quot; rx=&quot;6&quot; fill=&quot;none&quot; stroke=&quot;#7c5cbf&quot; stroke-width=&quot;1.5&quot; stroke-dasharray=&quot;5,3&quot;/&gt;
        &lt;text x=&quot;15&quot; y=&quot;6&quot; font-size=&quot;10&quot; fill=&quot;#7c5cbf&quot;&gt;gcl_splitter (outer, rows=2 cols=1)&lt;/text&gt;

        &lt;rect x=&quot;20&quot; y=&quot;18&quot; width=&quot;380&quot; height=&quot;38&quot; rx=&quot;3&quot; fill=&quot;#FAECE7&quot; stroke=&quot;#F0997B&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;210&quot; y=&quot;41&quot; text-anchor=&quot;middle&quot; font-size=&quot;12&quot; fill=&quot;#993C1D&quot; font-family=&quot;Courier New, monospace&quot;&gt;row=1 → gcl_top_con  (Header / HTML Doc)&lt;/text&gt;

        &lt;rect x=&quot;20&quot; y=&quot;62&quot; width=&quot;380&quot; height=&quot;96&quot; rx=&quot;3&quot; fill=&quot;none&quot; stroke=&quot;#B4B2A9&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;200&quot; y=&quot;76&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; fill=&quot;#888780&quot;&gt;lcl_bottom_con → lcl_lr_splitter (inner, rows=1 cols=2)&lt;/text&gt;

        &lt;rect x=&quot;28&quot; y=&quot;82&quot; width=&quot;118&quot; height=&quot;68&quot; rx=&quot;3&quot; fill=&quot;#EEEDFE&quot; stroke=&quot;#AFA9EC&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;87&quot; y=&quot;116&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; fill=&quot;#3C3489&quot;&gt;col=1&lt;/text&gt;
        &lt;text x=&quot;87&quot; y=&quot;131&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; fill=&quot;#534AB7&quot;&gt;gcl_tree_con&lt;/text&gt;

        &lt;rect x=&quot;154&quot; y=&quot;82&quot; width=&quot;238&quot; height=&quot;68&quot; rx=&quot;3&quot; fill=&quot;#E1F5EE&quot; stroke=&quot;#5DCAA5&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;273&quot; y=&quot;116&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; fill=&quot;#085041&quot;&gt;col=2&lt;/text&gt;
        &lt;text x=&quot;273&quot; y=&quot;131&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; fill=&quot;#0F6E56&quot;&gt;gcl_right_con&lt;/text&gt;
      &lt;/svg&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-lang&quot;&gt;ABAP — 중첩 스플리터 전체 코드 (FORM create_splitter)&lt;/span&gt;
        &lt;button class=&quot;copy-btn&quot; onclick=&quot;copyCode(this)&quot;&gt;copy&lt;/button&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;kw&quot;&gt;FORM&lt;/span&gt; create_splitter.
  &lt;span class=&quot;kw&quot;&gt;DATA&lt;/span&gt;: lcl_bottom_con     &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_container,
        lcl_lr_splitter    &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_splitter_container.

  &lt;span class=&quot;cm&quot;&gt;&quot; ① 외부 스플리터: 상하 2분할&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; gcl_splitter
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
      parent  = gcl_dock_container
      rows    = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
      columns = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
      &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

  gcl_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_top_con ).     &lt;span class=&quot;cm&quot;&gt;&quot; 상단: HTML Doc 영역&lt;/span&gt;
  gcl_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = lcl_bottom_con ).  &lt;span class=&quot;cm&quot;&gt;&quot; 하단: 좌우 분할 예정&lt;/span&gt;

  gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;20&lt;/span&gt; ).
  gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;80&lt;/span&gt; ).

  &lt;span class=&quot;cm&quot;&gt;&quot; ② 내부 스플리터: 하단을 좌우 2분할 (트리 35% / 그리드 65%)&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; lcl_lr_splitter
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
      parent  = lcl_bottom_con
      rows    = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
      columns = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
      &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

  lcl_lr_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_tree_con ).
  lcl_lr_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_right_con ).

  lcl_lr_splitter-&gt;set_column_width( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; width = &lt;span class=&quot;num&quot;&gt;35&lt;/span&gt; ).
&lt;span class=&quot;kw&quot;&gt;ENDFORM&lt;/span&gt;.&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;패턴 C — 3중 중첩 (상단 Header + 하단 좌우 + 우측 상하 분할)&lt;/h3&gt;
    &lt;p&gt;ZRE3FI0002에서 사용하는 구조입니다. 우측 영역을 다시 그리드/차트로 상하 분할합니다.&lt;/p&gt;
    &lt;div class=&quot;diagram-wrap&quot;&gt;
      &lt;svg width=&quot;420&quot; height=&quot;210&quot; viewBox=&quot;0 0 420 210&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
        &lt;rect x=&quot;10&quot; y=&quot;8&quot; width=&quot;400&quot; height=&quot;198&quot; rx=&quot;6&quot; fill=&quot;none&quot; stroke=&quot;#7c5cbf&quot; stroke-width=&quot;1.5&quot; stroke-dasharray=&quot;5,3&quot;/&gt;
        &lt;text x=&quot;15&quot; y=&quot;6&quot; font-size=&quot;10&quot; fill=&quot;#7c5cbf&quot;&gt;gcl_splitter (outer)&lt;/text&gt;

        &lt;rect x=&quot;20&quot; y=&quot;18&quot; width=&quot;380&quot; height=&quot;35&quot; rx=&quot;3&quot; fill=&quot;#FAECE7&quot; stroke=&quot;#F0997B&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;210&quot; y=&quot;40&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; fill=&quot;#993C1D&quot;&gt;gcl_top_con  (Header)&lt;/text&gt;

        &lt;rect x=&quot;28&quot; y=&quot;62&quot; width=&quot;118&quot; height=&quot;134&quot; rx=&quot;3&quot; fill=&quot;#EEEDFE&quot; stroke=&quot;#AFA9EC&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;87&quot; y=&quot;132&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; fill=&quot;#3C3489&quot;&gt;gcl_tree_con&lt;/text&gt;

        &lt;rect x=&quot;154&quot; y=&quot;62&quot; width=&quot;236&quot; height=&quot;134&quot; rx=&quot;3&quot; fill=&quot;none&quot; stroke=&quot;#5DCAA5&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;265&quot; y=&quot;76&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; fill=&quot;#888780&quot;&gt;lcl_right_splitter (rows=2 cols=1)&lt;/text&gt;

        &lt;rect x=&quot;162&quot; y=&quot;82&quot; width=&quot;220&quot; height=&quot;50&quot; rx=&quot;3&quot; fill=&quot;#E1F5EE&quot; stroke=&quot;#5DCAA5&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;272&quot; y=&quot;111&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; fill=&quot;#085041&quot;&gt;gcl_right_con  (그리드)&lt;/text&gt;

        &lt;rect x=&quot;162&quot; y=&quot;138&quot; width=&quot;220&quot; height=&quot;50&quot; rx=&quot;3&quot; fill=&quot;#E6F1FB&quot; stroke=&quot;#85B7EB&quot; stroke-width=&quot;1&quot;/&gt;
        &lt;text x=&quot;272&quot; y=&quot;167&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; fill=&quot;#0C447C&quot;&gt;gcl_chart_con  (차트)&lt;/text&gt;
      &lt;/svg&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-lang&quot;&gt;ABAP — 3중 중첩 전체 코드&lt;/span&gt;
        &lt;button class=&quot;copy-btn&quot; onclick=&quot;copyCode(this)&quot;&gt;copy&lt;/button&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;kw&quot;&gt;FORM&lt;/span&gt; create_splitter.
  &lt;span class=&quot;kw&quot;&gt;DATA&lt;/span&gt;: lcl_bottom_con     &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_container,
        lcl_lr_splitter    &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_splitter_container,
        lcl_right_splitter &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_splitter_container.

  &lt;span class=&quot;cm&quot;&gt;&quot; ① 외부: 상단(20%) / 하단(80%) 분할&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; gcl_splitter
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
      parent  = gcl_dock_container
      rows    = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
      columns = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
      &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

  gcl_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_top_con ).
  gcl_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = lcl_bottom_con ).

  gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;20&lt;/span&gt; ).
  gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;80&lt;/span&gt; ).

  &lt;span class=&quot;cm&quot;&gt;&quot; ② 중간: 하단을 좌(트리 35%) / 우(65%) 분할&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; lcl_lr_splitter
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
      parent  = lcl_bottom_con
      rows    = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
      columns = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
      &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

  lcl_lr_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_tree_con ).
  lcl_lr_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_right_con ).

  lcl_lr_splitter-&gt;set_column_width( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; width = &lt;span class=&quot;num&quot;&gt;35&lt;/span&gt; ).

  &lt;span class=&quot;cm&quot;&gt;&quot; ③ 내부: 우측을 상(그리드 50%) / 하(차트 50%) 분할&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; lcl_right_splitter
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
      parent  = gcl_right_con  &lt;span class=&quot;cm&quot;&gt;&quot; ②에서 꺼낸 우측 컨테이너가 부모&lt;/span&gt;
      rows    = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
      columns = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
      &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

  lcl_right_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_right_con ).  &lt;span class=&quot;cm&quot;&gt;&quot; 변수 재사용 (그리드 컨테이너)&lt;/span&gt;
  lcl_right_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_chart_con ).

  lcl_right_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;50&lt;/span&gt; ).
  lcl_right_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;50&lt;/span&gt; ).
&lt;span class=&quot;kw&quot;&gt;ENDFORM&lt;/span&gt;.&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;callout&quot;&gt;
      &lt;strong&gt;gcl_right_con 재사용 포인트:&lt;/strong&gt; lcl_right_splitter 생성 시 &lt;code&gt;parent = gcl_right_con&lt;/code&gt;으로 넘기고, get_container row=1 결과를 다시 &lt;code&gt;gcl_right_con&lt;/code&gt;에 받습니다. 이렇게 하면 별도 변수 없이 기존 전역 변수를 재활용할 수 있습니다.
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;hr class=&quot;divider&quot;&gt;

  &lt;div class=&quot;section&quot;&gt;
    &lt;h2&gt;4. pa_check 조건 분기 패턴&lt;/h2&gt;
    &lt;p&gt;Selection Screen 파라미터로 레이아웃을 동적으로 전환할 때 사용합니다. 체크박스가 ON이면 분할 없이 단일 컨테이너로, OFF면 전체 분할 레이아웃으로 동작합니다.&lt;/p&gt;
    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-lang&quot;&gt;ABAP — pa_check 조건 분기&lt;/span&gt;
        &lt;button class=&quot;copy-btn&quot; onclick=&quot;copyCode(this)&quot;&gt;copy&lt;/button&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;kw&quot;&gt;IF&lt;/span&gt; pa_check &lt;span class=&quot;kw&quot;&gt;EQ&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;'X'&lt;/span&gt;.
  &lt;span class=&quot;cm&quot;&gt;&quot; 체크박스 ON: 스플리터 없이 전체를 하나의 컨테이너로 사용&lt;/span&gt;
  lcl_bottom_con = gcl_dock_container.
&lt;span class=&quot;kw&quot;&gt;ELSE&lt;/span&gt;.
  &lt;span class=&quot;cm&quot;&gt;&quot; 체크박스 OFF: 상하 분할 후 하단 컨테이너를 lcl_bottom_con에 배정&lt;/span&gt;
  &lt;span class=&quot;kw&quot;&gt;CREATE OBJECT&lt;/span&gt; gcl_splitter
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt;
      parent  = gcl_dock_container
      rows    = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt;
      columns = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;EXCEPTIONS&lt;/span&gt;
      &lt;span class=&quot;kw&quot;&gt;OTHERS&lt;/span&gt;  = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;.

  gcl_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = gcl_top_con ).
  gcl_splitter-&gt;get_container(
    &lt;span class=&quot;kw&quot;&gt;EXPORTING&lt;/span&gt; row = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; column = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;RECEIVING&lt;/span&gt; container = lcl_bottom_con ).

  gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;1&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;20&lt;/span&gt; ).
  gcl_splitter-&gt;set_row_height( id = &lt;span class=&quot;num&quot;&gt;2&lt;/span&gt; height = &lt;span class=&quot;num&quot;&gt;80&lt;/span&gt; ).
&lt;span class=&quot;kw&quot;&gt;ENDIF&lt;/span&gt;.

&lt;span class=&quot;cm&quot;&gt;&quot; 이후 lcl_bottom_con을 동일하게 사용 →&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;&quot; 분기와 관계없이 나머지 코드는 동일하게 유지&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class=&quot;section&quot;&gt;
    &lt;h2&gt;5. 전역 변수 선언 참고&lt;/h2&gt;
    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-lang&quot;&gt;ABAP — 전역 컨테이너 변수 선언&lt;/span&gt;
        &lt;button class=&quot;copy-btn&quot; onclick=&quot;copyCode(this)&quot;&gt;copy&lt;/button&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;kw&quot;&gt;DATA&lt;/span&gt;: gcl_dock_container &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_docking_container,
      gcl_splitter       &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_splitter_container,
      gcl_top_con        &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_container,  &lt;span class=&quot;cm&quot;&gt;&quot; 상단 Header&lt;/span&gt;
      gcl_tree_con       &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_container,  &lt;span class=&quot;cm&quot;&gt;&quot; 좌측 트리&lt;/span&gt;
      gcl_right_con      &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_container,  &lt;span class=&quot;cm&quot;&gt;&quot; 우측 ALV 그리드&lt;/span&gt;
      gcl_chart_con      &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_container,  &lt;span class=&quot;cm&quot;&gt;&quot; 우측 하단 차트&lt;/span&gt;
      gcl_grid           &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_alv_grid,
      gcl_tree           &lt;span class=&quot;kw&quot;&gt;TYPE REF TO&lt;/span&gt; cl_gui_alv_tree.&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class=&quot;section&quot;&gt;
    &lt;h2&gt;요약: 스플리터 생성 3단계&lt;/h2&gt;
    &lt;table class=&quot;prop-table&quot;&gt;
      &lt;thead&gt;
        &lt;tr&gt;&lt;th&gt;단계&lt;/th&gt;&lt;th&gt;코드&lt;/th&gt;&lt;th&gt;역할&lt;/th&gt;&lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;1. 생성&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CREATE OBJECT splitter EXPORTING parent rows columns&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;부모 컨테이너를 rows×columns로 분할&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;2. 추출&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;splitter-&gt;get_container( row col RECEIVING container )&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;원하는 셀의 컨테이너 레퍼런스 획득&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;3. 비율&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;splitter-&gt;set_row_height / set_column_width&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;행/열 크기 비율 지정 (합산 100 권장)&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;
function copyCode(btn) {
  const pre = btn.closest('.code-block').querySelector('pre');
  const text = pre.innerText || pre.textContent;
  navigator.clipboard.writeText(text).then(() =&gt; {
    btn.textContent = 'copied!';
    setTimeout(() =&gt; btn.textContent = 'copy', 1500);
  });
}
&lt;/script&gt;</description>
      <category>ABAP</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/34</guid>
      <comments>https://sherlock0105.tistory.com/34#entry34comment</comments>
      <pubDate>Sat, 30 May 2026 20:51:47 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] SAP ABAP 엑셀 템플릿 다운로드 구현 (SMW0 + DOWNLOAD_WEB_OBJECT)</title>
      <link>https://sherlock0105.tistory.com/33</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;개요&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자에게 업로드용 엑셀 템플릿을 제공할 때 가장 깔끔한 방법은&lt;br /&gt;SMW0에 템플릿 파일을 등록해두고 DOWNLOAD_WEB_OBJECT로 내려받는 패턴임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1단계 &amp;mdash; SMW0 템플릿 등록&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMW0 트랜잭션 &amp;rarr; Binary Data 선택 &amp;rarr; 업로드&lt;br /&gt;등록 후 Object ID를 기억해둠 (예: ZPE3QM_EXCEL)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAP는 등록된 파일 정보를 &lt;b&gt;WWWDATA&lt;/b&gt; 테이블에 저장함.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OBJID&lt;/td&gt;
&lt;td&gt;Object ID (SMW0 등록명)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RELID&lt;/td&gt;
&lt;td&gt;데이터 종류 구분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPataA/dJMcagMqA5k/3EauS9D8fzTHFl733ZBLlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPataA/dJMcagMqA5k/3EauS9D8fzTHFl733ZBLlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPataA/dJMcagMqA5k/3EauS9D8fzTHFl733ZBLlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPataA%2FdJMcagMqA5k%2F3EauS9D8fzTHFl733ZBLlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;212&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2단계 &amp;mdash; 코드 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;① WWWDATA에서 키 조회&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;DATA ls_key TYPE wwwdatatab.

SELECT SINGLE *
  INTO CORRESPONDING FIELDS OF ls_key
  FROM wwwdata
 WHERE objid = 'ZPE3QM_EXCEL'.

IF sy-subrc NE 0.
  MESSAGE s000 WITH '엑셀 템플릿 Object를 찾을 수 없습니다.' DISPLAY LIKE 'E'.
  EXIT.
ENDIF.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMW0에 등록된 파일의 메타정보를 가져옴.&lt;br /&gt;sy-subrc NE 0 이면 SMW0 미등록 상태 &amp;rarr; 방어 처리 필수.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;② 저장 경로 팝업&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;DATA: lv_filename    TYPE string,
      lv_path        TYPE string,
      lv_fullpath    TYPE string,
      lv_user_action TYPE i.

CALL METHOD cl_gui_frontend_services=&amp;gt;file_save_dialog
  EXPORTING
    default_extension = 'XLSX'
    default_file_name = '검수결과_업로드_템플릿.xlsx'
    file_filter       = 'Excel 파일 (*.xlsx)|*.xlsx|'
  CHANGING
    filename          = lv_filename
    path              = lv_path
    fullpath          = lv_fullpath
    user_action       = lv_user_action
  EXCEPTIONS
    OTHERS            = 1.

&quot; 취소 클릭 시 중단
IF lv_user_action = cl_gui_frontend_services=&amp;gt;action_cancel.
  EXIT.
ENDIF.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file_save_dialog는 OS 기본 저장 대화상자를 띄움.&lt;br /&gt;사용자가 취소(action_cancel)하면 다운로드 없이 종료.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;③ 파일 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;abap&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
  EXPORTING
    key         = ls_key
    destination = CONV rlgrap-filename( lv_fullpath ).

MESSAGE s000 WITH '검수결과 업로드 템플릿이 다운로드되었습니다.'.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOWNLOAD_WEB_OBJECT가 SMW0 오브젝트를 지정 경로에 바이너리로 저장.&lt;br /&gt;destination은 rlgrap-filename 타입(CHAR128)이므로 CONV로 변환 필요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 흐름&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;SMW0 등록 (ZPE3QM_EXCEL)
    │
    │ SELECT SINGLE &amp;rarr; WWWDATA
    ▼
ls_key (파일 메타정보)
    │
    │ file_save_dialog &amp;rarr; 사용자 경로 선택
    ▼
lv_fullpath (저장 경로)
    │
    │ DOWNLOAD_WEB_OBJECT
    ▼
로컬 PC에 XLSX 저장&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체코드&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGxEYr/dJMcabj3nVg/1oC8aPIAEAy8okNpgUtow1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGxEYr/dJMcabj3nVg/1oC8aPIAEAy8okNpgUtow1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGxEYr/dJMcabj3nVg/1oC8aPIAEAy8okNpgUtow1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGxEYr%2FdJMcabj3nVg%2F1oC8aPIAEAy8okNpgUtow1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;185&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1779529793876&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  DATA : lv_filename    TYPE string,
         lv_path        TYPE string,
         lv_fullpath    TYPE string,
         lv_user_action TYPE i,
         ls_key         TYPE wwwdatatab.

  SELECT SINGLE *
    INTO CORRESPONDING FIELDS OF ls_key
    FROM wwwdata
   WHERE objid = 'ZPE3QM_EXCEL'.

  IF sy-subrc NE 0.
    MESSAGE s000 WITH '엑셀 템플릿 Object를 찾을 수 없습니다.' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  CALL METHOD cl_gui_frontend_services=&amp;gt;file_save_dialog
    EXPORTING
      default_extension = 'XLSX'
      default_file_name = '검수결과_업로드_템플릿.xlsx'
      file_filter       = 'Excel 파일 (*.xlsx)|*.xlsx|'
    CHANGING
      filename          = lv_filename
      path              = lv_path
      fullpath          = lv_fullpath
      user_action       = lv_user_action
    EXCEPTIONS
      OTHERS            = 1.

  IF lv_user_action = cl_gui_frontend_services=&amp;gt;action_cancel.
    EXIT.
  ENDIF.

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_key
      destination = CONV rlgrap-filename( lv_fullpath ).

  MESSAGE s000 WITH '검수결과 업로드 템플릿이 다운로드되었습니다.'.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ABAP/기초</category>
      <category>ABAP</category>
      <category>엑셀 템플릿 다운</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/33</guid>
      <comments>https://sherlock0105.tistory.com/33#entry33comment</comments>
      <pubDate>Sat, 23 May 2026 18:51:14 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] ALV 불필요한 툴바 버튼 제거하는법</title>
      <link>https://sherlock0105.tistory.com/32</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배경&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CL_GUI_ALV_GRID 기본 툴바에는 편집용 버튼들이 기본으로 활성화되어 있음.&lt;br /&gt;조회 전용 ALV인데 사용자가 행 삭제/추가를 할 수 있으면 UX상 혼란을 줌.&lt;br /&gt;it_toolbar_excluding 파라미터로 원하는 버튼만 골라서 제거 가능.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6KofT/dJMcahYOLyd/lk1FK9YCN4WVDmXz7pmGJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6KofT/dJMcahYOLyd/lk1FK9YCN4WVDmXz7pmGJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6KofT/dJMcahYOLyd/lk1FK9YCN4WVDmXz7pmGJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6KofT%2FdJMcahYOLyd%2Flk1FK9YCN4WVDmXz7pmGJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1069&quot; height=&quot;768&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1779529281174&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &quot;불필요한 툴바 제거
  gt_exclude = VALUE #(
                         ( cl_gui_alv_grid=&amp;gt;mc_fc_loc_undo )        &quot;UNDO 제거
                         ( cl_gui_alv_grid=&amp;gt;mc_fc_loc_cut )         &quot;CUT
                         ( cl_gui_alv_grid=&amp;gt;mc_mb_paste )           &quot;PASTE
                         ( cl_gui_alv_grid=&amp;gt;mc_fc_loc_copy_row )    &quot;COPY_ROW
                         ( cl_gui_alv_grid=&amp;gt;mc_fc_loc_append_row )  &quot;APPNED_ROW
                         ( cl_gui_alv_grid=&amp;gt;mc_fc_loc_delete_row )  &quot;DELETE_ROW
                         ( cl_gui_alv_grid=&amp;gt;mc_fc_loc_insert_row )  &quot;INSERT_ROW
                     ).&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvR43B/dJMcah5DgRd/X3pnWSDq2KJlrlinwUONak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvR43B/dJMcah5DgRd/X3pnWSDq2KJlrlinwUONak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvR43B/dJMcah5DgRd/X3pnWSDq2KJlrlinwUONak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvR43B%2FdJMcah5DgRd%2FX3pnWSDq2KJlrlinwUONak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;340&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btAgFi/dJMcabdckgt/m6oOLrXqy6y1XrOg5yKag0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btAgFi/dJMcabdckgt/m6oOLrXqy6y1XrOg5yKag0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btAgFi/dJMcabdckgt/m6oOLrXqy6y1XrOg5yKag0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtAgFi%2FdJMcabdckgt%2Fm6oOLrXqy6y1XrOg5yKag0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;262&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE2PK3/dJMcadWo0AE/7ra6HPMtQ6FMn1pOSeI861/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE2PK3/dJMcadWo0AE/7ra6HPMtQ6FMn1pOSeI861/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE2PK3/dJMcadWo0AE/7ra6HPMtQ6FMn1pOSeI861/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE2PK3%2FdJMcadWo0AE%2F7ra6HPMtQ6FMn1pOSeI861%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;606&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>ABAP/기초</category>
      <category>툴바제거</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/32</guid>
      <comments>https://sherlock0105.tistory.com/32#entry32comment</comments>
      <pubDate>Sat, 23 May 2026 18:44:51 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] 도메인 텍스트 매핑</title>
      <link>https://sherlock0105.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALV에 코드값(SA, 01)만 표시하면 사용자가 의미를 알 수 없음.&lt;br /&gt;ZDE3_FI_BLART = SA &amp;rarr; 일반전표 처럼 텍스트로 변환해서 보여줘야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAP는 도메인 고정값(Fixed Values)의 텍스트를 &lt;b&gt;DD07T&lt;/b&gt; 테이블에 저장함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DD07T 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DOMNAME&lt;/td&gt;
&lt;td&gt;도메인명 (예: ZDE3_FI_BLART)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOMVALUE_L&lt;/td&gt;
&lt;td&gt;코드값 (예: SA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DDTEXT&lt;/td&gt;
&lt;td&gt;텍스트 (예: 일반전표)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DDLANGUAGE&lt;/td&gt;
&lt;td&gt;언어키 (WHERE 빠지면 전체 언어 조회됨 주의)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;① 도메인 텍스트 Bulk SELECT&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT domvalue_l AS key, ddtext
  INTO TABLE @DATA(lt_stgrd)
  FROM dd07t
  WHERE domname EQ 'ZDE3_FI_STGRD'.

SORT lt_stgrd BY key.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인 전체 고정값을 한 번에 메모리로 가져옴&lt;/li&gt;
&lt;li&gt;SORT 는 이후 BINARY SEARCH 를 위한 전처리&lt;/li&gt;
&lt;li&gt;LOOP 안에서 SELECT 하지 않는 것이 핵심 &amp;larr; &lt;b&gt;N+1 쿼리 방지&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;② LOOP + FIELD-SYMBOL + BINARY SEARCH&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;LOOP AT gt_header ASSIGNING FIELD-SYMBOL(&amp;lt;fs_h&amp;gt;).
  READ TABLE lt_stgrd INTO DATA(ls_stgrd)
    WITH KEY key = &amp;lt;fs_h&amp;gt;-stgrd
    BINARY SEARCH.
  IF sy-subrc EQ 0.
    &amp;lt;fs_h&amp;gt;-stgrd_txt = ls_stgrd-ddtext.
  ENDIF.
ENDLOOP.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인트 3가지:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FIELD-SYMBOL (&amp;lt;fs_h&amp;gt;)&lt;/b&gt; &amp;mdash; 복사본이 아닌 원본 참조&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot; INTO ls_h &amp;rarr; 복사본 수정 &amp;rarr; gt_header 안 바뀜 (❌)
&quot; ASSIGNING &amp;lt;fs_h&amp;gt; &amp;rarr; 원본 직접 수정 (✅)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BINARY SEARCH&lt;/b&gt; &amp;mdash; 정렬된 테이블에서 O(log n) 탐색&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;&quot; SORT 없이 BINARY SEARCH &amp;rarr; 결과 보장 안 됨 (❌)
&quot; SORT &amp;rarr; BINARY SEARCH 세트로 사용 (✅)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sy-subrc 체크&lt;/b&gt; &amp;mdash; 코드값이 도메인에 없는 경우 방어&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;IF sy-subrc EQ 0.  &quot; 찾았을 때만 텍스트 세팅
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 흐름 요약&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;DD07T (도메인 고정값 테이블)
    │
    │ SELECT (Bulk, 1회)
    ▼
lt_stgrd / lt_blart (메모리)
    │
    │ SORT &amp;rarr; BINARY SEARCH
    ▼
gt_header (ALV 출력 테이블)
    stgrd_txt / blart_txt 컬럼에 텍스트 세팅
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어 필터를 빠뜨리면 다국어 레코드가 중복 조회됨.&lt;br /&gt;운영 시스템에서는 WHERE 절에 추가 권장:&lt;/p&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;WHERE domname    EQ 'ZDE3_FI_BLART'
  AND ddlanguage EQ sy-langu.   &quot; 현재 로그인 언어
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ABAP/기초</category>
      <category>도메인</category>
      <category>도메인텍스트매핑</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/31</guid>
      <comments>https://sherlock0105.tistory.com/31#entry31comment</comments>
      <pubDate>Sat, 23 May 2026 18:39:55 +0900</pubDate>
    </item>
    <item>
      <title>CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS' 말일 계산 FUNCTION</title>
      <link>https://sherlock0105.tistory.com/30</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CIQbI/dJMcaf0TOS8/mY5zhAOij8S1wvY6jKSsr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CIQbI/dJMcaf0TOS8/mY5zhAOij8S1wvY6jKSsr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CIQbI/dJMcaf0TOS8/mY5zhAOij8S1wvY6jKSsr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCIQbI%2FdJMcaf0TOS8%2FmY5zhAOij8S1wvY6jKSsr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;408&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;  CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = sy-datum                &quot; Key date
    IMPORTING
      last_day_of_month = lv_date.                 &quot; Date of last day of the month from key  date

  DATA(ls_header)   = VALUE zte3fi0002(
                    bukrs = '1000'
                    blart = 'SA'
                    waers = 'KRW'
                    budat = lv_date   &quot;월말일을 계산
                    pernr = sy-uname
                    bltxt = |{ pv_gjahr }년 { pv_monat }월 감가상각|
    ).&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KaqhA/dJMcadvcJUt/K1ksWsgry67B1Bunh3mlM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KaqhA/dJMcadvcJUt/K1ksWsgry67B1Bunh3mlM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KaqhA/dJMcadvcJUt/K1ksWsgry67B1Bunh3mlM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKaqhA%2FdJMcadvcJUt%2FK1ksWsgry67B1Bunh3mlM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;187&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월을 입력 받고 -&amp;gt; 월말일을 계산하는 로직&lt;/p&gt;</description>
      <category>ABAP</category>
      <category>월말계산</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/30</guid>
      <comments>https://sherlock0105.tistory.com/30#entry30comment</comments>
      <pubDate>Sat, 16 May 2026 13:14:02 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] ALV TREE , EVENT</title>
      <link>https://sherlock0105.tistory.com/29</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucihB/dJMcacXk4e1/kxVDj5XAKAnzv6izZW8vx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucihB/dJMcacXk4e1/kxVDj5XAKAnzv6izZW8vx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucihB/dJMcacXk4e1/kxVDj5XAKAnzv6izZW8vx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucihB%2FdJMcacXk4e1%2FkxVDj5XAKAnzv6izZW8vx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;914&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TOP 선언&lt;/p&gt;
&lt;pre id=&quot;code_1778301801818&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot; ===== 트리 관련 전역 선언 =====

&quot; 노드 키 (filter_detail에서 루트 판단)
DATA: gv_all_node TYPE lvc_nkey,
      gv_sel_node TYPE lvc_nkey.

&quot; 데이터 테이블
DATA : BEGIN OF gs_data,
       END OF gs_data,
       gt_data      LIKE TABLE OF gs_data,  &quot; 트리용 마스터
       gt_make_tree LIKE TABLE OF gs_data.  &quot; 트리 내부 outtab

&quot; CDS 기반 그리드용
DATA: gs_item TYPE zcds_e3_cm_0001_i,
      gt_item LIKE TABLE OF gs_item.

&quot; 컨테이너 / 트리 / 그리드 객체
DATA: gcl_dock_container TYPE REF TO cl_gui_docking_container,
      gcl_splitter       TYPE REF TO cl_gui_splitter_container,
      gcl_top_con        TYPE REF TO cl_gui_container,  &quot; TOP OF PAGE
      gcl_tree_con       TYPE REF TO cl_gui_container,  &quot; 트리
      gcl_right_con      TYPE REF TO cl_gui_container,  &quot; 그리드
      gcl_chart_con      TYPE REF TO cl_gui_container,  &quot; 차트
      gcl_tree           TYPE REF TO cl_gui_alv_tree,
      gcl_grid           TYPE REF TO cl_gui_alv_grid,
      gcl_doc_top        TYPE REF TO cl_dd_document.

&quot; 필드카탈로그 / 레이아웃
DATA: gt_fcat_tree TYPE lvc_t_fcat,   &quot; 트리 숫자 컬럼용
      gt_fcat      TYPE lvc_t_fcat,   &quot; 그리드용
      gs_fcat      TYPE lvc_s_fcat,
      gs_layout    TYPE lvc_s_layo,
      gs_variant   TYPE disvariant,
      gs_stable    TYPE lvc_s_stbl.

&quot; 이벤트
DATA: gt_event TYPE cntl_simple_events,
      gs_event LIKE LINE OF gt_event.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PBO&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chmZy2/dJMcagMfhDm/Dl4H21owAXVyLJnenlkHa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chmZy2/dJMcagMfhDm/Dl4H21owAXVyLJnenlkHa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chmZy2/dJMcagMfhDm/Dl4H21owAXVyLJnenlkHa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchmZy2%2FdJMcagMfhDm%2FDl4H21owAXVyLJnenlkHa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;340&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778302422667&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form create_dock_con
*&amp;amp;---------------------------------------------------------------------*
FORM create_dock_con.

  CREATE OBJECT gcl_dock_container
    EXPORTING
      side      = cl_gui_docking_container=&amp;gt;dock_at_left
      extension = 5000.

ENDFORM.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form create_splitter
*&amp;amp; 상하(TOP/하단) &amp;rarr; 좌우(트리/그리드) &amp;rarr; 우측 상하(그리드/차트)
*&amp;amp;---------------------------------------------------------------------*
FORM create_splitter.

  DATA: lcl_bottom_con     TYPE REF TO cl_gui_container,
        lcl_lr_splitter    TYPE REF TO cl_gui_splitter_container,
        lcl_right_splitter TYPE REF TO cl_gui_splitter_container.

  &quot; [1단계] 상하 분할 (상단 20% TOP / 하단 80% 컨텐츠)
  CREATE OBJECT gcl_splitter
    EXPORTING
      parent  = gcl_dock_container
      rows    = 2
      columns = 1.

  gcl_splitter-&amp;gt;get_container( EXPORTING row=1 column=1 RECEIVING container=gcl_top_con ).
  gcl_splitter-&amp;gt;get_container( EXPORTING row=2 column=1 RECEIVING container=lcl_bottom_con ).
  gcl_splitter-&amp;gt;set_row_height( id=1 height=20 ).
  gcl_splitter-&amp;gt;set_row_height( id=2 height=80 ).

  &quot; [2단계] 하단 좌우 분할 (트리 35% / 그리드 65%)
  CREATE OBJECT lcl_lr_splitter
    EXPORTING
      parent  = lcl_bottom_con
      rows    = 1
      columns = 2.

  lcl_lr_splitter-&amp;gt;get_container( EXPORTING row=1 column=1 RECEIVING container=gcl_tree_con ).
  lcl_lr_splitter-&amp;gt;get_container( EXPORTING row=1 column=2 RECEIVING container=gcl_right_con ).
  lcl_lr_splitter-&amp;gt;set_column_width( id=1 width=35 ).
  lcl_lr_splitter-&amp;gt;set_column_width( id=2 width=65 ).

  &quot; [3단계] 우측 상하 분할 (그리드 50% / 차트 50%)
  CREATE OBJECT lcl_right_splitter
    EXPORTING
      parent  = gcl_right_con
      rows    = 2
      columns = 1.

  lcl_right_splitter-&amp;gt;get_container( EXPORTING row=1 column=1 RECEIVING container=gcl_right_con ).
  lcl_right_splitter-&amp;gt;get_container( EXPORTING row=2 column=1 RECEIVING container=gcl_chart_con ).
  lcl_right_splitter-&amp;gt;set_row_height( id=1 height=50 ).
  lcl_right_splitter-&amp;gt;set_row_height( id=2 height=50 ).

ENDFORM.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form create_top_doc
*&amp;amp; cl_dd_document 객체 생성 (set_top_page에서 사용)
*&amp;amp;---------------------------------------------------------------------*
FORM create_top_doc.

  CREATE OBJECT gcl_doc_top
    EXPORTING
      style            = 'ALV_TO_HTML'
      background_color = 1
      no_margins       = space.

ENDFORM.
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form set_tree_header
*&amp;amp; 트리 좌측 숫자 컬럼 필드카탈로그
*&amp;amp;---------------------------------------------------------------------*
FORM set_tree_header.

  PERFORM set_fcat_tree USING:
    'APRICE' '취득원가' 'ZTE3CM0002' 'APRICE' '8',
    'ACCUM'  '감가누계' 'ZTE3CM0002' 'ACCUM'  '8',
    'BOOK'   '장부가액' 'ZTE3CM0002' 'APRICE' '8',
    'WAERS'  '통화'     'ZTE3CM0002' 'WAERS'  '8'.

ENDFORM.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form set_fcat_tree
*&amp;amp;---------------------------------------------------------------------*
FORM set_fcat_tree USING pv_field
                         pv_text
                         pv_ref_table
                         pv_ref_field
                         pv_len.

  gs_fcat-fieldname = pv_field.
  gs_fcat-coltext   = pv_text.
  gs_fcat-ref_table = pv_ref_table.
  gs_fcat-ref_field = pv_ref_field.
  gs_fcat-outputlen = pv_len.

  CASE pv_field.
    WHEN 'APRICE' OR 'ACCUM' OR 'BOOK'.
      gs_fcat-cfieldname = 'WAERS'.  &quot; 통화키 연결
      gs_fcat-do_sum     = 'X'.      &quot; 합계 자동계산
  ENDCASE.

  APPEND gs_fcat TO gt_fcat_tree.
  CLEAR  gs_fcat.

ENDFORM.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form create_tree
*&amp;amp; ALV Tree 객체 생성 + 이벤트 등록
*&amp;amp;---------------------------------------------------------------------*
FORM create_tree.

  DATA: l_hierarchy_header TYPE treev_hhdr.

  l_hierarchy_header-heading   = '자산명'.
  l_hierarchy_header-width     = 25.
  l_hierarchy_header-width_pix = space.

  CREATE OBJECT gcl_tree
    EXPORTING
      parent              = gcl_tree_con
      node_selection_mode = cl_gui_column_tree=&amp;gt;node_sel_mode_single
      item_selection      = space
      no_html_header      = 'X'
      no_toolbar          = space.

  &quot; 더블클릭 이벤트 등록
  gcl_tree-&amp;gt;get_registered_events( IMPORTING events = gt_event ).
  gs_event-eventid    = cl_gui_column_tree=&amp;gt;eventid_node_double_click.
  gs_event-appl_event = 'X'.
  APPEND gs_event TO gt_event.
  gcl_tree-&amp;gt;set_registered_events( EXPORTING events = gt_event ).

  SET HANDLER lcl_event_handler=&amp;gt;handle_node_click FOR gcl_tree.

  gs_variant-report = sy-repid.

  gcl_tree-&amp;gt;set_table_for_first_display(
    EXPORTING
      i_save              = 'A'
      is_variant          = gs_variant
      is_hierarchy_header = l_hierarchy_header
    CHANGING
      it_outtab       = gt_make_tree   &quot; 트리 내부 데이터 (add_node가 여기 채워넣음)
      it_fieldcatalog = gt_fcat_tree ).

ENDFORM.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form make_hierarchy
*&amp;amp; [Lv.0] 전체 루트
*&amp;amp; [Lv.1] 자산분류 폴더 (anlkl 기준 합계)
*&amp;amp; [Lv.2] 개별 자산 리프
*&amp;amp;---------------------------------------------------------------------*
FORM make_hierarchy.

  DATA: lt_data_tmp LIKE TABLE OF gs_data,
        lt_sum      LIKE TABLE OF gs_data,
        ls_sum      LIKE gs_data,
        ls_root     LIKE gs_data,
        lv_all_key  TYPE lvc_nkey,
        lv_cls_key  TYPE lvc_nkey,
        lv_node_key TYPE lvc_nkey.

  lt_data_tmp = gt_data.
  REFRESH: gt_make_tree, lt_sum.

  &quot;----------------------------------------------------------------
  &quot; STEP 1. anlkl별 합계 집계 (COLLECT &amp;rarr; O(n) 루프 1번)
  &quot;         COLLECT은 anlkl 같은 행끼리 aprice/accum 자동 합산
  &quot;----------------------------------------------------------------
  LOOP AT lt_data_tmp INTO gs_data.
    CLEAR ls_sum.
    ls_sum-anlkl  = gs_data-anlkl.
    ls_sum-aprice = gs_data-aprice.
    ls_sum-accum  = gs_data-accum.
    ls_sum-book   = gs_data-aprice - gs_data-accum.
    ls_sum-waers  = 'KRW'.
    COLLECT ls_sum INTO lt_sum.
  ENDLOOP.

  SORT lt_sum      BY anlkl.
  SORT lt_data_tmp BY anlkl anln1.

  &quot;----------------------------------------------------------------
  &quot; STEP 2. [Lv.0] 루트 노드 &amp;mdash; 전체
  &quot;         ls_root는 반드시 CLEAR 후 넘겨야 COLLECT 잔여값 방지
  &quot;----------------------------------------------------------------
  CLEAR ls_root.
  PERFORM add_node USING ls_root '전체' space lv_all_key.
  gv_all_node = lv_all_key.  &quot; 전역 저장 &amp;rarr; filter_detail에서 루트 판단에 사용

  &quot;----------------------------------------------------------------
  &quot; STEP 3. [Lv.1] 분류 폴더 + [Lv.2] 개별 자산 리프
  &quot;----------------------------------------------------------------
  LOOP AT lt_sum INTO ls_sum.

    &quot; [Lv.1] 자산분류 폴더 노드 (부모: lv_all_key)
    PERFORM add_node USING ls_sum ls_sum-anlkl lv_all_key lv_cls_key.

    &quot; [Lv.2] 개별 자산 리프 노드 (부모: lv_cls_key)
    LOOP AT lt_data_tmp INTO gs_data WHERE anlkl = ls_sum-anlkl.
      PERFORM add_node USING gs_data gs_data-anlnt lv_cls_key lv_node_key.
    ENDLOOP.

  ENDLOOP.

  &quot;----------------------------------------------------------------
  &quot; STEP 4. 트리 렌더링
  &quot;----------------------------------------------------------------
  gcl_tree-&amp;gt;expand_node( i_node_key = gv_all_node ).
  gcl_tree-&amp;gt;update_calculations( ).
  gcl_tree-&amp;gt;frontend_update( ).

ENDFORM.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form add_node
*&amp;amp; ps_data      : 노드에 담길 실제 데이터 (오른쪽 숫자 컬럼)
*&amp;amp; pv_text      : 왼쪽 계층 컬럼에 표시될 텍스트
*&amp;amp; pv_relat_key : 부모 노드 키 (space면 최상위 루트)
*&amp;amp; pv_node_key  : 생성된 노드의 고유 키 반환 (자식 연결 시 부모로 사용)
*&amp;amp;---------------------------------------------------------------------*
FORM add_node USING ps_data      LIKE gs_data
                    pv_text
                    pv_relat_key TYPE lvc_nkey
                    pv_node_key  TYPE lvc_nkey.

  DATA lv_node_text TYPE lvc_value.
  lv_node_text = pv_text.

  gcl_tree-&amp;gt;add_node(
    EXPORTING
      i_relat_node_key = pv_relat_key
      i_relationship   = cl_gui_column_tree=&amp;gt;relat_last_child
      i_node_text      = lv_node_text
      is_outtab_line   = ps_data
    IMPORTING
      e_new_node_key   = pv_node_key ).

ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EVENT&lt;/p&gt;
&lt;pre id=&quot;code_1778302548737&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Include          ZRE3FI0008_C01
*&amp;amp;---------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION FINAL.
  PUBLIC SECTION.

    CLASS-METHODS:
      handle_node_click
        FOR EVENT node_double_click OF cl_gui_alv_tree
        IMPORTING node_key.

ENDCLASS.
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Class (Implementation) lcl_event_handler
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;
*&amp;amp;---------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.

  METHOD handle_node_click.

    PERFORM filter_detail USING node_key.

  ENDMETHOD.

ENDCLASS.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1778302519596&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form filter_detail
*&amp;amp; 트리 노드 클릭 시 우측 Grid 필터링
*&amp;amp; - 전체 노드: 전체 조회
*&amp;amp; - Lv.1 폴더: anlkl 조건
*&amp;amp; - Lv.2 리프: anln1 조건
*&amp;amp;---------------------------------------------------------------------*
FORM filter_detail USING pv_node_key TYPE lvc_nkey.

  DATA: ls_node  LIKE gs_data,
        lr_anln1 TYPE RANGE OF zte3cm0002-anln1,
        lr_anlkl TYPE RANGE OF zte3cm0002-anlkl.

  &quot; 클릭한 노드의 outtab 데이터 읽기
  gcl_tree-&amp;gt;get_outtab_line(
    EXPORTING i_node_key    = pv_node_key
    IMPORTING e_outtab_line = ls_node ).

  &quot; 노드 종류 판단 &amp;rarr; RANGE 조건 세팅
  IF pv_node_key NE gv_all_node.                     &quot; 전체가 아니면

    IF ls_node-anln1 IS NOT INITIAL.                 &quot; Lv.2 리프 클릭
      lr_anln1 = VALUE #( ( sign='I' option='EQ' low=ls_node-anln1 ) ).

    ELSEIF ls_node-anlkl IS NOT INITIAL.             &quot; Lv.1 폴더 클릭
      lr_anlkl = VALUE #( ( sign='I' option='EQ' low=ls_node-anlkl ) ).

    ENDIF.
  ENDIF.

  &quot; CDS에서 조건에 맞는 월별 감가상각 조회
  REFRESH gt_item.
  SELECT bukrs, anln1, anlnt, waers,
         m01, m02, m03, m04, m05, m06,
         m07, m08, m09, m10, m11, m12
    FROM zcds_e3_cm_0001_i
   WHERE bukrs = @pa_bukrs
     AND ( gjahr = @pa_gjahr OR gjahr IS NULL )
     AND anln1 IN @lr_anln1
     AND anlkl IN @lr_anlkl
    INTO CORRESPONDING FIELDS OF TABLE @gt_item.

  gcl_grid-&amp;gt;refresh_table_display(
    EXPORTING is_stable = gs_stable i_soft_refresh = space ).

ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xieRE/dJMcaaFguyu/6gRK8HIg41LlcXmVvrgolK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xieRE/dJMcaaFguyu/6gRK8HIg41LlcXmVvrgolK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xieRE/dJMcaaFguyu/6gRK8HIg41LlcXmVvrgolK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxieRE%2FdJMcaaFguyu%2F6gRK8HIg41LlcXmVvrgolK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;366&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PBO 에 EVENT 등록&lt;/p&gt;
&lt;pre id=&quot;code_1778302622408&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FORM create_tree .

  DATA: l_hierarchy_header TYPE treev_hhdr.

  l_hierarchy_header-heading   = '자산명'.
  l_hierarchy_header-width     = 25.
  l_hierarchy_header-width_pix = space.

  CREATE OBJECT gcl_tree
    EXPORTING
      parent              = gcl_tree_con
      node_selection_mode = cl_gui_column_tree=&amp;gt;node_sel_mode_single
      item_selection      = space
      no_html_header      = 'X'
      no_toolbar          = space
    EXCEPTIONS
      OTHERS              = 1.

  &quot; 이벤트 등록
  CALL METHOD gcl_tree-&amp;gt;get_registered_events
    IMPORTING
      events = gt_event.

  gs_event-eventid    = cl_gui_column_tree=&amp;gt;eventid_node_double_click.
  gs_event-appl_event = 'X'.
  APPEND gs_event TO gt_event.

  CALL METHOD gcl_tree-&amp;gt;set_registered_events
    EXPORTING
      events = gt_event.

  SET HANDLER lcl_event_handler=&amp;gt;handle_node_click FOR gcl_tree.

  gs_variant-report = sy-repid.

  CALL METHOD gcl_tree-&amp;gt;set_table_for_first_display
    EXPORTING
      i_save              = 'A'
      is_variant          = gs_variant
      is_hierarchy_header = l_hierarchy_header
    CHANGING
      it_outtab           = gt_make_tree
      it_fieldcatalog     = gt_fcat_tree.

ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LAYOUT&lt;/p&gt;
&lt;pre id=&quot;code_1778302663221&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FORM set_tree_header .

  PERFORM set_fcat_tree USING:
      'APRICE' '취득원가' 'ZTE3CM0002' 'APRICE' '8',
      'ACCUM'  '감가누계' 'ZTE3CM0002' 'ACCUM'  '8',
      'BOOK'   '장부가액' 'ZTE3CM0002' 'APRICE' '8',
      'WAERS'   '통화' 'ZTE3CM0002' 'WAERS' '8'.

ENDFORM.
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Form set_fcat_tree
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; text
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      --&amp;gt; P_
*&amp;amp;      --&amp;gt; P_
*&amp;amp;      --&amp;gt; P_
*&amp;amp;      --&amp;gt; P_
*&amp;amp;      --&amp;gt; P_
*&amp;amp;---------------------------------------------------------------------*
FORM set_fcat_tree   USING   pv_field
                             pv_text
                             pv_ref_table
                             pv_ref_field
                             pv_len.

  gs_fcat-fieldname = pv_field.
  gs_fcat-coltext   = pv_text.
  gs_fcat-ref_table = pv_ref_table.
  gs_fcat-ref_field = pv_ref_field.
  gs_fcat-outputlen = pv_len.

  CASE pv_field.
    WHEN 'APRICE' OR 'ACCUM' OR 'BOOK'.
      gs_fcat-cfieldname = 'WAERS'.
      gs_fcat-do_sum     = 'X'.

  ENDCASE.

  APPEND gs_fcat TO gt_fcat_tree.
  CLEAR  gs_fcat.

ENDFORM.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ABAP</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/29</guid>
      <comments>https://sherlock0105.tistory.com/29#entry29comment</comments>
      <pubDate>Sat, 9 May 2026 13:58:02 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP]  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'</title>
      <link>https://sherlock0105.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리에 있는 테이블만 가능함. itab 불가&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;FORM set_fcat_layout .

  gs_layout-zebra      = 'X'.
  gs_layout-cwidth_opt = 'A'.
  gs_layout-sel_mode   = 'D'.
  gs_layout-grid_title = TEXT-t02.
  gs_layout-smalltitle = 'X'.
  gs_layout-stylefname = 'STYLE'.

  gs_stable-row = 'X'.
  gs_stable-col = 'X'.

  &quot;==================================================
  &quot; FCAT 생성 (DDIC 기준)
  &quot;==================================================
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = 'ZC505T0047'
    CHANGING
      ct_fieldcat      = gt_fcat.

  &quot;==================================================
  &quot; FCAT 후처리 (기존 make_fcat 로직 대체)
  &quot;==================================================
  LOOP AT gt_fcat ASSIGNING FIELD-SYMBOL(&amp;lt;fs_fcat&amp;gt;).

    CASE &amp;lt;fs_fcat&amp;gt;-fieldname.

      WHEN 'MATNR' OR 'WERKS'
        OR 'STLAN' OR 'STLNR' OR 'STLAL'.
        &amp;lt;fs_fcat&amp;gt;-key  = 'X'.
        &amp;lt;fs_fcat&amp;gt;-edit = space.

      WHEN 'LOSBS' OR 'LOSVN'.
        &amp;lt;fs_fcat&amp;gt;-edit        = 'X'.
        &amp;lt;fs_fcat&amp;gt;-qfieldname = 'BMEIN'.

      WHEN 'BMEIN'.
        &amp;lt;fs_fcat&amp;gt;-edit = space.

    ENDCASE.

  ENDLOOP.
  
ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;FORM set_fcat_layout .

  DATA ls_fcat TYPE lvc_s_fcat.

  gs_layout = VALUE #(
                        zebra      = 'X'
                        cwidth_opt = 'A'
                        sel_mode   = 'D'
                        grid_title = TEXT-t01
                        smalltitle = 'X'
                     ).

  gs_stable = VALUE #(
                       row  = 'X'
                       col  = 'X'
                      ).

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = 'ZC505T0048'
    CHANGING
      ct_fieldcat      = gt_fcat.

  LOOP AT gt_fcat ASSIGNING FIELD-SYMBOL(&amp;lt;fs_fcat&amp;gt;).

    CASE &amp;lt;fs_fcat&amp;gt;-fieldname.

      WHEN 'AUFNR'.       &quot;핫스팟 (예: 생산오더 클릭)
        &amp;lt;fs_fcat&amp;gt;-hotspot  = 'X'.
        &amp;lt;fs_fcat&amp;gt;-coltext  = 'Production Order'.

      WHEN 'ERDAT' OR 'ERZET' OR 'ERNAM' OR 'AEDAT' OR 'AEZET' OR 'AENAM'.
        &amp;lt;fs_fcat&amp;gt;-no_out = 'X'.

    ENDCASE.

  ENDLOOP.

  gt_fcat = VALUE #( BASE gt_fcat

  ( key       = 'X'
   fieldname = 'ICON'
   coltext   = 'ICON'
   col_pos   = 1
   icon      = 'X')
  ).

ENDFORM.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ABAP</category>
      <category>ABAP</category>
      <category>CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/28</guid>
      <comments>https://sherlock0105.tistory.com/28#entry28comment</comments>
      <pubDate>Sun, 19 Apr 2026 13:56:08 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] FCAT 필드 값 바꾸기</title>
      <link>https://sherlock0105.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 도메인 fixed value 에 있는 값 받아서 바꾸기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B4bLW/dJMcagZuvT8/oOVkmFixP0S2TxcjLtc2aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B4bLW/dJMcagZuvT8/oOVkmFixP0S2TxcjLtc2aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B4bLW/dJMcagZuvT8/oOVkmFixP0S2TxcjLtc2aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB4bLW%2FdJMcagZuvT8%2FoOVkmFixP0S2TxcjLtc2aK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;604&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 직접 지정해서 바꾸기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCYM4L/dJMcadn9tKT/FykIk2Dy7AkdGvqHUUPAlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCYM4L/dJMcadn9tKT/FykIk2Dy7AkdGvqHUUPAlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCYM4L/dJMcadn9tKT/FykIk2Dy7AkdGvqHUUPAlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCYM4L%2FdJMcadn9tKT%2FFykIk2Dy7AkdGvqHUUPAlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;737&quot; height=&quot;352&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 받고 그 값을 루프 돌려서 필드를 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 값을 받을 수도 있고 하나 하나 지정도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daESh1/dJMcad2JA6d/1McLTIX2W2Kn3AuymP6pz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daESh1/dJMcad2JA6d/1McLTIX2W2Kn3AuymP6pz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daESh1/dJMcad2JA6d/1McLTIX2W2Kn3AuymP6pz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaESh1%2FdJMcad2JA6d%2F1McLTIX2W2Kn3AuymP6pz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;328&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stats 가 char(2) 여서 stats_txt 를 선언하고 필드에 추가하였음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRgGF7/dJMcaffg5hO/vj0NnH50GtrthsjeHOP8MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRgGF7/dJMcaffg5hO/vj0NnH50GtrthsjeHOP8MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRgGF7/dJMcaffg5hO/vj0NnH50GtrthsjeHOP8MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRgGF7%2FdJMcaffg5hO%2Fvj0NnH50GtrthsjeHOP8MK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;276&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 알아보기 쉽다.&lt;/p&gt;</description>
      <category>ABAP</category>
      <category>ABAP</category>
      <category>MAKEFCAT변경</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/27</guid>
      <comments>https://sherlock0105.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 19 Apr 2026 13:53:04 +0900</pubDate>
    </item>
    <item>
      <title>CL_GUI_TIMER - 타이머 이벤트</title>
      <link>https://sherlock0105.tistory.com/26</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;CL_GUI_TIMER 기본 구조&lt;/h3&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;&quot; 선언
DATA: gcl_timer   TYPE REF TO cl_gui_timer,
      gcl_handler TYPE REF TO lcl_handler.  &quot; 이벤트 핸들러 클래스

&quot; 핸들러 클래스
CLASS lcl_handler DEFINITION.
  PUBLIC SECTION.
    METHODS: on_timer FOR EVENT finished OF cl_gui_timer.
ENDCLASS.

CLASS lcl_handler IMPLEMENTATION.
  METHOD on_timer.
    &quot; 타이머 실행 시 동작할 로직
  ENDMETHOD.
ENDCLASS.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;활용 방안 5가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 저장 후 자동 화면 초기화&lt;/h3&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;METHOD on_timer.
  &quot; 2초 후 화면 리셋
  PERFORM init_screen.
  gcl_timer-&amp;gt;stop( ).
ENDMETHOD.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 실시간 ALV 자동 새로고침&lt;/h3&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;&quot; 5초마다 ALV 데이터 갱신
gcl_timer-&amp;gt;interval = 5.
gcl_timer-&amp;gt;run( ).

METHOD on_timer.
  PERFORM get_data.      &quot; DB 재조회
  PERFORM refresh_grid.  &quot; ALV 갱신
  &quot; 타이머 stop 안 하면 계속 반복됨
ENDMETHOD.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 세션 타임아웃 경고&lt;/h3&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;&quot; 10분 후 경고
gcl_timer-&amp;gt;interval = 600.
gcl_timer-&amp;gt;run( ).

METHOD on_timer.
  MESSAGE s000 WITH '세션이 곧 만료됩니다.'.
  gcl_timer-&amp;gt;stop( ).
ENDMETHOD.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 진행률 표시 (Progress Bar 연동)&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DATA: gv_progress TYPE i VALUE 0.

gcl_timer-&amp;gt;interval = 1.
gcl_timer-&amp;gt;run( ).

METHOD on_timer.
  gv_progress = gv_progress + 10.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = gv_progress
      text       = |처리 중... { gv_progress }%|.

  IF gv_progress &amp;gt;= 100.
    gcl_timer-&amp;gt;stop( ).
  ENDIF.
ENDMETHOD.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 입력 대기 후 자동 조회 (Debounce)&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;&quot; 사용자가 입력 멈추고 1초 후 자동 조회
METHOD on_input_change.
  gcl_timer-&amp;gt;stop( ).   &quot; 기존 타이머 리셋
  gcl_timer-&amp;gt;interval = 1.
  gcl_timer-&amp;gt;run( ).
ENDMETHOD.

METHOD on_timer.
  PERFORM get_data.      &quot; 1초 동안 추가 입력 없으면 조회
  gcl_timer-&amp;gt;stop( ).
ENDMETHOD.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;1. stop( ) 필수
   &amp;rarr; on_timer 안에서 stop 안 하면 interval마다 무한 반복

2. CREATE OBJECT 중복 방지
   &amp;rarr; IS INITIAL 체크 후 생성

3. Dynpro 화면 종료 시
   &amp;rarr; LEAVE PROGRAM 전에 gcl_timer-&amp;gt;stop( ) 호출
   &amp;rarr; 안 하면 백그라운드에서 타이머 계속 동작&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ABAP</category>
      <category>ABAP</category>
      <category>CL_GUI_TIMER</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/26</guid>
      <comments>https://sherlock0105.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 12 Apr 2026 22:49:04 +0900</pubDate>
    </item>
    <item>
      <title>[FI] 환율 API 프로그램</title>
      <link>https://sherlock0105.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;TCURR 스탠다드 프로그램 참고해서 CBO TABLE 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dj6mGm/dJMcagkGf6C/ZcCQ14bb2B0JotNvYAqbpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dj6mGm/dJMcagkGf6C/ZcCQ14bb2B0JotNvYAqbpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dj6mGm/dJMcagkGf6C/ZcCQ14bb2B0JotNvYAqbpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdj6mGm%2FdJMcagkGf6C%2FZcCQ14bb2B0JotNvYAqbpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1387&quot; height=&quot;678&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775276784766&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FORM get_api .

  gv_date = sy-datum.
  &quot; 주말/공휴일 대비 최근 5일 재시도
  DO 5 TIMES.

    CLEAR: gv_json, gt_json.

    gv_url = |https://oapi.koreaexim.go.kr/site/program/financial/exchangeJSON?| &amp;amp;&amp;amp;
             |authkey={ gc_key }&amp;amp;searchdate={ gv_date }&amp;amp;data=AP01|.

    CALL METHOD cl_http_client=&amp;gt;create_by_url
      EXPORTING
        url    = gv_url
      IMPORTING
        client = lo_http.

    lo_http-&amp;gt;request-&amp;gt;set_method( if_http_request=&amp;gt;co_request_method_get ).
    lo_http-&amp;gt;send( ).
    lo_http-&amp;gt;receive( ).
    gv_json = lo_http-&amp;gt;response-&amp;gt;get_cdata( ).
    lo_http-&amp;gt;close( ).

    /ui2/cl_json=&amp;gt;deserialize(
      EXPORTING json = gv_json
      CHANGING  data = gt_json ).

    READ TABLE gt_json INTO gs_json INDEX 1.
    IF sy-subrc = 0 AND gs_json-result = 1.
      EXIT.                          &quot; 데이터 있음 &amp;rarr; 루프 탈출
    ELSEIF sy-subrc = 0 AND gs_json-result = 3.
      MESSAGE 'API 인증 오류: 키를 확인하세요.' TYPE 'E'.
      STOP.
    ENDIF.

    gv_date = gv_date - 1.           &quot; 하루 전으로 재시도
  ENDDO.

  IF gt_json IS INITIAL OR gs_json-result &amp;lt;&amp;gt; 1.
    MESSAGE '최근 5일 내 유효한 환율 데이터가 없습니다.' TYPE 'E'.
    STOP.
  ENDIF.

ENDFORM.

FORM save_data.

  CLEAR gt_save.

  LOOP AT gt_json INTO gs_json WHERE cur_unit = 'USD'
                                OR cur_unit = 'EUR'
                                OR cur_unit CS 'JPY'.

    REPLACE ALL OCCURRENCES OF ',' IN gs_json-deal_bas_r WITH ''.
    CONDENSE gs_json-deal_bas_r NO-GAPS.

    gv_date = 99999999 - sy-datum.

    CLEAR gs_save.
    gs_save-mandt = sy-mandt.
    gs_save-kurst = 'M'.
    gs_save-tcurr = 'KRW'.
    gs_save-gdatu = gv_date.
    gs_save-erdat = sy-datum.
    gs_save-erzet = sy-uzeit.
    gs_save-ernam = sy-uname.


    IF gs_json-cur_unit CS '(100)'.
      gs_save-fcurr = gs_json-cur_unit+0(3).
      gs_save-ukurs = trunc( gs_json-deal_bas_r ).   &quot; ★ 소수점 제거
      gs_save-ffact = 100.
      gs_save-tfact = 1.
    ELSE.
      gs_save-fcurr = gs_json-cur_unit.
      gs_save-ukurs = trunc( gs_json-deal_bas_r ).   &quot; ★ 소수점 제거
      gs_save-ffact = 1.
      gs_save-tfact = 1.
    ENDIF.

    APPEND gs_save TO gt_save.
  ENDLOOP.

  MODIFY zte3fi0008 FROM TABLE gt_save.

  IF sy-subrc = 0.
    COMMIT WORK.
    MESSAGE |{ gv_date } 환율 { lines( gt_save ) }건 저장 완료| TYPE 'S'.
  ELSE.
    ROLLBACK WORK.
    MESSAGE 'DB 저장 오류' TYPE 'E'.
  ENDIF.

ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPTgED/dJMcadVNKtY/PG6TdG3K37TVaiLNTTLOV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPTgED/dJMcadVNKtY/PG6TdG3K37TVaiLNTTLOV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPTgED/dJMcadVNKtY/PG6TdG3K37TVaiLNTTLOV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPTgED%2FdJMcadVNKtY%2FPG6TdG3K37TVaiLNTTLOV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;132&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Batch job 으로 실행, selection screen은 생략했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매일 11시 30분에 환율을 받아 CBO 테이블에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주말에는 금요일 데이터를 받아온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gist.github.com/sherlock0105/4e0930cb146aa9ebcafda5553c82959d&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gist.github.com/sherlock0105/4e0930cb146aa9ebcafda5553c82959d&lt;/a&gt;&lt;/p&gt;</description>
      <category>ABAP</category>
      <category>ABAP API</category>
      <category>ABAP환율</category>
      <category>FI</category>
      <category>환율조회</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/24</guid>
      <comments>https://sherlock0105.tistory.com/24#entry24comment</comments>
      <pubDate>Sat, 4 Apr 2026 13:28:41 +0900</pubDate>
    </item>
    <item>
      <title>  SAP PP 생산 프로세스 (MTO 방식) 정리</title>
      <link>https://sherlock0105.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MTO(Make To Order)는&lt;br /&gt;&lt;b&gt;고객 주문이 들어온 이후에 생산을 시작하는 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MTS와 달리 재고를 미리 쌓아두지 않고,&lt;br /&gt;  &lt;b&gt;주문 단위로 맞춤 생산&lt;/b&gt;이 이루어진다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  전체 흐름&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;판매오더 &amp;rarr; MRP &amp;rarr; 계획오더 &amp;rarr; 생산오더 &amp;rarr; 생산 &amp;rarr; 납품 &amp;rarr; 청구&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ 판매 오더 (Sales Order)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MTO는 반드시 &lt;b&gt;고객 주문으로부터 시작&lt;/b&gt;된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고객 요청 제품 / 수량 / 납기 확정&lt;/li&gt;
&lt;li&gt;해당 주문이 생산의 기준이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;이 주문을 위해 생산한다&amp;rdquo;는 개념&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ 자재 소요 계획 (MRP)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판매 오더를 기반으로&lt;br /&gt;생산에 필요한 자재를 계산한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 수행 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 주문에 필요한 자재 산출&lt;/li&gt;
&lt;li&gt;재고 확인&lt;/li&gt;
&lt;li&gt;부족 자재 식별&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 결과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 생산 &amp;rarr; 계획오더 생성&lt;/li&gt;
&lt;li&gt;외부 조달 &amp;rarr; 구매요청(PR) 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  MTS와 다르게 &amp;ldquo;특정 주문에 종속된 MRP&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ 계획 오더 (Planned Order)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MRP 실행 결과로 생성되는&lt;br /&gt;&lt;b&gt;주문 기반 생산 계획 오더&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 판매오더에 연결됨&lt;/li&gt;
&lt;li&gt;독립 재고가 아닌 &amp;ldquo;주문 전용 생산&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ 생산 오더 (Production Order)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계획오더를 실제 생산오더로 전환한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 수행 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BOM / Routing 확정&lt;/li&gt;
&lt;li&gt;생산 작업 지시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  해당 고객 주문을 위한 생산 시작&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ 생산 진행 (Production Execution)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 생산이 이루어진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 발생 변화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원자재 출고 &amp;rarr; 재고 감소&lt;/li&gt;
&lt;li&gt;생산 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  주문 단위로 생산 진행&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6️⃣ 납품 (Delivery)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생산 완료된 제품은&lt;br /&gt;&lt;b&gt;해당 고객에게 바로 납품&lt;/b&gt;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  재고를 거치지 않거나 최소화&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7️⃣ 대금 청구 (Billing)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;납품 완료 후 고객에게 청구 진행&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매출 발생&lt;/li&gt;
&lt;li&gt;매출 채권 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 포인트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 1. MTO의 핵심&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주문 후 생산&lt;/li&gt;
&lt;li&gt;재고 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 2. MRP 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 판매오더 기준 실행&lt;/li&gt;
&lt;li&gt;개별 수요 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 3. 재고 개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MTS &amp;rarr; 재고 만들어놓고 판매&lt;/li&gt;
&lt;li&gt;MTO &amp;rarr; 생산 후 바로 납품&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 4. 흐름 차이 (중요)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MTS: 생산 &amp;rarr; 재고 &amp;rarr; 판매&lt;/li&gt;
&lt;li&gt;MTO: 판매 &amp;rarr; 생산 &amp;rarr; 납품&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✍️ 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MTO는 고객 맞춤형 생산에 적합하며,&lt;br /&gt;재고 부담을 줄이는 대신 리드타임이 길어질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAP에서는 판매오더를 중심으로&lt;br /&gt;PP, MM, SD가 긴밀하게 연결되는 구조가 핵심이다.&lt;/p&gt;</description>
      <category>모듈 공부/PP</category>
      <category>MTO</category>
      <category>PP모듈공부</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/23</guid>
      <comments>https://sherlock0105.tistory.com/23#entry23comment</comments>
      <pubDate>Sat, 21 Mar 2026 13:08:53 +0900</pubDate>
    </item>
    <item>
      <title>  SAP PP 생산 프로세스 (MTS 방식) 정리</title>
      <link>https://sherlock0105.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SAP PP(Production Planning)에서 MTS(Make To Stock)는&lt;br /&gt;&lt;b&gt;수요를 예측하여 미리 생산하고 재고로 판매하는 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 고객 주문 전에 생산이 먼저 이루어진다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  전체 흐름&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;생산계획 &amp;rarr; MRP &amp;rarr; 계획오더 &amp;rarr; 생산오더 &amp;rarr; 생산 &amp;rarr; 생산실적입력&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ 생산 계획 (Production Planning)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생산 프로세스는 판매 계획을 기반으로 시작된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;과거 판매 데이터 및 예측 기반 계획 수립&lt;/li&gt;
&lt;li&gt;미래 수요를 대비한 생산량 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;br /&gt;  &amp;ldquo;3분기 판매를 위해 2분기에 미리 생산&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, MTS는 &lt;b&gt;재고 확보가 핵심 목적&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ 자재 소요 계획 (MRP)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MRP(Material Requirements Planning)는&lt;br /&gt;생산에 필요한 자재가 충분한지 확인하는 단계다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 수행 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;완제품 생산에 필요한 원자재/부품 계산&lt;/li&gt;
&lt;li&gt;현재 재고 확인&lt;/li&gt;
&lt;li&gt;부족 자재 자동 식별&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 결과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 생산 대상 &amp;rarr; 계획오더 생성&lt;/li&gt;
&lt;li&gt;외부 조달 대상 &amp;rarr; 구매요청(PR) 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;생산 가능한 상태인지 판단하는 핵심 단계&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 MRP는 보통&lt;br /&gt;**백그라운드 잡(정해진 시간 자동 실행)**으로 운영된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ 계획 오더 (Planned Order)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MRP 실행 결과로 생성되는&lt;br /&gt;**&amp;ldquo;생산 예정 상태의 오더&amp;rdquo;**다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아직 실제 생산은 시작되지 않음&lt;/li&gt;
&lt;li&gt;생산 계획 단계의 가상 오더&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  내부 생산 대상 자재에 대해 생성된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ 생산 오더 (Production Order)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요 자재가 확보되면&lt;br /&gt;계획오더를 실제 생산 오더로 전환한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 수행 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BOM(자재구성) 확정&lt;/li&gt;
&lt;li&gt;Routing(공정) 확정&lt;/li&gt;
&lt;li&gt;작업 지시 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;실제 생산 시작을 위한 준비 완료 상태&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ 생산 진행 (Production Execution)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생산 오더를 기준으로 실제 생산이 이루어진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 발생 변화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원자재 출고 &amp;rarr; 재고 감소&lt;/li&gt;
&lt;li&gt;공정 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이 단계에서 실제 물류 흐름이 발생한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6️⃣ 생산 실적 입력 (Confirmation)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생산이 완료되면&lt;br /&gt;실적을 시스템에 반영한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 입력 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생산 완료 수량&lt;/li&gt;
&lt;li&gt;작업 시간&lt;/li&gt;
&lt;li&gt;불량품 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생산 10개 &amp;rarr; 정상 8개 / 불량 2개&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  생산 결과가 확정되는 단계&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 포인트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 1. MTS의 핵심&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고객 주문 전에 생산&lt;/li&gt;
&lt;li&gt;재고 기반 판매&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 2. MRP 역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자재 부족 여부 판단&lt;/li&gt;
&lt;li&gt;생산 vs 구매 자동 분기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 3. 오더 흐름&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계획오더 &amp;rarr; 생산오더&lt;br /&gt;  &amp;ldquo;계획 &amp;rarr; 실행&amp;rdquo; 전환 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 4. 재고 변화 시점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생산 중 &amp;rarr; 원자재 감소&lt;/li&gt;
&lt;li&gt;생산 완료 &amp;rarr; 완제품 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모듈 공부/PP</category>
      <category>MTS</category>
      <category>PP모듈공부</category>
      <category>PP흐름</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/22</guid>
      <comments>https://sherlock0105.tistory.com/22#entry22comment</comments>
      <pubDate>Sat, 21 Mar 2026 13:06:50 +0900</pubDate>
    </item>
    <item>
      <title> SAP MM 구매 프로세스 정리</title>
      <link>https://sherlock0105.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SAP에서 자재 조달은 단순 구매가 아니라&lt;br /&gt;**생산 계획(PP) &amp;rarr; 자재 소요 계산 &amp;rarr; 구매(MM) &amp;rarr; 회계(FI)**까지 이어지는 통합 프로세스다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  전체 흐름&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;MRP &amp;rarr; 구매요청(PR) &amp;rarr; 구매오더(PO) &amp;rarr; 입고(GR) &amp;rarr; 송장 검증 &amp;rarr; 대금 지급&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ 자재 소요 계획 (MRP / CBP)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 &lt;b&gt;PP 영역의 자재 소요 계산&lt;/b&gt;에서 시작된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MRP(Material Requirements Planning)&lt;/li&gt;
&lt;li&gt;CBP(Consumption-Based Planning)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계에서는 다음을 수행한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생산 계획 기반 자재 필요량 계산&lt;/li&gt;
&lt;li&gt;재고 확인&lt;/li&gt;
&lt;li&gt;부족 시 조달 필요 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과: &lt;b&gt;필요 자재 수량 확정 + 구매 요청 생성&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ 내부 생산 vs 외부 조달&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자재 부족이 발생하면 두 가지 선택지가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 내부 생산 (PP)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생산 오더 생성&lt;/li&gt;
&lt;li&gt;공정(BOM, Routing) 기반 생산 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 외부 조달 (MM)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구매 요청(PR) 생성&lt;/li&gt;
&lt;li&gt;공급업체로부터 구매 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  즉, &amp;ldquo;직접 만들지 vs 외부에서 살지&amp;rdquo; 결정하는 단계다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ 구매 요청 (PR: Purchase Requisition)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구매 요청은&lt;br /&gt;&lt;b&gt;&amp;ldquo;이 자재를 구매해 주세요&amp;rdquo;라고 구매부서에 요청하는 문서&lt;/b&gt;다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 생성 방식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 생성: MRP 실행 시 자동 생성&lt;/li&gt;
&lt;li&gt;수동 생성: 사용자 직접 입력 (결재 프로세스 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 주요 정보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;품목명&lt;/li&gt;
&lt;li&gt;수량 / 단위&lt;/li&gt;
&lt;li&gt;필요일자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  구매 프로세스의 출발점&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ 구매 오더 (PO: Purchase Order)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구매 요청을 기반으로&lt;br /&gt;실제 공급업체에 주문을 넣는 단계다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 수행 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공급업체 선정&lt;/li&gt;
&lt;li&gt;단가 및 조건 확정&lt;/li&gt;
&lt;li&gt;구매 오더 생성 후 발주&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 포함 정보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공급업체&lt;/li&gt;
&lt;li&gt;자재 / 수량&lt;/li&gt;
&lt;li&gt;납기일&lt;/li&gt;
&lt;li&gt;단가 / 통화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;누구에게 얼마에 살 것인지&amp;rdquo; 확정&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ 검수 및 입고 (GR: Goods Receipt)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문한 자재가 도착하면&lt;br /&gt;검수 후 창고에 입고 처리한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 수행 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실물 수량 확인&lt;/li&gt;
&lt;li&gt;구매오더와 비교 검증&lt;/li&gt;
&lt;li&gt;입고 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 결과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;재고 증가&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자재 문서(Material Document) 생성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  시스템에 &amp;ldquo;재고가 들어왔다&amp;rdquo; 반영되는 시점&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6️⃣ 송장 검증 (Invoice Verification)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공급업체에서 받은 송장(Invoice)을&lt;br /&gt;구매오더 및 입고 내역과 비교하는 단계다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 비교 기준&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구매오더(PO)&lt;/li&gt;
&lt;li&gt;입고 문서(GR)&lt;/li&gt;
&lt;li&gt;송장(Invoice)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이걸 &lt;b&gt;3-Way Match&lt;/b&gt;라고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 결과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일치 시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;미지급금(AP) 계정 생성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;FI 전표 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  회계 처리 시작되는 핵심 구간&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7️⃣ 대금 지급 (Payment)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;송장 검증이 완료되면&lt;br /&gt;공급업체에 대금을 지급한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미지급금(AP) 감소&lt;/li&gt;
&lt;li&gt;현금/예금 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  구매 프로세스 종료&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 포인트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 1. 시작은 PP, 실행은 MM&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MRP &amp;rarr; 자재 필요 계산 (PP)&lt;/li&gt;
&lt;li&gt;구매 &amp;rarr; 실제 조달 (MM)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 2. 재고 변화 시점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;❌ PR / PO &amp;rarr; 변화 없음&lt;/li&gt;
&lt;li&gt;✅ GR &amp;rarr; 재고 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 3. 회계 반영 시점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GR &amp;rarr; 재고 계정 증가&lt;/li&gt;
&lt;li&gt;송장 검증 &amp;rarr; 미지급금(AP) 발생&lt;/li&gt;
&lt;li&gt;지급 &amp;rarr; 현금 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 4. 3-Way Match 중요&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PO vs GR vs Invoice&lt;br /&gt;  하나라도 다르면 지급 불가&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>모듈 공부/MM</category>
      <category>MM모듈공부</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/21</guid>
      <comments>https://sherlock0105.tistory.com/21#entry21comment</comments>
      <pubDate>Sat, 21 Mar 2026 13:04:34 +0900</pubDate>
    </item>
    <item>
      <title> SAP SD 판매 프로세스</title>
      <link>https://sherlock0105.tistory.com/20</link>
      <description>&lt;h1&gt;  SAP SD 판매 프로세스 한눈에 정리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAP SD(Sales &amp;amp; Distribution) 모듈의 핵심은&lt;br /&gt;&lt;b&gt;고객 주문부터 매출 발생까지의 전체 흐름을 관리하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 프로세스는 다음과 같이 이어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;판매 오더 &amp;rarr; 납품 &amp;rarr; 피킹 및 패킹 &amp;rarr; 출고 &amp;rarr; 대금 청구 &amp;rarr; 재무/관리 회계&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ 판매 오더 (Sales Order)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판매 오더는 고객의 주문 정보를 기반으로 생성되는 문서이며,&lt;br /&gt;전체 프로세스의 출발점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서에는 다음과 같은 정보가 포함된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고객 정보&lt;/li&gt;
&lt;li&gt;제품(자재) 및 수량&lt;/li&gt;
&lt;li&gt;가격 조건&lt;/li&gt;
&lt;li&gt;납기일&lt;/li&gt;
&lt;li&gt;배송 및 결제 조건&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &amp;ldquo;누가 / 무엇을 / 언제 / 얼마에 구매하는지&amp;rdquo;를 정의하는 단계다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ 납품 생성 (Delivery)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판매 오더를 기반으로 실제 출하를 위한 &lt;b&gt;납품 문서&lt;/b&gt;가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계에서는 다음이 수행된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;납품 일정 확정&lt;/li&gt;
&lt;li&gt;자재 가용성 확인 (ATP Check)&lt;/li&gt;
&lt;li&gt;출하 프로세스 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  쉽게 말해, &amp;ldquo;언제 어떤 물건을 보내겠다&amp;rdquo;는 실행 단계로 넘어가는 과정이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ 피킹 및 패킹 (Picking &amp;amp; Packing)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;납품 문서를 기준으로 창고 작업이 진행된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 피킹 (Picking)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;창고에서 실제 제품을 꺼내는 작업&lt;/li&gt;
&lt;li&gt;납품 문서를 기준으로 수행됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 패킹 (Packing)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피킹된 제품을 배송할 수 있도록 포장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 자재 이동이 발생하며,&lt;br /&gt;**자재 문서(Material Document)**가 생성된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ 출고 (Goods Issue)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포장이 완료된 제품을 창고에서 출고 처리하는 단계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 가장 중요한 변화는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재고 감소&lt;/li&gt;
&lt;li&gt;출고 전기(Post Goods Issue) 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  즉, 이 시점부터 시스템상에서도 &amp;ldquo;재고가 실제로 나간 것&amp;rdquo;으로 반영된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ 대금 청구 (Billing)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출고가 완료되면 이를 기준으로 고객에게 대금을 청구한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;청구 문서 생성&lt;/li&gt;
&lt;li&gt;매출 발생&lt;/li&gt;
&lt;li&gt;고객에게 결제 요청&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이 단계에서 **매출 채권(AR)**이 생성된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6️⃣ 재무 / 관리 회계 연동 (FI / CO)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 판매 과정에서 발생한 모든 데이터는&lt;br /&gt;재무 및 관리 회계로 자동 반영된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ FI (Financial Accounting)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매출 전표 생성&lt;/li&gt;
&lt;li&gt;고객 채권 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ CO (Controlling)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수익성 분석&lt;/li&gt;
&lt;li&gt;원가 및 이익 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  전체 흐름 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;판매 오더 &amp;rarr; 납품 &amp;rarr; 피킹/패킹 &amp;rarr; 출고 &amp;rarr; 청구 &amp;rarr; FI/CO 반영&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 포인트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;재고 감소는 출고(Goods Issue) 시점에 발생한다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매출은 대금 청구(Billing) 시점에 발생한다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;모든 프로세스는 문서 흐름(Sales Order &amp;rarr; Delivery &amp;rarr; Billing)으로 연결된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모듈 공부/SD</category>
      <category>SD모듈공부</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/20</guid>
      <comments>https://sherlock0105.tistory.com/20#entry20comment</comments>
      <pubDate>Sat, 21 Mar 2026 13:02:24 +0900</pubDate>
    </item>
    <item>
      <title>[RAP] 전체 흐름 및 기초 개념</title>
      <link>https://sherlock0105.tistory.com/19</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DB Table &amp;rarr; CDS Data Model &amp;rarr; Behavior &amp;rarr; Projection &amp;rarr; Service &amp;rarr; Binding &amp;rarr; OData 서비스 노출&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Z5J3/dJMcahcABRI/l5gQNPcG3EuafuCFYedplk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Z5J3/dJMcahcABRI/l5gQNPcG3EuafuCFYedplk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Z5J3/dJMcahcABRI/l5gQNPcG3EuafuCFYedplk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Z5J3%2FdJMcahcABRI%2Fl5gQNPcG3EuafuCFYedplk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;438&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRSQxg/dJMcacoPcVG/v1nRK2pT7IjXFeS8SnoJb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRSQxg/dJMcacoPcVG/v1nRK2pT7IjXFeS8SnoJb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRSQxg/dJMcacoPcVG/v1nRK2pT7IjXFeS8SnoJb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRSQxg%2FdJMcacoPcVG%2Fv1nRK2pT7IjXFeS8SnoJb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;457&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;1️⃣ Dictionary Layer (맨 아래)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  DB Table(s)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SE11에서 만든 &lt;b&gt;실제 물리 테이블&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;데이터가 저장되는 곳&lt;/li&gt;
&lt;li&gt;예: ZSALES, ZC5MSVBRK, ZC5MSBSEG&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 여기는 그냥 &lt;b&gt;저장소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 로직 없음&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2️⃣ Core Data Services (노란 영역)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기가 RAP의 핵심&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ① Data Model View(s)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interface CDS View (보통 ZI_ 로 시작)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 테이블을 감싸는 &lt;b&gt;CDS View&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;데이터 모델 정의&lt;/li&gt;
&lt;li&gt;association, composition 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;define root view entity ZI_SALES
  as select from zsales
{
  key vbeln,
      vkorg,
      netwr
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ DB 위에 논리 모델을 하나 만든 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 아직 서비스 아님&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ② Behavior Definition&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.behavior 파일&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 정의함:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;create&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;delete&lt;/li&gt;
&lt;li&gt;action&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;determination&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;define behavior for ZI_SALES
persistent table zsales
lock master
{
  create;
  update;
  delete;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ &quot;이 CDS는 생성/수정/삭제 가능하다&quot; 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 실제 로직은 아직 없음&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ③ Behavior Pool (ABAP Class)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 ABAP 구현 클래스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 구현:&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;METHOD create.
METHOD update.
METHOD delete.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 진짜 로직이 들어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ validation, determination 코드 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  구조:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Behavior Definition &amp;rarr; Behavior Pool 구현
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3️⃣ Business Services (파란 영역)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 외부에 공개하는 단계&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ④ Projection View(s)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 ZC_ 로 시작&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Interface View를 외부용으로 가공&lt;/li&gt;
&lt;li&gt;필드 숨기기 가능&lt;/li&gt;
&lt;li&gt;UI 전용 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;puppet&quot;&gt;&lt;code&gt;define projection view entity ZC_SALES
  as projection on ZI_SALES
{
  key vbeln,
      vkorg,
      netwr
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 내부 모델(ZI)을 외부용(ZC)으로 감싼 것&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ⑤ Behavior Projection&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Projection용 Behavior 정의&lt;/p&gt;
&lt;pre class=&quot;puppet&quot;&gt;&lt;code&gt;define behavior for ZC_SALES
{
  use create;
  use update;
  use delete;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 내부 behavior 중 어떤 걸 쓸지 결정&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ⑥ Service Definition&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 Projection을 서비스로 노출할지 정의&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;define service ZUI_SALES {
  expose ZC_SALES;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ &amp;ldquo;이 CDS를 OData로 공개하겠다&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ⑦ Service Binding&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OData V4 / UI / WebAPI 바인딩&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OData V4 선택&lt;/li&gt;
&lt;li&gt;Publish 체크&lt;/li&gt;
&lt;li&gt;서비스 URL 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;/sap/opu/odata4/sap/zui_sales/...
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  전체 흐름 연결&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DB Table
   &amp;darr;
Data Model View (ZI_)
   &amp;darr;
Behavior Definition
   &amp;darr;
Behavior Pool (ABAP Class)
   &amp;darr;
Projection View (ZC_)
   &amp;darr;
Behavior Projection
   &amp;darr;
Service Definition
   &amp;darr;
Service Binding
   &amp;darr;
OData Service
   &amp;darr;
Fiori App
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;  핵심 개념 정리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계층 역할&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;실제 데이터 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Model View&lt;/td&gt;
&lt;td&gt;논리 데이터 모델&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavior Definition&lt;/td&gt;
&lt;td&gt;CRUD 규칙 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavior Pool&lt;/td&gt;
&lt;td&gt;실제 ABAP 로직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Projection&lt;/td&gt;
&lt;td&gt;외부용 모델&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Definition&lt;/td&gt;
&lt;td&gt;서비스 공개 선언&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Binding&lt;/td&gt;
&lt;td&gt;OData 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;  이렇게 나누는 이유&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 이유 1: 계층 분리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB / 로직 / 서비스 완전 분리&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 이유 2: 재사용성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 Data Model을 여러 Projection에서 사용 가능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 이유 3: 보안&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Projection에서 필드 숨길 수 있음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 이유 4: 확장성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클린 아키텍처 구조&lt;/p&gt;</description>
      <category>RAP</category>
      <category>ABAP</category>
      <category>CDS</category>
      <category>Rap</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/19</guid>
      <comments>https://sherlock0105.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 15 Mar 2026 15:50:18 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] 라디오 버튼 동적 / 클릭시 Selection Screen 화면 전환</title>
      <link>https://sherlock0105.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;라디오 버튼 동적 클릭시 화면 전환하는 법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJCCr/dJMcaibwFMv/KzpEK7KqZ8eJOhPH4Zrpkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJCCr/dJMcaibwFMv/KzpEK7KqZ8eJOhPH4Zrpkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJCCr/dJMcaibwFMv/KzpEK7KqZ8eJOhPH4Zrpkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJCCr%2FdJMcaibwFMv%2FKzpEK7KqZ8eJOhPH4Zrpkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;294&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqeGbG/dJMb996HWZi/yfK7MHPgLqP3nn6pArP2A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqeGbG/dJMb996HWZi/yfK7MHPgLqP3nn6pArP2A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqeGbG/dJMb996HWZi/yfK7MHPgLqP3nn6pArP2A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqeGbG%2FdJMb996HWZi%2FyfK7MHPgLqP3nn6pArP2A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;300&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Purchase 누를때와 Product 누를 때 다르게 나옴&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxztU/dJMcaiWPZ68/rSlWxdzk3kWFRr5cBjlhdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxztU/dJMcaiWPZ68/rSlWxdzk3kWFRr5cBjlhdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxztU/dJMcaiWPZ68/rSlWxdzk3kWFRr5cBjlhdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwxztU%2FdJMcaiWPZ68%2FrSlWxdzk3kWFRr5cBjlhdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;342&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECTION-SCREEN BEGIN OF BLOCK bl2 WITH FRAME TITLE TEXT-t01.

  SELECTION-SCREEN BEGIN OF LINE.

    PARAMETERS: pa_rb1 RADIOBUTTON GROUP rb1 DEFAULT 'X' USER-COMMAND ucm.
    SELECTION-SCREEN COMMENT (20) FOR FIELD pa_rb1.

    PARAMETERS: pa_rb2 RADIOBUTTON GROUP rb1.
    SELECTION-SCREEN COMMENT (20) FOR FIELD pa_rb2.

  SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK bl2.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRqpPM/dJMcaf6Urfv/mqa9HtFOopfim9O897owK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRqpPM/dJMcaf6Urfv/mqa9HtFOopfim9O897owK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRqpPM/dJMcaf6Urfv/mqa9HtFOopfim9O897owK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRqpPM%2FdJMcaf6Urfv%2Fmqa9HtFOopfim9O897owK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;110&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;FORM control_screen .

  LOOP AT SCREEN.

    IF pa_rb1 = 'X'.

      IF screen-group1 = 'RB2'.
        screen-active = 0.
      ENDIF.

    ENDIF.

    IF pa_rb2 = 'X'.

      IF screen-group1 = 'RB1'.
        screen-active = 0.
      ENDIF.

    ENDIF.

    MODIFY SCREEN.

  ENDLOOP.

ENDFORM.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ABAP</category>
      <category>ABAP</category>
      <category>sap</category>
      <category>라디오 버튼 동적</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/18</guid>
      <comments>https://sherlock0105.tistory.com/18#entry18comment</comments>
      <pubDate>Sat, 14 Mar 2026 23:28:33 +0900</pubDate>
    </item>
    <item>
      <title>[ABAP] Text Table 확인하는 법</title>
      <link>https://sherlock0105.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✅&lt;/span&gt;&amp;nbsp;Text Table 확인하는 법&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  도메인 &amp;rarr; Value Table &amp;rarr; Text Table&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예: MAABC 도메인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Value Table: TMABC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Text Table: TMABCT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정은 유지보수뷰에서 &lt;b&gt;체크 테이블 / 텍스트 테이블을 정확히 조인하기 위함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1번.png&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk42Vh/dJMcaaEyZCR/EnMyIvuYbDJlPoRy1Xq8rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk42Vh/dJMcaaEyZCR/EnMyIvuYbDJlPoRy1Xq8rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk42Vh/dJMcaaEyZCR/EnMyIvuYbDJlPoRy1Xq8rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk42Vh%2FdJMcaaEyZCR%2FEnMyIvuYbDJlPoRy1Xq8rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1139&quot; height=&quot;883&quot; data-filename=&quot;1번.png&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MAABC Value Table 에 들어가서 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2번.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2SIyK/dJMcaaEyZCQ/Pyirj4xtsGuYliDzamyfN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2SIyK/dJMcaaEyZCQ/Pyirj4xtsGuYliDzamyfN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2SIyK/dJMcaaEyZCQ/Pyirj4xtsGuYliDzamyfN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2SIyK%2FdJMcaaEyZCQ%2FPyirj4xtsGuYliDzamyfN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;839&quot; height=&quot;527&quot; data-filename=&quot;2번.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;goto &amp;rarr; text Table&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3번.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kkhvx/dJMcac3oL3e/EmMv84YlfDi66DUwfVDKGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kkhvx/dJMcac3oL3e/EmMv84YlfDi66DUwfVDKGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kkhvx/dJMcac3oL3e/EmMv84YlfDi66DUwfVDKGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKkhvx%2FdJMcac3oL3e%2FEmMv84YlfDi66DUwfVDKGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;537&quot; data-filename=&quot;3번.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TMABCT 텍스트 테이블 확인 (여기랑 연결)&lt;/li&gt;
&lt;li&gt;다른 필드의 텍스트 테이블도 확인 후 유지보수뷰를 만든다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ABAP</category>
      <category>ABAP</category>
      <category>texttable</category>
      <author>셜록누나</author>
      <guid isPermaLink="true">https://sherlock0105.tistory.com/17</guid>
      <comments>https://sherlock0105.tistory.com/17#entry17comment</comments>
      <pubDate>Sat, 14 Mar 2026 18:45:44 +0900</pubDate>
    </item>
  </channel>
</rss>