반응형

Document Parking and Hold Document

 

FI전표는 반드시 /대변 금액이 같고, 필요로 하는 모든 필드의 값들이 정상적으로 되어야만

 

저장(Posting 혹은 전기) 되며, 저장된 전표는 일부 텍스트 필드 등을 제외하고는 수정이 불가하다.

 

 

전표를 입력하다 보면 입력하고자 하는 Cost Center G/L 계정 아직 생성이 안되어서

 

전표를 완성하지 못할 있다.

 

이런 경우, 전표를 정상적으로 Posting하기 전에 임시저장 하는 기능이 있다.

 

임시로 저장할 경우에는 /대변의 잔액이 0 아니더라도 저장이 가능하며,

 

저장 후에도 어떠한 필드 값이라도 변경이 가능하고 삭제도 가능하다.

 

이렇게 전표의 임시저장 방식은 두가지로

 

Parking Document 방식 Holding Document 방식 있다.

 

 

Holding Document

Holding Document 방식은 Parking 방식보다 많이 사용하지 않는 방식이다.

 

이유는 일반적으로 전표번호는 전표타입에 의하여 설정된 Number Range 따라서

 

자동으로 채번이 되는데, Hold방식은 번호가 자동으로 생성되지 않고

 

사용자가 수동으로 직접 입력해야 하기 때문이다.

 

저장된 데이터가 원장에 업데이트 되지도 않고 Line Item Display화면

 

다른 표준 레포트에서도 보이지 않으며 Workflow 적용할 없어 승인(결재)기능을 사용할 없다.

 

 

사용자가 직접 입력한 전표번호를 따로 메모해 놓지 않으면, 추후 전표를 찾기가 쉽지 않다.

 

 

Held Document 버튼을 클릭 Hold 전표를 찾은 정상적으로 전표입력을 완료하고

 

Post 처리를 하면 정상적인 전표가 생성된다.

 

생성 사용했던 Hold Document 전표번호는 재사용이 가능하다.

 

Posting Hold Document 사용흔적이 시스템에 남지 않아 관리하기가 어려운 편이다.

 

 

Parking Document

Parking 전표는 일반적인 전표 생성시와 같이 전표번호가 미리 설정된 대로 자동으로 채번이 된다.

 

도중에 전표를 삭제하더라도 사용흔적이 시스템에 남게 된다.

 

Parking 전표도 임시 전표이므로 거래금액이 원장에 업데이트 되지는 않는다.

 

 

전표 입력 Park Document 버튼을 클릭하거나 more document park 기능을 사용할 있다.

 

차/대변 잔액이 맞지 않아도 저장가능 하며, Save as Completed 기능을 이용하면

 

정상적으로 생성되었는지 확인하고 저장해 놓을 있다.

 

 

이러한 임시전표는 정상적인 전표가 저장되는 테이블의 이름앞에 'V' 붙는 형태로 저장된다.

 

정상전표는 'BKPF', 'BSEG' 테이블에 저장되나, 임시전표는 'VBKPF', 'VBSEG' 테이블에 저장된다.

 

Parking 상태로 저장이 되면, 'BKPF' 테이블에 헤더정보가 저장이 되나,

 

'BSEG' 완전히 정상적으로 Posting 처리가 끝난 저장이 된다.

 

또한, 정상적으로 Posting 처리가 끝나면 'VBKPF' , 'VBSEG' 테이블에는 해당 데이터가 자동으로 삭제된다.

 

 

Parking 전표는 임시저장 혹은 결재를 앞둔 미승인 전표의 성격으로 반드시 월말이나 결산시점에

 

처리되지 않은 건이 있는지 점검하고 확인하는 프로세스가 필요하다.

 

Parking 전표는 Parking Post / Delete(FBV0) 트랜잭션을 이용하여 한건씩 Posting 있고

 

Document List 버튼을 이용하여 여러 건을 동시에 Posting 가능하다.

 

여러 건을 동시에 Posting 경우엔 반드시 사전에 Complete체크가 되어 있어야 한다.

 

삭제된 Parking 전표는 Change History에서 이력을 확인할 있으며,

 

헤더정보에 Doc. Status 'Z' (Parked document which was deleted) 표시된다.

해당 글은 ' 알기쉽게 정리한 SAP FI' 책을 통해 스스로 공부하면서 정리한 내용이다. 
반응형

'SAP > FI모듈' 카테고리의 다른 글

[FI모듈] Special G/L  (2) 2024.06.18
[FI모듈] Tax - Business Place & Section Code  (0) 2024.06.15
[FI모듈] Document Change & Reverse  (0) 2024.06.13
[FI모듈] Fiscal Year & Posting Period  (0) 2024.06.12
[FI모듈] Exchange Type / Rates  (2) 2024.06.11
반응형

ABAP에서 Selection Screen 화면에서 

 

Select Option에서 나오는 서치헬프를 제한할 수 있다.

 

Select Option Search Help 화면

 

보통 select option 에서 서치헬프를 클릭하면 다음과 같이 4개의 탭이 나온다.

 

이 4개에 탭에서 필요없는 항목을 제거할 수 있고,

 

selection options 종류도 제한적으로 설정할 수 있다.

selection options 의 종류

 

사용할 function은 바로 'SELECT_OPTIONS_RESTRICT' 이다.

 

  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction            = ls_restriction
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.

 

위의 코드를 INITIALIZATION. 단계 혹은 PBO 단계에서 입력해주면 

 

Selection Screen 의 특정 필드에 대해서 제한을 걸 수 있다.

 

그러면 함수에서 restriction에는 어떠한 정보를 제공해야 하는지 확인해보자.

 

해당 SSCR_RESTRICT 를 더블클릭 하여 들어가보면

 

해당 타입은 다음과 같이 구성되어 있는 걸 확인 할 수 있다.

 

* The type for SELECT_OPTIONS_RESTRICT (to be extended)
TYPES: BEGIN OF SSCR_RESTRICT,
         OPT_LIST_TAB TYPE SSCR_OPT_LIST_TAB,
         ASS_TAB     TYPE SSCR_ASS_TAB,
       END   OF SSCR_RESTRICT.
       
* List of option lists
TYPES: SSCR_OPT_LIST_TAB TYPE SSCR_OPT_LIST OCCURS 5.

* One list of options
TYPES: BEGIN OF SSCR_OPT_LIST,
         NAME    LIKE RSRESTRICT-OPTIONLIST,
         OPTIONS LIKE RSOPTIONS,
       END   OF SSCR_OPT_LIST.

* The association table
TYPES: SSCR_ASS_TAB TYPE SSCR_ASS OCCURS 20.

* One line of table associating selection screen object with opt. list
TYPES: BEGIN OF SSCR_ASS,
         KIND LIKE RSSCR-KIND,               " A(ll), B(lock), S(elect-Option)
         NAME LIKE RSRESTRICT-OBJECTNAME,    " Blockname, maximal 20
         SG_MAIN LIKE RSRESTRICT-SIGN,       " (only) I, * = both
         SG_ADDY LIKE RSRESTRICT-SIGN,       " additional SIGN
                                             " on multiple selection screen
         OP_MAIN LIKE RSRESTRICT-OPTIONLIST, " name of option list for
                                             " main selection screen
         OP_ADDY LIKE RSRESTRICT-OPTIONLIST, " name of additional option
                                             " list for multiple selection screen
       END   OF SSCR_ASS.

 

Restriction 에는 기본적으로 opt_list_tab ( one list of options table ) 와 ass_tab ( association table )를 구성해야한다.

 

1. OPT_LIST_TAB

option list를 나타내는 이름과 , options 의 종류 설정이다.

 

이름은 10글자 이내로 원하는대로 넣으면 된다. [ EX) 'ONLY_EQ' , 'SELOP_EQ', 'EQ_ONLY' , 'ONLY_NE' 등 ]

 

options는 원하는 항목에 대해서 아래 Structure Name 을 선택하여 구성하면 된다.

selection options 의 종류 Structure.

 

구성 방법은 다음과 같다.

DATA: ls_sscr_opt_list TYPE sscr_opt_list,
      ls_sscr_ass_list  type SCR_ASS,
      ls_restriction   TYPE sscr_restrict.

* 'SELOP_EQ' 라는 이름과 EQ만 허용
ls_sscr_opt_list-name = 'SELOP_EQ'.
ls_sscr_opt_list-options-eq = 'X'.

* 만든 option list를 restriction 의 opt_list_tab에 append.
APPEND ls_sscr_opt_list TO ls_restrict-opt_list_tab.

* New Syntax 선언 방법 ( ass_tab 은 아래 추가 설정 )
DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) ) )
                          ass_tab      = VALUE #(  ) ).

 

해당 코드는 'SELOP_EQ' 라는 이름을 가지고 selection option 은 EQ만 허용하는 opt_list_tab를 설정한 것이다.

반응형

2. ASS_TAB

KIND는 특정 유형의 필드를 제어할지 나타내는 것이다.

A : ALL(모든필드)를 제어한다.

B: Block(블락)을 제어한다.

S: Select-option(선택옵션) 제어 사용.

 

나는 Select-option을 제어할 것이기에 Kind = 'S'를 설정할 것이다. 

 

NAME은 제어할 필드의 이름이다. [ ex) s_bukrs, p_bukrs ]

 

SG_MAIN은 메인 선택기호 (Sign)이며, SG_ADDY 는 추가 선택기호이다.

'I' = Include로 포함을 의미한다.

'*'을 넣어주면 Include, Exclude 둘다 적용 된다.

 

OP_MAIN은 메인 option list 이름이며, OP_ADDY는 추가 option list 이다. 

해당 값은 위에 설정했던 OPT_LIST_TAB에 있는 option_list_tab-name 이다.

 

구성방법은 다음과 같다.

DATA: ls_sscr_opt_list TYPE sscr_opt_list,
      ls_sscr_ass_list  type SCR_ASS,
      ls_restriction   TYPE sscr_restrict.

* 'SELOP_EQ' 라는 이름과 EQ만 허용
ls_sscr_opt_list-name = 'SELOP_EQ'.
ls_sscr_opt_list-options-eq = 'X'.

* 만든 option list를 restriction 의 opt_list_tab에 append.
APPEND ls_sscr_opt_list TO ls_restrict-opt_list_tab.

* ass_list 구성 후 ls_restriction의 ass_tab에 append.
ls_sscr_ass_list-kind = 'S'.
ls_sscr_ass_list-name = 'S_BUKRS'
ls_sscr_ass_list-sg_main = 'I'.
ls_sscr_ass_list-op_main = 'SELOP_EQ'.

APPEND ls_sccr_ass_list TO ls_restriction-ass_tab.


* New Syntax 선언 방법
DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_EQ' ) ) ).
                          
CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction  = ls_restriction

 

사용방법은 위의 코드와 같다.

 

그러면 실행해서 어떻게 제어가 되는지 확인해보자.

 

위에 코드 실행 시 아래 화면과 같이 제어가 된다.

sg_main = 'I' , select-options는 EQ만 사용.

 

그러면 sg_main = '*' 로 변경하면 어떻게 되는지 확인해보자.

sg_main = '*', select-options는 EQ만 사용.

 

Single Value가 아니라 Range를 넣고 싶으면, 

  DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) )
                                                  ( name = 'SELOP_BT'    options = VALUE #( bt = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_BT' ) ) ).

 

사용할 op_main을 BT로 설정한 list_tab 이름으로 변경해주면 된다.

Select Ranges로 변경된 것을 확인.

위와 동일하게 sg_main = '*'로 하면 select ranges탭과 exclude select ranges 탭 2개가 생긴다.

 

  DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) )
                                                  ( name = 'SELOP_BT'    options = VALUE #( bt = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_BT' op_addy = 'SELOP_EQ' ) ) ).

 

op_addy에 SELOP_EQ를 넣으면 select single values와 select ranges 탭으로 설정 가능하다.

Select single value와 select ranges 탭으로만 설정.

 

마지막으로 selection options에 값 추가해보자.

  DATA(ls_restriction) = VALUE sscr_restrict(
                          opt_list_tab = VALUE #( ( name = 'SELOP_EQ'    options = VALUE #( eq = 'X' ) )
                                                  ( name = 'GE&NE'       options = VALUE #( ge = 'X' ne = 'X' ) ) )
                          ass_tab      = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I'  op_main = 'SELOP_EQ' op_addy = 'GE&NE' ) ) ).

 

selection options 제어 화면

 

opt_list_tab 구성 시 제어하기를 원하는 필드를 추가하여 위와 같이 설정해주면

 

위 화면과 같이 seletion options를 제어 할 수 있다.

반응형
반응형

https://economic-diary.tistory.com/entry/ABAP-SWM0%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-Excel-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C

 

[ABAP] SMW0를 이용한 Excel 다운로드

Excel 을 다운로드 하는 경우가 종종 생긴다. 먼저 Download 할 위치를 정해줘야 하는데 SAP 스탠다드 코드를 이용할 수 있다. Method cl_gui_frontend_services=>file_save_dialog를 이용하면 된다.  DATA : lv_file_fil

economic-diary.tistory.com

 

SMW0에 등록하여 WebRFC를 이용하여 Excel 다운로드 하는 방법을 알아보았다.

 

혹시 모르면 위에 내용 참고하시면 됩니다.

 

 

이번엔 SMW0에 등록을 하려는데 MIME type이 없다고 등록이 안되는 현상이 발생 할 수 있다.

SMW0 등록 과정
Error 문구

 

이런 경우 MIME type을 설정해주면 되는데,

 

SMW0에서 해당 파일을 등록하는 화면에서 세팅 -> MIME 타입 정의 를 클릭해주면 된다.

Define MIME Types

 

TYPE과 EXTENSION을 넣어주면 해당 오류는 사라지고 등록 할 수 있다.

 

대표적으로 등록하는 타입들은 아래 캡쳐화면을 참고하면 대부분의 확장자들에 대해서는 등록 가능.

 

주로 사용하는 엑셀이나, 사진, 파워포인트, PDF는 등록을 해두면 편하다.

 

MIME Type과 Extension 설정

반응형
반응형

React에서 구현하기 어려웠던 부분을

 

NextJS에서 간단하게 처리가 가능하다.

 

각 병렬처리할 컴포넌트를 만들어 준다.

 

import { API_URL } from "../app/(Home)/page";

async function getMovies(id: string) {
  await new Promise((resolve) => setTimeout(resolve, 2000));
  return fetch(`${API_URL}/${id}`).then((response) => response.json());
}

export default async function MovieInfo({ id }: { id: string }) {
  const movies = await getMovies(id);
  return <h6>{JSON.stringify(movies)}</h6>;
}

 

Movie정보를 가져오는 첫번째 컴포넌트 (MoiveInfo)

 

그리고

import { API_URL } from "../app/(Home)/page";

async function getVideos(id: string) {
  await new Promise((resolve) => setTimeout(resolve, 4000));
  return fetch(`${API_URL}/${id}/videos`).then((response) => response.json());
}

export default async function MovieVideos({ id }: { id: string }) {
  const videos = await getVideos(id);
  return <h6>{JSON.stringify(videos)}</h6>;
}

 

Movie Video를 가지고 오는 2번째 컴포넌트 (MovieVideos)

 

이렇게 만든 컴포넌트를 가지고 

 

원하는 페이지에서 <Suspense> 를 구성하여 코드를 작성하면

import { Suspense } from "react";
import MovieInfo from "../../../../Components/movie-info";
import MovieVideos from "../../../../Components/movie-videos";

export default async function MovieDetail({
  params: { id },
}: {
  params: { id: string };
}) {
  return (
    <div>
      <Suspense fallback={<h1>Loading movie info</h1>}>
        <MovieInfo id={id} />
      </Suspense>
      <Suspense fallback={<h1>Loading movie videos</h1>}>
        <MovieVideos id={id} />
      </Suspense>
    </div>
  );
}

 

이렇게 작성하면 await 동안에는 fallback이 작용하여

 

Loading movie info 와 Loading movie videos가 동시에 나타났다가,

 

fetch가 끝난 거 부터 병렬적으로 Json 데이터를 받아올 수 있다.

 

이 모든 병렬프로그래밍을 서버에서 진행한다는게 미쳤다..

 

 

반응형

'Front-End > NextJS' 카테고리의 다른 글

[NextJS] VsCode에 NextJS 설치 및 초기설정  (1) 2024.09.13
반응형

1. 폴더 만들기

mkdir <폴더명>

 

2. 폴더 들어가기

cd <폴더명>

 

3. 해당폴더 Visual Studio Code에서 열기

code . 

visual studio code 창 열리면 해당 terminal에서

npm init -y

 

4. Package.json 변경

Pakage.json 내용 변경.

 

5. Next, React, React-Dom 최신 버전 설치

npm install react@latest next@latest react-dom@latest

 

NextJS는 프레임 워크라 명명 규칙을 잘 따라야 한다.

 

APP 폴더안에 Page가 있어야 그것을 찾아서 렌더링을 해준다.

 

page는 page.tsx or page.jsx로 만들어 주면 초기 세팅은 끝이다.

 

6. page 작성

export default function Home() {
  return <div>Home</div>;
}

 

7. 실행하기

npm run dev

 

 

실행하면 알아서 TypeScript가 필요하다고 설치해주고

 

layout.tsx가 없다고 설치까지 해준다.

 

NextJS 프레임워크 👍

 

layout.tsx 에 들어가면 아래와 같이 설정되어있는데,

 

전체적인 페이지의 레이아웃을 설정해주는 곳이라고 보면 된다.

export const metadata = {
  title: 'Next.js',
  description: 'Generated by Next.js',
}

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  )
}

metadata에서 title을 '개발일지'로 변경하면

 

react에서 Helmet 이라는 라이브러리를 사용했었는데, 

 

NextJS는 그냥 layout에서 변경하면 알아서 반영해준다.

 

 

안쓸이유가 없어보이는 NextJS....

반응형

'Front-End > NextJS' 카테고리의 다른 글

[NextJS] async 서버 컴포넌트 단위로 병렬 처리  (0) 2024.09.13
반응형

 

ABAP에서 URL에 접근하여 데이터를 가져오는 가장 일반적인 방법은

 

HTTP Client Class를 사용하는 것이다.

 

CL_HTTP_CLIENT 클래스를 이용하여 HTTP요청을 보낼 수 있다.

 

DATA : lo_http_client TYPE REF TO if_http_client,
       lv_json        TYPE string,
       lv_api_token   TYPE string VALUE '접근가능한 API TKOEN명',  " API Token
       lv_auth        TYPE string,
       ls_data        TYPE gty_data.


DATA(lv_url) = |https://접근할 URL 주소|.
" HTTP 클라이언트 생성
cl_http_client=>create_by_url( EXPORTING url = lv_url
                               IMPORTING client = lo_http_client ).

" HTTP 요청 설정
lv_auth = |Bearer { lv_api_token }|.
lo_http_client->request->set_header_field( name = 'Authorization' value = lv_auth ).
lo_http_client->request->set_header_field( name = 'Content-Type' value = if_rest_media_type=>gc_appl_json ).
lo_http_client->request->set_method( if_http_request=>co_request_method_get ).

" HTTP 요청 전송
lo_http_client->send( ).

lo_http_client->receive( ).

" HTTP 상태 코드 확인.
lo_http_client->response->get_status( IMPORTING code = DATA(lv_status_code) ).

IF lv_status_code <> '200'.
  " 실패 Message 처리
  EXIT.
ELSE.

  " Body Data
  DATA(lv_response_body) = lo_http_client->response->get_cdata( ).

  " HTTP 클라이언트 종료
  lo_http_client->close( ).

  "  Json Data -> ABAP Stucture로 변환
  CALL METHOD /ui2/cl_json=>deserialize(
    EXPORTING
      json = lv_response_body
    CHANGING
      data = ls_data ).    " ABAP Structure Data

ENDIF.

 

코드를 다음과 같이 작성하면 URL에 접근이 가능하다.

 

CL_HTTP_CLIENT 클래스를 사용하요 HTTP 클라이언트를 생성하고,

 

Header 및 Method 구성 후 send 와 receive를 사용하여 요청하고 응답을 받을 수 있습니다.

 

만약 URL에 데이터를 전송하려면 Method구성 시 GET이 아니라 POST를 요청하면 된다.

 

IF_REST_MEDIA_TYPE 해당 인터페이스를 들어가보면 Attribute에 변수가 저장되어 있어서 

 

알맞은 attribute를 찾아서 header와 method를 구성하면 쉽게 접근할 수 있다.

 

IF_REST_MEDIA_TYPE 인터페이스에 설정되어 있는 atrribute

 

IF_HTTP_ENTITY의 attribute

 

위의 코드로 접근 시 해당 data를 받아오면 되는데 JSON type 으로 요청했기 때문에

 

JSON data를 ABAP Structure로 변환만 해주면 된다.

 

" Status, issue info
TYPES: BEGIN OF gty_name,
         name TYPE string,
       END OF gty_name.

" Field info
TYPES: BEGIN OF gty_fields,
         issuetype         TYPE gty_name,      
         status            TYPE gty_name,       
         resolutiondate    TYPE string,          
         created           TYPE string,           
       END OF gty_fields.

" JSON Data Info
TYPES : BEGIN OF gty_data,
          key    TYPE string,                  
          fields TYPE gty_fields,          
        END OF gty_data.

 

JSON 받을 data는 다음과 같이 deep structure로 구성하여 필요한 필드만 구성하여 받을 수 있다.

 

이렇게 구성되어 나온 JSON데이터를 가공하여

 

아래 그림과 같이 ABAP Structure로 변환 된 data를 사용할 수 있다.

 

반응형
반응형

 

BDC(Batch Data Communication)으로 SAP시스템에서 대량의 데이터를 일괄적으로

 

입력하거나 업데이트하기 위해 사용되는 기술로 수작업으로 데이터를 입력하는 대신 

 

자동화된 방식으로 데이터를 처리할 수 있는 기능이다.

 

 

BDC는 크게 기록(Recording)을 통해 트랜젝션을 기록하고 BDC프로그램을 작성하는 Session Method와

 

작성한 BDC프로그램을 Call Transaction Method 를 실행하는 방법으로 구성되어있다.

 

 

1. T-Code : SHDB 실행 후 기록.

SHDB 화면 ( Recording Overview)

 

해당프로그램에서 New recording을 클릭.

Create Recording 화면

 

Recording 명을 작성하고 기록할 T-Code입력 후 start recording을 눌러 실행한다.

 

내가 프로그램을 자동화 처리하기 위한 하나의 과정을 진행하고 종료하면 다음과 같이 행위에 대한 결과가 저장된다.

 

Recording 결과

반응형

2. 코드작성 

DATA : lt_bdcdata TYPE TABLE OF bdcdata WITH EMPTY KEY.

 lv_opt = VALUE ctu_params( dismode = 'E' ).
 lt_bdcdata = VALUE #(
                      ( program = 'RDDM0001' dynpro = '0200' dynbegin = 'X' )
                      ( fnam    = 'BDC_CURSOR'           fval = 'TRDYSE01SN-TR_TRKORR' )
                      ( fnam    = 'TRDYSE01SN-TR_TRKORR' fval = ls_list-trkorr )
                      ( fnam    = 'BDC_OKCODE'           fval = '=SINGLE_LOGS' ) ).

CALL TRANSACTION 'SE01' USING lt_bdcdata OPTIONS FROM lv_opt.

 

RDDM0001이란 프로그램의 화면 0200을 시작하겠다고 선언.

 

위의 기록대로 필요한 값을 bdcdata Type table에 넣어주면 된다.

 

lv_opt 이란 bdc가 작동하면서 화면을 어떻게 보여줄지에 대한 설정이다.

 

                                       'A' : 모든 화면에 대해 조회하면서 트랜잭션 수행 모드

 

                                       'E' : 에러 발생할 경우 해당화면 조회

 

                                       'N' : 화면을 표시하지 않음.

 

보통 'E' 모드를 많이 쓰고, Data 값을 가져오기 위한 경우엔 'N'화면을 많이 사용한다.

 

 

 

더블클릭 or Hotspot 클릭을 이용하여 특정 필드에 대한 Event를 등록하면

 

해당 TROKRR ( Request No)를 가지고 바로 SE01의 Log화면을 띄워주는 걸 확인 할 수 있다.

 

반응형
반응형

 

Excel 을 다운로드 하는 경우가 종종 생긴다.

 

먼저 Download 할 위치를 정해줘야 하는데 SAP 스탠다드 코드를 이용할 수 있다.

 

Method cl_gui_frontend_services=>file_save_dialog를 이용하면 된다.

 

  DATA : lv_file_filter       TYPE string,
         lv_initial_directory TYPE string,
         lv_filename          TYPE string,
         lv_path              TYPE string,
         lv_fullpath          TYPE string.

  lv_filename = 'Template'.
  lv_file_filter = 'Excel File(*.xlsx; *.xls )|*.xlsx; *.xls'.
  lv_initial_directory = 'C:'.
  cl_gui_frontend_services=>file_save_dialog(
    EXPORTING
      default_extension         = 'xlsx'                " Default Extension
      default_file_name         = lv_filename           " Default File Name
      file_filter               = lv_file_filter        " File Type Filter Table
      initial_directory         = lv_initial_directory  " Initial Directory
    CHANGING
      filename                  = lv_filename           " File Name to Save
      path                      = lv_path               " Path to File
      fullpath                  = lv_fullpath           " Path + File Name
    EXCEPTIONS
      cntl_error                = 1                     " Control error
      error_no_gui              = 2                     " No GUI available
      not_supported_by_gui      = 3                     " GUI does not support this
      invalid_default_file_name = 4                     " Invalid default file name
      OTHERS                    = 5.
      
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  
  IF lv_fullpath IS INITIAL.
    RETURN.
  ENDIF.

 

위 코드와 같이 작성을 하면 아래와 같이 Download하는 창을 불러올 수 있다.

Excel Download 창

 

Default로 C드라이브 , 제목은 Template고 형식은 Excel로 들어간다.

 

필요에 따라 저장위치, 파일이름, 형식은 변경이 가능

 

lv_fullpath 는 저장위치(path) + 파일이름(File Name)  으로 구성되는 String으로 반환된다.

 

 

자 그러면 이제 Excel 혹은 Excel Template를 SAP 스탠다드에(웹저장소) 등록을 해보자.

 

T-Code : SMW0 실행.

 

SMW0 화면

 

Binary data for WebRFC applications를 선택하고 실행을 눌러준다.

 

Binary data for WebRFC 화면

 

해당 프로그램이 포함된 Package를 넣어주고 Excute(실행) 클릭

반응형

 

Obj. name 과 Description을 작성하고 import 버튼을 눌러 생성해준다.

 

Obj. name은 나중에 select문에 사용된다.

 

Import 클릭 후 화면

 

Import 버튼을 누르면 Excel을 선택하는 창이 나오는데,

 

미리 작성해둔 template excel 파일을 선택하여 등록하면 SAP 스탠다드 웹 저장소에 Upload되면서 저장이 된다.

 

그럼 코드로 돌아와서 해당 파일을 가져오자.

 

DATA : ls_item              TYPE wwwdatatab,
       lv_file              TYPE rlgrap-filename.
       
lv_file = lv_fullpath.

  SELECT SINGLE FROM wwwdata
   FIELDS *
    WHERE objid = 'Z_EXCEL_TEMPLATE'
     INTO CORRESPONDING FIELDS OF @ls_item.             "#EC CI_NOORDER

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_item
      destination = lv_file.

  IF ls_item IS INITIAL.
    "File is not exist
    MESSAGE s044 DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

 

wwwdata 에서 방금 만든 obj.name 의 data를 가져와 

 

CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' 를 사용해서 다운로드를 해주면 

 

기존의 만들어 뒀던 template의 모든 형식그대로 다운로드가 된다.

 

( 날짜 타입, 엑셀 border, Cell style 모두 적용된 상태로 다운 )

 

반응형

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

[ABAP] URL 접근하여 데이터 얻는 방법  (0) 2024.09.12
[ABAP] BDC를 활용한 CALL TRANSACTION  (2) 2024.09.10
[ABAP] Subtotal(소계) 세팅  (1) 2024.09.02
[ABAP] SELECT WITH 구문  (0) 2024.06.24
[ABAP] Pass by Value vs Pass by Reference  (1) 2024.06.16
반응형

ALV에서 로직을 이용하여 Subtotal 초기 세팅하는 법에 대해서 알아보자.

 

다음과 같은 List가 있다.

해당 List를 보면 Company Code, Status, Posting Date, Document Date, Document Number는 동일하고

 

전표안에 있는 Line Item들의 고객마다 처리할 금액이 여러 건 있는 케이스다.

 

이럴 경우 전표번호에 따른 금액을 Subtotal(소계) 하여 보여주고 싶을 경우가 생길 것이다.

 

이럴 때 사용하는 Subtotal 에 대해서 알아보겠습니다.

 

먼저 Fieldcatalog 세팅에서 소계를 해줄 필드에대해서 세팅을 해준다.

Fieldcatalog에서 do_sum 세팅

 

해당필드에 do_sum = 'X' (abap_true)로 세팅을 해주면 

do_sum 결과 ALV화면

 

해당 필드에 값들이 모두 더해진 라인이 맨 아래 생긴다.

 

 전표번호를 기준으로 Subtotal이 필요하기에 이 세팅을 해줘야 하는데

 

Sort 세팅에서 넣어줘야한다.

 

Sort 세팅.

 

spos : 정렬 순서를 의미

fieldname : 어떤 필드로 정렬할지

up : 오름차순으로 정렬 (내림차순으로 하고싶은면 down 이다. )

subtot : 해당 필드로 소계를 적용하겠다.

반응형

이렇게 설정을 하고 실행을 해보면

해당 전표 별로 소계가 되어 나오는 걸 알 수 있다.

 

하지만, ALV화면 맨아래 총 합은 모든 전표에 대한 합계이기 때문에 필요없을 수 있다.

 

이럴 경우에는 Layout 설정에 가서 설정해주면 된다.

no_totline = 'X' (abap_true) 로 설정하고 실행하면

no_totline 설정 후 ALV 화면

 

노란색으로 되어있던 전체 합계 라인이 사라진 것을 확인 할 수 있다.

 

그러면 동일 한 필드에 대해서는 전표번호 처럼 합쳐서 나오게 하려면 

 

Sort 세팅에서 묶어주면 해결된다.

Sort 세팅

이렇게 원하는 필드에 대해서 Sort table에 넣어주면 된다.

 

 

이러면 테이블이 보는게 훨씬 깔끔해야지고 가독성이 올라간다.

 

지금까지 세팅한 Sort, layout, fieldcat 은 alv를 불러올 때

 

입력해주는 값 들에 세팅을 해줘야 하며,

 

set_table_for_first_display 가 실행되기 전에 세팅을 해야한다.

 

또한, set_ready_for_input( i_ready_for_input = 0 )

 

필수로 설정해줘야 동일 필드가 합쳐져서 1개로 보인다.

반응형

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

[ABAP] BDC를 활용한 CALL TRANSACTION  (2) 2024.09.10
[ABAP] SMW0를 이용한 Excel 다운로드  (1) 2024.09.09
[ABAP] SELECT WITH 구문  (0) 2024.06.24
[ABAP] Pass by Value vs Pass by Reference  (1) 2024.06.16
[ABAP] ALV Grid Event Handler - 2편  (0) 2024.06.11
반응형

 

CTE ( Common Table Expression, 공통 테이블 ) 단일 명령문의 범위 내에 존재하는 명명된 임시 결과 집합이다.

 

이러한 공통 테이블 표현식을 지정하기 위해서 사용되는게 WITH구문이다.

 

CTE 이름은 다른 CTE에서 참조할 있으므로 CTE 다른 CTE 기반으로 정의 있다.

 

또한, CTE 자신을 참조하여 재귀 CTE 정의할 있다.

 

이러한 이유로 복잡한 쿼리를 단순하게 정의 있어 가독성을 높이고 중복을 제거하는데 도움이 된다.

 

WITH구문 사용하는 방법은 다음과 같다.

 

 

WITH +(NAME) AS (

SELECT 쿼리

             ),

 +(NAME) AS (

SELECT 쿼리

 ),

+(NAME) AS (

SELECT 쿼리

)

메인 SELECT 쿼리

 

Name 길이는 최대 30 까지 가능하기에 이름만으로 추론할 있도록 이름으로 설정할 있다.

   또한, 이름앞에 반드시 '+' 기호를 사용해야 한다.

 

다음과 같이 항공편 테이블이 있다고 , WITH구문을 이용하여 데이터를 추출해보자.

 

 

다음과 같이 2개의 임시 View 생성한다.

 

첫번째 (+main_spfli) 메인 테이블 도착이 배정안되어 있는 곳은 제외한 데이터

두번째 (+airline) 메인 테이블에서 항공사, 출발나라 , 거리단위 같은 항목끼리 Group by 하여 운항 거리를 합한 데이터

 

 

이렇게 임시의 View 만들어 Inner Join 통하여 두개의 데이터를 가공할 있다.

 

예시로 2개의 (View 만들었지만, 실제로는 여러 개를 만들 있으며 만들었으면 무조건 사용은 해야한다.

 

실행 결과) 항공사별 출발지가 같은 곳의 최종 거리가 추가된 것을 확인 있다.

 

 

1개의 View 만들 안에서도 Join이나 Union 모두 사용가능 하기에 복잡한 데이터를 가공하기에 매우 유용하게 사용할 있다.

 

ABAP에서 CDS View 이용하여 쿼리를 많이 짜는 방향으로 바꼈는데 WITH 구문을 사용하여 가독성을 높여보자.

 

복잡한 쿼리인 경우 SELECT문이 길어지면서 가독성이 떨어지는데 WITH구문으로 VIEW 이름을

 

용도에 맞게 나눠서 만들기에 가독성이 매우 높아지기 때문에 유지보수에도 도움이 것이다.

 

또한, WITH구문은 본절에서 1 사용될 때는 서브쿼리와 성능차이가 보이지 않지만,

 

WITH구문으로 정의된 테이블이 2번이상 사용될 때에는 내부적으로 메모리에 쿼리의 결과값을 저장하고 반복하여 사용하는 방식으로

 

저장된 결과값을 불러와 실행 수를 줄여주기 때문에 성능의 개선이 있다.

반응형

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

[ABAP] SMW0를 이용한 Excel 다운로드  (1) 2024.09.09
[ABAP] Subtotal(소계) 세팅  (1) 2024.09.02
[ABAP] Pass by Value vs Pass by Reference  (1) 2024.06.16
[ABAP] ALV Grid Event Handler - 2편  (0) 2024.06.11
[ABAP] ALV Grid Event Handler - 1편  (0) 2024.06.10

+ Recent posts