코드에서 fieldcatalog 더블 클릭 

 

 

slis_t_fieldcat_alv 타입 클릭

 

 

slis_fieldcat_alv 타입 클릭

 

 

slis_fieldcat_main. 클릭

 

 

slis_fieldcat_main0. 클릭

 

 

이렇게 타입타고 들어오면 옵션 리스트들이 나온다

 

 

 

반응형
LIST

 

 

 

1. /ose11 검색해서 se11 실행하기

 

  • /o : 새 창 띄우기
  • /se11 : ABAP Dictionary 화면 열기
  • ABAP Dictionary 란? SAP 시스템에서 데이터를 저장하는 데이터베이스 테이블, 뷰, 데이터 타입 등

 

2. SPFLI 테이블 검색하기 

- display 클릭

 

 

 

SPFLI 테이블의 필드 정보, 데이터 타입 등 정보들이 나온다

 

 

 

3. SPFLI 테이블의 ALV 출력해서 데이터 보기

 

상단에 Contents 버튼 클릭 > Execute 버튼 차례로 클릭

 

 

 

SPFLI 테이블의 실제 데이터들을 볼 수 있다.

> SPFLI  테이블은 항공편 정보를 담고 있어서 항공편 정보 데이터들이 조회가 됨

 

  • CONNID: 항공편 번호
  • CARRID: 항공사 코드
  • CITYFROM / CITYTO: 출발지 & 도착지
  • FLTIME: 비행 시간
  • .....

 

 


 

 

이제 내가 프로그램을 직접 생성해서 SPFLI 테이블의 데이터를 직접 코드를 만들고 ALV를 출력해보자

 

 

1. SE80 검색 후 프로그램 생성하기

 

 

 

2. 우측 코드 수정하기

 

abap alv example 구글링하기

*첫번째 링크에 들어가서 맨 아래 두번째 코드 참조했음 

https://community.sap.com/t5/application-development-discussions/sample-alv-program-using-reuse-alv-grid-display/m-p/3647449

 

Sample ALV program using REUSE_ALV_GRID_DISPLAY

Hi, I need a sample alv program using REUSE_ALV_GRID_DISPLAY. I want to know how to populate the the fieldcatalog and the layout... Thanks a lot!

community.sap.com

 

 

▼ 코드

*&---------------------------------------------------------------------*
*& Report Z2WEEK_ALV11
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z2WEEK_ALV02.


TABLES: SPFLI    .

TYPE-POOLS: slis.                                 "ALV Declarations

*Data Declaration
*----------------
TYPES: BEGIN OF t_spfli,
  mandt TYPE spfli-mandt,
  carrid TYPE spfli-carrid,
  CONNID TYPE spfli-CONNID,
  COUNTRYFR TYPE spfli-COUNTRYFR,
  CITYFROM TYPE spfli-CITYFROM,
  AIRPFROM TYPE spfli-AIRPFROM,
  COUNTRYTO TYPE spfli-COUNTRYTO,
  CITYTO TYPE spfli-CITYTO,
  AIRPTO TYPE spfli-AIRPTO,
  FLTIME TYPE spfli-FLTIME,
  DEPTIME TYPE spfli-DEPTIME,
  ARRTIME TYPE spfli-ARRTIME,
  DISTANCE TYPE spfli-DISTANCE,
  DISTID TYPE spfli-DISTID,
  FLTYPE TYPE spfli-FLTYPE,
  PERIOD TYPE spfli-PERIOD,
 END OF t_spfli.

DATA: it_spfli TYPE STANDARD TABLE OF t_spfli INITIAL SIZE 0,
      wa_spfli TYPE t_spfli.

*ALV data declarations
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE slis_layout_alv,
      gd_repid     LIKE sy-repid.


DATA : t TYPE slis_t_sp_group_alv .
************************************************************************
*Start-of-selection.
START-OF-SELECTION.

  PERFORM data_retrieval.
  PERFORM build_fieldcatalog.
  PERFORM build_layout.
  PERFORM display_alv_report.


*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
*       Build Fieldcatalog for ALV Report
*----------------------------------------------------------------------*
FORM build_fieldcatalog.

  fieldcatalog-fieldname   = 'MANDT'.
  fieldcatalog-seltext_m   = 'Client'.
  fieldcatalog-col_pos     = 0.
  fieldcatalog-outputlen   = 10.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CARRID'.
  fieldcatalog-seltext_m   = 'Airline Code'.
  fieldcatalog-col_pos     = 1.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CONNID'.
  fieldcatalog-seltext_m   = 'Flight Connection Number'.
  fieldcatalog-col_pos     = 2.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'COUNTRYFR'.
  fieldcatalog-seltext_m   = 'Country Key'.
  fieldcatalog-col_pos     = 3.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CITYFROM'.
  fieldcatalog-seltext_m   = 'Departure city'.
  fieldcatalog-col_pos     = 4.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'AIRPFROM'.
  fieldcatalog-seltext_m   = 'Departure airport'.
  fieldcatalog-col_pos     = 5.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'COUNTRYTO'.
  fieldcatalog-seltext_m   = 'Country Key'.
  fieldcatalog-col_pos     = 6.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'CITYTO'.
  fieldcatalog-seltext_m   = 'Arrival city'.
  fieldcatalog-col_pos     = 7.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'AIRPTO'.
  fieldcatalog-seltext_m   = 'Destination airport'.
  fieldcatalog-col_pos     = 8.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'FLTIME'.
  fieldcatalog-seltext_m   = 'Flight time'.
  fieldcatalog-col_pos     = 9.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DEPTIME'.
  fieldcatalog-seltext_m   = 'Departure time'.
  fieldcatalog-col_pos     = 10.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ARRTIME'.
  fieldcatalog-seltext_m   = 'Arrival time'.
  fieldcatalog-col_pos     = 11.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DISTANCE'.
  fieldcatalog-seltext_m   = 'Distance'.
  fieldcatalog-col_pos     = 12.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DISTID'.
  fieldcatalog-seltext_m   = 'Mass unit of distance (kms, miles)'.
  fieldcatalog-col_pos     = 13.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'FLTYPE'.
  fieldcatalog-seltext_m   = 'Flight type'.
  fieldcatalog-col_pos     = 14.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'PERIOD'.
  fieldcatalog-seltext_m   = 'Arrival n day(s) later'.
  fieldcatalog-col_pos     = 15.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.



ENDFORM.                    " BUILD_FIELDCATALOG


*&---------------------------------------------------------------------*
*&      Form  BUILD_LAYOUT
*&---------------------------------------------------------------------*
*       Build layout for ALV grid report
*----------------------------------------------------------------------*
FORM build_layout.

  gd_layout-no_input          = 'X'.
  gd_layout-colwidth_optimize = 'X'.
  gd_layout-zebra = 'X'.
*  gd_layout-info_fieldname =      'LINE_COLOR'.
*  gd_layout-def_status = 'A'.

ENDFORM.                    " BUILD_LAYOUT


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV_REPORT
*&---------------------------------------------------------------------*
*       Display report using ALV grid
*----------------------------------------------------------------------*
FORM display_alv_report.
  gd_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = gd_repid
      is_layout          = gd_layout
      it_fieldcat        = fieldcatalog[]
      i_save             = 'X'
    TABLES
      t_outtab           = it_spfli
    EXCEPTIONS
      program_error      = 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.                    " DISPLAY_ALV_REPORT


*&---------------------------------------------------------------------*
*&      Form  DATA_RETRIEVAL
*&---------------------------------------------------------------------*
*       Retrieve data form EKPO table and populate itab it_ekko
*----------------------------------------------------------------------*
FORM data_retrieval.
  DATA: ld_color(1) TYPE c.

  SELECT mandt carrid CONNID COUNTRYFR CITYFROM AIRPFROM COUNTRYTO CITYTO AIRPTO FLTIME DEPTIME ARRTIME DISTANCE DISTID FLTYPE PERIOD
*   UP TO 10 ROWS
    FROM spfli
    INTO TABLE it_spfli.

ENDFORM.                    " DATA_RETRIEVAL

 

 

 

+ 테이블명 SPFLI로 다 수정하고 SPFLI 테이블의 필드와 설명란 그대로 복붙해서 수정하면된다.

 

 

+ 마지막엔 필드 나열하기

SELECT mandt carrid CONNID COUNTRYFR CITYFROM AIRPFROM COUNTRYTO CITYTO AIRPTO FLTIME DEPTIME ARRTIME DISTANCE DISTID FLTYPE PERIOD
*   UP TO 10 ROWS
    FROM spfli
    INTO TABLE it_spfli.

 

 

 

 

 

 

코드 수정했으면 Active > DIRECT PROCESSING 버튼 클릭

 

 

 

4. 내가 생성한 SPFLI 테이블의 데이터를 ALV 형태로 출력한 결과를 확인할 수 있다.

 

 

이것을 처음에 se11 검색했을때 SPFLI 테이블과 비교하면 다른점이 있다

 

다른부분 3가지

  • CONNID 앞에 빈 자리수 00으로 채우기
  • Flight time 정수부분으로 바꾸기
  • Distance 소수점을 없애기

 

 

 

 

fieldcatalog (필드 카탈로그) 옵션 

 

 

 

CONNID앞에 00이 나오게 하는 방법

 

1. fieldcatalog-datatype = 'CHAR'.

숫자인 CONNID 를 CHAR 문자열로 바꾸면 0 으로 채워진다

 

fieldcatalog-fieldname   = 'CONNID'.
  fieldcatalog-seltext_m   = 'Flight Connection Number'.
  fieldcatalog-datatype = 'CHAR'.
  fieldcatalog-col_pos     = 2.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

 

 

2. fieldcatalog-inttype 'c'

 

3. fieldcatalog-LZERO 'X'.

 

LZERO : 선행에 0 출력 여부 

= ' ' 만 하면 0이 출력 안되고 X를 해야 0이 출력 (alv 출력에만 영향을 준다.)

 

> NUMC 필드를 위한 옵션이라 LZERO 옵션을 가장 많이 쓴다.

 

 

 

 

=  숫자 0 으로 채워짐

 

 

 

 

정수로 변환

 

fieldcatalog-edit_mask  = '__________'.

  fieldcatalog-fieldname   = 'FLTIME'.
  fieldcatalog-seltext_m   = 'Flight time'.
  fieldcatalog-edit_mask  = '__________'.
  fieldcatalog-col_pos     = 9.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

 

'_' 언더바를 10자리로 하는 이유? 최대 10자리까지 들어갈 수 있어서 10자리 수 언더바를 쓴다

 

 

 

 

 

 

 

 

 

 

 

소수점 없애기 

 

fieldcatalog-decimals_out '0'

 

  fieldcatalog-fieldname   = 'DISTANCE'.
  fieldcatalog-seltext_m   = 'Distance'.
  fieldcatalog-decimals_out = '0'.
  fieldcatalog-col_pos     = 12.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

 

 

 

 

결과물

 

 

반응형
LIST

라이센스 

sap서버 라이센스DB라이센스 두 개가 있다 

 

두 라이센스 갱신하는 법 

  • SAP 서버 라이센스는 SAP LOGON 프로그램에서 3개월마다 갱신 해야한다
  • DB라이선스는 (ABAP사이트에서 재다운)  Win SCP 프로그램에서 2년 마다 갱신을 해야한다.

 

 

 

먼저 서버를 올린 후에 WinSCP 프로그램 접속한다

 

아래처럼 차례로 치기 

sudo -i

비밀번호 치기

su npladm

startsap all 

 

 

WinSCP 프로그램 
root 사용자로 로그인 하기

 

 

호스트 이름 : 127.0.0.1 
포트번호 : 22
사용자이름 : root
비밀번호 : Down1oad

로그인 버튼 클릭

* 경고 창이 나오면 업데이트 해주면 된다!

 

 

... 폴더 클릭하면 root 사용자 최상단 폴더로 이동

 

 

 

hostname, hosts 이름 수정하는 법!
etc 폴더 > hostname, hosts 

 

여기서 hostname 수정(또는 hosts 수정)도 가능

 

 

 


DB 라이센스 갱신하는 방법

sybase 폴더 클릭

 

파일위치 : NPL/SYSAM-2_0/licenses 

 

 

SYBASE_ASE_TestDrive.lic  파일에 들어가면 '25년 3월 31일에 만료된다' 고 나온다

 

 

 

SYBASE_ASE_TestDrive.lic 는 2년마다 갱신해줘야 한다.  

어떻게? 기존 SYBASE_ASE_TestDrive.lic 파일을 삭제하고 재다운 받은 파일을 다시 넣으면 된다. 

 

SYBASE_ASE_TestDrive.lic 란?
DB라이센스를 인증해주는 파일

 

 

DB 라이센스 재다운로드

 

라이센스 재다운로드 위치

https://developers.sap.com/trials-downloads.html

 

 

처음에 라이센스 다운받았던 사이트에서 라이센스가 새로 업데이트가 된다.

 

 

 

 

 

 


 

서버 라이센스 갱신하는 법

 

중요! SAP 서버가 깜빡깜빡한 상태가 됐을때 SAP LOGON 로그온 하기

 

 

 

 

 

SAP LOGON에서 로그온할때 서버 라이센스 만료가 됐으면 맨아래에 이렇게 뜬다

 

 

 

기존 라이센스 삭제 후 재다운로드 하고 업로드하기 

 

sap* 

Down1oad 

로 로그인해서 slicense 검색하면 라이센스가 만료(두 번째 줄)됐다고 뜬다 

 

 

 

 

1. 두번째 줄 우클릭 delete 하기

 

2. 라이센스 재다운로드 하기 위해 Active Hardware Key 복사한다

 

 

3. minisap 사이트 또는 https://go.support.sap.com/minisap/#/minisap 사이트 접속

 

SAP License Keys for Preview, Evaluation and Developer Versions

 

go.support.sap.com

 

 

4. Netweaver 7.x sybase 버전 선택 > 아래 개인정보 작성 > 동의하기

이렇게하면 NPL.txt 파일이 다운로드가 된다.

 

 

 

 

5. 새로운 라이센스 설치 > NPL.txt 찾고 창뜨면 권한허용(Allow) > 설치완료

 

 

6. 새로운 라이센스 업로드 완료! 유효기간 valid 확인하기 

 

 

Installation Number 상태가 DEMOSYSYTE 로 자동으로 변경됐음

 

 

이 과정을 3개월마다 라이센스 갱신을 반복해줘야한다. (유효기간 만료 10일전에 알려줌)

 

 

 


만약 SAP LOGON 에서 비밀번호 5번 이상 오류시 잠금됐다면?

 

아이디 sap*

비밀번호 Down1oad 

로 로그온 하고 검색어 "su01" 친 후 

 

 

자물쇠 아이콘 클릭해서 잠금풀거나 잠금가능!

 

 

반응형
LIST

 

h2 연동 에러들

 

에러문구 

Caused by: java.lang.RuntimeException: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl,

 

 

해결

application.yml 또는 .properties 에 분명 오타 또는 띄어쓰기 잘못된거 있으니까 잘 보면 된다..

 

 

정말 삽질을 오래했는데 알고봤더니 jdbc 에서 j가 빠져있었다.. 

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/vintage-camera-shop

 

 

 

 

에러문구 : h2 DB가 제대로 연결이 안됐다?

java.lang.ClassNotFoundException: org.h2.Driver

 

 

해결

 build.gradle 에 runtimeOnly 'com.h2database:h2'  추가하면 된다!

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'

    compileOnly 'org.projectlombok:lombok'

    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    runtimeOnly('org.springframework.boot:spring-boot-devtools')
    
     runtimeOnly 'com.h2database:h2'
}
반응형
LIST

 

 

상품등록 후 새로고침하면 중복등록이 되는 문제가 발생

 

 

[실제 상품을 등록한 뷰 화면]

 

위처럼 상품 등록한 상태에서 새로고침을 누른다면 상품ID는 계속 올라가고 상품이 계속 등록되는 이슈가 생긴다.

 

 

 

[상품등록 POST - BasicItemController ]

@PostMapping("/add")
public String addItemV4(Item item){
    itemRepository.save(item);
    return "basic/item";
}

 

  • 전체 흐름
    • 실제 상품등록
    • 상품 상세 뷰로 뷰템플릿(basic/item)을 호출 - 끝
    • 상품 등록 (POST / add) URL 이 유지되어있는 상태
    • 새로고침하면 계속 POST / add 행위가 지속된다.
    • 새로고침 시 마지막 행위가 다시 요청되기 때문에 상품이 중복저장이 되는 이슈가 발생한다. 
  •  

 

 

 

 

 

문제 해결 방법은 리다이렉트! 

 

 

POST ▶ Redirect ▶ GET

실제 상품을 등록하고 뷰 템플릿으로 호출하는게 아니라 상품 상세화면으로 리다이렉트를 하면된다.

그렇게 하면 상품 등록 후 상품 상세 화면으로 다시 이동해서 (리다이렉트) 마지막에 호출한 GET /items/{id} 이 된다.

 

  • 전체 흐름 
    • 실제 상품등록 POST/ add
    • 상품 상세 화면으로 리다이렉트 Redirect items/{itemId} 호출 http://localhost:8080/basic/items/3
    • 웹 브라우저가 상품 상세를 새로 요청 GET /items/{id} 
    • 새로고침을 해도 GET /items/{id} 상품 상세 화면으로 이동
    • 문제 해결 

 

 

 

[상품등록 POST redirect - BasicItemController ]

@PostMapping("/add")
public String addItemV5(Item item) {
    itemRepository.save(item);
    return "redirect:/basic/items/" + item.getId();
}

 

※ 주의

+item.getId() 처럼 URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험

 

 

 

 

RedirectAttributes

RedirectAttributes 을 사용하여 URL 인코딩 문제 해결과 상품이 실제로 등록이 됐을때 "저장되었습니다." 메세지가 나오도록 해보자 

@PostMapping("/add")
public String addItemV6(Item item, RedirectAttributes redirectAttributes){
    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute("itemId", savedItem.getId());
    redirectAttributes.addAttribute("status", true);
    return "redirect:/basic/items/{itemId}";
}

 

RedirectAttributes 는 리다이렉트할 때 모델에 데이터를 전달할 수 있고 파라미터에 itemIdstatus 를 붙여주는 역할이다. 

  • basic/items/1?status=true

 

 

 

이제 저장완료 메세지를 만들어보자

 

리다이렉트  redirect:/basic/items/{itemId}  ▶ 최종 basic/item 뷰 템플릿을 호출한다. 

@Controller
@RequestMapping("/basic/items")
@RequiredArgsConstructor
public class BasicItemController {

    private final ItemRepository itemRepository;

    //상품 상세
    @GetMapping("/{itemId}")
    public String item(@PathVariable Long itemId, Model model){
        Item item = itemRepository.findById(itemId);
        model.addAttribute("item", item);
        return "basic/item";
    }
    
    ....

 

 

 

 

뷰템플릿

resources/templates/basic/item.html 

상품 상세

<div class="container">
    <div class="py-5 text-center">
        <h2>상품 상세</h2>
    </div>

    <!-- -->
    <h2 th:if="${param.status}" th:text="'저장 완료'"></h2>
    
    ...
  • th:if 해당 조건이 참일 때
  • ${param.status} : 파라미터 값을 조회할 수 있는 기
  • 참이면 '저장완료' 가 나온다.

 

 

 

상품 실제 등록시 '저장 완료' 메세지를 확인할 수 있다. 

반응형
LIST

+ Recent posts