From f0520cdcc1a1f2a9b8e764b796d60d0a4e0dc863 Mon Sep 17 00:00:00 2001 From: lee-hyeon-cheol Date: Wed, 23 Sep 2026 13:46:17 +0900 Subject: [PATCH] =?UTF-8?q?feat(snippets):=20=ED=95=9C=EA=B8=80=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=20=EC=B4=88=EC=95=88=20143=EA=B0=9C=C2=B7?= =?UTF-8?q?=EC=83=88=20=EC=9D=B4=EB=A6=84=2011=EA=B0=9C=20=EA=B2=80?= =?UTF-8?q?=ED=86=A0=20=ED=8C=8C=EC=9D=BC=20+=20import=5Fsnippets=20?= =?UTF-8?q?=EB=8A=94=20=EB=B9=88=20DB=20=EC=97=90=EC=84=9C=EB=A7=8C(?= =?UTF-8?q?=EA=B7=9C=EC=B9=99=20=EB=B3=80=EA=B2=BD=20=ED=9B=84=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=C2=B7=EC=98=9B=20=EC=9D=B4=EB=A6=84=20=EB=B6=80?= =?UTF-8?q?=ED=99=9C=20=EB=B0=A9=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- .../management/commands/import_snippets.py | 16 +- 5_django_backend/tests/test_snippets.py | 5 +- docs/snippets/README.md | 28 ++++ docs/snippets/snippet_meta_review.csv | 144 ++++++++++++++++++ 4 files changed, 188 insertions(+), 5 deletions(-) create mode 100644 docs/snippets/README.md create mode 100644 docs/snippets/snippet_meta_review.csv diff --git a/5_django_backend/apps/snippets/management/commands/import_snippets.py b/5_django_backend/apps/snippets/management/commands/import_snippets.py index 6349627..98c5e13 100644 --- a/5_django_backend/apps/snippets/management/commands/import_snippets.py +++ b/5_django_backend/apps/snippets/management/commands/import_snippets.py @@ -1,6 +1,10 @@ -"""옛 로컬 snippets.db(SQLite) → 서버. 같은 이름은 건너뜀(--overwrite 로 덮어씀). +"""옛 로컬 snippets.db(SQLite) → 서버. **스니펫이 하나도 없을 때만**(처음 채우기). --force 면 비어 있지 않아도. python manage.py import_snippets ../CODE_ASSISTANT_DB/snippets.db + +deploy.sh 가 배포 때마다 부르므로, 이미 채워진 DB 에서 다시 돌면 안 됨 — +2026-09-23: 이름 규칙이 바뀐 뒤 다시 돌면 옛 이름(IF_SUBRC-ABAP)이 새 규칙 이름(IF_SUBRC_ABAP)으로 중복 추가되고, +apply_snippet_meta 로 이름을 바꾼 뒤엔 옛 이름이 되살아났음. 이름은 옛 규칙 그대로 둠(lookup_name). """ import sqlite3 @@ -8,7 +12,7 @@ import sqlite3 from django.core.management.base import BaseCommand from apps.snippets.models import Snippet -from apps.snippets.views import normalize_name +from apps.snippets.views import lookup_name class Command(BaseCommand): @@ -17,13 +21,17 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument("path") parser.add_argument("--overwrite", action="store_true") + parser.add_argument("--force", action="store_true", help="스니펫이 이미 있어도 가져옴") - def handle(self, path, overwrite, **_): + def handle(self, path, overwrite, force, **_): + if Snippet.objects.exists() and not force: + self.stdout.write(f"이미 스니펫 {Snippet.objects.count()}개 있음 — 건너뜀(처음 채울 때만 씀, 필요하면 --force)") + return con = sqlite3.connect(path) rows = con.execute("SELECT name, desc, body, category FROM snippets").fetchall() added = updated = skipped = 0 for name, desc, body, category in rows: - name = normalize_name(name) + name = lookup_name(name) if not name or not (body or "").strip(): skipped += 1 continue diff --git a/5_django_backend/tests/test_snippets.py b/5_django_backend/tests/test_snippets.py index 5fe28b8..71f2f55 100644 --- a/5_django_backend/tests/test_snippets.py +++ b/5_django_backend/tests/test_snippets.py @@ -49,8 +49,11 @@ def test_import_from_sqlite(db, tmp_path): call_command("import_snippets", str(p)) names = {s.name: s for s in Snippet.objects.all()} assert set(names) == {"A_B", "C"} and names["C"].category == "코드" - call_command("import_snippets", str(p)) # 재실행해도 중복 없음 + call_command("import_snippets", str(p)) # 이미 있으면 건너뜀 — 배포마다 돌아도 안전 assert Snippet.objects.count() == 2 + Snippet.objects.create(name="LEGACY-ABAP", body="x") + call_command("import_snippets", str(p)) + assert not Snippet.objects.filter(name="LEGACY_ABAP").exists() # 새 규칙 이름으로 중복 생기지 않음 def test_legacy_name_still_editable(auth_api, user): diff --git a/docs/snippets/README.md b/docs/snippets/README.md new file mode 100644 index 0000000..899dfab --- /dev/null +++ b/docs/snippets/README.md @@ -0,0 +1,28 @@ +# 스니펫 메타 검토 · 반영 + +`snippet_meta_review.csv` — 공용 스니펫 143개의 한글 설명 초안과, 옛 규칙 이름(`-ABAP` 꼬리) 11개의 새 이름. +2026-09-23 에 본문(코드·★ 머리줄·주석)을 읽고 AI 가 만든 초안이라 **사람 검토가 필요함**. + +## 검토 + +- 엑셀로 열림(UTF-8 BOM). 열: `name`(지금 이름) · `new_name`(비어 있으면 안 바꿈) · `desc`(한글 설명). +- 설명은 **사용자가 검색창에 칠 말**이 들어가게: 한글 업무 용어(전표·코스트센터·팝업·엑셀) + 핵심 ABAP 키워드. +- 새 이름 규칙: 영문 대문자·숫자·`_`, 문자로 시작, 3~50자, 권장 모양 `영역_대상_동작`. +- 고친 뒤 **UTF-8 CSV** 로 저장(엑셀 "CSV UTF-8"). + +## 반영 (서버마다 한 번) + +```bash +cd /code-assistant/5_django_backend # 우리 서버 도커면: docker compose exec be python manage.py ... +.venv/bin/python manage.py apply_snippet_meta ../docs/snippets/snippet_meta_review.csv --dry-run # 바뀔 것만 출력 +.venv/bin/python manage.py apply_snippet_meta ../docs/snippets/snippet_meta_review.csv # 반영 +``` +- 설명은 비어 있거나 한글이 없는 것만 채움(사용자가 이미 한글로 고친 건 안 건드림). `--overwrite` 면 덮어씀. +- 이름 변경은 사람별 사용 기록도 같이 옮김. 새 이름이 이미 있으면 건너뜀. 여러 번 돌려도 결과 같음. +- 로컬 실데이터 실측(143개): 설명 143 · 이름 변경 11 · 규칙 위반 0. 한글 검색 '팝업' 0→8건, '전표' 0→6건. + +## 관련 규칙 (코드) + +- 이름 규칙: `2_frontend/src/features/snippets/core/name.ts` = `5_django_backend/apps/snippets/views.py` (`normalize_name`, `NAME_RE`) +- 검색: 이름 + 설명 + 본문의 ★ 머리줄·주석줄(`core/search.ts`). 본문 코드 줄은 안 봄. +- `import_snippets` 는 스니펫이 하나도 없을 때만 돎(처음 채우기). 배포마다 불려도 중복·옛 이름 부활 없음. diff --git a/docs/snippets/snippet_meta_review.csv b/docs/snippets/snippet_meta_review.csv new file mode 100644 index 0000000..605579b --- /dev/null +++ b/docs/snippets/snippet_meta_review.csv @@ -0,0 +1,144 @@ +name,new_name,desc +ABAP_740-ABAP,SYNTAX_ABAP740_EXAMPLES,ABAP 7.4(HANA) 새 문법 예제 모음 — 인라인 선언·COALESCE 등 +ALV_LIST_STATUS_ICONS,,ALV 상태 아이콘 목록 — 신호등(빨강·노랑·초록)·LED 아이콘 이름 +ALV_MARK_GJAHR_VALIDATION_ERRORS,,업로드 데이터 검증 — 회계연도 다르면 에러 메시지·빨간 신호등 +ALV_MODIFY_CHANGED_CELLS,,ALV 에서 사용자가 바꾼 셀 값 받아 처리 (DATA_CHANGED) +ALV_POPULATE_CELL_COLOR_TABLE,,"ALV 행·셀 색깔 지정 (LVC_T_SCOL, CTAB_FNAME)" +ALV_PROCESS_SELECTED_ROWS,,"ALV 에서 선택한 행 가져오기 — 단일/다중 선택, 미선택 시 에러" +ALV_RESET_EUINFO_BUFFER,,ALV 레이아웃·필드 변경이 안 보일 때 버퍼 초기화 (SBUF_OBJ_RESET_OBJECT) +ALV_SET_CELL_EDITABILITY,,"ALV 셀 입력 가능/불가 설정 (LVC_T_STYL, STYLEFNAME)" +ALV_SET_RYEAR_CELL_COLOR,,ALV 컬럼(열) 색깔 지정 (LVC_T_SCOL) +ALV_UPDATE_VISIBLE_EXCLUDE_FLAG,,ALV 필터 적용 후 화면에 보이는 행만 골라 처리 (필터된 행 제외) +BDC_DECLARE_MESSAGE_TEXT,,BDC 메시지 텍스트용 변수 선언 (BDC_VTEXT1) +BDC_EXECUTE_F110_TRANSACTION,,BDC 실행 틀 — BDCDATA 구성·옵션·메시지 수집 (CALL TRANSACTION) +BDC_FORMAT_WRBTR_CURRENCY,,BDC 용 금액을 통화 기준 문자로 변환 (WRITE CURRENCY) +CALL_FB09D-ABAP,FI_OPEN_FB09D_LINE_ITEM,전표 개별 항목 변경(FB09D) 화면 바로 열기 — 파라미터 ID 세팅 +CASE_X-ABAP,CONTROL_CASE_X_RADIO,라디오버튼·체크박스 중 선택된 것으로 분기 (CASE 'X') +COND_SWITCH-ABAP,SYNTAX_COND_SWITCH_INLINE,7.4 COND/SWITCH — 조건에 따라 값을 한 줄로 결정 +CONVERSION_APPLY_ALPHA_KOSTL,,앞자리 0 채우기/빼기 — 코스트센터 등 번호 변환 (CONVERSION_EXIT_ALPHA) +CONVERSION_COPY_FIELDS_CORRESPONDING,,"7.4 CORRESPONDING — 같은 이름 필드 복사, 이름 다르면 MAPPING" +CONVERSION_FORMAT_WBS_POSID_ABPSP,,WBS 요소 내부번호 → 화면용 번호 변환 (CONVERSION_EXIT_ABPSP_OUTPUT) +CONVERSION_IDOC_TO_SAP_CURRENCY,,"통화별 금액 자릿수 변환 (CURRENCY_AMOUNT_IDOC_TO_SAP, 원화 등)" +CO_SELECT_GROUP_K_GROUP_SELECT,,CO 그룹(코스트센터 그룹 등) F4 조회 팝업 (K_GROUP_SELECT) +CO_SUM_COSS_PERIODS_DYNAMIC_ASSIGN,,필드심볼로 12개월(WKG001~012) 금액 필드 동적 합산 +DATA_DECLARE_SY_SUBRC_VARIABLE,,SY-SUBRC 저장용 변수 선언 +DATE_CALCULATE_ELAPSED_TIME,,처리 시간 측정 — 시작/종료 시각 차이로 경과 시간 계산 +DATE_GET_MONTH_END_RP_LASTDAY,,해당 월의 마지막 날짜 구하기 (RP_LAST_DAY_OF_MONTHS) +DATE_SUBTRACT_MONTH_MONTH_PLUS,,날짜 계산 — n개월 전후 날짜 (MONTH_PLUS_DETERMINE) +DATE_SUBTRACT_MONTH_RP_CALC,,날짜 계산 — n개월/일/년 전후 날짜 (RP_CALC_DATE_IN_INTERVAL) +DDIC_DECLARE_ZBTPBUDS0003_STRUCTURE,,구조체 기준으로 작업영역·내부테이블·필드심볼 선언 (INCLUDE STRUCTURE) +DDIC_DEFINE_T_INPUT_STRUCTURE,,TYPES 로 구조체 타입 정의 후 변수 선언 +DDIC_MAINTAIN_ZFIDVGC1002_SM30,,SM30 테이블 유지보수 화면 호출 메모 +DDIC_OPEN_VIEW_BUKRS_FILTER,,테이블 유지보수 뷰를 회사코드 조건으로 열기 (VIEW_MAINTENANCE_CALL) +DDIC_SET_CHANGE_AUDIT_FIELDS,,생성/변경 이력 필드 채우기 (ERDAT·ERNAM·AEDAT·AENAM) +DEBUGGER_ACTIVATE_SYSTEM_COMMAND,,팝업에서도 디버깅 켜기 — /H 시스템 명령 파일 +DEL_MARK_ALV,,"ALV 에서 선택한 행 삭제 — 선택 없으면 안내, 확인 팝업 후 삭제" +DYNPRO_CONFIRM_MESSAGE_POPUP,,확인 팝업(예/아니오) 띄우고 답에 따라 분기 +DYNPRO_DISABLE_INPUT_GROUP1,,화면 필드 그룹(GROUP1) 입력 비활성화 (LOOP AT SCREEN) +DYNPRO_HANDLE_OK_CODE_NAVIGATION,,화면 버튼 처리 — 뒤로·취소·종료(BACK/CANC/EXIT) 분기 +DYNPRO_OPEN_FB03_CURSOR_FIELD,,ALV·리스트에서 커서 위치 필드를 더블클릭하면 전표(FB03) 열기 (GET CURSOR) +DYNPRO_OPEN_POPUP_SCREEN,,화면을 팝업 창으로 띄우기 (CALL SCREEN STARTING AT) +DYNPRO_REQUEST_DD03L_TABNAME_VALUES,,값 입력 팝업 — 특정 필드 값을 사용자에게 입력받기 (POPUP_GET_VALUES) +DYNPRO_RETURN_PREVIOUS_SCREEN,,이전 화면으로 돌아가기 (LEAVE TO SCREEN 0) +EXCEL_UPLOAD-ABAP,FILE_UPLOAD_EXCEL_DYNAMIC,엑셀 파일 업로드 — 동적 내부테이블로 읽기 (SMW0 양식) +F4_FILE-ABAP,SELECTION_SCREEN_F4_FILE_PATH,선택화면 파일 경로 입력칸에 F4 파일 선택 팝업 +FILE_DOWNLOAD_SMW0_DOCUMENT,,SMW0 에 올린 양식 파일(엑셀 템플릿) 다운로드 버튼 +FILE_DOWNLOAD_TEXT_GUI_DOWNLOAD,,"내부테이블을 PC 텍스트 파일로 다운로드 (GUI_DOWNLOAD, 탭 구분)" +FILE_UPLOAD_TEXT_GUI_UPLOAD,,"PC 텍스트 파일을 내부테이블로 업로드 (GUI_UPLOAD, 탭 구분)" +FI_DELETE_PARKED_DOCUMENT_FBV0_BDC,,파킹전표 삭제 — BDC 로 FBV0 실행 +FI_OPEN_FB03_PARAMETER_IDS,,전표 조회(FB03) 화면 바로 열기 — 회사코드·전표번호·연도 파라미터 +FI_OPEN_FB09D_SKIP_SCREEN,,FB09D 첫 화면 건너뛰고 실행 (CALL TRANSACTION AND SKIP FIRST SCREEN) +FI_OPEN_FBV3_PARAMETER_IDS,,파라미터 ID 세팅 후 파킹전표 조회(FBV3) 바로 열기 +FI_TOGGLE_COMPANY_CODE_POPUP_FO2,,FI 회사코드 입력 팝업 켜고 끄기 (파라미터 ID FO2) +GET_TABLE_KEKO,,원가계산 헤더(KEKO) 조회 — 서브쿼리로 최신 건만 +IF_SUBRC-ABAP,CONTROL_IF_SUBRC_CHECK,직전 처리 성공 여부로 분기 (IF SY-SUBRC EQ 0) +ITAB_AGGREGATE_DMBTR_COLLECT,,키가 같으면 숫자 필드 합산 (COLLECT) +ITAB_AGGREGATE_SUM_COUNT_REDUCE,,7.4 REDUCE — 내부테이블 합계·조건 건수 한 줄 계산 +ITAB_CALCULATE_GJAHR_SUBTOTAL,,그룹별 소계 — AT NEW / AT END OF (정렬 필수) +ITAB_COPY_COMPONENTS_DYNAMIC_ASSIGN,,필드심볼 2개로 필드명을 동적으로 지정해 값 복사 (ASSIGN (필드명)) +ITAB_COUNT_ROWS_LINES,,내부테이블 행 개수 세기 (LINES) +ITAB_DECLARE_LOCAL_STRUCTURE,,로컬 구조체·내부테이블·필드심볼 선언 틀 (BEGIN OF) +ITAB_DEDUPLICATE_ACCOUNTING_KEY,,내부테이블 정렬 후 중복 제거 (SORT·DELETE ADJACENT DUPLICATES) +ITAB_DELETE_ROWS_WHERE,,내부테이블에서 조건 맞는 행 삭제 (DELETE itab WHERE) +ITAB_FILTER_ROWS_LOOP_WHERE,,조건 맞는 행만 반복 처리 (LOOP AT WHERE) +ITAB_GROUP_ROWS_BY_KEY,,7.4 그룹핑 — 키별로 묶어서 반복 (LOOP AT GROUP BY) +ITAB_LOOKUP_ROWS_TABLE_EXPRESSIONS,,7.4 행 존재 여부·위치·값 바로 읽기 (LINE_EXISTS·LINE_INDEX·itab[ ]) +ITAB_MODIFY_GJAHR_PERIOD_TRANSPORTING,,내부테이블 여러 행의 특정 필드만 일괄 수정 (MODIFY TRANSPORTING WHERE) +ITAB_POPULATE_VALUE_CONSTRUCTOR,,7.4 VALUE 생성자로 RANGE·내부테이블 한 번에 채우기 +ITAB_READ_ACCOUNTING_KEY_BINARY_SEARCH,,내부테이블 빠른 조회 — 정렬 후 READ TABLE BINARY SEARCH +ITAB_READ_KEYS_BINARY_SEARCH,,여러 키로 정렬 후 빠른 조회 (READ TABLE WITH KEY BINARY SEARCH) +ITAB_READ_OBJNR_BINARY_SEARCH,,"내부테이블 한 건 빠르게 찾기 (READ TABLE BINARY SEARCH, OBJNR)" +ITAB_SUM_PERIOD_FIELDS_VARYING,,기간별 금액 필드(HSL01~16) 반복 합산 (DO VARYING) +ITAB_UPDATE_MARK_TRANSPORTING,,내부테이블 조건 맞는 행의 선택표시(MARK) 필드만 수정 +JOB_REPEAT_BACKGROUND_CALL_DO,,DO n TIMES 반복하며 백그라운드 잡 여러 번 실행 +JOB_SUBMIT_Z2RCO5010_IMMEDIATE,,백그라운드 잡 생성·다른 프로그램 SUBMIT·즉시 실행 (JOB_OPEN/CLOSE) +LOCK_MANAGE_ZTABLE_ENQUEUE_DEQUEUE,,Z테이블 잠금/해제 (ENQUEUE·DEQUEUE) — 동시 수정 방지 +MEMORY_IMPORT_EXPORT_INDX_ST,,공유 버퍼로 프로그램 간 데이터 주고받기 (EXPORT/IMPORT SHARED BUFFER) +MEMORY_IMPORT_ORGDOC_AND_FREE,,ABAP 메모리에서 값 가져오고 비우기 (IMPORT FROM MEMORY·FREE MEMORY) +MESSAGE_DISPLAY_STATUS_AS_ERROR,,메시지 출력 — 상태 표시줄에 에러처럼 보이게 (MESSAGE S DISPLAY LIKE E) +MESSAGE_FORMAT_GP_510_TEXT,,메시지 번호로 메시지 문장 만들기 (MESSAGE ... INTO) +NUMBER_RANGE_GET_NEXT_NUMBER,,번호범위로 다음 채번 (NUMBER_GET_NEXT) +OPEN_SQL_AGGREGATE_COSS_COSL_TOTALS,,CO 원가 테이블(COSS·COSP) 12개월 금액 합계 조회 +OPEN_SQL_APPLY_SELECT_OPTIONS_FILTERS,,SELECT-OPTIONS 범위 조건 만들기 (NO INTERVALS·NO-EXTENSION) +OPEN_SQL_DELETE_ZCO240T_PERBL,,DB 테이블 조건 삭제 (DELETE FROM WHERE) +OPEN_SQL_DELETE_ZCOT1010_PERIOD,,"DB 테이블 조건 삭제 (DELETE FROM WHERE, 기간 단위)" +OPEN_SQL_LIST_DD03L_FIELDS,,테이블 필드 목록 조회 (DD03L — 필드명·위치·데이터 요소·길이) +OPEN_SQL_LOOKUP_AUFK_AUFNR,,내부오더(AUFNR) 유효성 확인·오더명 가져오기 (AUFK) +OPEN_SQL_LOOKUP_CEPC_CEPCT_PRCTR,,손익센터(PRCTR) 유효성 확인·명칭 가져오기 (CEPC·CEPCT) +OPEN_SQL_LOOKUP_CSKA_CSKU_KSTAR,,원가요소(KSTAR) 유효성 확인·명칭 가져오기 (CSKA·CSKU) +OPEN_SQL_LOOKUP_CSKS_CSKT_KOSTL,,코스트센터(KOSTL) 유효성 확인·명칭 가져오기 (CSKS·CSKT) +OPEN_SQL_LOOKUP_J_1BBRANCH,,사업장(BRANCH) 유효성 확인·사업장명 가져오기 (J_1BBRANCH) +OPEN_SQL_LOOKUP_KNA1_KNB1_KUNNR,,고객(KUNNR) 유효성 확인·고객명 가져오기 (KNA1·KNB1) +OPEN_SQL_LOOKUP_LFA1_LFB1_LIFNR,,구매처·벤더(LIFNR) 유효성 확인·이름 가져오기 (LFA1·LFB1) +OPEN_SQL_LOOKUP_SKB1_SKAT_SAKNR,,계정코드(SAKNR) 유효성 확인·계정명 가져오기 (SKB1·SKAT) +OPEN_SQL_LOOKUP_TGSBT_GSBER,,사업영역(GSBER) 유효성 확인·명칭 가져오기 (TGSBT) +OPEN_SQL_POLL_BKPF_DOCUMENT,,전표(BKPF) 생성될 때까지 반복 확인 — 존재 여부 체크 후 대기 +OPEN_SQL_READ_DD07T_DOMAIN_TEXTS,,도메인 고정값과 텍스트 가져오기 (DD07T) +OPEN_SQL_READ_MAKT_MAKTX_SINGLE,,한 건 조회 (SELECT SINGLE) — 자재명(MAKTX) 가져오기 +OPEN_SQL_READ_MARA_FAE,,내부테이블 기준 조회 (FOR ALL ENTRIES) — 비어 있으면 전체조회 주의 +OPEN_SQL_REPLACE_ZCOT1010_PERIOD,,"내부테이블 내용을 DB 테이블에 저장 (ZCOT1010, 기간 단위 삭제 후 저장)" +OPEN_SQL_UPDATE_BKPF_DOCUMENT,,DB 테이블 필드 직접 수정 (UPDATE BKPF SET) +OPEN_SQL_UPSERT_ZFIDTGC1056_TABLE,,"내부테이블로 DB 테이블 저장(있으면 수정, 없으면 추가) — MODIFY FROM TABLE·COMMIT" +PART1_4_SCREEN,,스크린 흐름 로직 기본 틀 — PBO(화면 전)·PAI(사용자 액션 후) +PART1_5_PBO,,스크린 PBO/PAI 모듈 기본 틀 — 상태(버튼·제목) 설정과 버튼 처리 +PART2_13_RADIO_BOX_HORIZONTAL,,라디오버튼 가로 배치 + 앞에 설명 텍스트 +PART2_1_BEGIN_OF_BLOCK,,선택화면 블록(테두리) 만들고 입력 조건으로 SQL 조회 +RANGE_APPEND_SY_DATUM_EQ,,"RANGE/SELECT-OPTIONS 에 단일값 한 줄 추가 (SIGN I, OPTION EQ)" +RANGE_BUILD_EQ_BT_MACROS,,RANGE 조건 매크로로 채우기 (EQ 단일값·BT 범위) +RAP_QUERY_FIND_CLOUD_API_SUCCESSORS,,RAP 커스텀 쿼리 클래스 예제 — 필터·페이징·건수 처리 +REPORT_CONFIGURE_FUNCTION_BUTTONS,,선택화면 툴바 기능 버튼(F01~F05) 텍스트·아이콘 설정 +REPORT_DEFINE_ZMESSAGE_MESSAGE_ID,,리포트 선언에 메시지 클래스 지정 (MESSAGE-ID) +REPORT_WRITE_HELLO_WORLD,,가장 간단한 리포트 — Hello world 출력 +RUNTIME_WAIT_HALF_SECOND,,잠깐 대기 — 0.5초 멈춤 (WAIT UP TO SECONDS) +SELECTION_SCREEN_ADD_SKIP_ULINE,,선택화면 빈 줄·구분선 넣기 (SKIP·ULINE) +SELECTION_SCREEN_ASSIGN_KOSTL_MATCHCODES,,선택화면 코스트센터 입력칸에 검색도움(매치코드) 붙이기 +SELECTION_SCREEN_BIND_MEMORY_ID,,선택화면 값 기억하기 — MEMORY ID 로 다음에도 같은 값 자동 입력 +SELECTION_SCREEN_DEFINE_DEFAULT_CHECKBOX,,선택화면 체크박스 (기본 체크) +SELECTION_SCREEN_DEFINE_FRAMED_BLOCK,,선택화면 테두리 블록 만들기 (BEGIN OF BLOCK WITH FRAME) +SELECTION_SCREEN_DEFINE_RB1_RADIOBUTTONS,,선택화면 라디오버튼 그룹 (4개 중 하나 선택) +SELECTION_SCREEN_DEFINE_RD1_RADIOBUTTONS,,선택화면 라디오버튼 2개 (기본 선택 지정) +SELECTION_SCREEN_DEFINE_RD2_RADIOBUTTONS,,"선택화면 라디오버튼 — 여러 개 중 하나만 선택, 기본값 지정" +SELECTION_SCREEN_DEFINE_ZBTN_PUSHBUTTON,,선택화면에 푸시버튼 만들기 (전체 체크·영역 보이기/숨기기 등) +SELECTION_SCREEN_DISABLE_MD1_INPUT,,선택화면 특정 그룹(MODIF ID) 입력 막기 (AT SELECTION-SCREEN OUTPUT) +SELECTION_SCREEN_HANDLE_UC1_COMMAND,,선택화면 버튼 클릭(USER-COMMAND) 처리 +SELECTION_SCREEN_HIDE_P_BUKRS2,,선택화면 파라미터 숨기기 (NO-DISPLAY) +SELECTION_SCREEN_INSERT_BLANK_LINE,,선택화면에 빈 줄 한 칸 넣기 (SELECTION-SCREEN SKIP) +SELECTION_SCREEN_LAYOUT_PARAMETER_LINE,,선택화면 한 줄에 여러 파라미터 배치 (BEGIN OF LINE·COMMENT·POSITION) +SELECTION_SCREEN_LAYOUT_RD1_RADIOBUTTONS,,선택화면 라디오버튼 가로로 배치 (BEGIN OF LINE·POSITION) +SELECTION_SCREEN_POPULATE_P_PERIOD_LISTBOX,,선택화면 파라미터를 드롭다운 리스트박스로 — 도메인 값으로 목록 채우기 +SELECTION_SCREEN_SET_PARAMETER_DEFAULTS,,"선택화면 기본값 지정 (DEFAULT, 올해 연도 등)" +SELECTION_SCREEN_TRACE_EVENT_SEQUENCE,,선택화면 이벤트 실행 순서 확인 (INITIALIZATION·AT SELECTION-SCREEN 등) +SELECT_SUBQUERY_MAX-ABAP,OPEN_SQL_SUBQUERY_MAX_KEKO,서브쿼리로 최신(MAX) 값만 조회 — KEKO 원가계산 헤더 +SELECT_SUM-ABAP,OPEN_SQL_SUM_GROUP_BY_HAVING,SELECT 합계 집계 — SUM·GROUP BY·HAVING (매출원가 수량·금액) +STRING_CONVERT_LOWER_CASE,,문자열 소문자로 바꾸기 (TRANSLATE TO LOWER CASE) +STRING_EXTRACT_BY_OFFSET_LENGTH,,문자열 잘라 쓰기 — 위치(offset)·길이로 년/월/일 뽑기 +STRING_FIND_ALPHA_OFFSET_REGEX,,정규식으로 첫 영문자 위치 찾기 (FIND REGEX MATCH OFFSET) +STRING_FIND_FIRST_MATCH_OFFSET,,"문자열에서 첫 위치 찾기 — 일반/정규식, 위치(OFFSET) 받기 (FIND)" +STRING_JOIN_FIELDS_SEPARATOR,,여러 필드를 구분자로 합치기 (CONCATENATE SEPARATED BY) +STRING_OVERLAY_HKONT_BLANKS,,문자열 덮어쓰기 — 빈 자리를 다른 값으로 채우기 (OVERLAY) +STRING_REPLACE_DELIMITERS,,문자열 치환 — 특정 문자 전부/처음 것만 바꾸기 (REPLACE) +STRING_SHIFT_LEFT_BY_COUNT,,문자열을 왼쪽으로 n칸 밀기 (SHIFT ... PLACES LEFT) +STRING_SPLIT_AT_SPACE,,문자열을 구분자(공백)로 나누기 (SPLIT AT) +STRING_TEMPLATE-ABAP,STRING_TEMPLATE_FORMAT,"7.4 문자열 템플릿 |...| — 숫자·날짜 포맷, 자리수 0 채우기" +STRING_VALIDATE_DIGIT_SPACE_CO,,문자열이 숫자(와 공백)로만 되어 있는지 확인 (CO) +XF_XFELD-ABAP,DDIC_LIST_XFELD_DOMAINS,예/아니오(체크) 필드용 데이터 요소 목록 — XFELD 계열