홈 · 개발 참고자료

개발 참고자료

[파워빌더 확인해볼것] 다이렉트빌 api연동 관련 (pbdom 사용 )

작성자
관리자
작성일
2016-09-17
조회
9209
분류
파워빌더
금번 다이렉트빌과의 연동 작업중 필요로 하실 분들이 많으실것 같아서 올려봅니다.


완성본은 아닙니다.


DB를 이용하여 만들어 보았으며 다이렉트빌에서 제공하는 API관련된 몇개의 테이블을 만들어 사용하였습니다.


필요하신분은 연락주시면 자세히 안내해 드리겠습니다.


1. 기본설정값 셋팅


2. 다이렉트빌에 접속 -> 인증번호 획득


3. 세금계산서 등록


4. 필요시 계산서 국세청 전송


* 문서전송시 필요한 각 항목은 DB에 저장후 CURSOR를 이용하여 조합하였습니다.




//===========================================================================//
// instance variable
string is_type, is_multi, is_sinch_no, is_svc_key, is_mst_key
string is_saup_no, is_mng_id, is_mng_pwd, is_url


inet inet_base
n_ir_msgbox iir_msgbox
//===========================================================================//


//===========================================================================//
// event name : ue_send
// MAIN EVENT
//===========================================================================//


long ll_row, ll_trow
int li_rc


IF IsValid(n_ir_msgbox) THEN
DESTROY n_ir_msgbox
END IF


iir_msgbox = CREATE n_ir_msgbox


li_rc = GetContextService( "Internet", inet_base )


IF li_rc < 0 THEN
Messagebox('Error','INTERNET 연결 오류 입니다.')
Return
END IF


dw_auth.Reset()
dw_auth.InsertRow(1)



If wf_get_config() < 0 Then
Return
End If


If wf_directbill_connect() < 0 Then
Return
End If


uo_1.visible = True


IF wf_directbill_insert(ll_row) < 0 THEN
uo_1.visible = False
Return
END IF


Messagebox("Notify","자료 등록이 완료되었습니다.")


uo_1.visible = False



//======================================================//
// function : wf_get_config
//
// return : integer
//
// description : Get User Configureation
//======================================================//


SELECT custid,
mng_id,
mng_pwd,
url
INTO :is_saup_no,
:is_mng_id,
:is_mng_pwd,
:is_url
FROM DBILL_MASTER;

IF sqlca.sqlcode <> 0 Then
Messagebox('ERROR','서버 접속 오류입니다.')
Return FAILURE
End If


IF Isnull(is_url) OR Len(Trim(is_url)) = 0 Then
Messagebox('Error','해당 사이트 연결 정보 없습니다.~n~r'+&
'접속자 정보 확인 바랍니다.')
Return FAILURE
End If


return SUCCESS


//===========================================================================//


// function name : wf_directbill_connect


// return : integer


// 다이렉트빌에 접속하여 기본정보를 가져온다.


//===========================================================================//



string ls_url, ls_temp, ls_name, ls_val, ls_msg, ls_val2, ls_name2, ls_obj
int li_rc, li_i, li_j, li_Max
boolean lb_flag = True


ls_url = is_url +&
"_auth.aspx?mode=GETSVCKEY" +&
"&saup_no=" + is_saup_no +&
"&mng_id=" + is_mng_id +&
"&mng_pwd=" + is_mng_pwd


li_rc = inet_base.GetURL(ls_url , iir_msgbox)


ls_temp = string(iir_msgbox.ib_data,EncodingUTF8!)


PBDOM_Builder lpbdom_Builder
PBDOM_Document lpbdom_Doc
PBDOM_element lpbdom_ele[]
PBDOM_attribute lpbdom_att[]


lpbdom_Builder = CREATE PBDOM_BUILDER


TRY
//Import File and generate XML Document
lpbdom_Doc = lpbdom_Builder.BuildFromString( ls_temp )
lpbdom_Doc.GetRootElement().getChildelements(lpbdom_ele)

li_Max = UpperBound(lpbdom_ele)
IF li_Max > 0 Then
for li_i = 1 to UpperBound(lpbdom_ele)
ls_obj = lpbdom_ele[li_i].GetObjectClassString()
If ls_obj = 'pbdom_element' Then
ls_name = lpbdom_ele[li_i].GetName()
ls_val = lpbdom_ele[li_i].gettext()
CHOOSE CASE ls_name
CASE 'RET'
IF ls_val <> 'OK' OR Isnull(ls_val) OR Len(ls_val) = 0 THEN
lb_flag = False
End If
CASE 'MSG'
IF lb_flag = False Then
MessageBox ("서비스 오류", ls_val)
Return Failure
End If
CASE 'COLUMN'
IF lpbdom_ele[li_i].HasAttributes() THEN
lpbdom_ele[li_i].getattributes(lpbdom_att)
IF UpperBound(lpbdom_att) > 0 Then
ls_name2 = lpbdom_att[1].gettext()
Choose Case ls_name2
Case 'sinch_no'
is_sinch_no = ls_val
Case 'svc_key'
is_svc_key = ls_val
Case 'mast_key'
is_mst_key = ls_val
END Choose
//dw_auth.SetItem(1, ls_name2,ls_val)
End If
END IF
CASE ELSE
END CHOOSE
End If
next
End If


CATCH (PBDOM_Exception except)
MessageBox ("Exception Occurred", except.Text)

FINALLY
DESTROY lpbdom_Builder

END TRY



Return SUCCESS




//===========================================================================//


// function name : wf_directbill_insert


// return : integer


// ERP 데이타를 다이렉트 빌로 INSERT한다.


// 국세청 전송을 아님


//===========================================================================//


string ls_send, ls_recieve, ls_data, ls_val, ls_name, ls_name2, ls_val2, ls_msg = '', ls_obj
int li_rc, li_i, li_Max
boolean lb_flag = True



ls_data = wf_directbill_gen('_document.aspx','INSERT',al_row)


ls_send = is_url + " _document.aspx?"+&
"&sinch_no=" + is_sinch_no +&
"&svc_key=" + is_svc_key +&
"&mst_key" + is_mst_key + "&mode=INSERT&" + ls_data


li_rc = inet_base.GetURL(ls_send , iir_msgbox)


ls_recieve = string(iir_msgbox.ib_data,EncodingUTF8!)


PBDOM_Builder lpbdom_Builder
PBDOM_Document lpbdom_Doc
PBDOM_element lpbdom_ele[]
PBDOM_attribute lpbdom_att[]


lpbdom_Builder = CREATE PBDOM_BUILDER


TRY
//Build String and generate XML Document
lpbdom_Doc = lpbdom_Builder.BuildFromString( ls_recieve )
lpbdom_Doc.GetRootElement().getChildelements(lpbdom_ele)

li_Max = UpperBound(lpbdom_ele)
IF li_Max > 0 Then
for li_i = 1 to UpperBound(lpbdom_ele)
ls_obj = lpbdom_ele[li_i].GetObjectClassString()
If ls_obj = 'pbdom_element' Then
ls_name = lpbdom_ele[li_i].GetName()
ls_val = lpbdom_ele[li_i].gettext()
CHOOSE CASE ls_name
CASE 'RET'
IF ls_val <> 'OK' OR Isnull(ls_val) OR Len(ls_val) = 0 THEN
lb_flag = False
End If
CASE 'MSG'
IF lb_flag = False Then
MessageBox ("서비스 오류", ls_val)
Return Failure
End If
CASE 'COLUMN'
IF lpbdom_ele[li_i].HasAttributes() THEN
lpbdom_ele[li_i].getattributes(lpbdom_att)
IF UpperBound(lpbdom_att) > 0 Then
ls_name2 = lpbdom_att[1].gettext()
Choose Case ls_name2
Case 'conversation_id'
dw_1.SetItem(al_row, 'conversation_id', ls_val)
END Choose
End If
END IF
CASE ELSE
END CHOOSE
End If
next
End If


CATCH (PBDOM_Exception except)
MessageBox ("Exception Occurred", except.Text)
// MessageBox( "PBDOM_Exception", lpbdom_Except.GetExceptionCode())
FINALLY
DESTROY lpbdom_Builder
END TRY



Return SUCCESS


//======================================================//
// function : wf_directbill_gen
// argument : string as_page 다이렉트빌의 호출 페이지
// string as_command 다이렉트 빌의 명령어
// long al_row erp의 계산서 row
// return : string
//
// description : Get User Configureation
//======================================================//
string ls_PARAMKEY, ls_PARAMKEY_ERPNM, ls_PARAMKEY_NULLYN, ls_PARAMKEY_ARRYN
string ls_rtn, ls_col, ls_temp, ls_report


DECLARE C1 CURSOR FOR
SELECT PARAMKEY,
PARAMKEY_ERPNM,
PARAMKEY_NULLYN,
PARAMKEY_ARRYN
FROM DBILL_PARAMKEY
WHERE PAGE = :as_page
AND COMMAND = :as_command
AND PARAMKEY_USEYN = 'Y'
ORDER BY PARAMKEY_SEQ;


OPEN C1;


ls_rtn = as_command



DO
FETCH C1 INTO :ls_PARAMKEY, :ls_PARAMKEY_ERPNM, :ls_PARAMKEY_NULLYN, :ls_PARAMKEY_ARRYN;
IF SQLCA.SQLCODE = 100 THEN EXIT
IF Not Isnull(ls_PARAMKEY) AND Len(Trim(ls_PARAMKEY)) > 0 THEN
IF Not Isnull(ls_PARAMKEY_ERPNM) AND Len(Trim(ls_PARAMKEY_ERPNM)) > 0 THEN
ls_report = dw_1.Describe(lower(ls_PARAMKEY_ERPNM)+".Coltype")
IF Left(ls_report,4) = 'char' THEN
ls_temp = dw_1.GetItemString(al_row,ls_PARAMKEY_ERPNM)
ELSE
ls_temp = string(dw_1.GetItemNumber(al_row, ls_PARAMKEY_ERPNM))
END IF
ELSE
ls_temp = ''
END IF

IF Isnull(ls_temp) THEN ls_temp = ''


ls_rtn = ls_rtn + '&' + ls_PARAMKEY + '=' + ls_temp

END IF

mle_1.text = ls_rtn

LOOP WHILE SQLCA.SQLCODE = 0


CLOSE C1;



Return ls_rtn




//===========================================================================//


// function name : wf_directbill_send


// return : integer


//===========================================================================//


string ls_send, ls_recieve, ls_data, ls_val, ls_name, ls_name2, ls_val2, ls_msg = ''
string ls_obj, ls_dockey
int li_rc, li_i, li_Max
boolean lb_flag = True
long ll_row



ls_data = ''


For ll_row = 1 to dw_1.Rowcount()
ls_dockey = dw_1.Object.conversation_id[ll_row]


If dw_1.Object.chk1[ll_row] = 'N' Then Continue

If Isnull(ls_dockey) or Len(Trim(ls_dockey)) = 0 Then Continue

If ls_data = '' Then
ls_data = ls_dockey
Else
ls_data = ls_data + ', ' + ls_dockey
End If

Next


ls_send = is_url + " _taxinvoice.aspx?"+&
"&sinch_no=" + is_sinch_no +&
"&svc_key=" + is_svc_key +&
"&mst_key" + is_mst_key + "&mode=REQNTS&" + ls_data


li_rc = inet_base.GetURL(ls_send , iir_msgbox)


ls_recieve = string(iir_msgbox.ib_data,EncodingUTF8!)


PBDOM_Builder lpbdom_Builder
PBDOM_Document lpbdom_Doc
PBDOM_element lpbdom_ele[]
PBDOM_attribute lpbdom_att[]


lpbdom_Builder = CREATE PBDOM_BUILDER


TRY
//Build String and generate XML Document
lpbdom_Doc = lpbdom_Builder.BuildFromString( ls_recieve )
lpbdom_Doc.GetRootElement().getChildelements(lpbdom_ele)

li_Max = UpperBound(lpbdom_ele)
IF li_Max > 0 Then
for li_i = 1 to UpperBound(lpbdom_ele)
ls_obj = lpbdom_ele[li_i].GetObjectClassString()
If ls_obj = 'pbdom_element' Then
ls_name = lpbdom_ele[li_i].GetName()
ls_val = lpbdom_ele[li_i].gettext()
CHOOSE CASE ls_name
CASE 'RET'
IF ls_val <> 'OK' OR Isnull(ls_val) OR Len(ls_val) = 0 THEN
lb_flag = False
End If
CASE 'MSG'
IF lb_flag = False Then
MessageBox ("서비스 오류", ls_val)
Return Failure
End If
CASE 'COLUMN'
IF lpbdom_ele[li_i].HasAttributes() THEN
lpbdom_ele[li_i].getattributes(lpbdom_att)
IF UpperBound(lpbdom_att) > 0 Then
ls_name2 = lpbdom_att[1].gettext()
Choose Case ls_name2
Case 'conversation_id'
For ll_row = 1 to dw_1.Rowcount()
ls_dockey = dw_1.Object.conversation_id[ll_row]


If dw_1.Object.chk1[ll_row] = 'N' Then Continue

If Isnull(ls_dockey) or Len(Trim(ls_dockey)) = 0 Then Continue

dw_1.Object.status[ll_row] = 'OK'
dw_1.Object.doc_key[ll_row] =

Next


END Choose
End If
END IF
CASE ELSE
END CHOOSE
End If
next
End If


CATCH (PBDOM_Exception except)
MessageBox ("Exception Occurred", except.Text)
// MessageBox( "PBDOM_Exception", lpbdom_Except.GetExceptionCode())
FINALLY
DESTROY lpbdom_Builder
END TRY



Return SUCCESS[출처] 다이렉트빌 api연동 관련 (pbdom 사용 ) (파워빌더 커뮤니티(PBExpertClub)) |작성자 짱