[파워빌더] 파워빌더에서 SAP RFC 호출하가...RFC 호출
DW의 속성을 이용하여 조상단에서
RFC 이름과 같은 기본정보를 인스턴스 변수로 저장해두고
유저오브젝트로 자동 호출하도록 만들어 둔다.
쿼리의 컬럼이름은 RFC 의 항목이름으로 맞춰서 사용하게 되면 DW를 만드는 것만으로도
RFC호출을 하게 만들수 있다.
DW조상단을 하나 만들어서
인스턴스 변수로 호출할 RFC 이름을 저장해 둔다.
ex : adw.is_sap_rfc_name_process 이런식으로 호출해서 사용할 것임
eZsap 라는 유저오브젝트를 만들어서 사용한다.
아래 스크립트는 사용중이 스크립트에서 가져온거라 그대로 사용하면 에러가 사방에서....
그냥 이런방식도 있다라고 참조만 하심이
Boolean lb_Receive
String args_cols[], args_datas[]
String rs_ev_type, rs_ev_msg
args_cols[1] = 'IV_ARBPL_F'
args_cols[2] = 'IV_ARBPL_T'
args_cols[3] = 'IV_WKDAT_F'
args_cols[4] = 'IV_WKDAT_T'
args_cols[5] = 'IV_AUFNR_F'
args_cols[6] = 'IV_AUFNR_T'
args_cols[7] = 'IV_TYPE'
args_datas[1] = ls_arbpl
args_datas[2] = ls_arbpl
args_datas[3] = ls_sdt
args_datas[4] = ls_edt
args_datas[5] = ls_aufnr
args_datas[6] = ls_aufnr
args_datas[7] = ls_gubun
/*
args_cols[] : 이거슨 RFC 파라메타의 이름
args_datas[] : 이거슨 RFC로 넘길 실제 데이터
rs_ev_type : 리턴 타입 ( S:성공 , E:오류)
rs_ev_msg : 리턴 메시지
*/
lb_Receive = eZsap.rfc_call_dw( dw_list, args_cols[], args_datas[], rs_ev_type, rs_ev_msg )
/*************/
eZsap.rfc_call_dw
/*************/
/*
DW 하나 보낼때 사용한다.
args_cols[] : 이거슨 RFC 파라메타의 이름
args_datas[] : 이거슨 RFC로 넘길 실제 데이터
rs_ev_type : 리턴 타입 ( S:성공 , E:오류)
rs_ev_msg : 리턴 메시지
*/
Oleobject SAP_Rfc
Oleobject SAP_Table[]
Boolean lb_Return = true
Boolean lb_SAP_Rfc_CALL = false
Long mnp, increase, ll_args, ll_DwCnt
Long ll_Rcnt[]
String ls_data, ls_tblNm, ls_RfcNm, ls_tbl_log, ls_Exception
ls_RfcNm = adw.is_sap_rfc_name_process
/* RFC 이름 셋팅 */
SAP_Rfc = Sap_OLE.Add( ls_RfcNm )
ll_args = UpperBound( args_cols[] )
for mnp = 1 to ll_args
//SAP_Rfc.exports("IV_AUFNR", "20000269")
SAP_Rfc.exports(args_cols[MNP], args_datas[MNP])
next
any la_call[]
/* SEND */
if lb_Return then
Try
lb_SAP_Rfc_CALL = SAP_Rfc.CALL
Catch (RuntimeError Re)
ls_Exception = Re.GetMessage()
End Try
if lb_SAP_Rfc_CALL = true then
rs_ev_type = func.nvl(SAP_Rfc.imports("EV_TYPE").VALUE, 'S')
rs_ev_msg = SAP_Rfc.imports("EV_MSG").VALUE
if rs_ev_type <> 'S' then
Messagebox("SAP 오류 메시지 :: EV_TYPE :: " + rs_ev_type, rs_ev_msg)
lb_Return = false
else
/* MNAIN */
increase++
ls_tblNm = adw.getsap_tbl_name_process_all()
is_TableS[UpperBound(is_TableS[]) + 1] = ls_tblNm
SAP_Table[increase] = SAP_Rfc.TABLES.Item( ls_tblNm )
ll_Rcnt[increase] = SAP_Table[increase].Rowcount
if ll_Rcnt[increase] >= 1 then
this.rfc_call_dw_setitem( SAP_Table[increase], adw, ls_tbl_log )
end if
end if
else
Messagebox("SAP_Rfc.CALL 오류", "RFC 실행 오류 ~r~n~r~n" + ls_Exception + "~r~n~r~n" + String(SAP_Rfc.Exception) )
end if
end if
Long ll_Cnt
ll_Cnt = UpperBound(SAP_Table[])
for mnp = 1 to ll_cnt
Destroy SAP_Table[MNP]
next
if isValid(SAP_Rfc) then Destroy SAP_Rfc
/***********************************/
함수 : rfc_call_dw_setitem
/***********************************/
Boolean lb_Return = true
Long i, Row, mnp, ll_Rcnt, ll_colCnt
Dec ld_data
String ls_ColNm, ls_data, ls_temp, ls_txtNm, ls_Type
ll_Rcnt = SAP_Table.Rowcount
ll_colCnt = Long(adw.Describe("DataWindow.Column.Count"))
ls_temp = adw.Classname()
adw.Reset()
for Row = 1 to ll_Rcnt
MNP = adw.insertRow(0)
for i = 1 to ll_colCnt
ls_ColNm = Upper(adw.Describe("#"+String(i)+".Name"))
choose case ls_ColNm
case 'DEV_END_DEV'
/* 여기에서 입력을 멈춘다. */
exit
end choose
ls_Type = adw.Describe(ls_ColNm+".ColType")
Choose Case ls_Type
Case "number"
ld_data = Long(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ld_data)
Case Else
if Mid(ls_Type, 1, 4) = "char" then
ls_data = func.n2b(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ls_data)
elseif left(ls_Type,7) = "decimal" or left(ls_Type,4) = "long" then
ld_data = Long(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ld_data)
else
ls_data = func.n2b(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ls_data)
end if
End Choose
ls_txtNm = adw.Describe(ls_colNm + "_t.Text")
if ls_txtNm = '!' or ls_colNm = '?' or ls_colNm = '' then
ls_txtNm = ls_colNm
end if
rs_Rfc_txt += String(today(), "yyyy:mm:dd") + " " + String(now()) + " :: ["+ ls_colNm +"] ==== [" + ls_data + "] :: " + ls_txtNm + " ~r~n"
next
next
Return lb_Return
RFC 이름과 같은 기본정보를 인스턴스 변수로 저장해두고
유저오브젝트로 자동 호출하도록 만들어 둔다.
쿼리의 컬럼이름은 RFC 의 항목이름으로 맞춰서 사용하게 되면 DW를 만드는 것만으로도
RFC호출을 하게 만들수 있다.
DW조상단을 하나 만들어서
인스턴스 변수로 호출할 RFC 이름을 저장해 둔다.
ex : adw.is_sap_rfc_name_process 이런식으로 호출해서 사용할 것임
eZsap 라는 유저오브젝트를 만들어서 사용한다.
아래 스크립트는 사용중이 스크립트에서 가져온거라 그대로 사용하면 에러가 사방에서....
그냥 이런방식도 있다라고 참조만 하심이
Boolean lb_Receive
String args_cols[], args_datas[]
String rs_ev_type, rs_ev_msg
args_cols[1] = 'IV_ARBPL_F'
args_cols[2] = 'IV_ARBPL_T'
args_cols[3] = 'IV_WKDAT_F'
args_cols[4] = 'IV_WKDAT_T'
args_cols[5] = 'IV_AUFNR_F'
args_cols[6] = 'IV_AUFNR_T'
args_cols[7] = 'IV_TYPE'
args_datas[1] = ls_arbpl
args_datas[2] = ls_arbpl
args_datas[3] = ls_sdt
args_datas[4] = ls_edt
args_datas[5] = ls_aufnr
args_datas[6] = ls_aufnr
args_datas[7] = ls_gubun
/*
args_cols[] : 이거슨 RFC 파라메타의 이름
args_datas[] : 이거슨 RFC로 넘길 실제 데이터
rs_ev_type : 리턴 타입 ( S:성공 , E:오류)
rs_ev_msg : 리턴 메시지
*/
lb_Receive = eZsap.rfc_call_dw( dw_list, args_cols[], args_datas[], rs_ev_type, rs_ev_msg )
/*************/
eZsap.rfc_call_dw
/*************/
/*
DW 하나 보낼때 사용한다.
args_cols[] : 이거슨 RFC 파라메타의 이름
args_datas[] : 이거슨 RFC로 넘길 실제 데이터
rs_ev_type : 리턴 타입 ( S:성공 , E:오류)
rs_ev_msg : 리턴 메시지
*/
Oleobject SAP_Rfc
Oleobject SAP_Table[]
Boolean lb_Return = true
Boolean lb_SAP_Rfc_CALL = false
Long mnp, increase, ll_args, ll_DwCnt
Long ll_Rcnt[]
String ls_data, ls_tblNm, ls_RfcNm, ls_tbl_log, ls_Exception
ls_RfcNm = adw.is_sap_rfc_name_process
/* RFC 이름 셋팅 */
SAP_Rfc = Sap_OLE.Add( ls_RfcNm )
ll_args = UpperBound( args_cols[] )
for mnp = 1 to ll_args
//SAP_Rfc.exports("IV_AUFNR", "20000269")
SAP_Rfc.exports(args_cols[MNP], args_datas[MNP])
next
any la_call[]
/* SEND */
if lb_Return then
Try
lb_SAP_Rfc_CALL = SAP_Rfc.CALL
Catch (RuntimeError Re)
ls_Exception = Re.GetMessage()
End Try
if lb_SAP_Rfc_CALL = true then
rs_ev_type = func.nvl(SAP_Rfc.imports("EV_TYPE").VALUE, 'S')
rs_ev_msg = SAP_Rfc.imports("EV_MSG").VALUE
if rs_ev_type <> 'S' then
Messagebox("SAP 오류 메시지 :: EV_TYPE :: " + rs_ev_type, rs_ev_msg)
lb_Return = false
else
/* MNAIN */
increase++
ls_tblNm = adw.getsap_tbl_name_process_all()
is_TableS[UpperBound(is_TableS[]) + 1] = ls_tblNm
SAP_Table[increase] = SAP_Rfc.TABLES.Item( ls_tblNm )
ll_Rcnt[increase] = SAP_Table[increase].Rowcount
if ll_Rcnt[increase] >= 1 then
this.rfc_call_dw_setitem( SAP_Table[increase], adw, ls_tbl_log )
end if
end if
else
Messagebox("SAP_Rfc.CALL 오류", "RFC 실행 오류 ~r~n~r~n" + ls_Exception + "~r~n~r~n" + String(SAP_Rfc.Exception) )
end if
end if
Long ll_Cnt
ll_Cnt = UpperBound(SAP_Table[])
for mnp = 1 to ll_cnt
Destroy SAP_Table[MNP]
next
if isValid(SAP_Rfc) then Destroy SAP_Rfc
/***********************************/
함수 : rfc_call_dw_setitem
/***********************************/
Boolean lb_Return = true
Long i, Row, mnp, ll_Rcnt, ll_colCnt
Dec ld_data
String ls_ColNm, ls_data, ls_temp, ls_txtNm, ls_Type
ll_Rcnt = SAP_Table.Rowcount
ll_colCnt = Long(adw.Describe("DataWindow.Column.Count"))
ls_temp = adw.Classname()
adw.Reset()
for Row = 1 to ll_Rcnt
MNP = adw.insertRow(0)
for i = 1 to ll_colCnt
ls_ColNm = Upper(adw.Describe("#"+String(i)+".Name"))
choose case ls_ColNm
case 'DEV_END_DEV'
/* 여기에서 입력을 멈춘다. */
exit
end choose
ls_Type = adw.Describe(ls_ColNm+".ColType")
Choose Case ls_Type
Case "number"
ld_data = Long(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ld_data)
Case Else
if Mid(ls_Type, 1, 4) = "char" then
ls_data = func.n2b(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ls_data)
elseif left(ls_Type,7) = "decimal" or left(ls_Type,4) = "long" then
ld_data = Long(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ld_data)
else
ls_data = func.n2b(SAP_Table.cell(Row, ls_ColNm))
adw.setitem( MNP, i, ls_data)
end if
End Choose
ls_txtNm = adw.Describe(ls_colNm + "_t.Text")
if ls_txtNm = '!' or ls_colNm = '?' or ls_colNm = '' then
ls_txtNm = ls_colNm
end if
rs_Rfc_txt += String(today(), "yyyy:mm:dd") + " " + String(now()) + " :: ["+ ls_colNm +"] ==== [" + ls_data + "] :: " + ls_txtNm + " ~r~n"
next
next
Return lb_Return