어제에 이어서 진행됩니다.
집가고 싶다.
REPORT zr5a12108.
PARAMETERS pa_stuno TYPE zts5a1203-stuno.
DATA gv_stuln TYPE zts5a1203-lname.
DATA gv_stufn TYPE zts5a1203-fname.
DATA gv_stugd TYPE zts5a1203-gender.
DATA gv_stugt TYPE string.
DATA gv_claid1 TYPE zts5a1203-claid.
SELECT SINGLE lname fname gender claid
FROM zts5a1203
INTO (gv_stuln,gv_stufn,gv_stugd,gv_claid1)
WHERE stuno = pa_stuno.
IF gv_stugd = 'M'.
gv_stugt ='남성'.
ELSEIF gv_stugd = 'F'.
gv_stugt ='여성'.
ENDIF.
IF pa_stuno IS INITIAL.
WRITE 'You have to write Studebt Number'.
ELSEIF sy-subrc IS INITIAL.
WRITE: '학생이름 :', gv_stuln,gv_stufn,/
'성별 :', gv_stugt.
ELSE.
WRITE 'No data in here'.
ENDIF.
DATA gv_claid2 TYPE zts5a1202-claid.
DATA gv_areac TYPE zts5a1202-areac.
*
SELECT SINGLE claid areac
FROM zts5a1202
INTO (gv_claid2, gv_areac)
WHERE claid = gv_claid1.
NEW-LINE.
IF gv_claid2 = 'C001'.
WRITE: '소속반 : 1반' ,/
'지역: 서울' .
ELSEIF gv_claid2 = 'C002'.
WRITE: '소속반 : 2반' ,/
'지역: 부산' .
ELSE.
WRITE: '기타'.
ENDIF.
Write에서 / 쓰면 뛰어쓰기된다.
Write에서 2개이상 쓰려면 Write : 로 써야한다.
DATA gv_stuln TYPE zts5a1203-lname.
DATA gv_stufn TYPE zts5a1203-fname.
DATA gv_stugd TYPE zts5a1203-gender.
위처럼 쓰지않고
DATA : gv_stuln TYPE zts5a1203-lname,
gv_stufn TYPE zts5a1203-fname,
gv_stugd TYPE zts5a1203-gender.
이렇게 써도됨
이 문제를 풀면서 다른 친구들이 제시한 질문들
1. 변수 선언할때 pa, gv, gc_, 차이 다시 설명 듣고싶습니다
변수를 선언할때는 남들도 이해할 수 있는 코드를 만들어야한다.
그래서 변수를 설정할때 잘고려하여 말해야한다.
pa 파라메터, gv 글로벌변수, co 상수(constant), lc 로컬변수
2. Default value와 initial value 의 차이를 다시 한번 설명해주세요.
default value는 명확한 값을? 가지고 있다?
initial value 만들어놓고 타입에 관련된 틀을 만들어 놓은 것 입니다.
Ex) type i length 5. => 00000
Default value는 변수를 선언하면서 value값을 선언하는 것.
이경우 사용자가 사용할때 빈값의 부분이 아니라 입력되어 있는 기본값이 생긴다.
3. ZR5A191081 에 보면 실행시키면 옆에 돋보기가 안떠요
껐다 켜보세요,
4. START-OF-SELECTION. 을 쓰지 않아도 PARAMETER 키워드를 사용하면 사용자의 입력을 기다리는데 굳이 적어줘야하는지 궁금합니다.
event program에는 써주는게 좋은데 써주는 위치 기준은 보여주기 직전에 써주면됩니다.
조만간 알려드리겠습니다.
5. ZR5A06108의 테이블에는 성별 필드값이 M과 F만 존재하는데 gv_gender 케이스 문에 when others를 사용할 필요가 있는지 궁금합니다
gender 필드값이 공백인 경우도 있을 수 있으니까.
우리가 매번 1 : CN이라고 관계를 많이 줬었는데
공백이 있는경우 1,1 임에도 공백이 생겨서 0,1처럼 이뤄진다.
이 경우는 C : CN이 맞는 관계이다.
하지만 1 : CN 설정을 해둔다해서 강제성을 갖는것은 아니다.
se80으로 만들기~
select single 은 단권의 정보를 가져온다는 뜻.carrid = pa_car carrid EQ pa_car위처럼 써도 되고 아래처럼 써도된다,
Condition ( Selection Screen 1000 ) 뜻이 뭐야?
- Condition (Selection Screen 1000) 뜻
"Condition (Selection Screen 1000)"은 SAP ABAP에서 특정 조건을 입력하기 위한 선택 화면을 의미합니다. 사용자가 입력할 수 있는 파라미터(예: 항공사 코드, 항공편 번호 등)를 정의하기 위해 사용됩니다. 이 선택 화면에서 사용자는 필요한 정보를 입력하고, 프로그램이 그 정보를 바탕으로 데이터를 처리할 수 있게 됩니다.
OPEN SQL 뜻 뭐야?
OPEN SQL 뜻
OPEN SQL은 SAP ABAP에서 데이터베이스에 접근하기 위해 사용하는 SQL의 일종입니다. ABAP 프로그램 내에서 데이터를 조회, 삽입, 수정, 삭제하기 위해 사용됩니다. OPEN SQL은 데이터베이스 독립적이며, 다양한 데이터베이스 시스템에서 사용할 수 있도록 설계되었습니다.
IF sy-subrc IS NOT INITIAL. " <> 0 뜻이 뭐야?
IF sy-subrc IS NOT INITIAL. (<> 0 뜻)
sy-subrc는 ABAP에서 이전에 실행한 명령의 결과를 나타내는 시스템 변수입니다. 일반적으로 SELECT문, CALL FUNCTION 등과 같은 명령어의 실행 결과를 확인하기 위해 사용됩니다. sy-subrc가 0이 아니면(즉, NOT INITIAL) 해당 명령이 성공적으로 실행되지 않았음을 의미합니다. <> 0은 "0이 아니다"라는 뜻으로, 데이터가 없거나 오류가 발생했음을 나타냅니다.
RETURN. 을 쓰면 다시 SELECT문으로 돌아가 그런데 SELECT문과 WRITE는 IF문에 있는게 아니잖아 그런데 왜 SELECT문으로 돌아가는거지?
RETURN. 문은 현재 프로시저(예: START-OF-SELECTION)를 종료하고, 프로세스를 호출한 지점으로 돌아갑니다. 따라서 RETURN.이 실행되면 이후의 코드(SELECT문과 WRITE문)는 실행되지 않게 됩니다. 즉, SELECT문과 WRITE문은 IF문과 같은 블록 내에 위치하므로, IF 조건이 충족되지 않을 때만 실행됩니다. IF 조건이 충족되면 RETURN.이 호출되므로 SELECT문으로 돌아가는 것이 아니라 프로시저가 종료됩니다.
SY-SUBIC은 SELECT문과 멀어지면 쓸수 없다는데 어디범위까지 가능한 거지?
sy-subrc는 특정 명령어의 직후에만 그 결과를 확인할 수 있습니다. 일반적으로 sy-subrc를 확인하는 명령어가 실행된 바로 다음에 사용해야 하며, 그 이후에 다른 명령어가 실행되면 sy-subrc의 값은 변경될 수 있습니다. 따라서, 같은 블록 내에서 실행된 명령어에 대한 결과를 평가하는 데에만 사용해야 합니다.
MESSAGE i001(zmc5a12). 이거랑 MESSAGE s001(zmc5a12). 의 차이는 뭐야?
i001은 메세지박스로 뜨고 s001은 하단에 출력된다.
se91 새로운 T-코드
메세지 박스를 만든다.
원하는 출력값을 설정 가능하다.
덤프가 뜨기 때문에 x는 쓰지않는다.
사용자가 액션을 했을때 심각한 문제가 발생했습니다 처음부터 다시해주세요 라고 말하는것
= message a
정리하자면 위와 같다.
위의 사진은 아래와 같은 뜻이다.
TIP 하나 드립니다.
위의 경우는 gv_r의 식이 바뀌면 두번바꿔야하는데
그래서 아래와 같이 폼을 만듭니다
https://gogangnam.tistory.com/category/%EC%96%B4%EC%A9%8C%EB%8B%A4%20SAP?page=2
https://gomtui.tistory.com/category/SAP
지희님이 알려주신 SAP 잘하시는분들 티스토리
CALL BY Value SHIT!
" call by value and return
10과 112가 출력됨
20과 112가 출력됨
원칙은 이런 이유 때문에 전역변수(글로벌변수)는
폼안에 작성하지 않는다.
USING VALUE 가져다가 쓸거야.
CHANGING VALUE 바꿔 쓸거야.
call by reference
11이 출력된다.
11, 20, 20 이 출력된다.
레퍼런스는 바로 가져가기때문이다.
USING으로 써도 레퍼런스 개념으로 쓸 수 있는데 Value를 안쓰면 된다.
그렇기에 중요한게 바로 Value를 붙이고 안쓰고 차이다.
이거 차이점 기억하자
call by value
call by value and return
call by reference
화이팅 화이팅 화이팅 화이팅 화이팅
아래 지희님 코드 읽어보기
DATA: gv_a TYPE i VALUE 10.
" 호출할때 서브루틴으로 변수를 던져줄 수 있다.(Actual Parameter)
PERFORM test USING gv_a. "gv_a에 있는 값을 서브루틴으로 던질거야.
WRITE : / 'test 실행 결과 값 : ', gv_a, /.
PERFORM test_ch CHANGING gv_a.
WRITE: /'test_ch 실행 결과값 : ', gv_a, /.
PERFORM test_ref CHANGING gv_a.
WRITE: /'test_ref 실행 결과값 : ', gv_a.
*&---------------------------------------------------------------------*
*& Form test
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM test USING VALUE(pv_a). "pv_a로 던져준값을 받을거야. (Formal parameter)
pv_a = 20.
WRITE : /'call by value 폼 구문 내 gv_a값 : ', gv_a.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form test_ch
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GV_A
*&---------------------------------------------------------------------*
FORM test_ch CHANGING VALUE(cv_a).
cv_a = 11.
gv_a = 20.
WRITE : /'call by result and value 폼 구문 내 gv_a 값 : ',gv_a.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form test_ref
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GV_A
*&---------------------------------------------------------------------*
FORM test_ref CHANGING p_a.
p_a = 15.
gv_a = 20.
WRITE : /'call by reference 폼 구문 내 gv_a 값 : ',gv_a.
ENDFORM.