[ 파워빌더.공통함수 - 네이버 Open Api 예제 ]

 

☞   

 

정말 초 간단하게 만든거구요.

네이버의 사진검색 Api 를 통해 검색하고 싶은것을 입력하고 검색 버튼을 누르면

그 검색어가 들어간 것의 정보를 가져와서 DW에 저장하여 뿌려줍니다(사진은 뺏습니다.추가해보세요^^;)

 

String ls_req_status, ls_file, ls_search
String ls_xml_request, ls_returnmsg
String ls_xml_response
Integer li_rtn
Boolean lb_rtn

//internetexception  inetException
ls_search = sle_1.text
gs_search = ls_search
ls_file = "http://openapi.naver.com/search?key="+"********"+"&target=image&query="+ls_search+"&display=100&start=1"
OleObject req
req = CREATE oleobject
li_rtn = req.ConnectToNewObject("Msxml2.XMLHTTP.3.0")
IF li_rtn < 0 THEN
 ls_returnmsg = "XMLHttpRequest Connect OLE Object : "
 lb_rtn = False
ELSE
 req.open (2, ls_file, false)
 req.send ()
 ls_req_status = Trim(req.StatusText)
 IF req.Status <> 200 THEN
  ls_returnmsg = "HTTP request failed : " + String(req.Status) + " : " + ls_req_status
  lb_rtn = False
 ELSE
  String ls_temp
  ls_temp = String(req.responseText)
  dw_1.reset()
  dw_1.importstring(XML!, ls_Temp)
  lb_rtn = True 
 END IF
END IF

req.DisconnectObject()
Destroy req

로직은 이렇구요. 저 위에 키 넣는 부분에 발급받으신 키를 넣으시면 됩니다.

importstring을 통해 XML! 형식으로 데이터윈도우에 집어 넣는 거구요.

데이터윈도우는 당연히 XML에 포맷에 맞게 구성을 하셔야 됩니다.

(데이터윈도우를 여시고 Layout->Default 보시면 XML 탭에서 구성한게 보이실 거에요^^)

 

그러면 테스트 해보시길...(PB 11버전입니다.)

Posted by 농부지기
,

  [ ◎ 한글 코드 테이블을 이용한 초성 검색 ]     

 

 

☞   

 

한글 코드 테이블을 이용해서 한글 초성 검색을 해봅시다.

 

까페를 뒤져 보면 한글 초성에 관한 내용들이 나오는데. 문제는 유니코드를 지원하는

 

파워빌더 10 이상에서만 가능하고 하위 버전에서는 적용이 안됩니다.

 

파빌 버전에 상관없이 .. 시스템이 완성형이건 조합형이건 유니코드 이건 상관없이

 

그야 말로 단신 무식한 방법 소개 합니다.

(때론 단순 무식한 방법이 제일 정확하고 빠를때도 있습니다.)

 

컴퓨터 상에서 한글을 표현할 수 있는 가지수는 전부 11172 가지 입니다.

 

이걸 모두 테이블 하나 만들어서 모두 때려 집어 넣고 불러 오는 겁니다. !!!

 

언제 다입력 하냐고 물으시면 첨부 화일을 다운 로드 하셔서 조금만 손질하셔서 테이블에 쓱싹 로드 하시면

 

입력하는 공수는 없으니 걱정 마시라...

 

첨부화일을 열어보시면 위와 같은 암호 같은 글자 들이 나열되어 있습니다. (16진수)

 

첫번쨰 컬럼 : 그냥 순번 1 - 11172

두번째 컬럼 : 완성형 코드 KSC 5601-1987

세번째 컬럼 : Unified 한글 완성형 한글의 확장판

네번째 컬럼 : 조합형 한글 코드

다섯번째 컬럼 : 유니코드 1.0 한글코드

여섯번째 컬럼 : 유니코드 1.1 한글코드

이곱번째 컬럼 : 유니코드 2.0 한글코드

여덟번때 컬럼 : 발음 KIYEOK A SSANGKIYEOK (ㄱ ㅏ ㄲ -->갂)

마지막 컬럼 : 초성 글자

 

일단 테이블을 만듭시다...

(오라클 기준으로)

 


CREATE TABLE HCODE
(
 SEQ            NUMBER (10) NOT NULL,
 CODE_WANSUNG   VARCHAR2 (4),
 CODE_UNIFIED   VARCHAR2 (4),
 CODE_JOHAP     VARCHAR2 (4),
 CODE_UNI1      VARCHAR2 (4),
 CODE_UNI11     VARCHAR2 (4),
 CODE_UNI20     VARCHAR2 (4),
 BIGO           VARCHAR2 (100),
 CHSUNG         VARCHAR2 (10)
) ;

 

유니크 인덱스도 만들어 놓고..

CREATE UNIQUE INDEX HCODE_PKEY ON HCODE (SEQ ASC) ;

 

첨부 화일을 텍스트를 테이블에 부어요...

(프로그램 짜서 붓든지.. 오렌지 써서 넣든지.. 각자 알아서 넣으세요..)

 

자 여기까지 따라 오셨나요..?

 

데이터 다 집어 넣었으면 이제 한글 코드 헥사값으로 바꿔 볼까요..?

 

문자를 헥사 값으로 바꿔주는 프로그램이 필요 하지만 고맙게도

 

오라클 함수중에 문자를 헥사 값으로 바꿔주는 함수가 있어요..  (이런거는 오라클이 좋습니다.)

 

헥사 코드를 보아하니.. 완성형으로 값이 뛰어 나오네요.. 윈도우 7 같은 환경이나 유니코드를 지원 하는 툴에서는

 

다른 값이 뛰어 나올수도 있어요..

 

자 그럼 헥사 값에 해당되는 초성은 완성형 임으로..

 

 

 

 

 

 

Posted by 농부지기
,

[ 파워빌더.공통함수 - escape ]

 

☞   JavaScript함수인 escape사용 하기

 

OleObject wsh
wsh = CREATE OleObject
li_rc = wsh.ConnectToNewObject( "MSScriptControl.ScriptControl" )
wsh.AllowUI = true

//JAVAScript

wsh.language = "javascript"
//wsh.addcode("function URLEncoding(s) { return encodeURI(s); }")
wsh.addcode("function URLEncoding(s) { return escape(s); }")

//Blob lb_data
//lb_data = Blob('URLEncoding("') + Blob("어린이", EncodingANSI!) + Blob('");')
//ls_temp = wsh.eval(lb_data)
ls_temp = wsh.eval('URLEncoding("어린이")')

Posted by 농부지기
,

[ 파워빌더.공통함수 - xmlParser ]

 

☞   Xml 을 읽는 예제.. Xml Parsing .. MS XML Parser (PB 9 이전 버전서 유용할 듯)

 

제가 예전에 PBDN에 올렸었던 자료입니다..

MsXML 을 이용하여 xml을 읽는 예제입니다..

파빌 9버전 이전 버전은 유용할 듯...하네요..

소스 참조 하세요..

oleobject xmldoc, root, rootlist, rootnode, childlist, childnode
Integer li_rc, i, j
Boolean lb_test
string ls_file

//객체를 만들고
xmldoc = Create oleobject
li_rc = xmldoc.ConnectToNewObject("MSXML2.DOMDocument.3.0")
IF li_rc < 0 THEN
fmsg("Connecting to COM Object Failed", "Error: " + String(li_rc))
DESTROY xmldoc
Return
END IF

//파일을 연결하고
ls_file = "D:\Z_Work\book.xml"
lb_test=xmldoc.load(ls_file)
IF lb_test = false THEN
//Demonstrate the parseError attribute
fmsg("Load of XML doc Failed", "ErrorCode: "+string(xmldoc.parseError.ErrorCode)+ "~n~r" &
+ "FilePosition: " +string(xmldoc.parseError.Filepos)+ "~n~r" &
+ "Line: " +string(xmldoc.parseError.Line)+ "~n~r" &
+ "LinePosition: " +string(xmldoc.parseError.Linepos)+ "~n~r" &
+ "Reason: " +string(xmldoc.parseError.Reason)+ "~n~r" &
+ "SourceText: " +string(xmldoc.parseError.SrcText))
DESTROY xmldoc
Return
END IF

//내용을 읽고
root = xmlDoc.documentElement
rootlist = root.childnodes
For i = 0 To rootlist.length - 1
rootnode= rootlist.item[i]
childlist = rootnode.childnodes
mle_1.text += string(i) +"~r~n"

For j = 0 To childlist.length -1
childnode = childlist.item[j]
mle_1.text += string(i) + "." + string(j) + " : " + childnode.text + "~r~n"
Next
mle_1.text += "~r~n"
Next


//oleobject xmldoc, root,rootlist, rootnode, child, childnode
If IsValid(xmldoc) Then DESTROY xmldoc
If IsValid(root) Then DESTROY root
If IsValid(rootlist) Then DESTROY rootlist
If IsValid(rootnode) Then DESTROY rootnode
If IsValid(childlist) Then DESTROY childlist
If IsValid(childnode) Then DESTROY childnode

Posted by 농부지기
,

[ 파워빌더.공통함수 - 메일1 ]

 

☞   

 

까페 게시판에 있던 메일 프로그램을 테스트 해보니

 

메일 인증에서 오류가 나기에 최신버젼 찾아서 올립니다.

 

우선 프로그램은 여기서 받으시면 되고요.

 

http://www.topwizprogramming.com/freecode/emailsmtp.zip

 

 

소스

 

1. Global Variables에 아래 한줄 추가해 주시고요. (로컬 변수에 선언해도 간게 없을듯 싶어유...)

 

    n_smtp gn_smtp // 메일 발송을 위한 변수

 

2. 아래 2개만 사용하실 라이브러리에 복사해 넣으시고유 (다른건 디자인적인거라 의미 없을듯 싶어유...)

    n_smtp
    n_winsock

 

3. 버튼 하나 맹그신후에유...

 

String ls_body, ls_server, ls_uid, ls_pwd
String ls_filename, ls_port, ls_encrypt
Integer li_idx, li_max
Boolean lb_html, lb_Return
UInt lui_port

SetPointer(HourGlass!)

 

// HTML 메일로 보낼때 아래꺼 주석 지워주세유...

//If cbx_sendhtml.Checked Then // 체크박스 만들어서 HMTL / TEXT 메일 선택하도록 한거임
// ls_body  = "<html><body bgcolor='#FFFFFF' topmargin=8 leftmargin=8><h2>"
// ls_body += of_replaceall(mle_body.text, "~r~n", "<br>") + "</h2>"
// ls_body += "</body></html>"
// lb_html = True
//Else
// ls_body = mle_body.text
// lb_html = False
//End If

// *** set email properties *********************


gn_smtp.of_ResetAll()
gn_smtp.of_SetPort(25)
gn_smtp.of_SetServer("메일서버이름")
gn_smtp.of_SetReceipt(False)
gn_smtp.of_SetLogFile(False, "smtp_logfile.txt")
gn_smtp.of_SetSubject("메일 제목")
gn_smtp.of_SetBody("메일 내용", False)
gn_smtp.of_SetFrom("발송메일주소", "발송자이름")
gn_smtp.of_AddAddress("수신자메일주소", "수신자이름")

 

// *** set Userid/Password if required **********
gn_smtp.of_SetLogin("아이디", "패스워드")

 

// *** add any attachments **********************

// 여긴 첨부파일임 gn_smtp.of_AddAttachment(파일이름인가 경로인가 넣어주면될듯)
//li_max = lb_attachments.TotalItems()
//For li_idx = 1 To li_max
// ls_filename = lb_attachments.Text(li_idx)
// gn_smtp.of_AddAttachment(ls_filename)
//Next

 

// *** send the message *************************
// 메일 서버 로그인 방식

ls_encrypt = ""
choose case ls_encrypt
 case "SSL"
  lb_Return = gn_smtp.of_SendSSLMail()
 case "TLS"
  lb_Return = gn_smtp.of_SendTLSMail()
 case else
  lb_Return = gn_smtp.of_SendMail()
end choose

If lb_Return Then
 MessageBox("SendMail", "Mail successfully sent!")
Else
 MessageBox("SendMail Error", gn_smtp.of_GetLastError())
End If

 

끝...

 

쉽게 응용 가능 하실꺼유...

 

테스트 환경 : Windows7 (64Bit), Appeon 6.5 다 됨...

 

태그 : 사무직이 이런걸 해야되는건지 ㅠㅠ

Posted by 농부지기
,

[ 파워빌더.공통함수 - 10진수 <-> 36진수 ]

 

☞   

 

응? 파워빌더에서 진수 변환을 쓸 일이 있을까?

오늘 드디어 쓰게 됐네요. ^^;

 

PK는 1개 이고..

MS SQL NChar(17) 로 만들어진 테이블이 있습니다.

중복 방지용으로만 코드를 만들었으면,

정말 넘치고 넘칠 정도로 데이터를 저장 할 수 가 있습니다.

 

예) YYYYMMDD+SEQ(9)

(연번을 9자리 주는 경우는 없죠 ㅡㅡㅋ)

 

근데, 문제는 코드 생성을 각각 자리마다 무언가 의미를 주다보니

Sequence를 겨우 2자리만 쓸 수 있는 상태입니다.

 

즉, "01" ~ "99"... "100" Error!!!!

관계있는 Table도 있어서 18자리로 늘리기도 힘들고..

 

그래서 머리 굴린 결과... ('' ) ( '') ( ..) (.. ) 데구르르 ~~

0~9 A~Z 총 36개 문자를 이용해서 36진수로 해결하자.

2자리로도 "01" ~ "ZZ" 까지 총 1295개 처리가 가능하더라구요.

Sort 도 문제 될게 없고.. 굿~!

 

Table 설계 하시는 분.. 개발자를 위해서 Seq 넉넉하게 잡아주세요!!!

또, Seq 짧게 잡으면 미워합니다. ㅎㅎㅎ

 

 

//------------------------------------------

// 10진수 -> 36진수 변환

// gf_decto36(Decimal ad_Value) Return String

//------------------------------------------

String  ls_Char, ls_36
Decimal ld_Num


Do While ad_Value > 0
 ld_Num = Mod(ad_Value, 36)
 ls_Char = Mid("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", ld_Num + 1, 1)
 ls_36  = ls_Char + ls_36
 ad_Value = Int(ad_Value / 36)
Loop

Return ls_36

 

 

//------------------------------------------

// 36진수 -> 10진수 변환

// gf_36todec(String as_Value) Return Decimal

//------------------------------------------

String  ls_Reverse, ls_Char
Decimal ld_Pos, ld_Num, ld_Dec


ls_Reverse = Reverse(as_value)

For ld_Pos = 1 To Len(ls_Reverse)
 ls_Char = Upper(Mid(ls_Reverse, ld_Pos, 1))
 ld_Num = Pos("123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", ls_Char)
 ld_Dec = ld_Dec + ( ld_Num * ( 36 ^ ( ld_Pos - 1 ) ) )
Next

Return ld_Dec

Posted by 농부지기
,

[ 파워빌더.공통함수 -  시간 지연 시키기  ]

 

☞   

 

Fuction wf_delay(integer ai_second) return None

 

//ai_second 만큼 뺑뺑이를 돌린다.
time lt_start
lt_start = now()
do while true
 do while Yield()
 loop
 if SecondsAfter ( lt_start, now() ) >= ai_second then
  exit
 end if
loop

Posted by 농부지기
,

[ 파워빌더.공통함수 - 숫자를 한들로 변환  ]

 

☞   

 

//* ======================================================================*
//*  f_amount() : 아라비아 숫자로 표기된 금액을 한글로 변환해 주는 함수
//*              천조단위( 16자리 ) 까지 표시 ( 1,000,000,000,000,000 )
//*      
//*  Example    :  ₩123,456,789   
//*            --> 일금 일억이천삼백사십오만육천칠백팔십구 원정
//*  구분(flag) : '1' 한글, '2' 한자.
//*---------------------------------------------------------------------- *
Double  db_amount
String ls_amount, ls_money,  ls_knum,    ls_kor_amount,Ls_hanja,ls_mhanja
string   ls_hanja_amount,ls_return
Long l_cnt,    l_cipher,     l_cipher_1
//*----------------------------------------------------------------------*
db_amount   =   target
ls_amount   =  String(db_amount) //  입력된 수치값을 문자로 변환
l_cipher    =  len(ls_amount)  //  자릿수를 구함
l_cipher_1  = l_cipher + 1  //  단위를 구하기 위해 초기값 부여( 자릿수 + 1 )
//*----------------------------------------------------------------------*
FOR l_cnt = 1 TO  l_cipher
l_cipher_1   = l_cipher_1  -  1   //  자릿수가 증가할때 감소시킴( 초기값 : 자릿수 )
//*----------------------------------------------------------------------*
CHOOSE CASE Mid(ls_amount, l_cnt, 1)  //  해당 자릿수의 숫자 변환( 한글 )
  CASE '1'
 If L_Cnt = L_cipher Then
  ls_knum = '일'
  ls_hanja =  '壹'
 Else
  ls_knum = ''
  ls_hanja =  ''
 End If
  CASE '2'
 ls_knum = '이'
 ls_hanja =  '貳'
  CASE '3'
 ls_knum = '삼'
 ls_hanja =  '參'
  CASE '4'
 ls_knum = '사'
 ls_hanja =  '四'
  CASE '5'
 ls_knum = '오'
 ls_hanja =  '五'
  CASE '6'
 ls_knum = '육'
 ls_hanja =  '六'
  CASE '7'
 ls_knum = '칠'
 ls_hanja =  '七'
  CASE '8'
 ls_knum = '팔'
 ls_hanja =  '八'
  CASE '9'
 ls_knum = '구'
 ls_hanja =  '九'
  CASE ELSE
 ls_knum = '00'
 ls_hanja =  '  '
END CHOOSE
//*----------------------------------------------------------------------*
CHOOSE CASE l_cipher_1 // 해당 자릿수의 단위 표시
  CASE  1
//  If L_Cnt = L_cipher Then
//   ls_knum = '일'
//   ls_hanja =  '壹'
//  Else
//   ls_knum = ''
//   ls_hanja =  ''
//  End If   
    ls_money = ''
 ls_mhanja = '' 
CASE  2,  6, 10, 14
 ls_money = '십'
 ls_mhanja = '十' 
  CASE  3,  7, 11, 15
 ls_money = '백'
 ls_mhanja = '百' 
  CASE  4,  8, 12, 16
 ls_money = '천'
 ls_mhanja = '千' 
  CASE  5
 ls_money = '만'
 ls_mhanja = '萬' 
  CASE  9
 ls_money = '억'
 ls_mhanja = '億' 
  CASE 13
 ls_money = '조'
 ls_mhanja = '兆' 
END CHOOSE
//*----------------------------------------------------------------------*
//*  해당 자릿수의 단위가 0(ZERO)인 경우 단위표시를 하지 않음
//*----------------------------------------------------------------------*

IF ls_knum <> '00' THEN
 ls_kor_amount = ls_kor_amount + ls_knum + ls_money
 ls_hanja_amount = ls_hanja_amount + ls_hanja + ls_mhanja
ELSEIF l_cipher_1  =   5  THEN
 IF Mid(ls_amount, l_cnt - 3, 4) <> '0000'  THEN
  ls_kor_amount = ls_kor_amount + ls_money
    ls_hanja_amount = ls_hanja_amount + ls_mhanja  
 END IF
ELSEIF l_cipher_1  =   9  THEN
 IF Mid(ls_amount, l_cnt - 3, 4) <> '0000'  THEN
  ls_kor_amount = ls_kor_amount + ls_money
    ls_hanja_amount = ls_hanja_amount + ls_mhanja     
 END IF
ELSEIF l_cipher_1  =  13  THEN
 ls_kor_amount = ls_kor_amount + ls_money
    ls_hanja_amount = ls_hanja_amount + ls_mhanja    
ELSE
 ls_kor_amount = ls_kor_amount
   ls_hanja_amount = ls_hanja_amount
END IF
NEXT
//*----------------------------------------------------------------------*
//ls_kor_amount =  '일금 ' + ls_kor_amount + ' 원정'
//*----------------------------------------------------------------------*

if flag = '2' then
ls_return = ls_hanja_amount
else
  ls_return = ls_kor_amount
end if

RETURN trim(ls_return)
//*======================================================================*
http://cafe.naver.com/pentaeduclub.cafe

Posted by 농부지기
,

[ 파워빌더.공통함수 - 실행중인 파일명 찾기 ]

 

☞   

 

현재 윈도우에서 해당 파일명으로 프로세스가 실행중인지 아닌지 알고 싶을 때,

다음과 같이 해서도 찾을 수 있습니다.

 

외부함수 선언)

Function ulong CreateToolhelp32Snapshot (ulong dwFlags, ulong th32ProcessID) Library "KERNEL32.DLL"
Function boolean Process32First (ulong hSnapshot, ref PROCESSENTRY32 lppe) Library "KERNEL32.DLL" alias for "Process32First;Ansi"
Function boolean Process32Next (ulong hSnapshot, ref PROCESSENTRY32 lppe) Library "KERNEL32.DLL" alias for "Process32Next;Ansi"
Function boolean CloseHandle (ref ulong hObject) Library "KERNEL32.DLL"
Function ulong GetCurrentProcess() Library "KERNEL32.DLL" Alias For "GetCurrentProcess"

 

스트럭쳐 선언)

global type PROCESSENTRY32 from structure
 ulong  dwSize
 ulong  cntUsage
 ulong  th32ProcessID
 ulong  th32DefaultHeapID
 ulong  th32ModuleID
 ulong  cntThreads
 ulong  th32ParentProcessID
 long  pcPriClassBase
 ulong  dwFlags
 character szExeFile[260]
end type

 

스크립트)

비교하고자 하는 파일이 실행중이면 True, 그렇지 않으면 False 를 Return

String ls_File_nm  //비교할 실행파일명

ulong ll_SnapShot
ulong lul_null
boolean lb_Res,lb_rtn = false
string ls_exefile //읽어온 프로세스의 실행파일명
PROCESSENTRY32 lstr_Entry


SetNull(lul_null)

ll_SnapShot = CreateToolhelp32Snapshot(15, lul_null)

lstr_Entry.dwSize = 1506 // structure의 size

// 실행중인 프로세스들의 첫번째 정보를 가져온다.
Process32First(ll_SnapShot, lstr_Entry)
if lstr_Entry.szExeFile = ls_File_nm  then
 lb_rtn = true
ELSE

 do while true
   lb_Res = Process32Next(ll_SnapShot,lstr_Entry);
   if not lb_Res then  exit //더이상 프로세스가 없으면 Exit
  ls_exefile = trim(lstr_Entry.szExeFile)
  ls_exefile = trim(ls_exefile)
  if ls_exefile = ls_File_nm  then    lb_rtn = true
 loop

END IF

CloseHandle(ll_SnapShot)

return lb_rtn

 

Posted by 농부지기
,

[ 파워빌더.공통함수 - 최소/최대/닫기 버튼 막기 ]

 

 

☞   

 

MDI 시트에서 최소/최대/닫기 버튼을 사용할 수 없게 하려면 먼저 사용자 이벤트 중 PBM_SYSCOMMAND을 선택하고, ue_syscommand라는 사용자 이벤트를 생성합니다. ue_syscommand 이벤트에서 다음 코드를 사용하면

Minimize/Maximize/Close 버튼을 눌러서 해당 윈도우를 '최소/최대/닫기'하려는 동작은 취소됩니다.

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

IF message.wordparm = 61488 THEN // 최대화 버튼
message.processed = TRUE
message.returnvalue = 1
END IF
IF message.wordparm = 61472 THEN // 최소화 버튼
message.processed = TRUE
message.returnvalue = 1
END IF
IF message.wordparm = 61536 THEN // 닫기 버튼
message.processed = TRUE
message.returnvalue = 1
END IF

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Test Version : 7.0.3 Build 10009

Posted by 농부지기
,