구슬이네 IT & Media / IT 와 미디어를 바라봅니다

ABAP 형변환

IT 개발/SAP-ABAP 2012. 4. 20. 16:17


원문 : http://www.abapschool.com/board/xboard/read.php?boardname=qna&list_num=773&offset=1155&PHPSESSID=509f1a872cc40ebdcacf32fa72f33320

 

형변환이 대한 것입니다. abap help 에 나와 있는 내용을 정리해 봤습니다.

generic type 이외에 predefined type (사전정의된유형) 에 대하여만 참고 바랍니다.

 

generic type 은 Assign 되는 source field 의 타입속성을 따르게 때문에 따로 정리할 수가 없을 것 같습니다.

 

Predefined type 에 대하여는 다음과 같습니다.

( 자세한 설명은 도움말을 참고하여 주시기 바랍니다.)

 

source field Type C => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type D => target field type C, D, F, I, B, S, P, STRING, T, X, XSTRING

source field Type F => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type I, B OR S => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type N => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type P => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type STRING => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type T => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type X => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

source field Type XSTRING => target field type C, D, F, I, B, S, N, P, STRING, T, X, XSTRING

 

보시면 아시겠지만 형변환이 별 차이가 없습니다.

 

[첫번째 질문]

 

DATA L_CHAR TYPE CHAR 10 VALUE '         0      '.

DATA L_INT      TYPE I.

 

* L_CHAR 의 문자가 숫자뿐이라면

IF L_CHAR CO '0123456789'.

    L_INT = L_CHAR.

ELSE.

* 숫자이외의 문자가 있으므로 변환불가입니다.

ENDIF.

 

이렇게만 해주시면 됩니다.

 

[두번째 질문]

아밥에서 NULL은 거의 사용을 하지 않습니다.

 

사전정의된 데이터 타입은 기본적으로 정의될때 기본값을 가지므로

NULL 에 대한 점검이 거의 없다고 보시면 됩니다.

 

궂이 NULL 을 갖는 값을 원하신다면

 

CLEAR field WITH NULL.

 

로 CLEAR 하셔야 합니다.

 

질문은 문자열 치환방법이나 공백제거 방법에 대하여 물어보신것으로 하고 답변드립니다.

(사용방법은 개인별로 방법이 다 달라서 제가 가끔 사용하는 방법위주로 말씀드리겠습니다)

문자열 치환 :

단일문자 치환

DATA L_STRING TYPE CHAR10 VALUE 'ABCDEFGHIJ'.

* L_STRING 을 모두 소문자로 변환한다면

TRANSLATE L_STRING TO LOWER CASE.

* 또는

TRANSLATE L_STRING USING 'AaBbCcDdEeFfGgHhIiJj'.

 

공백제거( 문자열에 대하여 )

DATA L_STRING TYPE CHAR10 VALUE '   BAS   '.

 

SHIFT L_STRING RIGHT DELETING TRAILING SPACE.

 

등등...

 

문자열에서 특정한 문자(공백같은) 에 대하여 NULL 값으로 주는 것은 힘들 것 같습니다.

 

수고하세요.



1. watchpoint를 걸기 원하는 앞부분에 breakpoint를 건다.

2. 실행시켜서 디버기화면으로 가면 editor 앞에 watchpoint 버튼을 클릭한다.

 

image

아래와 같이 변수를 적고 No Additional Condition에 수식을 입력한다.

수식에 해당 변수가 어떨때 멈출지 수식을 입력한다. EQ 혹은 = 로 입력한다.

image

3. F8눌러서 진행시키면 해당 조건에 걸린다.

 

참고할만한 다른 인터넷 강좌 : ABAP 디버깅 강좌

http://www.abapgogo.com/lec_basic/8631



1. 호출하는 프로그램에서 실행하고 나서 필요하면 get parameter로 값을 불러서 쓴다.

  DATA: t_msg(1).

  SUBMIT callpg
         WITH aa EQ aa
         WITH bb EQ bb
         WITH cc EQ cc
         AND RETURN.

  GET PARAMETER ID 'MSG_ID' FIELD t_msg.
  MOVE t_msg TO msg.
 
2. 호출당하는 프로그램에서 호출하는 프로그램에 값을 넘겨주고
싶으면 set parameter로 값을 쓴다. 
    SET PARAMETER ID 'MSG_ID' FIELD msg.
    LEAVE PROGRAM.



참고문서

http://arraybox.com/entry/ASP%EC%97%90%EC%84%9C-SAP-Remote-Function-Call
 

<%@ Language=VBScript %>
<% Option Explicit %>
<%
Dim sapConnection, functionCtrl
Dim retcd
Dim theFunc
Dim returnFunc
Dim docs
Dim T_PERSON
Dim i
Dim pernr

'SAP 접속 함수
Sub ConnectSAP() 
 Set sapConnection = CreateObject("SAP.Logoncontrol.1") 
 Set sapConnection = sapConnection.NewConnection 
 
 sapConnection.System = "KKK" 
 sapConnection.ApplicationServer = "erperp"
 sapConnection.SystemNumber = 00
 sapConnection.user = "USERID" 
 sapConnection.Password = "USERPASS" 
 sapConnection.client = "300" 
 sapConnection.language = "3"
 sapConnection.Codepage = "8500"  
 
 retcd=sapConnection.Logon(0,true) 
 If RetCd = False Then 
  Response.write "SAP Logon Failed. retcd="  & retcd
  Response.End 
 end if 
 
 Set functionCtrl = CreateObject("SAP.Functions") 
 functionCtrl.Connection = sapConnection 
End Sub

'SAP 접속 종료 함수
Sub CloseSAP()
 functionCtrl.Connection.logoff
 Set sapConnection = Nothing
 Set functionCtrl = Nothing
End Sub

ConnectSAP()


functionCtrl.Connection = sapConnection
Set theFunc = functionCtrl.Add("FUNC_NAME") 
' 인자를 넣을 때는 아래와 같이
'theFunc.exports("PERNR") = "00014657 "
returnFunc = theFunc.Call

If returnFunc = True Then         

 Set T_PERSON = theFunc.Tables ( "T_SEND")
 For i = 1 To T_PERSON.ROWCOUNT
  
  Response.write T_PERSON(i,"PERNR") & " - "
  Response.write T_PERSON(i,"ENDDA") & " - "
  Response.write T_PERSON(i,1) & " - "
  Response.write T_PERSON(i,2) & " - "
  Response.write "<BR>"

 Next

End if


Set theFunc = Nothing

CloseSAP()
%>
<br><br>
RFC호출 페이지입니다.




만들어지는것 자체는 잘 되는데 운영에 넘기는데 뭐가 안되서 제법 삽질을 했습니다.

구글에서 찾다보니 자료는 많이 있네요.

제가 해본바로는 개발 --> 운영을 넘긴후에는 꺼꾸로

SOAMANAGER에서 해당 웹서비스를 CREATE 해줌. 해주고 나서 저장하면 Inactive상태가 되는데 여기서 SAVE를 한번 더해주면 그제서야 Active 상태가 됨

그러고 나면 SICF 에서 검색안되던것도 검색이 되고 개발클래스에서도 Enterprise Service에서 보여짐

참고문서 : http://theagussantoso.blogspot.com/2010/08/create-web-service-from-sap-function.html



CTS (Change and Transport System)

개발 서버에서 변경된 사항을 운영 서버에 반영하거나 고객 환경에 적합하도록 커스터마이징 하는데 사용하는 TOOL

Request No : CTS와 같은 의미로 사용됨
Task : Request No 밑에 실제 작업 정보가 저장된 Object

(1) 소스의 버전 확인

ABAP Editor에서 메뉴 [유틸리티] -> [버전] -> [버전관리] 선택
과거 프로그램의 소스 버전이 Request No를 기준으로 조회됨
복구를 원할경우 이전버전을 선택한 후 복구 버튼 클릭



(2) 내가 고치고 있는 프로그램이 어떤 CTS인지 알고 싶을 때

프로그램을 편집기로 여시고 메뉴에서
Goto(이동) > Object Directory Entry(오브젝트디렉토리엔트리)
선택하시면 팝업창이 뜸. 여기서 잠금개요(F5) 버튼 클릭
그러시면 어느 CTS로 걸려있는지 나옴


(3) CTS가 안따져서 새로 따고 싶을 때

se80에서 프로그램에서 우클릭-Other function - Write Transport Entry 눌러서 생성하시면 됩니다.


(4) Request No가 삭제가 안될 때

SE09에서 삭제할때는 맨 하위 노드부터 삭제해서 올라와야 함
만약 테이블 Lock이 걸렸다면 SM12에서 Lock 해제할 수 있음
그게 아니라 Request가 Lock이 걸렸다면 SE03에 가보시면 "요청/태스크" 밑에 "오브젝트 잠금해제(전문가툴)"
가 있음.  그걸로 해제하시면 Lock해제 됨





*. CTS를 따고 나서 해당 소스에 들어가서 Utilities - Versions - Version Management 선택하면 현재 CTS 따진 번호가 나온다.

CTS 전송을 취소하려면 Request No 하위의 Task No에서 해당 소스를 삭제하면 된다.

다시 수정을 하려고 하면 CTS번호가 새로 따지게 된다.






1. 아래의 내용을 텍스트파일로 만든다 (ex : sapdebug.txt)

[FUNCTION]
Command=/H
Title=Debugger
Type=SystemCommand

 2. 실행시 팝업창 등 /h를 입력할 수 없는 상태에서 이 파일을 팝업창으로 드래그앤 드롭

3. 그다음과정에서 자동으로 디버깅 상태로 들어감





ERP 업그레이드이후 많이 발생하는데 그때마다 까먹고 있다가 찾아서 고치곤 했다.

헷갈리지 말고 잘 정리해 놔야겠다.


 참고문서 :
http://www.abapschool.com/board/xboard/read.php?boardname=qna&list_num=971&offset=840&PHPSESSID=509f1a872cc40ebdcacf32fa72f33320


결론부터 말씀드리면 버전 업 되면서 발생된 버그 입니다. 덤프 사유는 'REUSE_ALV_FIELDCATALOG_MERGE' 펑션 코딩 내용중 "READ REPORT" 라는 명령에서 오류를 발생 시켰는데 이 명령은 호출 프로그램 소스를 읽어 드리는 것이며 소스코딩 72문자열로 읽어 들이다가 길이가 맞지 않아 발생된 것입니다. SAP 버전이 ECC 로 오면서 아밥 소스 라인 길이를 255자 까지 지원 하다 보니 위 과거 펑션은 지원이 제대로 되지 못하는 것이지요. 해결방법은 우선 아밥 에디터 상단 메뉴에 "유틸리티->세팅" 에 가셔서 "ABAP편집기" 탭 내의 "편집기" 탭이 있는데 하위 체크박스 "Downwards-Comp. Line Lngth(72)" 라는 것을 체크 하시면 되구요 물론 질문하신 소스에 대해 이렇게 설정 하시면 우선 경고창이 뜰 겁니다. 경고 내용은 소스코딩이 72 보다 크다는 내용이구요. 경고를 확인 하시고 소스 코딩 에디터를 보시면 빨간 점선이 우측으로 표시될겁니다. 이것이 72문자 Dead line 이 구요, 이 라인 이후 문자(코딩) 를 지우시면 위의 덤프는 발생 되지 않을 겁니다. 물론 이건 최선책이 아니구요 ALV 구현 방식을 최신 소개되는 클래스 "CL_GUI_ALV_GRID" 를 사용 하시면 됩니다.