728x90
반응형

SAP 시스템에서 개발을 시작하려면 계정 별로 Access Key 발급받아야 합니다.

이번 포스팅에서는  Access Key 발급받는 방법을 써보려고 합니다.

새로 개발자 계정을 하나 만들어줍니다.

T-Code SU01 실행하셔서 생성하고자 하는 계정을 생성해주세요.

(상세한 계정 생성 과정은 설명하지 않겠습니다.)

 

그리고  발급을 위해 support.sap.com  접속해주세요.

상단 메뉴에서 My Support > Keys > Developer & Object Keys (SSCR)  클릭합니다.

 

SSCR 화면에서 Launch the SSCR Application 버튼을 눌러주세요.

 

그러면 현재 여러분의 S-User 계정이 가지고 있는 개발자 키들이 나옵니다.

새로 등록하기 위해 오른쪽 아래에 Register 버튼을 눌러주세요.

 

등록하고자 하는 SAP User명을 입력합니다.

여러 개를  번에 등록할  있으니 여러 줄에 걸쳐서 입력하셔도 됩니다.

입력을  하셨으면, Installation Number 선택하고 Register 버튼을 누릅니다.

 

 생성이 되었네요! 이상으로 Developer Access Key 발급이 끝났습니다.

 

'5. SAP > BC' 카테고리의 다른 글

SAP - BC Client 설치  (0) 2022.05.12
SAP - BC Spool 관리 TemSe 관리  (0) 2022.05.12
SAP - BC 차근차근 (1)  (0) 2022.05.12
SAP 사용자별 권한 및 T-CODE 조회 방법  (0) 2020.10.02
SAP 절차  (0) 2020.10.01
728x90
반응형

(1) CTS (Change and Transport System)

SAP 시스템은 보통 개발-검증-운영 3 Landscsape 구성됩니다. (경우에 따라 검증 시스템이 빠져서 2 Landscape 구성할  있습니다. 물론 권장사항은 아닙니다.)

이때 개발 시스템에서 개발한 ABAP 프로그램 같은 것들을 운영 시스템에 반영해야  때가 찾아옵니다. 이럴 때에 쓰이는 것이 CTS 입니다. Change and Transport System  그대로 변경사항을 관리해주는 시스템인 것이지요. 여기서 Target 말하자면, 개발 시스템의 Target 시스템은 검증 시스템이고, 검증 시스템의 Target 시스템은 운영 시스템인 셈입니다.

(2) TMS (Transport Management System)

CTS 안에는 TMS라고 하는 관리 시스템이 있습니다.  TMS 사용해서 Transport Domain 생성/관리하고, System Landscape 구성/관리할  있습니다.

Transport Domain이란 쉽게 말해, 변경사항을 적용할  있는 그룹을 말합니다.  Transport Domain 내에 있는 시스템끼리만 변경사항 적용이 가능한 것이지요.

TMS  자세히 알아보기 위해 T-Code STMS 실행해주세요.

STMS 메뉴 중에 Transport Routes 버튼을 클릭합니다.

 

아래 그림과 같이 저의 시스템은 3 Landscape 이며, TEP 진짜 저의 시스템이고, VIR PRD Virtual System으로 실체 없는 허상입니다.

 

 위의 캡쳐를 보면 Transport Layer, Delivery라고 되어 있는 것이 있지요?

개발 시스템인 TEP에서 검증 시스템인 VIR 가는 것에는 Transport Layer 연결되어 있고, 검증 시스템에서 운영 시스템인 PRD 가는 것에는 Delivery 연결되어 있습니다.

이건 무엇을 의미할까요?

우선 개발 시스템에서 오브젝트를 변경하면 Change Request 통해 검증 시스템으로 넘어갑니다. 이때 변경한 오브젝트가 SAP Standard Object라면 SAP 라고 이름 붙여진 Transport Layer 통해 검증 시스템으로 가고, CBO Object라면 ZTEP라고 붙여진 Transport Layer 통해 갑니다. 이렇게 그룹핑 해주는 것이지요.

그렇다면 Delivery 무엇일까요?

 글의 위에서 Change Request 릴리즈해야 다음 시스템에 넘어간다고 말씀드렸는데, Delivery 연결된 시스템 간에는 릴리즈가 따로 필요 없습니다. , 승인 절차는 따로 필요하죠. 테스트도 끝나지 않았는데 멋대로 반영되면 안되니까요.

이렇게 Transport Layer Delivery 나눈 이유에 대해 생각해봤는데, QA(검증)에서는 별도 변경을 하지 말라는 의미이지 않을까요? ㅎㅎ QA에서는 테스트만 하고 테스트 후에 문제가 발생했다면 개발 시스템에서 다시 수정하고 절차에 따르라는 의미인  같습니다.

 

다음 포스팅에서는 실제로 어떻게 Change Request 개발 > 검증 > 운영 순으로 반영할  있는지 테스트 해보겠습니다.

 

'5. SAP > BC' 카테고리의 다른 글

SAP - BC Spool 관리 TemSe 관리  (0) 2022.05.12
SAP - BC Developer & Object Key 관리(2)  (0) 2022.05.12
SAP 사용자별 권한 및 T-CODE 조회 방법  (0) 2020.10.02
SAP 절차  (0) 2020.10.01
SAP - BC - 모니터링 점검 리스트  (0) 2020.10.01
728x90
반응형

#SAP #공부 #ABAP

국내의 많은 기업들이 ERP 시스템으로 SAP를 사용하고 있다. 

하지만 사용방법을 습득하기 위한 방법이 희소성을 띌 정도로 작다

특히 이번 프로젝트를 띄면서 (NVH - SAP) 시스템 도입을 하는데 참고할 만한 서적이 정말 적다

결국 업체의 역량 또는 노하우에 의존할 수 밖에 없는 것이 현실이다.

그러다 보니 정말 답답해 미칠 지경이다. 머가 참인지 머가 거짓인지를 구별하기가 매우 어렵다.

나 같이 생각하는 사람들이 많이 있을 것이라 판단하에 이렇게 글을 적어본다 

오늘 부터 SAP에 대해서 파헤쳐 볼려고한다.

1. GUI 설정 및 사용

2. 주요 모듈 소개

3. 기본사용 방법

4. 유지보수 기능

5. 시스템 관련

6. ABAP 개발 관련

7. S/4 HANA 버전 특징 

여기까지 일단 배우는대로 닥치는대로 적어 진행 해 볼 생각이다.

SAP를 처음 접하는 책임자에게는 개념과 체계를 IT담당자에게는 넓은 시야를 가질 수 있는 기회가 되었으면 좋겠다.

'5. SAP' 카테고리의 다른 글

[PowerBuilder] - P.B 와 SAP 연결  (0) 2023.01.05
[PowerBuilder] - P.B 와 SAP 연결  (0) 2022.12.14
SAP R3 ABAP 프로그램 정리.  (0) 2020.10.08
SAP HANA 장점  (0) 2020.10.01
SAP 중복 로그인 방지 Source  (0) 2020.10.01
728x90
반응형

그 전에 SAP의 전표에 대해서 먼저 짚고 넘어가겠습니다. 

전표.. 영어로는 Document입니다. 

전표라고 해서 별다른 것은 없고 그냥 문서라고 생각하시면 됩니다. 

자재 입고라는 트랜잭션을 실행하고 나면 여러가지 문서가 생성됩니다. 

이 문서가 전표(Document)입니다. 

어떤 전표들이 발생할까요?

① 입고 트랜잭션을 실행했으니 입고 관련된 자재 문서(Material Document)가 생성됩니다. 

② 입고는 회계상의 거래입니다. 그래서 이와 관련한 회계 전표(Accounting Document)가 생성됩니다. 

③ 입고는 자재의 수불(재고의 증감)이 발생하는 것 입니다.

    그러므로 CO의 자재원장 전표(Material Ledger)가 발생합니다. 

④ 입고 시 구매단가와 이동평균가가 차이가 발생하면 차이를 인식해 주는 회계전표가 발생합니다. 

    (제 블로그의 35번 글을 참고하시기 바랍니다)

    이 차이금액은 회계전표만 발생하는 것이 아니라 관리회계 전표(Controlling Document)도 발생합니다. 

    왜냐하면, 차이 금액도 비용으로 인식하기 때문에 CO Object가 필요하며 그에 따라 관리회계 전표가 발생합니다. 

기본적으로 회계상 거래가 1건 발생하면 위의 4가지 형태로 전표가 발생한다고 생각하시면 됩니다. 

항상 같은 형태로 발생하는 것은 아닙니다. 

  - 위의 ④번의 경우 가격차이가 없다면 관리회계 전표는 발생하지 않습니다. 

  - 매출의 경우 관리회계전표가 아닌 수익성 분석 전표(Profitability Analysis)가 발생합니다. 

     이 부분은 매출을 설명할 때 자세하게 확인해 보겠습니다. 

  - 단순히 자재 저장위치(창고)를 이동하는 경우는 회계상의 거래가 아니기 때문에 자재문서만 발생합니다. 

아무튼 제가 여기서 말씀드리고 싶은 것은 물류 관련 트랜잭션이 발생하면 항상 문서가 발생하며

회계상의 거래인 경우 FI 전표 및 CO 전표가 함께 발생한다는 것입니다. 

그리고, 이 문서들은 하나의 거래에서 파생된 것이므로 위의 문서번호 중 1개만 알고 있더라고 

다른 문서(전표)를 모두 조회할 수 있습니다. 

이제 SAP의 전표(문서)는 여기까지 설명하고, 

실제로 입고 문서에서 회계전표, 관리회계전표, 자재원장 전표를 확인해 보겠습니다.

입고 트랜잭션을 실행하면 입고에 대한 자재문서가 자동으로 생성됩니다. 

입고 문서 번호를 확인해서 조회할 수도 있지만, 

저는 지난 시간에 확인한 구매오더에서 입고 문서를 확인하는 방법을 설명드리겠습니다. 

1. 구매오더 조회(T-Code : ME23N)

    아래 구매오더에서 하나의 품목을 선택한 후 아래 쪽 품목 데이터의 '구매오더 이력' Tab을 확인합니다. 

    여기 아래 리스트에 보시면 입고(물품대)라는 항목에 자재전표 번호가 있습니다. 

    이 부분을 클릭하면 해당 품목의 입고문서를 확인할 수 있습니다. 

    만약 입고가 되지 않았다면 아무런 리스트도 나타나지 않습니다. 

    아래 예시는 입고도 되었고, 송장 처리도 되었다는 것을 확인할 수 있습니다. 

[ 구매오더 조회 ] 

2. 자재 문서 조회 

    가. 입력인, 생성일 및 트랜잭션 코드를 확인할 수 있습니다. 

    나. 품번 및 자재내역, 수량, 저장위치 및 이동유형을 확인할 수 있습니다. 

    다. 상세 내역을 확인한 후에 'FI 문서'를 클릭합니다. 

[ 자재 문서 조회 ] 

3. 전표 리스트 

   FI 문서를 클릭하면 아래 화면과 같이 회계 전표 리스트가 보입니다. 

   현재 보이는 것은 회계전표(Accounting Document)와 자재원장(Material Ledger) 전표 2개 입니다. 

   입고할 때 구매단가와 이동평균가가 일치했기 때문에 관리회계전표(Controlling Document)는 발생하지 않았습니다. 

   가. 회계 전표는 FI 전표로 시산표에 반영되는 차변과 대변 항목 및 금액을 확인할 수 있습니다. 

   나. 자재 원장은 CO 관련 전표로 자재원장(CKM3)에 반영된 내역을 확인 수 있습니다.  

   먼저, 회계전표를 선택하여 자세히 확인해 보겠습니다. 

[ 전표 리스트 ]

4. 회계 전표 

     FI의 시산표에 반영되는 것으로 아래와 같이 분개된 것을 확인할 수 있다. 

      차) 구입부분품   ***     / 대) GR/IR   ***

     각 행을 클릭하면 차변과 대변 항목의 상세한 내역을 확인할 수 있으나, 

     여기서는 생략하겠습니다(간단한 것이니 직접 확인해 보시기 바랍니다).   

     구입부품의 경우 자산 계정으로 CO에서 원가요소를 생성하지 않았기 때문에 

     CO의 코스트센터, 내부오더, PSG 등에는 반영되지 않습니다. 

     왜냐하면 원가요소가 없기 때문입니다. ^^  

     여기에서 'Back'버튼을 클릭하면 전표 리스트로 다시 돌아 갑니다. 

[ 회계전표 ]

5. 전표 리스트

    이번에는 전표리스트에서 자재원장을 선택해 보겠습니다. 

[ 자재원장 ]

6. 자재원장 

     흔히들 보시던 CKM3의 화면은 아닙니다. 

     이런 전표 하나하나가 CKM3의 하나하나의 항목을 구성하고 있는 것 입니다. 

     회계전표에서 구입부분품은 자산계정으로 CO Object에는 반영이 되지 않는다고 했습니다. 

     그렇지만 재고의 증감으로 수불을 나타내는 것으로 이 부분은 CKM3(자재원장)에 반영됩니다. 

      아래 그림에서 마지막 열에 있는 'UP'이 재고 변경을 의미합니다. 

      해당 품번으로 300개의 재고가 추가되었고, 그때 금액은 52,800원입니다. 

      화면에서 '자재 가격 분석'을 클릭하시면 자재원장(Material Ledger, 'CKM3')를 확인할 수 있습니다. 

[ 자재원장 전표 ]

7. 자재원장 (CKM3) - 가격이력 

    처음부터 T-Code : CKM3를 입력하고 들어올 수 있고, 

    구매오더 →입고 문서  FI 전표 → 자재원장 → 자재원장전표 → 자재가격분석으로 들어올 수도 있습니다. 

    해당 품번의 GR 입고로 300개, 52,800원이 추가되어

    총재고, 총액 및 신규 가격이 변경되었음을 확인할 수 있습니다. 

    이 내역을 확인하고, 중간 정도의 '뷰' 컬럼에서 '가격이력'을 '가격 결정 구조'로 변경해 보겠습니다. 

[ CKM3 - 가격 이력 ]

8. 자재원장 (CKM3) - 가격 결정 구조  

  가격 결정 구조의 범주는 크게 기초, 입고, 소비, 기말 재고로 구분되며

   각 범주마다 상세 범주가 있습니다. 

   입고의 경우 구매입고, 외주가공, 플랜트간 이전전기, 상품간 대체, 생산 입고 등이 있으며, 

   소비의 경우 판매, 생산투입, 코스트센터 출고, 외주가공, 플랜트간 이전전기, 상품간 대체  등이 있습니다. 

   재고가 입고되는 여러가지 경우, 소비되는 여러가지 경우의 수를 나타낸다고 이해하시면 됩니다. 

   이 부분은 나중에 상세히 설명하겠습니다. 

     구매 입고를 하는 부분이기 때문에 CKM의 입고에 구매오더라는

   범주로 수량, 금액 및 이동평균가를 확인할 수 있습니다. 

[ CKM3 - 가격 결정 구조 ]

이상으로 구매오더를 통해 부품을 입고했을 때 발생하는 자재문서, 회계전표 및 자재원장 전표를 확인해 보았습니다. 

하나의 물류 거래가 발생하면 각 모듈과 관련된 여러가지 전표(문서)가 생성됩니다. 

구매오더를 생성한 후 입고를 하게되면 

FI에서는 차변에 구입부품, 대변에 GR/IR로 분개가 발생하면서 시산표에 반영되고, 

CO에서는 자재원장의 입고에 재고 수량과 금액이 반영됩니다. 

위 예시에서는 보이지 않았지만, 

입고 시 구매단가와 이동평균가가 서로 달라 차이가 발생하면

그 차이 부분을 인식하고, 바로 재고에 반영하는 회계전표(FI)가 추가로 하나 더 발생하며

CO 관련된 것으로 '관리회계전표'도 발생합니다. 

관리회계전표는 이 차이 금액을 특정 코스트센터로 반영하는 것을 보여 줍니다. 

(특정 코스트센터는 CO의 IMG Setting 중 '자동계정지정'에서 가능합니다)

이 부분도 예시를 찾아서 화면으로 한번 보여드리도록 하겠습니다. 

728x90
반응형

 

CO 결산 과정에 앞서 SAP 물류 흐름과 그에 따라 발생하는 전표를 확인하고, 

CO Report에 어떻게 반영되는지를 먼저 알아 보겠습니다. 

물류 흐름은 말로 설명하면 아주 간단합니다. 

 

제조업이니까....

생산에 필요한 자재를 구매(매입)해서(MM) 제품을 생산하여(PP) 고객에게 납품합니다(SD)

이 중에서 오늘은 먼저 자재 업무의 일부분을 확인해 보겠습니다. 

자재에서 가장 중요한 업무가 무엇일까요?

저는 생산에 필요한 자재를 구매하는 것이라고 생각합니다.^^ 

(저와 생각이 다른 분이 있으실지도 모르겠네요)

실제로 SAP에서 자재 업무가 많고 다양하지만, 

이번에는 핵심업무 자재 구매에 대해서 알아 보겠습니다. 

SAP에서 자재 구매업무 절차를 수행하는 방법도 다양합니다. 

하지만 제가 아는 방법 1가지만 설명드리겠습니다. 

이 방법도 각자 회사 상황에 맞게 사용한 것이라 약간의 차이는 있을 겁니다. 

SAP 자재 구매 업무는 아래 4단계로 실행합니다. 

   구매 요청(PR)  구매오더(PO) 생성 → 입고  송장(Invoice) 처리 또는 

   구매 요청(PR)  구매오더(PO) 생성 → 송장(Invoice) 처리 → 입고

  (입고와 송장처리는 순서가 바뀔 수도 있습니다. 아래에서 추가 설명하겠습니다.)

이 중에서 구매요청(PR)은 있어도 되고, 없어도 됩니다. 

제가 다니는 회사에도 처음에는 있었으나, 굳이 필요가 없는 일이라 프로세스에서 제거했습니다. 

그래서 자재 구매업무는 구매오더 생성, 입고, 송장처리 3단계로 이루어져 있습니다. 

우선 각각 단계를 글로 한번 배워 봅시다. ^^

① 구매오더(PO, Purchasing Order)

    말 그대로 구매할 자재를 주문하는 것입니다. 

    A 자재를 B업체에서 100개를 구매하겠다.

    이때 단가 정보도 같이 입력되기 때문에 구매금액도 알수가 있습니다. 

       그리고, 회사 내부에 자재 구매하는 조직이 여러개로 나누어져 있다면 (자재1팀, 자재2팀 등)

    어느 팀에서 구매하는지('구매조직')에 대한 정보도 입력되어 있습니다. 

    하지만 구매오더.. 즉 주문은 회계상의 거래가 아니기 때문에 회계전표는 발생하지 않습니다. 

② 입고(GR, Good Receipt)

     주문한 자재를 업체에서 우리 공장으로 납품하여 우리가 가용할 수 있는 재고로 되는 것입니다. 

     말이 어렵네요....

     쉽게 실물 자재가 우리 공장에 들어온거죠^^

     이 때 실물 자재(자산)의 움직임이 있기 때문에 회계상 거래 입니다. 

③ 송장(Invoice Verification)

     업체에 매입 대금을 인식하는 행위입니다. 

     물건을 샀으니 그에 상응하는 돈을 지불해야겠죠..^^

     실제 지불은 아니고 지불할 금액을 회계상으로 인식하는 것입니다(외상매입금 ). 

여기서 질문입니다. ^^

입고와 송장을 왜 구분했을까요? 

물건 사면서 바로 대금지불하면 되는데, 왜 굳이 2개를 구분했을까요?

여기에서 아주 중요한 개념이 하나 나옵니다. 

GR/IR...   

Good Receipt, Invoice Receipt....

우리가 동네 수퍼마켓에서 과자를 하나 사면 돈을 바로 지급하고 과자를 삽니다. 

이것은 입고와 송장처리가 동시에 발생하는 겁니다. 

하지만, 일반회사는 어떨까요? 

자재 주문을 하면 업체에서 자재를 가져다 줍니다. 

그리고, 월말에 한달동안 납품한 자재에 대한 세금계산서를 보냅니다. 

매 건별로 돈을 지불하는 것이 아니라 한달에 한번씩만 돈을 지불합니다. 

그러니 자재 입고와 금액 지불하는 것을 구분해 놓은 것입니다. 

더 쉬운 예는 수입입니다. 

수입의 경우 송장.... 종이로 된 서류입니다.

요즘에는 E-mail이나 Fax로 금방 보낼 수 있죠

어떤 자재를 얼마만큼 보냅니다라는 정보를 업체에서 우리회사에 보냅니다. 

그러면 우리는 지불할 금액을 먼저 인식합니다(외상매입금).

자재는 배를 타고 와야하기 때문에 2달이 걸립니다. 

이렇듯 자재 입고 시점과 지불할 금액을 인식(외상매입금)하는 시점이 다릅니다. 

그래서 입고와 송장을 구분해 놓은 것이라고 생각합니다. 

그리고, 이런 이유로 입고와 송장처리는 순서가 바뀔 수도 있는 것입니다.

그래서 아래와 같은 분개가 발생합니다. 

입고 시 :   부품 xxx   /  GR/IR  xxx

송장 시 :   GR/IR xxx    / 외상매입금  xxx

일반적으로 부품인식 금액과 외상매입금 인식 금액은 동일하기 때문에, 

입고시 GR/IR 대변금액과 송장 시 GR/IR 차변 금액은 일치합니다. 

그래서 이 부분을 월말에 FI에서 상계하여 잔액이 0이 되게 만들어주는 

GR/IR 반제 작업을 수행합니다. 

어려운 이야기로 갑자기 빠져버렸네요. --; 

아무튼 이런 개념이 있다는 걸 아시고, CO 담당자는 크게 신경쓰지 않으셔도 됩니다. ^^

자.. 이제 본격적으로 구매업무로 들어가 보겠습니다.^^

구매오더, 입고, 송장 처리하는 트랜잭션을 따로 설명하지 않겠습니다. 

이는 MM 모듈 업무로 제가 설명하는 것은 부적절다고 생각합니다. 

다만, CO 담당자도 어느 정도 알고는 있어야 하기 때문에

구매오더에서 입고와 송장 처리 문서를 확인하고, 

회계 전표를 확인하는 방법을 간단하게 알아보겠습니다.

 

1. 구매오더(PO) 조회 : T-Code ME23N

아래 구매오더는 이미 입고와 송장처리가 완료된 것입니다. 

제가 미리 알고 이 오더를 보여드리는 것은 아니고, 

아래 화면에서 바로 확인할 수가 있습니다. 

하나씩 확인해 보겠습니다. 

  ① 구매오더 번호입니다.  PO 번호로 나중에 송장처리를 수행합니다.

  ② 공급업체 번호입니다. 어떤 업체에서 구매하는지를 알 수 있습니다. 

  ③ ~ ⑤ : 구입할 자재의 품번과 내역, 수량 및 단위당 단가를 확인할 수 있습니다. 

  ⑥ 구매오더이력 :

        이 Tab에서 해당 구매오더는 입고와 송장처리가 완료되었다는 것을 확인할 수 있습니다. 

        처음에 구매오더를 생성하면 이 Tab의 아래에 아무런 내역이 없습니다. 

        그런데, 지금 보시면 ⑦번 입고(물품대)와 ⑧번 물품대 송장검증이라는 항목이 있습니다. 

      ⑦번 입고(물품대)가 입고가 되었을 때 업데이트되는 내용이며, 

      ⑧번 물품대 송장검증은 송장 처리가 완료되었을 때 업데이트 되는 내용입니다. 

여기에서 입고 문서를 확인하려면 ⑦번 입고(물품대)에 위에 있는 자재전표를 클릭하면 되고, 

송장 문서를 확인하려면  ⑧번 물품대 송장검증위에 있는 자재전표를 클릭하면 됩니다. 

아래 구매오더에는 구매하는 자재가 1개입니다.

하지만 동일한 업체에서 여러 가지 자재를 구매할 수도 있겠죠

그러면 품목이 여러개 나타나며,  ⑨번의 품번을 변경하면서 구매오더 이력을 확인해야 합니다. 

왜 그럴까요? 2개 품목을 주문했지만 업체 사정으로 1개는 오늘 납품하고,

다른 1개는 일주일 후에 납품할 수도 있습니다. 

품목마다 업체에서 제품을 생산 주기가 다를 수 있기 때문에 납품 일자가 다를 수 있습니다. 

또한 아래 PO는 300개를 주문해서 300개가 한꺼번에 입고되었지만, 

100개, 100개, 100개씩 3번에 나눠서 분할 입고가 되기도 합니다. 

대부분의 경우의 수가 다 포함되어 있다고 생각하시면 됩니다. 

[ 구매오더 조회 ]

위의 PO는 표준 PO입니다.

그렇다는 다른 유형의 PO도 있다는 것을 눈치채셨겠죠?

품번이 없을 경우 PO을 생성하는 방법

입고와 동시에 소비 처리하는 방법 등 여러가지 PO가 있을 수 있습니다. 

그리고 IMG Setting으로 추가 PO 방식을 생성할 수도 있습니다.

(이 부분은 MM 모듈에서 하는 거라 저는 모릅니다^^)

어떤 유형이라 하더라도 기본적인 틀은 표준 PO와 비슷합니다. 

각자 회사에서 사용하는 PO를 하나씩 확인해 보시면 이해하는데 도움이 되실겁니다. 

앞에서 다른 이야기를 하다보니 정작 필요한 얘기는 하지 못하고 말았네요. 

오늘은 구매오더 조회하는 방법을 간단히 소개드리고, 

다음 포스팅에서 입고 관련 문서를 확인하는 방법을 설명드리도록 하겠습니다. 

오늘은 여기까지 하겠습니다. 

항상 건강하고 행복하세요..*

728x90
반응형

과거에 월별 재고를 어느정도 유지하고 있었는지, 재고 보유량이 적정한지 등을 궁금할 때 

간단하게 확인해 볼 수 있는 SAP 프로그램이 "자재분석" 프로그램이다.

플랜트/저장위치/자재/자재유형/자재그룹/평가클래스별 기간별 재고내역을 분석할 수 있으며

월별 시계열 분석 및 재고 회전 계산 등 세부 분석까지 가능함.

  ■ T-CODE : MC.9

     1.조회 조건을 입력

          - 특정 자재에 대한 것만 보고 싶다면 자재란에 자재코드가 입력하거나, 그룹별, 플랜트별 조회가 가능함.

     2.합계 정보 출력

          - 하기 스크린샷은 특정 자재 하나만 조회한 상태임.

     3.자재에 대한 상세 분석 정보 출력

          - 출력된 정보를 더블클릭하면 상세 분석 정보 출력

     4.시계열 정보 출력

          - 출력 정보에 커서를 위치시키고 그래프 모양의 아이콘을 크릭하면 기간별 정보 출력됨.

 

'5. SAP > MM' 카테고리의 다른 글

[MM] 2. 자재 가격 분석  (1) 2020.10.28
[MM] 1. 구매오더  (1) 2020.10.28
SAP MM 자재마감 : T-CODE : MMPV  (0) 2020.10.02
SAP - [MM] 구매/자재관리 이동유형  (0) 2020.10.01
728x90
반응형

SAP R3 ABAP 프로그램 정리.

 

ABAP 프로그램 시작. 

 ABAP 프로그램을 작성하기 위하여 필수적으로 사용하여야 할 기본 Object 및 사용법에 대하여 학습했다. Data Browser, Abap Editor, Menu Painter, Function Builder, Message Builder.

 ABAP 프로그램 생성.

 ABAP 프로그램 생성법에 대하여 학습했다. 실제 샘플 프로젝트의 프로그램명과 각 Attribute를 작성했다.

 ABAP Dictionaray

 Database를 유지 보수하는 Object에 대해 학습했다. Table 생성법, Table을 구성하는 Data Element와 Domain 생성법, Structure 생성법, View생성법을 익혔다. 샘플 프로젝트에서 필요한 테이블과 테스트 데이터를 여러분들은 이 모듈에서 생성하였다.

 Report 초기화면및 Data

 보고서를 작성하기 위하여 초기화면에서 필요한 사용자 입력화면 정의방법과 각종 데이터 선언법에 대하여 학습하였다. SELECTION-SCREEN Event문에서 Parameter, Select-option,Data, Internal Table 등을 선언한다.
 샘플 프로젝트에서는 초기화면에서 지역과 그룹을 Select-Option으로 선언하고 지역/그룹별, 그룹/지역별을 Parameter로 선언하고 필요 데이터를 정의하였다.

 Data Retrieval

 초기화면에서 사용자가 입력한 사항에 맞는 데이터를 테이블로부터 발췌하는 SQL문에 대하여 학습하였다. 샘플 프로젝트에서는 START-OF-SELECTION Event절에서 미리 생성해놓은 테이블로부터 조건에 맞는 데이터를 SQL문으로 발췌하여 Internal Table에 저장한다.

 Basic Statements.

 가장 기본적인 제어문, 조건문, 대입문, Subroutine에 대하여 학습하였다.
샘플소스에서는 각 지역/그룹별 인원합계를 구하기 위하여 조건문, 제어문, 대입문을 사용하였다.

 Internal Table

 Internal Table의 선언법, Internal Table에 데이터를 채우는법, Internal Table의 각 제어문에 대하여 학습하였다.  샘플소스에서는 발췌한 데이터를 Internal Table에 저장하여 Internal Table을 LOOPING하면서 각 제어문으로 지역/그룹코드를 출력하고 인원수 합계를 구하여 지정된 보고서를 출력한다.

 Output화면구성

 발췌한 데이터를 실제로 화면상에 출력하는 Write문에 대하여 학습하였다.
기본 Write문, Format문, Layout지정에 대하여 학습하였다. END-OF-SELECTION Event절에서 Write문으로 지정된 보고서 양식에 맞는 메인 화면을 작성하였다.
TOP-OF-PAGE Event절에서는 머리말
 END-OF-PAGE 에서는 꼬리말을 작성 하였다.

 상세화면 출력

 기본화면에서 상세내역을 보고자 하는 라인을 더블클릭할 경우의 상세보고서를
출력하는 법
에 대하여 학습하였니다. 기본화면에서 상세내역으로 데이터를 넘겨주는 방법 및 Event에 대하여 학습하였죠.

At LINE-SELECTION 절에서 상세내역을 보여주고 TOP-OF-PAGE DURING LINE-SELECTION 절에서 상세화면의 머리말을 작성하였습니다.

 User Menu처리

 단순히 보여주는 화면에서 더 나아가 실제 User의 Event처리를 하기 위하여 필요한 At USER-COMMAND절, GUI Status, GUI Title, Function사용법, Message사용법, 화면상의 출력된 데이터를 읽고 쓰는법, 테이블에 데이터를 반영하는 법들에 대하여 학습하였다. 샘플소스에서는 At USER-COMMAND에서 전체선택, 전체취소, Download, Delete 등의 기능들을 작성하였다.

 

 

주소록 현황  Report 작성하기.

 

  - 먼저 사용자에게 초기화면에서 지역과 그룹의 값을 입력 받고 주소록 Table인 tkks01로 부터 데이터를
    발췌하여 주소록 현황보고서를 출력
  - 사용자가 하나의 지역과 그룹을 선택해서 더블클릭을 할 경우 주소록 상세내역을 출력
  - 첫 번째 화면에서 상단의 User Menu를 선택할 경우 그에 적절한 기능을 수행할 수 있도록 구현

 

 

 소스보기. 

  
*&---------------------------------------------------------------------*
*& Report ZTKKS001 *
*& *
*&---------------------------------------------------------------------*
*& System Name : Demo *
*& Description : 주소록 관리 *
*& Create on : 2003.04.11 *
*& Create by : KSKIM *
*&---------------------------------------------------------------------*
   report ztkks001 message-id zg 
                         line-size 73
                         line-count 65(1)
                         no standard page heading.

 

   tables:ztkks01, "주소록 관리 테이블 
            ztkks02. "주소록 관리 테이블(임시)

 

   data:gkey1_text like dd07t-ddtext, 
          gkey2_text like dd07t-ddtext,
          gkey1_domain like dd01l-domname,
          gkey2_domain like dd01l-domname.

 

   data:begin of itab occurs 0, 
          check,
           key1(3),              "Key Field 추가
           key2(3).
           include structure ztkks01.
   data:end of itab.

 

   data:$ztkks02 like ztkks02 occurs 0 with header line.

***************************************************
* Selection Screen
***************************************************
    selection-screen skip 1.
    selection-screen begin of block p1 with frame title text-001. 
    select-options:zgroup for ztkks01-zgroup, "그룹
                                area for ztkks01-area. "지역
    selection-screen uline.
    selection-screen end of block p1.

 

    selection-screen begin of block p2 with frame title text-002. 
    parameters:opt1 radiobutton group grp,
                    opt2 radiobutton group grp.
    selection-screen end of block p2.
**************************************************
* Event Start-of-Selection
***************************************************
   start-of-selection. 
         perform init.
         perform retrieve_data.
         perform set_key_field.
***************************************************
* Event End-of-Selection
***************************************************
    end-of-selection. 
         perform display_result.
***************************************************
* Event At user-command
***************************************************
   at user-command. 
       case sy-ucomm.
          when 'SELA'.
              perform select_all.
           when 'DSEL'.
              perform deselect_all.
           when 'ASEN'.
              perform sort_ascending.
           when 'DESC'.
             perform sort_descending.
           when 'DOWN'.
              perform download_to_pc.
           when 'DEL'.
              perform delete_data.
           when 'PICK'.
              perform show_detail.
           endcase.

***************************************************
* Event At line-selection
***************************************************
    at line-selection. 
           case sy-ucomm.
                 when 'PICK'.
                    perform show_detail.
           endcase.

   else.
           write: at /1(73) sy-uline. 
           write: at /1 sy-vline, 30 '>>주소록<<' color 1, 73 sy-vline,
              at /1(73) sy-vline, 73 sy-vline.
            write: at /1 sy-vline, 3 '조회일: ', 12 sy-datum,
                     57 'User: ', 62 sy-uname, 73 sy-vline.
            write: at /1(73) sy-uline.
                    format intensified on color 4.
            write: at /1(73) sy-uline. 
            write: at /4 '지역코드', 14 gkey1_text, 44 gkey2_text, 59 '인원'.
            perform draw_vline.
            write: at /1(73) sy-uline.
             format intensified off color off.
  endif.

 

***************************************************
* Event End-of-Page
***************************************************
  end-of-page. 
      write: at /1 'Page: ', 6 sy-pagno right-justified.

 

 : Report문은 프로그램명, 프로그램 내에서 사용할 Message Class,Page Layout을 지정한다.

<message-id zg>는 message class중 'zg'를 쓴다. <line-size 73>은 프로그램 결과화면인 보고서의 가로길이

가 73 column이라는 얘기다. <line-count 65(1)>는 프로그램 결과화면인 보고서의 새로길이가 65줄이며 이중(1)의

1줄이 꼬리말로 출력된다는 의미이다.

 

 : 프로그램 내에서 사용될 Global Data를 정의한다 프로그램 앞부분에서 정의한 변수는 모든 프로그램 내에서

전역변수로 사용할 수 있다.

 

 : sy-ucomm=<DSEL>는 <DeSelect> 아이콘을 클릭하였을 경우이며 checkbox를 모두 space로 만드는 Form문

을 수행하게 한다.

 

 : 프로그램내에서 사용될 Internal Table을 정의한다. 데이터를 발췌한 후 정의될 Internal Table를 정의한다.

  

 : SELECTION_SCREEN 절에서는 보고서의 기본화면을 작성한다. 사용자가 원하는 입력값을 받는 화면을 작성하는 부분이다. 샘플소스에서는 SELECT-OPTION으로 지역과 그룹코드를 입력받는다.

 

 : 보고서 결과화면에서 지역/그룹 또는 그룹/지역코드 형식으로 보여줄 것인지 parameter로 radio button형식으로 선택하게 한다.

 

 : START-OF-SELECTION절에서는 해당 테이블에서 입력 받은 조건에 맞는 데이터를 발췌하여 Internal Table에 저장한다.

 

 : END-OF-SELECTION 절에서는 지정된 보고서의 양식대로 메인 화면을 출력한다. 지역코드,지역명,그룹명을 출력하고 각 항목의 인원수를 Summary하여 인원수로 출력한다.

 

 : AT USER-COMMAND절에서는 기본화면에서 User가 선택한 기능들을 수행하도록 프로그램을 작성한다.

<SelectAll> , <DeSelect> , <Ascending> , <Descending> , <Download> , <Delete>기능을 구현한다.

 

 : At LINE-SELECTION절에서는 상세내역을 보고자 하는 라인을 더블 클릭할 경우 상세내역을 출력하는 기능을 작성한다. 해당 지역과 그룹 내에 속하는 주소록 세부내역인 이름,지역명 , 그룹명, 전화번호,핸드폰,E-mail,주소를 출력한다.

 

 : TOP-OF-PAGE절에서는 기본화면의 머리말을 출력한다. 기본보고서의 제목,조회일자,User ID와 메인화면의 각 항목의 제목을 출력한다.

 

 : TOP-OF-PAGE DURING LINE-SELECTION절에서는 AT LINE-SELECTION절에 의해서 출력된 화면의 머리말을 출력한다. 즉.세부내역에 해당되는 머리말이다. <주소록 세부내역>이라는 제목과 세부 메인 화면의 각항목의 제목을 출력한다.

 

 : END-OF-PAGE 절에서는 꾀리말을 출력한다. 여기서는 페이지 번호를 출력하기로 되어 있다.

 

 

 

 

2) 데이터 추출

 

  -  먼저 사용자에게 초기화면에서 지역과 그룹의 값을 입력 받고 주소록 Table인 tkks01로부터 데이터를 발췌하여 주소록 현황보고서를 출력
  - 사용자가 하나의 지역과 그룹을 선택해서 더블클릭을 할 경우 주소록 상세내역을 출력
  - 첫 번째 화면에서 상단의 User Menu를 선택할 경우 그에 적절한 기능을 수행할 수 있도록 구현

 

 

 소스보기.  

 **************************************************
* Event Start-of-Selection
***************************************************
start-of-selection.
   perform init. 
   perform retrieve_data. 
   perform set_key_field. 

*&---------------------------------------------------------------------*
* 사용자가 선택한 Option에 따라서 키필드명및 키필드에 해당하는
* Domain Name을 초기화
*----------------------------------------------------------------------*
* Parameter : Nothing
*----------------------------------------------------------------------*
   form init. 
      if opt1 eq 'X'.
           gkey1_text = '지역'.
           gkey2_text = '그룹'.
           gkey1_domain = 'ZCHR3'.
           gkey2_domain = 'ZCHR1'.
     else.
           gkey1_text = '그룹'.
           gkey2_text = '지역'.
           gkey1_domain = 'ZCHR1'.
           gkey2_domain = 'ZCHR3'.
     endif.
  endform. " INIT

*&---------------------------------------------------------------------*
*& Form RETRIEVE_DATA
*&---------------------------------------------------------------------*
* Table:ZTKKS001로부터 입력받은 조건에 의해서 데이타를 추출하는 FORM
*----------------------------------------------------------------------*
* Parameters : None
*----------------------------------------------------------------------*
   form retrieve_data. 
      select * appending corresponding fields of table itab
                from ztkks01
             where zgroup in zgroup and
                       area in area.
     endform. " RETRIEVE_DATA

*&---------------------------------------------------------------------*
*& Form SET_KEY_FIELD
*&---------------------------------------------------------------------*
* 선택된 Option에 맞게 Internal Table의 Key Field를 정의한다.
*----------------------------------------------------------------------*
* Parameter : None
*----------------------------------------------------------------------*
   form set_key_field. 
      loop at itab.
          if opt1 eq 'X'. "지역/그룹인 경우
             move:itab-area to itab-key1,
                itab-zgroup to itab-key2.
             modify itab.
          elseif opt2 eq 'X'. "그룹/지역인 경우
            move:itab-zgroup to itab-key1,
                itab-area to itab-key2.
            modify itab.
          endif.
      endloop.
      sort itab by key1 key2.
   endform.                     " SET_KEY_FIELD

 

 : 초기 화면에서 입력 받은 지역/그룹 Option에 따른 변수 지정을 하는 Subroutine을 호출한다.

 

 : 입력조건에 맞는 데이터를 발췌하는 Subroutine을 호출한다.

 

 : 초기 화면에서 입력 받은 지역/그룹 Option에 따라서 sort key를 지정하는 Subroutine을 호출한다.

 

 : 초기 입력 화면에서 지역/그룹 Option을 선택할 경우는 첫번째는 지역, 두번째는 그룹이 키가 되고

그룹/지역 Option을 선택할 경우는 첫번째는 그룹,두번째는 지역이 key가 된다. 이후 소스에서 각 코드의 

description을 domain의 fixed value에서 가져오기 위하여 미리 각 key별 domain값을 지정해 두는 부분이다.

 

 : 주소록 테이블 ztkks01로부터 입력 받은 조건에 맞는 데이터를 발췌한다. Select절을 이용하여 발췌함과 동시에 Internal Table <itab>에 저장한다. Where 조건절에서는 in을 써서 입력 받은 조건 zgoup과 area에 해당하는 데이터를 발췌하도록 한다.

 

 : 초기 입력 화면에서 지역/그룹 Option을 선택할 경우는 sort할 때 순서가 지역+그룹이 되며 그룹/지역을 선택할 경우는 sort시 순서가 그룹+지역이 된다. 이러한 기능을 하가 위하여 option에 따라서 key1,key2에 각각 지역/그룹

,그룹/지역코드를 settting하고 key1, key2순서대로 Internal Table을 sort한다.

 

 

3) 보고서 출력

 

 소스보기.

 ***************************************************
* Event End-of-Selection
***************************************************
  end-of-selection. 
       perform display_result.

***************************************************
* Event Top-of-Page
***************************************************
  top-of-page. 

* 그룹별 인원현황을 보여주는 1ST 보고서의 머릿말 부분

* 보고서의 제목/일자/USER ID를 출력한다.
   write: at /1(73) sy-uline.
   write: at /1 sy-vline, 30 '>>주소록<<' color 1, 73 sy-vline,
            at /1(73) sy-vline, 73 sy-vline.
   write: at /1 sy-vline, 3 '조회일: ', 12 sy-datum,
                   57 'User: ', 62 sy-uname, 73 sy-vline.
   write: at /1(73) sy-uline.

* 보고서의 각 ITEM제목을 출력한다.
   format intensified on color 4.
   write: at /1(73) sy-uline.
   write: at /4 '지역코드', 14 gkey1_text, 44 gkey2_text, 59 '인원'.
   perform draw_vline.
   write: at /1(73) sy-uline.
   format intensified off color off.

 

***************************************************
* Event End-of-Page
***************************************************
   end-of-page. 
       write: at /1 'Page: ', 6 sy-pagno right-justified.

 

*&---------------------------------------------------------------------*
*& Form DISPLAY_RESULT
*&---------------------------------------------------------------------*
* 추출된 결과를 화면에 출력하는 Form
*----------------------------------------------------------------------*
* Parameter : None
*----------------------------------------------------------------------*
  form display_result. 

 

      data:l_key1_total type i, "key1의 인원수 합계
             l_key2_total type i, "key2의 인원수 합계
             lkey1_text like dd07t-ddtext, "key1의 코드명
             lkey2_text like dd07t-ddtext. "key2의 코드명

 

* 메뉴바와 첫번째 OUTPUT 화면 Setting
   sy-lsind = 0. 
   set titlebar '0100'.
   set pf-status 'MENU01'.

 

* 초기화면에서 지역/그룹별을 선택시
   loop at itab.

 

* 지역코드명 추출및 화면에 출력
     at new key1. 
          clear:l_key1_total.
          perform get_domain_value changing:itab-key1
                                                             gkey1_domain
                                                             lkey1_text.
          write: at 2 itab-check as checkbox,
                      4 itab-key1, 14 lkey1_text.
         perform draw_vline.
      endat.

 

* 그룹코드명 추출및 화면에 출력
    at new key2. 
        clear:l_key2_total.
        perform get_domain_value changing:itab-key2
                                                           gkey2_domain
                                                           lkey2_text.
        write: at 44 lkey2_text.
    endat.

* 지역별/그룹별 인원수 합계 구하기
    add 1 to l_key1_total. 
    add 1 to l_key2_total.

   

    hide itab. 

 

* 지역별/그룹별 인원수 출력
   at end of key2. 
       write: at 59 l_key2_total.
       perform draw_vline.
       new-line.
  endat.

 

* 지역이 바뀔경우 밑줄을 그음.
   at end of key1.
        write: at /1(73) sy-uline.
        new-line.
   endat.
  endloop.

 

  clear:itab.

* 꼬릿말을 출력하기 위하여 제일 마지막 장에선 꼬릿말 위치로 커서 이동
   skip to line sy-linct. 

   endform. " DISPLAY_RESULT

 

*&---------------------------------------------------------------------*
*& Form GET_DOMAIN_VALUE
*&---------------------------------------------------------------------*
* Domain Value및 Domain Name을 인수로 받아서 Domain의 Value Text를 추출
*----------------------------------------------------------------------*
* --> D_value : Domain Value
* --> D_Domain : Domain name
* <-- D_text : Domain Fixed Value의 Text
*----------------------------------------------------------------------*
   form get_domain_value changing d_value
                                                  d_domain
                                                  d_text.
          call function 'STF4_GET_DOMAIN_VALUE_TEXT' 
                   exporting
                          iv_domname = d_domain
                          iv_value = d_value
                   importing
                          ev_value_text = d_text
                  exceptions
                          value_not_found = 1
                          others = 2.
           if sy-subrc <> 0.
              message id sy-msgid type sy-msgty number sy-msgno
                            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
           endif.

 

   endform.           " GET_DOMAIN_VALUE

 

 : 보고서의 메인 화면을 출력하는 Subroutine을 호출한다.

 : 보고서의 머리말을 작성한다. 제목,작업일자, User ID ,메인 화면의 각 필드 제목을 출력한다.

 : 보거서의 머리말/꼬리말을 작성한다. 페이지 번호를 출력하도록 한다.

 : 실제 보고서 화면을 출력하는 소스이다.

 : 기본 보고서의 상단에 나올 Menu와 Title을 지정한다.

 : 입력 초기화면에서 지역/그룹 option을 선택하였을 경우는 기준으로 설명하겠다.

Key1=지역 , Key2=그룹이 된다. 우선 지역이 바뀔경우 즉 AT NEW KEY1 제어문을 쓰면 된다. 지역명을 domain의 fixed value의 description 에서 가져와서 지역코드와 지역명을 출력한다.

 : 그룹이 바뀔 경우 그룹명을 Domain의 fixed value의 description에서 가져와서 그룹명을 출력한다.

 : 지역/그룹별 인원수 합계를 구하기 위하여 1씩 합계변수를 증가시킨다.

 :  세부내역을 출력하기 위하여 더블라인을 클릭할경우 기본화면의 데이터를 넘겨줘야 하는데, 이때 HIDE명령어를 사용하여 HIDE Area에 해당 라인의 데이터를 저장한다.

 : 하나의 그룹이 끝난 경우 인원수를 출력하여야 한다. AT END OF KEY2 제어문을 사용하여 인원수를 출력한다.

 : 꼬리말을 출력시키기 위해서는 보고서의 맨 끝 줄로 커서를 이동 시켜줘야 한다.

SKIP TO SY-LINCT라고 쓰면 보고서 하단의 끝 줄로 옮겨 간다.

 : Domain의 fixed value의 각 description을 가져오기 위하여 standard 함수인 'STF4_GET_DOMAIN_VAL_TEXT'를 사용한다. 함수에 Domain name과 코드값을 넘겨주면 코드명을 return값으로

받을 수 있다.

 

*결과화면

 

 

4) 상세 보고서 출력.

 

 -  한 라인을 선택한 다음 더블 클릭하면 AT LINE-SELECTION Event를 수행하게 되고 그 부분에 상세 내역 출력 Routine을 추가
 - 사용자가 원하는 지역/그룹의 라인을 더블 클릭하면 해당 지역/그룹 내의 상세 주소록 현황인 이름, 전화번호, E-Mail, 주소 등을 출력

 

 

 소스보기. 

 
 ***************************************************
* Event At line-selection
***************************************************

   at line-selection. 
       case sy-ucomm.
          when 'PICK'.
             perform show_detail.
       endcase.

***************************************************
* Event Top-of-Page during line-selection
***************************************************
   top-of-page during line-selection. 

 

       if sy-lsind ne 0. 
              format color col_heading.
         skip 2.
         write: at /2 '주소록 세부내역'.
         new-line.
         write: at /1(142) sy-uline.
         new-line.
         write: at /1 sy-vline, 2 '이름',12 sy-vline,13 '지역',
                     23 sy-vline,24 '그룹',
                     31 sy-vline,32 '(집)전화번호',
                     47 sy-vline,48 '핸드폰', 63 sy-vline,64 'E-mail',
                     79 sy-vline,80 '주소',
                   142 sy-vline.
               new-line.
               write: at 1(142) sy-uline.
               format color off.

 

        else
                  write: at /1(73) sy-uline.
                  write: at /1 sy-vline, 30 '>>주소록<<' color 1, 73 sy-vline,
                           at /1(73) sy-vline, 73 sy-vline.
                  write: at /1 sy-vline, 3 '조회일: ', 12 sy-datum,
                      57 'User: ', 62 sy-uname, 73 sy-vline.
                  write: at /1(73) sy-uline.
                      format intensified on color 4.
                  write: at /1(73) sy-uline.
                  write: at /4 '지역코드', 14 gkey1_text, 44 gkey2_text, 59 '인원'.
                  perform draw_vline.
                  write: at /1(73) sy-uline.
                  format intensified off color off.
         endif.

*&---------------------------------------------------------------------*
*& Form SHOW_DETAIL
*&---------------------------------------------------------------------*
* 세부내역을 Display
*----------------------------------------------------------------------*
* Parameter: Nothing
*----------------------------------------------------------------------*

   form show_detail. 

     data:l_group like itab-zgroup, "그룹코드
            l_area like itab-area, "지역코드
            lkey1_text like dd07t-ddtext, "그룹명
            lkey2_text like dd07t-ddtext. "지역명,

* 선택된 라인의 그룹이 space이면 빠져나감.
   if itab-zgroup is initial. 
      message s000(zg) with 'Choose Valid Line'.
      stop.
   endif.

 

* 세부내역의 Menu Setting
    set pf-status 'MENU02'. 

* 세부내역의 페이지 사이즈 Setting
    new-page line-size 150 line-count 65. 

 

* 메모리에 저장되었던 지역/그룹코드를 변수에 move
   move:itab-zgroup to l_group, 
      itab-area to l_area.

 

* 해당라인의 지역/그룹코드의 값들만을 Loop돌리면서 출력함.
   loop at itab where zgroup eq l_group 
          and area eq l_area.

 

          perform get_domain_value changing:itab-key1 
                     gkey1_domain
                     lkey1_text.

 

          perform get_domain_value changing:itab-key2
                     gkey2_domain
                     lkey2_text.


         write: at /1 sy-vline, 2 itab-name,12 sy-vline,13 lkey1_text, 
                     23 sy-vline,24 lkey2_text,
                     31 sy-vline,32 itab-hometel,
                     47 sy-vline,48 itab-mobile, 63 sy-vline,64 itab-email,
                     79 sy-vline,80 itab-address,
                    142 sy-vline.
            new-line.
       endloop.
       write: at 1(142) sy-uline.

 

   endform. " SHOW_DETAIL




 

 : 보고서의 결과 화면에서 라인을 더블 클릭할 경우에 AT LINE-SELECTION Event절을 수행하게 된다.

이부분에서 상세내역을 출력하는 Subroutine을 호출하낟.

 : 기본보고서가 아니라 AT LINE-SELECTION에서 출력된 상세화면의 머리말은 TOP-OF-PAGE DURING

LINE-SELECTION절에 기술한다.

 : SY-LSIND는 시스템 변수로서 화면 Page Depth를 나타낸다 따라서 SY-LSIND가 0가 아닐때 즉,

기본화면이 아닌 상세 화면일 때의 머리말을 작성한다. 상세화면 제목, 이름, 지역, 그룹, 전화번호 , 핸드폰 ,

E-Mail, 주소라는 항목명을 출력한다.

 : 상세내역을 출력하는 Subroutine이다. 더블 클릭한 라인의 지역/그룹의 데이터만 Internal Table에서 뽑아서

이름,지역,그룹,전화번호,핸드폰,E-Mail,주소를 출력한다.

 : HIDE Area에 저장해놨던 데이터를 사용한다. HIDE 시켰던 해당 변수를 사용하면 바로 클릭한 라인의 해당

변수값을 얻을 수가 있다. 만일 ITAB-ZGROUP이라는 화면필드의 값이 SPACE라는 얘기는 다른 라인 부분을 클릭

했다는 의미이므로 상세내역을 보여줄 필요가 없이 Message만 보여준다.

 : 상세 화면에서는 <SelectAll>,<DeSelect>등의 메뉴는 불필요하다. 따라서 기본화면과는 다른 Menu를 지정한다.

 : 상세화면은 기본화면보다 가로길이가 길어야 한다. 한 라이당 보여지는 항목이 많다. NEW-PAGE 구문을 사용하여 상세화면의 적절한 가로길이와 세로길이를 지정한다.

 : HIDE Area에 저장되어 있는 화면 필드값을 새로운 지역/그룹 변수로 옮긴다.

 : 지역/그룹 변수에 해당하는 데이터만 ITAB에서 발췌하여 출력한다. WHERE 조건절을 사용한다.

 : 지역과 그룹명을 구하기 위하여 기본화면에서도 호출했던 Subroutine을 이용한다.

지역코드와 지역코드의  domain명을 넘겨주고 지역코드명을 return값으로 받는다.

 : 이름, 지역명 , 그룹명 , 전화번호 , 핸드폰 , E-Mail 주소를 순서대로 출력한다. 각 항목간 구분은 '|'로 구분한다.

 

* 결과화면

 

 

 

5) User Menu 처리

 

  기본보고서의 상단의 메뉴작업들, 즉 <SelectAll>, <DeSelect>, <Ascending>, <Descending>, <Download>, <Delete> 기능들을 수행

=> 이러한 User Menu처리는 AT USER-COMMAND Event절에서 함.

 

 

  소스보기.

  at user-command. 
    case sy-ucomm.
       when 'SELA'. 
                perform select_all.
       when 'DSEL'. 
                perform deselect_all.
       when 'ASEN'. 
                perform sort_ascending.
       when 'DESC'. 
                perform sort_descending.
       when 'DOWN'. 
                perform download_to_pc.
       when 'DEL'. 
                perform delete_data.
      when 'PICK'. 
                perform show_detail.
    endcase.

 

 : 기본 보고서의 상단의 아이콘 즉 User Menu의 기능을 처리한다.

 : <SelectAll>의 기능을 수행하는 Subroutine을 호출한다. 화면상의 checkbox를 모두 check상태로

바꾸는 기능을 기술한다.

 : <DeSelect>의 기능을 수행하는 Subroutine을 호출한다. 화면상의 checkbox를 모두 space상태로 바꿔준다.

 : <Ascending>의 기능을 수행하는 Subroutine을 호출한다. 지역/그룹의 정렬 순서를 오름차순으로 재정렬하여

화면에 다시 보여준다.

 : <Descending>의 기능을 수행하는 Subroutine을 호출한다. 지역/그룹의 정렬순서를 내림차순으로 재정렬하여

이화면을 다시 보여준다.

 : <Download>의 기능을 수행하는  Subroutine을 호출한다. 현재 Internal Table에 있는 내용을 PC파일로 Down받는다.

 : <Delete>의 기능을 수행하는 Subroutine을 호출한다. Check된 데이터를 Backup용 테이블로 저장하고 화면상에서는 해당 데이터를 삭제하여 화면을 다시 보여준다.

 : 라인을 더블 클릭하였을 때와 같은 기능을 수행한다.

 

- <SelectAll>/<Deselect> Command기능

 

 소스보기. 
 
 *&---------------------------------------------------------------------*
*& Form Select_all
*&---------------------------------------------------------------------*
* FUNC: 모두선택
*----------------------------------------------------------------------*
* Parameter : Nothing
*----------------------------------------------------------------------*
  form select_all. 

* 방법1 - internal table의 checkbox의 값을 변경하고 새로 list write
* loop at itab.
* itab-check = 'X'.
* modify itab.
* endloop.
* perform display_result.

* 방법2 - 직접 list의 값을 변경함.
  do. 
      clear itab-check.
      read line sy-index field value itab-check. 
      if sy-subrc ne 0. 
          exit.
      endif.
      if itab-check is initial.
      itab-check = 'X'.
       modify line sy-index field value itab-check. 
      endif.
  enddo.

 

  endform.              " Select_all

 

*&---------------------------------------------------------------------*
*& Form deselect_all
*&---------------------------------------------------------------------*
* FUNC: 모두 선택취소
*----------------------------------------------------------------------*
* Parameter : Nothing
*----------------------------------------------------------------------*
  form deselect_all. 

 

* 방법1 - internal table의 checkbox의 값을 변경하고 새로 list write
* loop at itab.
* clear itab-check.
* modify itab.
* endloop.
* perform display_result.

* 방법2 - 직접 list의 값을 변경함.
  do. 
    clear itab-check.
    read line sy-index field value itab-check. 
    if sy-subrc ne 0.
       exit.
    endif.
      if itab-check = 'X'.
      clear itab-check.
      modify line sy-index field value itab-check. 
   endif.
enddo.

endform. " deselect_all



 

 : 화면상의 checkbox필드를 check상태로 변경하는 Subroutine이다.

 

 : 화면상의 모든  list의 checkbox를 변경시켜야 하므로 DO문으로 화면 첫 줄부터 끝 줄까지 순서대로 읽는다.

 

 : 해당 라인의 화면 필드인 itab-check를 읽는다.

 

 : 해당 라인을 읽은 결과 sy-subrc값이 0가 아닐 경우는 list의 끝이라는 의미이므로 이때는 DO문을 벗어난다.

 

 : 화면 필드 itab-check의 check표시를 해주기 위하여 'X'값으로 변경시켜서 화면필드를 수정하여 준다.

 

 : 화면상의 checkbox 필드를 space상태로 변경하는 Subroutine이다.

 

 : 화면상의 모든 list의 checkbox를 변경시켜야 하므로 DO문으로 화면 첫줄부터 끝 줄까지 순서대로 읽는다.

 

 : 해당 라인의 화면 필드인 itab-check를 읽는다.

 

 : 화면 필드 itab-check를 space상태로 해주기 위하여 변수값을 clear시킨 다음 modify시킨다.

 

* 결과화면

 

 

 

- <Ascending>/<Descending> Command기능

 

 

 소스보기.
 
 *&---------------------------------------------------------------------*
* Func:ASEN
* Internal Table을 Ascending Sort하여 화면에 다시 Display한다.
*----------------------------------------------------------------------*
* Parameter : Nothing
*----------------------------------------------------------------------*
   form sort_ascending. 

 

      sort itab by key1 ascending key2 ascending. 
      perform display_result. 

   

   endform. " SORT_ASCENDING

 

*&---------------------------------------------------------------------*
*& Form SORT_DESCENDING
*&---------------------------------------------------------------------*
* Func:DESC
* Internal Table을 Descending Sort하여 화면에 다시 Display한다.
*----------------------------------------------------------------------*
* Parameter : Nothing
*----------------------------------------------------------------------*
  form sort_descending. 

 

      sort itab by key1 descending key2 descending. 
      perform display_result. 

 

  endform. " SORT_DESCENDING

 

 

 : 지역/그룹 순서를 오름차순으로 정렬하여 화면을 다시 보여주는 Subroutine이다.

 : 지역/그룹 코드를 Sort 구문으로 오름차순으로 Internal Table을 정렬한다.

 : 정렬한 Internal Table로 다시 한번 기본화면을 출력한다. 

 : 지역/그룹 순서를 내림차순으로 정렬하여 화면을 다시 보여주는 Subroutine이다.

 : 지역/그룹 코드를 SORT구문으로 내림차순으로 Internal Table을 정렬한다.

 : 정렬한 Internal  Table로 다시 한번 기본화면을 출력한다. 

 

 

- <Download> Command기능

   주소록 데이터를 PC파일로 Down받는 기능을 구현한다.즉 Internal Table의 모든 내용을 PC파일로 Down받는다.

 

 소스보기.  
  *&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_PC
*&---------------------------------------------------------------------*
* t ext
* Internal Table의 데이타를 필드구분자 '|'를 이용하여
* Local PC로 Download한다.
*----------------------------------------------------------------------*
* Parameter : Nothing
*----------------------------------------------------------------------*
   form download_to_pc. 

 

       data: l_answer type c,
           l_separator type c value '|',
           lkey1_text like dd07t-ddtext,
           lkey2_text like dd07t-ddtext,
           f_name like rlgrap-filename.

 

* download힐 데이터를 넣을 internal table
    data: begin of itab_down occurs 0. 
            include structure itab.
   data: key1_text like dd07t-ddtext,
           key2_text like dd07t-ddtext,
   end of itab_down.

 

   refresh itab_down.
   loop at itab.

 

       clear itab_down.
          move-corresponding itab to itab_down. 
       perform get_domain_value changing:itab-key1
                  gkey1_domain
                 itab_down-key1_text.

 

       perform get_domain_value changing:itab-key2
                  gkey2_domain
       itab_down-key2_text.

          append itab_down. 

 

   endloop.

 

 * download 함수 사용
    call function 'DOWNLOAD' 
        exporting
            filename = f_name
               filetype = 'DAT'
        importing
           cancel = l_answer
         tables
           data_tab = itab_down.

       if l_answer eq 'x' or l_answer eq 'X'. 
             message i000(zg) with 'Job was canceled!'.
       elseif sy-subrc = 0.
             message i000(zg) with 'Job was ended sucessfully!'.
       else.
             message e000(zg) with 'Error occured'.
       endif.

 

  endform. " DOWNLOAD_TO_PC

 

 

 : Internal Table의 내용을 PC 파일로 Down받는 Subroutine이다.

 : Download할 내용을 저장할 Internal Table을 정의한다. itab을 그대로 Down받아도 되나 코드명이

없으므로 코드명 필드를 추가한 Internal Table을 만들어서 코드명까지 Down받도록 한다.

 : Download용 Internal Table itab_down으로  itab 데이터를 옮긴다.

 : APPEND 구문을 이용하여 Down용 Internal Table에 데이터를 저장한다.

 : 'DOWNLOAD'를 사용하여  itab_down의 내용을 PC파일로 저장한다.

 : Download 결과 여부를 사용자에게 Message를 사용하여 보여준다.

 

 

 

 

 

4) 상세 보고서 출력

 

- <Delete> Command기능

 

<Delete>기능 소스는 아래의 4단계로 구성된다.

 첫째. 화면상에서 checkbox가 되어 있는 라인의 지역코드와 그룹코드로부터 해당되는 Internal Table의 데이더를 삭제용 Internal Table로 저장한다.

 

 

 둘째. check된 라인의 데이터는 해당 Internal Table에서 삭제한다.

 

 

 세째. 삭제용 Internal Table에 저장된 데이터는 backup용 Table ztkks02 Table에 저장한다.

 

 

  넷째. 삭제된 데이터를 화면상에서 없애기 위하여 Internal Table itab의 데이터를 화면상에 다시 출력한다.

 

 

 

 소스보기. 
    
 *&---------------------------------------------------------------------*
*& Form delete_data
*&---------------------------------------------------------------------*
* check 된 데이터를 삭제처리한다.
*----------------------------------------------------------------------*
* parameter: Nothing
*----------------------------------------------------------------------*
   form delete_data.

* 화면상에서 check된 라인의 지역/그룹에 해당되는 데이터만 화면상에서는
* 없애주며 ztkks02라는 backup용 table에 반영한다.

* 1. 화면상에서 check된 라인의 지역/그룹에 해당되는 데이터만 발췌하여
* 해당 internal table에서 해당 데이터만 삭제하고 itab_del에
* append 한다.
* 2. 새로운 화면을 다시 뿌려준다.

 

* 해당 데이터를 삭제유무를 Confirm 한다.
   data: v_answer(1).
   call function 'POPUP_TO_CONFIRM_STEP' 
   exporting
* DEFAULTOPTION = 'Y'
      textline1 = '삭제하시겠습니까?'
* TEXTLINE2 = ' '
      titel = '삭제'
* START_COLUMN = 25
* START_ROW = 6
* CANCEL_DISPLAY = 'X'
      importing
         answer = v_answer.
       if v_answer ne 'J'. 
          exit.
      endif.


* 삭제용 internal table
    data: itab_del like ztkks02 occurs 0 with header line. 
    refresh itab_del.

  do.
     clear: itab-check, itab-key1, itab-key2.
     read line sy-index field value itab-check itab-key1 itab-key2. 
     if sy-subrc ne 0.
        exit.
     endif.
* check된 데이터만 삭제용 itab_del에 추가하고 itab에서는 삭제한다.
     if itab-check = 'X'. 
       loop at itab where key1 = itab-key1 
              and key2 = itab-key2.
       clear itab_del.
       move-corresponding itab to itab_del. 
       itab_del-deletion = sy-datum.
       append itab_del. 
       delete itab. 
    endloop.
    endif.
  enddo.

 

* 원래 table(ztkks01)에서는 삭제하고
* 삭제용 table(ztkks02)에 추가한다.
    delete ztkks01 from table itab_del. 
    modify ztkks02 from table itab_del. 
    if sy-subrc = 0.
        commit work. 
     else.
        rollback work.
    endif.

 

 * 새로 결과를 화면에 뿌린다.

    perform display_result. 

 

    endform. " delete_data
l

 

기본화면에서 삭제하고자 하는 지역/그룹을 check하고 <Delete>아이콘을 클릭하여 보세요. 그럼 결과 보기 화면처럼 Confirm 창이 뜨고 <Yes>버튼을 클릭하면 화면과 Table ztkks01 에서는 해당 데이터가 삭제되고 ztkks02 Table에는 해당 데이터가 저장되어 있음을 확인할 수 있다.

 

 : 이 <Delete> 기능은 Table에서 데이터를 삭제하는 처리이므로 사용자에게 한번 더 확인을 하는 절차가 필요하다. 실수로 <Delete> 아이콘을 클릭할 수도 있다. 사용자에게 Confirm 받을 수 있는 창을 띄우는 Function을 사용하여

확인자업을 한다.

 : 'POPUP_TO_CONFIRM_STEP'함수에서 <Yes>를 선택하면 그 return값은 'J'가 되며 그 이외의 값일때는 아래

Routine을 수행하지 않도록 한다.

 : 삭제되는 데이터를 backup용 Internal Table로 저장하기 위하여 삭제용 Internal Table을 정의한다.

 : 화면 필드 중 itab-check,itab-key1,itab-key2의 값을 읽는다.

 : 화면 필드 itab-check='X'인 경우 ,check된 라인에 한해서만 작업을 한다.

 : Internal Table <itab>에서 화면필드의 지역코드(itab-key1),그룹코드 (itab-key2)인 데이터만을 발췌한다.

 : 해당 데이터를 bakcup용 Internal Table로 옮긴다.

 : backup용 Internal Table에 저장한다.

 : 윈 Internal Tabe에서는 해당 데이터를 삭제한다.

 : 원래의 주소록 데이터가 들어있는 ztkks01 Table에서는 삭제한다.

 : backup용 Internal Table의 데이터를 ztkks02 Table에 저장한다.

 : 정상적으로 Table에 반영이 된 경우는 Table의 Commit 작업을 하고 비정상적인 경우는 이전의 모든 Table 작업을 취소 처리한다.

 : 해당 Internal Table에는 check된 데이터가 삭제되었으므로 이름 화면상에 반영하기 위하여 다시 한번 화면 출력을 한다.

 

Dictionary Object <SE11> or <SE16> 으로 들어가서 테이블 데이터 확인.

 

결과화면

 

 

 

 

 

'5. SAP' 카테고리의 다른 글

[PowerBuilder] - P.B 와 SAP 연결  (0) 2022.12.14
[1th] SAP 공부 해보자 - 1일차  (0) 2022.02.23
SAP HANA 장점  (0) 2020.10.01
SAP 중복 로그인 방지 Source  (0) 2020.10.01
SAP S/4 HANA이란?  (0) 2020.10.01
728x90
반응형

재고자산 평가방법에는 이동평균가 와 표준가 2가지가 있으며 상품유형에 해당 평가방법을 지정한다.

예를들어 아래와 같이 상품유형에 대해 재고자산평가 방법을 지정하였을 경우 

 

  1. HAWA/FERT : 표준가 ( S )
  2. ROH, ROH1, ROH2, ROH3 : 이동평균가 ( V )

 

  • 표준가 : 한번 결정된 후 변경되지 않는 원가이며 Material 의 표준이 되는 가격이다.

    원가계산을 시행할 때에만 원가변경이 있을 수 있다.

  • 이동평균가 : 해당 Materail에 단가변화가 있을 때마다, 평균값을 구하여 원가에 반영함으로 원가가 매번 변경되게 된다.

즉 원자재에 대해 입고시 마다 단가를 변경하게 되면 해당 원자재의 재고의 단가는 계속 변경 될 수 있다.

 

  • 상품유형별 가격관리 정의 2가지 방법 :

    상품유형별 가격관리를 정의하는 방법은 아래 2가지 방법이 있다.

     

1. 자재관리à 상품유형에 대한 가격관리 정의

 

 2. 자재마스타 à 기본세팅 à 자재유형 à 상품유형속성정의

예를들어 Standard Price 를 사용하는 HAWA 유형의 상품에 대해 아래와 같이 자재마스타의 단가를 지정 한 경우

재고분계가 어떻게 일어 나는지 알아보면 ( * 구매시 수량을 100 PCS 로 발주 한 경우)

표준가 : 자재마스타의 가격에 근거 하여 표준가는 1,000 원 이다.

구매금액 : 구매금액 1,200 원 단가 * 100 PCS 로 120,000 원이 된다.

입고가격 : 입고금액은 구매단가의 영향을 받게 되므로 1,200 * 100 PCS 로 120,000 원이 된다.

이 경우 재고분개는 상품과 GR-IR계정으로 (표준가 * 입고수량) 만큼 1,000 * 100 PCS 의 금액이 들어가게 되고 입고금액과의 차이 만큼 원가차이계정에 구분되어 들어가게 된다.

'5. SAP > FI_CO' 카테고리의 다른 글

제조원가  (0) 2024.05.08
이동평균법  (0) 2024.05.07
SAP 결산 전 Check List  (0) 2020.10.02
SAP CO 결산 과정  (2) 2020.10.02

+ Recent posts