사급과 도급의 정의는 광범위 함, 일반적으로는 제품의 생산에 필요한 원료를 조달하는 방식을 일컫음

 

사급

구매자가 원료를 조달하여 판매자에게 공급하는 방식

  • 원청업체(모기업, 구매자)가 구매한 자재를 구매원가보다 낮은 가격 혹은 무상으로 하청업체(자기업, 판매자)에 넘기고, 하청업체가 그 자재를 가공하여 가공비만 받고 다시 원청업체에 납품하는 형태
  • 더 단순하게 말하자면 구매자가 너 지금 돈 없다며 혹은 부담스럽다며? 내가 원재료 살게 너는 가공만 해
  • 왜?
    • 원가절감을 위함
    • 모기업에서 자재를 일괄 구매 후 원가를 절감
    • 자기업의 납품 기일 준수를 위해 관리

 

1. 유상사급

    - 원청업체가 자재 대금을 지불하여 자기업이 공급하도록 하거나 대신 주는 형태.

    - 외주 거래선의 자금조달능력 부족할때 소요 자재를 대신 구매해 공급하는 것.

    - 1000원짜리 상품을 계약 하였을때 원자재 값이 100원이라면 (이를 하청업체에 판매하고, 바로 받지 않고) 비용을 정산시에 원청업체는 1000원이 아닌 900원을 지불한다. 

    - 판매한 자재금액 만큼 납품금액에서 까는 것을 상계라고 함.

 

2. 무상사급

    - 자재 대금을 지불하지 않은 상태에서 자기업이 공급 받도록 하거나 주는 형태.

    - 원청업체는 하청업체에 무상으로 원자재를 제공하고 비용을 900원 지불한다.

 

=> 유상사급이던 무상사급이던 결국 하청업체가 받는 돈은 900원인데 똑같은거 아닌가요?

  • 결과적으로 지불하는 금액은 같지만 계약을 1000원으로 하는지 900원으로 하는지의 차이!
  • 도메인지식이 전무한 나의 개인적인 추측이지만 하청업체에서는 계약금이 더 적게 나오는 무상사급을 선호하지 않을까? 대신 원자재 선택을 못하니 이런 점에 있어서는 단점이라고 생각이 들 것 같다.
  • 품질 문제가 발생했을때에도 사급의 경우에는 원청업체(구매자)도 공동 책임이 생김?
  • 하청업체(판매자) 입장에서는 원가 정보가 누출되는것이 가장 큰 단점일 듯
  • 어중간하게 원청업체에서 사급을 진행하게 되면 담당자는 많이 힘듦..., 유상사급의 경우에는 재고관리도 원청업체에서 해야 함.

 

 

 

 


도급

사급과는 반대의 개념으로, 거래에 있어 판매자, 구매자가 있다면 특정 원료에 대해 판매자가 직접 조달을 하는 방식을 도급이라고 함. 

어떤 업무를 할것이라고 약정하고 결과에 따른 보수 지급을 약정함으로 성립하는 계약

 

'SAP > Domain Knowledge' 카테고리의 다른 글

ABC원가  (0) 2021.07.30
  • 1 번 글에서 언급한 바처럼

이번 멘토링에서 사용할 기술 스택은 다음과 같다

 

  • Python
    • Flask
  • AWS
    • Lambda
    • API Gateway
    • S3
    • DynamoDB
    • ECS
  • Deploy
    • Gitlab
    • Zappa

이제 해당 내용에 대해 정리를 해보고자 한다.

 

Python 

https://namu.wiki/w/Python

개발을 몰라도 한번씩은 들어봤을 언어이다. 

최근에는 대학교 1학년 필수교양에도 들어가는 것 같던데 나의 경우에는 졸업 직전 여름방학 멀티캠퍼스에서 아주 잠깐...

경험해보고 카카오톡 챗봇을 단시간에 만들어 본 것이 유일한 경험이고

이후에 뭔가 만들어봐야 한다고 생각만 하고 공부를 못했었다.

주요 특징이라면 인터프리터 언어이고 생각보다 오래된 언어이다. 이후에 데이터 엔지니어링 관련 라이브러리들이 많이 나오면서 정말 급상승 한 언어로 인지하고 있다.

아무래도 설치나 환경변수 잡는 등의 세팅이 자바나 다른 언어보다 용이? 하고 쉽기에 많이 입문하는 것으로 보인다.

 

 Flask

플라스크는 Python의 웹 애플리케이션 개발을 위한 프레임워크, Django(장고)도 웹 프레임워크이고 비교도 많이 되며 같이 쓰는 경우도 있다고 한다.

어떤게 더 가볍고 무겁다 이런 비교글들도 있지만 크게 차이는 없는 듯 하며 그냥 개발자의 선호도에 따라 나뉘는 듯? 하다.

누군가는 Flask가 더 배우기 쉽다고 말하기도 하고 사실은 더 어렵다 라는 글도 보인다.

 

프로젝트 레이아웃이 다르고 DB접근 방법에 대한 차이와 내가 원하는 기능을 추가할때의 편의성에 대한 차이가 Django에 대한 주요 차이점으로 보인다.

또한 Django는 RDBMS에 특화되어있고 NoSQL을 사용 한다면 그냥 Flask를 사용한다.

그러면 이제 RDB와 NoSQL에 대한 차이를 알아야 할 듯 하다.

 

RDBMS와 NoSQL의 차이 

  1. RDBMS
    1. 저장방식은 SQL(Strucured Query Language)에 의해 저장
    2. 정해진 스키마(데이터 구조와 제약조건에 관한 명세 기술, 속성 개체 관계)에 따라 데이터를 저장
    3. 테이블과 테이블이 관계를 맺고 있는 집합체 ( 외래키를 사용하여 Join)
  2. NoSQL
    1. 데이터가 증가하며 Scale-Up에 따른 비용 과다 등에 대한 대체 목적을 갖고 등장
    2. 일관성 포기 -> 데이터 분산 ( Scale-Out) - 클러스터링으로 하나의 DB 구성
    3. 유연성, 확장성, 고성능, 고기능성이라는 특징을 갖음
    4. 주로 키 - 값의 관계 ( Key-Value, Wide Columnar, Document(JSON, XML), Graph 등의 구조로 나뉨)
    5. 테이블간 연결 조회하는 join 없음

 

AWS

아마존 웹 서비스 

IT 인프라 구축에 필요한 다양한(엄청) 서비스를 제공한다.

원하는 만큼만 사용하고 비용을 측정하는 방식으로 사용

내가 하고 있는 SAP에서도 On-Premise와 Cloud(Rise)로 나뉘는 부분에서 Cloud에 해당

장기적으로 보면 On-Premise가 비용은 저렴한 듯 하지만, 소규로로 작업하거나 특정 트래픽때 사용하기에 유용함

 

  • Lamda
    • 서버를 프로비저닝, 관리 하지 않고 코드를 실행하는 서버리스 컴퓨팅 서비스
    • 코드 실행, OS유지 관리, 용량 확장, 모니터링, 로깅 등 모든 컴퓨팅 리소스 관리를 수행
    • 코드는 Lamda함수로 구성, C# GO Java 파이썬 루비 등 언어 지원
  • API Gateway
    • 규모에 관계 없이 API를 손쉽게 생성, 게시, 유지관리, 모니터링 할 수 있는 완전관리형 서비스
    • RESTful API,  WEBSOCKET API 지원
    • 서버 앞단에서 모든 API서버들의 엔드포인트를 단일화 해주는 또 다른 서버
    • https://tommypagy.tistory.com/143
  • S3
    • Simple Storage Service
    • 주로 파일서버의 역할을 함
    • 사용자 과다로 트래픽이 늘어나도 시스템적인 작업 안해도 됨
    • 저장 파일 제한 없음
    • REST, SOAP 인터페이스 제공
    • 데이터 중복저장으로(이중화) 데이터 손실시 자동 복원
    • 버전관리
    • 보호수준 차등 선택가능 - 비용 절감
    • https://opentutorials.org/course/608/3006
  • DynamoDB
    • NoSQL < - > RDBMS
    • MongoDB와 같은...
    • ACID에 대응
    • 일관성 데이터즉시반영 포기 , 확장성을 특징
    • RDBMS의 경우에는 띄우는 순간부터 비용이지만 DynamoDB는 거의 안나옴(용도에 따라)
    • 키워드에 DB가 붙어있긴 하지만 세일즈포인트가 아닐까?
    • 도큐먼트 엔진같은 느낌 JSON처럼
    • 쿼리가 없음
  • ECS
    • Elastic Container Service
    • 컨테이너를 적절하게 분배 확장 축소하는 서비스
    • 멘토링에서 할 데이터가 하루 70~80mb가량이 들어오는데 람다에서는 처리시간이 10초가 넘기면 메모리를 늘린다고 해도 죽어버리고 맘...
    • 그렇다고 EC2를 사용하기엔 하루 15분 가량을 사용하는데 너무 리소스가 아까움
    • 이를 스케쥴링 해서 필요한 시간만 사용, 과금을 낮춤
    • 너무 사이즈가 커지면 컨테이너를 늘려서 병렬처리 하고자 함

Deploy

  •  GitLab
    • 비공개된 GitHub?
    • 트렐로와 같은 협업툴처럼 협업 기능을 적극적으로 사용해서 GitHub + 트렐로의 느낌
    • 버전관리, 원격저장, issue tracker 지원
    •  
  • Zappa
    • Serverless를 구출을 가능하게 해주는 Python Pakage
    • 자원을 분산 -> 함수는 함수대로 DB는 DB대로 나누어 연동
    • AWS APIGateway Path 추가 작업 안해도 되서(자동으로 해줌) 귀찮음 해소
    • 명령어 한줄로도 배포 가능!
    • 비용 저렴
    • Zappa를 사용하면 람다에는 덜 신경 써도 됨

 

이렇게 아주.. 간단하게 정리해보았는데

정리하면서도 아직 많이 부족함을 느꼈고 , 해당 부분을 공부하면서 더 채워 넣어야 할 것 같다.

기술스택 정리하면서도 마음이 웅장해진다... (긍정적의미로...)

 

평소 SAP 관련 글을 보며 알게되고 이후에도 다양한 개발과 생활 이야기를 작성해서 즐겨보던 블로그가 있었다.

글을 읽다보면 내용에 사족이 없고 간결하지만 유익한 정보를 얻을 수 있어서 수시로 확인하며 글을 읽어왔었고

SAP 관련 내용들을 메일로 조심스레 여쭤보고 조언도 얻을 수 있어서 항상 감사한 마음을 갖고 언젠가 뵙고 싶기도 했는데


티스토리 - 뷰티풀 프로그래밍 해당 블로그에


https://krksap.tistory.com/1918

문득 해당 새 글이 업로드 된 것을 보았다.


이전부터 파이썬에 대한 학습과 데이터 엔지니어링 공부를 해야 한다고 생각해왔었는데

스터디의 경우에는 스터디장분이나 스터디원에 따라 산으로 가는 경우도 경험해보고

그게 아니더라도 방향성을 잡고 진행하기가 쉽지 않고 드문 경우여서 배제하고 있었고

본업을 생각하면 회사 업무가 최근 급등하기도 했고 SAP 공부도 빠듯한데 해도 될까라는 고민과

다른 멘티분들에게 발목을 잡지 않을까 라는 죄책감이 많이 들어서 선뜻 신청하지 못하고 있다가

바쁜거야 아마 죽는 그 날까지 바쁘다는 핑계를 대면 아무것도 할 수 없을 것 같았고

훌륭한 멘토님께 제대로 마음 먹고 해 볼 수 있는 좋은 기회라고 판단 하고 신청하게 되었다.

죄책감은... 내가 부족한 만큼 더 열심히 해서 채워 나갈 수 밖에 없는 부분...




아무튼 첫 멘토링을 진행하며 앞으로 진행해야 하는 방향성을 잡아주셨고 계획을 잡게 되었는데

  1. 우리는 팀 프로젝트의 형식으로 진행하게 된다.

    • 물론 모든 내용을 각각 개인이 하게 되면 실력이야 당연히 늘겠지만 정해진 시간에 정해진 개발을 해야 한다는 점에 있어 중요한 부분은 함께하고 개별적인 부분을 나눠서 하기로 하였다.

    • 매일 2~3시간씩, 주 5일, 5주의 시간을 할애하기로 하였고 ( 아마 부족한 나에게는 ... 최소 2배 이상의 시간이 필요하다라는 생각...)

      4시간을 개발에 쓰려면 5 ~ 6 시간을 해야 하니, 회사 업무를 정말 뽝집중해서... 업무시간내에 끝내고 새벽 1~2시 까지는 해야 할 것이라고 판단 (운동이나 게임 영화 이런건 어림없지)

  1. 사용 할 데이터는 공공데이터 포럼의 농축 수산부에서 제공하는 경매 데이터를 활용한다.

    • 이미 멘토님께서 기존에 개발한 설계와 코드가 존재하며

    • 데이터의 량이 충분할 뿐 아니라 매일 갱신되며 해당 데이터를 정해진 스케쥴링에 맞춰 가져오고 쓴다.

  1. 기술 셋 (크게 분류)

    • Python

      • Flask
    • AWS

      • Lambda
      • API Gateway
      • S3
      • DynamoDB
      • ECS
    • Deploy

      • Gitlab
      • Zappa

    위에 크게 언급한 기술 스텍을 기반으로 프로젝트를 진행한다 문제는 들어봤지만 제대로 써본 기술셋이 없을 뿐더러 ( 파이썬부터가 ... )
    들어보지도 못한 친구들을 공부해야 한다는 것...
    우선 기술 스텍에 대한 글을 따로 작성하며 정리해야 할 것 같다.

  1. AD Sense 를 통한 광고 유입 확인

    • 최종적으로 프로젝트 이후에는 애드센스를 달고 실제 사용자들이 어디서 얼마나 머무는지 어디에서 이탈하는지 수익은 나는지 등의
    • 테스트를 해볼 것 같다. 이전에 구글 애널릭틱스를 사용하여 분석하는 것을 본 적이 있는데 굉장히 상세하고 분석하지 좋았던 기억이 나는데 이번에도 한번 더 체험 해 볼 수 있을 것이다.
  2. 위의 내용을 기반으로 계획

    • 위의 내용들을 기반으로 WBS처럼 계획을 짜는 과정을 가졌다.
    • 하지만 나의 경우에는 해당 내용이나 선행지식 정도를 정확히 몰라 멘토님께 계속 여쭤보았고
    • 이를 통해 공통과제와 개인과제로 분류 진행하게 되었다.



이 외에도 더 많은 내용을 기재하고 싶은데...

정해진 기간동안 해야 할 과제도, 파이썬 개별 공부도 너무 부족하여 최대한 효율적으로 시간을 사용 해야 할 것 같으며

앞으로의 멘토링 과정에서 민폐 끼치지 말고 많은 것들을 배우고 성장 할 수 있는 기회가 되길 바라며 그 바램보다 더 많이 노력해야겠다.

정리를 하면서도 말씀헤주신 내용에 비해 기재한 내용이 너무 부족하고 빈약해서 부끄럽...다

VENDOR MASTER 생성을 하면서 VENDOR에 대해 공부하고 다시 정리해보고자 함.

Vendor Master Record


일반적으로 Vendor는 파는사람, 공급자(회사) Customer는 사는사람, 수요자(회사) 이지만 실직적으로 회사에서 통용되는 의미는 거래선 이라는 의미가 강하다. 갑과 을에 한정된 개념이 아닌 모두 포함된 의미이며 서로 협력업체간에 통용되는 의미
Master Data는 Core Data로 Tansaction의 Base가 된다. 생산, 물류, 판매, 구매 등의 활동을 할때 master data 는 유지되어야 한다.
Material Master Data Customer Master Data Vendor Master Data Pricing/conditions Master Data Warehouse management Master Data 등이 있음

Vendor Master Data의 경우에는 3영역으로 구성됨

  1. 일반 데이터
    • 기업 내 각 회사 코드에 동일하게 적용되는 데이터 ( 주소, 전화번호, 언어 등 )
  2. 회사 코드 데이터
    • 회사 코드 수준에서 보관되는 데이터 ( 지불 거래 데이터, 관리 계정 수 등)
  3. 구매 데이터
    • 구매 조직 수준에서 보관되는 데이터 ( 담당자, 배송 조건 등 )

거래등으로 Vendor가 생성되어야 할때 필요하며
FICO에서만 사용되는 매입처(Vendor)는 FK01에서
SD(물류)모듈과 연계 되는 매입처는 XKL01에서 생성한다.

'SAP' 카테고리의 다른 글

UD Cancel  (0) 2022.07.04

파일 입력을 위한 타입 설정 후 해당 매개변수를 사용하는 펑션에서 지속적으로 덤프가 발생하였는데

타입명도 정확하게 설정했다고 생각했는데 덤프가 발생해서 한참을 헤메였다.

RLGRAP-FILENAME ( CHAR 128 )
- WS_DOWNLOAD, WS_UPLOAD, KD_GET_FILENAME_ON_F4 와 같은 펑션모듈등에 사용됨

IBIPPARMS-PATH ( CHAR 128 )
- RLGRAP-FILENAME와 유사

FILENAME-FILEINTERN ( CHAR 60, 뭔가 이상해서 찾아봤는데 정말로 CHAR 60자리임. )
- 실제 파일 경로가 아닌 논리 파일 이름에 사용 됨, 디렉토리 구조 변경시 그냥 파일 논리 경로 정의만 변경하면 됨.
단 길이가 짧음 60, FILE_GET_NAME과ㅣ 같은 펑션모듈에 사용됨

우선 내 실수는

FILENAME-FILENAME 으로 .. 선언해버린 어처구니 없는 실수였지만

그 덕에 각각의 차이점에 대해 살펴 볼 기회가 생겼다.

사용하는 혹은 할 펑션에 따라 타입을 취사 선택하면 될 것으로 보인다.

나중에 조금 더 세분화 된 차이점을 공부해야겠다.

고객번호 / 전표번호 / 거래시작일

을 타 Internal Table에서 가져왔다.

Untitled

위와 같은 데이터 값이 저장되어있는데

여기에서 거래시작일 중 가장 최초거래일만을 가져와야 했는데

ABAP에서 MAP 같은 개념을 알지 못하여

고객번호별로 Loop을 돌리며 거래시작일을 Loop 돌리고

지역변수 하나(LV_BUDAT)를 생성 거래시작일을 넣어주고 LOOP안에서 비교하며 낮은 값을 넣어주는 방식으로 고민하다

LOOP에 LOOP도 찝찝하고 좀 바보같은 방법이길래 다른 방법이 없을까 고민하며 생각했던 건

고객번호별 거래시작일로 SORT 이후

DELETE ADJACENT DUPLICATES FROM [INTERNAL TABLE] COMPARING [ 필드네임 OR ALL FIELDS ] 였다.

혹시라도 최초거래시작일이 아닌 최근거래시작일을 구하고 싶다면

SORT itab BY field1 ASCENDING field2 DESCENDING.

이런식으로 필드별로 오름차순 내림차순을 정해주고 중복을 제거하면 될것.

훨씬 코드가 간결하고 가독성도 높으며 부가적인 변수 선언도 없으고 프로세스도 덜 먹는것으로 보인다.

잊지 말자 DELETE ADJACENT DUPLICATES

ABAP 에서 Modulerized 할 수 있는 방법은 3가지

  1. Subroutine
  2. Funtion
  3. Object oriented techniques

Function은 Subroutine과 유사하게 기능별로 모듈화 하고 재사용이 가능하도록 지원

  • Subroutine이 Local Modularization이라면
    • 같은 프로그램내에서만 호출 가능
  • Function은 Global Modularization이다.
    • Function Group이라고 불리는 POOL에 속해야 한다.
    • 예외 처리 기능을 제공하여 에러가 발생하면 예외 사항을 호출한 프로그램에 전달 가능
    • 호출 프로그램에 상관없이 Stand-alone 모드에서 테스트 할 수 있다.
    • Function을 호출할 때 Input 파라미터를 입력하고 수행결과를 Output 파라미터로 받게 됨

  1. Function Module
    • 중앙 라이브러리 (R/3 Repository) 에 저장되는 Global Subroutine
    • 모듈화 하여 재사용하며 스크립트 수 줄임
    • R/3에는 이미 수많은 기본 Function Module이 제공되며 추가로 생성하여 사용할 수도 있다.
    • 기본 포함 인터페이스
      • Import Parameter
      • Export Parameter
      • Changing Parameter
      • Tables
      • Exceptions
  2. Function Group
    • Function Module을 모아 놓은 Container
    • Function이 실행될 때 이 Function이 소속된 Group 내의 모든 Function이 영향을 받는다 → 하나에서 에러가 발생하면 동일 Group의 Function이 실행되지 않는다.

'SAP > Easy ABAP' 카테고리의 다른 글

Ch 04 Modularization  (0) 2021.01.26
Ch 03 OPEN SQL & NATIVE SQL - 3  (0) 2021.01.18
Ch 03 OPEN SQL & NATIVE SQL - 2  (0) 2021.01.14
Ch 03 OPEN SQL & NATIVE SQL - 1  (0) 2021.01.12
Ch 02 Data Type - 2  (0) 2021.01.08

참조테이블과 참조필드

CURR 금액이 표기되는 컬럼의 경우에는 반드시 참조테이블과 참조 필드가 설정되어야 한다.

이유는 발생매출, 채권잔액, 당월매출금액, 매출잔고 등등... 금액이 어떤 방식으로 표기되는지를 기재해야 하기 때문이다.

예를 들어

USD라면 1.00 과 같이 소수점자리까지 표기되고

KRW라면 12000 과 같이 소수점자리 없이 표기되게 되는데

이를 정해주는것이 참조필드이며 일반적으로는 통화키 WAERS 가 결정하기 때문에

일반적으로는 같은 테이블의 통화키 WAERS를 참조해주고 이 외에는 참조할 테이블의 통화키를 참조해주면 된다.


나는 이 방식을 전혀 모르고 어떻게든 오류를 잡겠다고 다른 테이블을 참조하다가 다른 테이블의 WAERS를 참조해버렸으니 문제가 있는 것.

운 좋게 참조한 테이블의 WAERS값이 일치했다면 다행이지만 절대 올바른 방법도 아니기에 이런 실수를 제거해야한다.

리액트 ( React )

  • UI 라이브러리
  • Virtual DOM 개념을 이용하여 전체가 아닌 선택적으로 유저 인터페이스를 렌더링
  • 이전 Virtual DOM에 있던 내용과 현재의 내용을 비교 한 후 바뀐 부분을 실제 DOM에 적용

Single Page Application

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4dacdd4a-b299-4ef7-9df2-2d00cf44dfab/Untitled.png

다시 전체 리로드가 필요없음.

기존에선 요청이 서버로 가면 전체가 새롭게 리프레쉬됨

하지만 SPA는 한번만, 그 시점에서 백엔드에서 전체 웹페이지를 고치지 않고 html dom을 동적으로 업데이트 함

Facebook, gmail등이 이런 방식으로 작동하게 되는데 필요한 부분만 업데이트, 전체 페이지만 업데이트 하는것이 아님

  • 장점

    • Virtual DOM이 실제 DOM보다 빨라 성능 향상
    • 필요한 데이터만 가져오기에 매우 빠름
    • 개발이 편함
      • 같은 백앤드로 여러 프론트 담당, 재사용 용이
      • 가독성 높고 유지보수 용이
    • 응용프로그램 전체가 자신의 컴퓨터에서 실행되기에 오프라인에서도 작업 가능
    • 프레임워크가 아닌 라이브러리기에 혼용 사용
  • 단점

    • 보안에 취약
      • 크로스 사이트 스크립팅(XSS) 활성화로 삽입공격 막아야 함
    • 메모리 누수
    • 하위버전 웹브라우저 지원불가

JSX는JS 문법을 확장, 이를 통해 JS XML HTML등을 쉽게 혼합할 수 있다.

삽입된 모든 값을 렌더링하기 전에 위험한 HTML 구문에 대해 자동으로 이스케이프 하므로 위에서 언급한 단점인 보약의 취약한 점을 XSS 공격 방지할 수 있음

단, 웹 브라우저는 JSX를 이해하지 못하기에 JSX→HTML JS로 변환 할 누군가가 필요

  1. 코드를 트랜스 파일 할 수 있는 컴파일러 babal을 포함하거나
    • 이 BABEL 라이브러리를 통해 런타임시 즉석에서 변환
  2. Node를 사용하여 완전한 개발 환경을 설정해야 함
    • Create-React-App

참조하면 좋은 블로그 글

React 완벽정리 (react란? 장점, 단점 등)

JSX 소개 - React

Modularization

  1. Subroutine 은 FORM으로 시작하여 END FORM으로 종료되는 구문
    • 스크립트의 모듈화, 재사용, 구조화를 주목적
    • ABAP 프로그램에서는 PERFORM 구문을 이용한 Subroutine으로 유사한 기능 제공
  2. Function Module - 파라미터 값을 주고 받음

Subroutine 정의

  • FORM으로 시작하여 ENDFORM 으로 종료되는 구문
  • Subroutine을 FORM문과 같은 것으로 간주하면 된다.
  • FORM 구문은 프로그램 내/외부에서 호출 가능

Subroutine 파라미터

  • 파라미터는 Subroutine을 호출하는 구문과 호출받는 구문 사이에 주고 받는 값
  • Actual Parameter = Subroutine을 호출할 때 사용되는 파라미터
  • Formal Parameter = Subroutine에서 사용되는 파라미터

파라미터 전달방법

  • Subroutine은 Using과 Changing 구문으로 파라미터를 주고 받음

    1. Call by Value

      • 넘겨주는 변수(Actual Parameter)와 받는 변수(Formal Parameter)가 물리적으로 다른 메모리 영역을 가지고 있다.

        FORM subr USING .. VALUE(pi) [TYPE <t>|LIKE <f>]
      • Subroutine을 호출할 때 Actual Parameter의 값은 Formal Parameter에 복사되지만 Formal Parameter의 값이 변하더라도 Actual Parameter에는 영향을 미치지 않는다.

    2. Call by Reference

      • 물리적으로 같은 메모리 영역을 공유하여 넘겨주며 값은 주소

      • CHANGING 키워드 다음에 파라미터를 사용하면 Subroutine에 전달된 파라미터 값이 변경된다.

        FORM subr CHANGING ... pi [TYPE <t>|LIKE <f>] ...
      • Subroutine의 Formal Parameter는 자신의 메모리를 가지지 않는다. Subroutine이 호출되는 동안 Actual parameter의 주솟값을 가지고 있을 뿐

      • Subroutine을 호출 한 프로그램의 메모리에서 작업하게 된다.

      • CHANGING 대신 USING 사용해도 에러 발생 안함

      • 단지 가독성 차원에서 사용, 병경한다는 걸 명시적으로 구분하기 위해 사용

      • Actual Parameter의 값이 Subroutine내에서 자동으로 변경되는 것을 피하려면 USING과 VALUE 구문을 함께 사용해야 한다.

    3. Call by Value and Result

      • 변수의 값을 넘겨주고 받는 구문에서 작업을 성공적으로 수행하였을 경우 변경된 값을 되돌려 준다. 물리적으로는 다른 영역

      • CHANGING 키워드 다음에 파라미터를 사용하고 VALUE 구문으로 완성

        FORM subr CHANGING..VALUE(pi) [TYPE <t>|LIKE <f>].
      • USING구문과 VALUE구문이 함께 사용되면 Subroutine이 정상적으로 종료될 경우 Actual Parameter 값이 변경된다.


파라미터 타입 정의

  • FORM 구문 내의 Formal Parameter는 TYPE과 LIKE 구문을 이용해 모든 ABAP 데이터 타입을 사용할 수 있다.
  • 타입을 명시적으로 지정하지 않으면 Generic Type으로 정의되고 Actual Parameter의 기술적 속성을 상속받게 된다.
  • Formal Parameter는 모든 ABAP Data Type이 허용되기에 구조체도 당연히 사용
    • 단 구조체를 전달할때 타입을 지정하지 않았으면 구조체 칼럼을 write하거나 인식하려 할 때 필드 심볼을 이용해야 함

파라미터와 인터널 테이블

  • USING CHANGING 구문
    • 인터널 테이블을 Subroutine의 파라미터로 사용할 때도 USING, CHANGING 키워드를 사용할 수 있다.
    • FORM문에 테이블 타입을 TYPE ANY TABLE을 주었다면 READ 구문을 동적으로 변경해야 한다. ( 이 부분 이해 안감, 2회독때 다시 보자)

TABLES 구문

  • USING과 CHANGING 구문 대신 사용 가능

Subroutine 호출

  • 호출하는 방법은 Internal, External 두가지 방법
* INTERNAL
PERFORM subr.
* EXTERNAL
PERFORM subr (prog) [IF FOUND].
  • 외부 External Subroutine 호출시에는 [IF FOUND] 구문을 사용하여 해당 Subroutine이 존재하는지 체크하는 것이 바람직, 체크하지 않았을 때 Subroutine이 존재하지 않으면 덤프에러 발생
  • 동적 호출 가능
  • LIST를 이용한 호출 가능
DO 2 TIMES.
    PERFORM SY-INDEX OF subr1 subr2.
ENDDO.

FORM subr1.
    WRITE / 'subr1 is called'.
ENDFORM

FORM subr2.
    WRITE / 'subr2 is called'.
ENDFORM

* 결과

*subr1 is called
*subr2 is called

'SAP > Easy ABAP' 카테고리의 다른 글

Ch 04 FUNCTION  (0) 2021.02.02
Ch 03 OPEN SQL & NATIVE SQL - 3  (0) 2021.01.18
Ch 03 OPEN SQL & NATIVE SQL - 2  (0) 2021.01.14
Ch 03 OPEN SQL & NATIVE SQL - 1  (0) 2021.01.12
Ch 02 Data Type - 2  (0) 2021.01.08

+ Recent posts