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

 

 

☞   

 

 

 

ancestorReturnValue 란 말 그대로 이벤트를 상속받아서 사용할 때, 해당 이벤트에 return 값이 있을 경우에 자손단에서는 조상단에서 이벤트를 수행하다가 return 된 값들을 체크할 때 사용할 수 있습니다.

 

예를 들어서, 저장하는 이벤트 ue_save를 만들구요.

거기에서는 trigger로 저장전에 체크하는 이벤트 ue_save_pre 라는 걸 만들었다고 가정합니다.

 

ue_save_pre는 리턴값이 있구요.

 

조상 이벤트에서 정상이면 1, 먼가 문제있으면 -1을 return 하도록 해놨다고 칩시다.

 

스크립트상에서는 다음과 같다고 할 수 있습니다.

ue_save() 이벤트내에서는

if this.event ue_save_pre() = -1 then

  return

end if

....

 

ue_save_pre() 이벤트내에서는

....//어떤 체크 로직이나 셋팅 로직

if 에러사항 then

  return -1

else

 return 1

end if

 

이를 상속받은 오브젝트에서 아무런 수정없이 그대로 사용하면 상관없는데, ue_save_pre에 먼가 기술을 하게 된다면..

 

조상단에서 -1을 호출해도 다시 자손에서 새로 기술된 스크립트까지 수행을 합니다.

그런데 자손단에서는 오류가 없어서 return 1 을 수행하게 되면, 앞의 -1은 무시가 될 수 있습니다.

 

이럴때 자손의 ue_save_pre 이벤트에서 조상의 return 값을 체크해주시면 됩니다.

 

if ancestorReturnValue = -1 then return -1

//이젠 자손에서 추가로 기술될 스크립트를 기술합니다.

...

return 1

Posted by 농부지기
,

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

 

☞   

 

code128인경우 4자리 이상일때 적용이 가능.숫자 같은경우는 짝수일때 적용했을때는 단축효과가 있다...

영문대소문자구분 숫자표현 가능...

바코드 폰트는 링크걸린 사이트에서 받을수 있음..

바코드는 demo용 ... 고치는 방법도 있음. 이 부분은 알아서 하시길...

다른 자료 같은 경우는 유럽쪽 소스 내용 같은 경우는 문자코드열때문에 우리나라와 변환이 안맞아 사용이 힘들었는데..

서핑중 발견.. ㅋㅋㅋ  

아래 내용을 함수로 만들고 링크사이트에서 바코드 폰트를 받으셔서 사용하시면 됩니다..

다른 바코드관련 자료도 있으니 바코드관련 업무에 참고 하세요...

 

// PowerBuilder Source Code for IDAutomation.com Code 128 Barcode Fonts
// Copyright ⓒ 2002, IDAutomation.com, Inc. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////////
//
//      NOTE: The following code is only an example that was provided by a client.
//      IDAutomation.com, Inc. does not guarantee, support or troubleshoot
//      PowerBuilder source code.
//
// To use this function the developer needs to create an external function,
// Set function arguments and paste all the codes below.
//
///////////////////////////////////////////////////////////////////////////////////
//
// This function will convert input to a data string formatted for our
//      Code 128 Barcode Fonts. This is a code 128 "auto" function.
//
//      This barcode font is available at:
//      http://www.bizfonts.com/code128fonts/
// Download a demo version from:
//      http://www.advancemeants.com/code128fonts/download.htm
//
//      You may incorporate our Source Code in your application
//      only if you own a valid Multi-user or Corporate Distribution
//      license from IDAutomation.com, Inc. for the associated font and
//      the copyright notices are not removed from the source code.
//
// Arguments:
// Input(Pass By value)
//    Datatype String
//    Name  as_input
//
// Output(Pass By reference)
//    Datatype String
//    Name  as_ouptut
//
//    Copyright, IDAutomation.com, Inc. 2002. All rights reserved.
///////////////////////////////////////////////////////////////////////////////////

string ls_c128_starta
string ls_c128_startb
string ls_c128_startc
string ls_c128_start
string ls_c128_stop
Long  ll_len,i
Integer li_curr_char
String ls_curr_char
string ls_curr_encoding
Long  ll_curr_value
Long  ll_weighted_tot
string ls_datatoencode
Integer li_check_digit
String ls_c128_checkdigit
string ls_datatoprint, as_input , as_output


as_input = trim(sle_2.text)

If Isnull(as_input) OR as_input = '' Then
 Return -1
End IF

ls_c128_starta = char(203)
ls_c128_startb = char(204)
ls_c128_startc = char(205)
ls_c128_stop = char(206)

// Here we select character set A, B or C for the START character
ll_len = len(as_input)
li_curr_char = Asc(Mid(as_input, 1, 1))
If li_curr_char < 32 Then ls_c128_start = ls_c128_starta
If li_curr_char > 31 AND li_curr_char < 127 Then ls_c128_start = ls_c128_startb
If ((ll_len > 4) AND Isnumber(mid(as_input,1,4))) Then ls_c128_start = ls_c128_startc

// 202 is the FNC1, with this Start C is mandatory
If li_curr_char = 202 Then ls_c128_start = ls_c128_startc
If ls_c128_start = char(203) Then ls_curr_encoding = "A"
If ls_c128_start = char(204) Then ls_curr_encoding = "B"
If ls_c128_start = char(205) Then ls_curr_encoding = "C"

For i = 1 to ll_len
 // check for FNC1 in any set 
 If ((Mid(as_input,i,1)) = Char(202)) Then
  ls_datatoencode = ls_datatoencode + char(202)
 // check for switching to character set C 
 ElseIf ((i < ll_len - 2) AND (Isnumber(mid(as_input,i,1))) and (isnumber(mid(as_input,i + 1,1))) AND (Isnumber(Mid(as_input,i,4)))) OR ((i < ll_len) AND (Isnumber(mid(as_input,i,1))) AND (Isnumber(Mid(as_input,i + 1,1))) And (ls_curr_encoding = "C")) Then
  // switch to set C if not already in it  
  If ls_curr_encoding <> "C" Then ls_datatoencode = ls_datatoencode + char(199)
  ls_curr_encoding = "C"
  ls_curr_char = (Mid(as_input,i,2))
  ll_curr_value = Long(ls_curr_char)
  // set the CurrentValue to the number of String CurrentChar  
  If (ll_curr_value < 95 AND ll_curr_value > 0 ) Then ls_datatoencode = ls_datatoencode + char(ll_curr_value + 32)
  If ll_curr_value > 94 Then ls_datatoencode = ls_datatoencode + char(ll_curr_value + 100)
  If ll_curr_value = 0 Then ls_datatoencode = ls_datatoencode + char(194)
  i = i + 1
 // check for switching to character set A
 ElseIf (i <= ll_len) AND ((ASC(Mid(as_input,i,1)) < 31) OR ((ls_curr_encoding = "A") AND (ASC(Mid(as_input,i,1)) > 32 AND (asc(mid(as_input,i,1))) < 96))) Then
  // switch to set A if not already in it 
  If ls_curr_encoding <> "A" Then ls_datatoencode = ls_datatoencode + char(201)
  ls_curr_encoding = "A"
  // Get the ASCII value of the next character
  li_curr_char = (asc(mid(as_input,i,1)))
  If li_curr_char = 32 Then
   ls_datatoencode = ls_datatoencode + char(194)
  ElseIf li_curr_char < 32 then
   ls_datatoencode = ls_datatoencode + char(li_curr_char + 96)
  ElseIf li_curr_char > 32 Then
   ls_datatoencode = ls_datatoencode + char(li_curr_char)
  End IF
 // check for switching to character set B
 ElseIf (i <= ll_len) AND ((ASC(mid(as_input,i,1))) > 31 AND (ASC(mid(as_input,i,1))) < 127) Then  
  // switch to set B if not already in it
  If ls_curr_encoding <> "B" Then ls_datatoencode = ls_datatoencode + char(200)
  ls_curr_encoding = "B"
  // Get the ASCII value of the next character
  li_curr_char = (asc(mid(as_input,i,1)))
  If li_curr_char = 32 Then
   ls_datatoencode = ls_datatoencode + char(194)
  Else
   ls_datatoencode = ls_datatoencode + char(li_curr_char)
  End IF
 End IF  
Next

// ***** Calculate Modulo 103 Check Digit *******

// Set WeightedTotal to the value of the start character
ll_weighted_tot = (ASC(ls_c128_start) - 100)
ll_len = Len(ls_datatoencode)

For i = 1 to ll_len
 // Get the ASCII value of each character
 li_curr_char = (asc(mid(ls_datatoencode,i,1)))
 // Get the Code 128 value of CurrentChar according to chart
 If li_curr_char < 135 Then ll_curr_value = li_curr_char - 32
 If li_curr_char > 134 Then ll_curr_value = li_curr_char - 100
 If li_curr_char = 194 Then ll_curr_value = 0
 // multiply by the weighting character
 ll_curr_value = ll_curr_value * i
 // add the values together
 ll_weighted_tot = ll_weighted_tot + ll_curr_value
Next
// divide the WeightedTotal by 103 and get the remainder, this is the CheckDigitValue
li_check_digit = Mod(ll_weighted_tot,103)
// Now that we have the CheckDigitValue, find the corresponding ASCII character from the table
If li_check_digit < 95 AND li_check_digit > 0 Then ls_c128_checkdigit = char(li_check_digit + 32)
If li_check_digit > 94 Then ls_c128_checkdigit = char(li_check_digit + 100)
If li_check_digit = 0 Then ls_c128_checkdigit = char(194)
// Check for spaces or "00" and print ASCII 194 instead
// place changes in data to print
ll_len = Len(ls_datatoencode)
For i = 1 to ll_len
 ls_curr_char = mid(ls_datatoencode,i,1)
 If ls_curr_char = " " Then ls_curr_char = char(194)
 ls_datatoprint = ls_datatoprint + ls_curr_char
Next

// Get Printable String
as_output = ls_c128_start + ls_datatoprint + ls_c128_checkdigit + ls_c128_stop + " "
 
Return 0

 

☞  

 

예.. 폰트는 다운 로드 하심 되구요... 물론 demo라 약간 제약이 있는데..
그 부분은 좀만 생각하심 .. 여기까지. 메일주심..
아 그러구 바코드활용(1) 은 kan13(ean13) 관련 내용입니다.
http://cafe.naver.com/pentaeduclub/4850
http://cafe.naver.com/pentaeduclub/4849
일반적으로 폰트로 하는것은 code39 같은 경우는 일번적으로 많이 쓰는데 kan,upc,code128등 다른
바코드는 encoding을 하지 않으면 폰트를 이용하더라도 인식이 안됩니다.
kan(ean코드 ) 아무 다른 업체의 ean바코드 폰트를 이용해도 되지만,
다른방식의 폰트는 해당업체의 모듈(인코딩방식)과 연동되기 때문에 조금식 인코딩시 넘어오는 문자가 다릅니다. 그래서 바코드 인식이 안되는 경우가 많습니다.
인코딩 소스를 받았다면 그 해당 업체의 폰트를 받아야지만 정확한 바코드가 인식되는 경우가 많음...ㅋㅋ

☞  http://cafe.naver.com/pentaeduclub/990 참고 하시면 퐅트 없이도
패턴을 가지고 이렇게 표현도 가능 합니다. 폰트를 깔아주는 수고를 덜수도 있구요..
demo 폰트 조작할 필요도 없구요...
이거를 kan, code128에 적용함 해볼려구요..
대칭관계라 쉽지만은 안더라구요....

 

폰트를 수정하는 방법을 하면 가능 하지 않을까 생각 됩니다...
ls_c128_starta = char(203)
ls_c128_startb = char(204)
ls_c128_startc = char(205)
ls_c128_stop = char(206)
이 부분을 폰트를 다른 사용하지 않는 글자로 대체 하시는 방법을 하시면 가능 할것 같은데..
폰트수정은 폰트 수정하는 툴을 이용... 저도 생각만 해봐서.. 가능하지 않을까 사료됨.

 

프로젝트 하시다 보면 간단한 바코드 폰트로 해결 되는 경우도 있지만

CODE128A,CODE128B

이과 같이 CODE128 에 Check digit 없이 Code 128 character set 은 A로 처리 되는경우등은 일반적으로 바코드 폰트로만은

처리기가 힘듭니다.

그래서 대부분 관련 ActiveX 같은걸 구매해서 사용하죠..

 

Java Barcode Servlets 된 WEB으로 바코드 폰트를 이미지화 하여 원하는 바코드 형식으로 만들수 있는 곳인데

프로젝트 하시다 보면 해당 바코드가 어떤 형태인지 확인해 보실때 사용하시면 좋을것 같습니다.

WEB으로 구축시에는 직접 사용하시는것도 괜찮을것 같네요

 

저는 보통 생성된 바코드를 확인할때 주로 많이 사용합니다...

처음 구매한 바코드나 접하지 않은 바코드일경우 해당 바코드의 타입과 설정을 알고 대응하게는 좋으니깐요..^^

 

바코드 접해 보지 않은분은 바코드에 대해 공부하신다 생각 하고 한번 확인해 보면 좋을것 같습니다.

 

URL은 아래와 같습니다.

 

http://www.idautomation.com/java/linearservlet.html

 

 

카페 등업점수가 얼마 남지 않았네요...

자주 글을 쓰야 하는데..ㅎㅎ 노력해보겠습니다.

Posted by 농부지기
,

☞   

 

ole media player 활용에 대한 자료가 많이 부족하여 저도 여기저기 많이 돌아다니다가

몸으로 부딪혀보고 하다가 이렇게 짧은 지식이나마 공유하고자 이렇게 올려봅니다.

1. insert control로 windows media player를 추가한다.

간단하게 이렇게 화면을 디자인했습니다 ㅎㅎ

 

 

 

2. 목록 불러오기

   미리 text파일로 목록들을 넣어 놓고 저장. 그 파일을 불러와서 데이터 윈도우에 Import 시킵니다.

   다른 방법으로 하셔도 됩니다.

 

   Script 내용

string docname, named
integer value
value = GetFileOpenName("Select File",  &
        docname, named, "txt", "Text Files (*.txt))
if (IsNull(docname)) then return
if (value = 1) then
dw_1.importfile(docname)
dw_1.setfocus()
end if

 

text파일 내용은 아래처럼 만들었습니다.

   e:\MP3\01. Intro - 모두 다 소리쳐 - 빅뱅(Bigbang) - Remember.mp3

   e:\MP3\02. 오,아,오 - 빅뱅(Bigbang) - Remember.mp3

   e:\MP3\03. 붉은 노을 - 빅뱅(Bigbang) - Remember.mp3

 

3. 시작하기

if dw_1.rowcount() = 0 then
 messagebox('알림','연주 할 앨범을 선택하세요 ! ! ! ! !')
 return
end if

if dw_1.getrow() = 0 then
 play_row = 1
else
 play_row = dw_1.getrow()
end if

DW_1.SELECTROW(0,FALSE)
DW_1.SELECTROW(play_row,TRUE)
dw_1.scrolltorow(play_row)
sle_1.text = dw_1.object.filelist[play_row]
ole_1.object.Controls.play()

//실행할 파일

ole_1.object.url = sle_1.text

 

4. 정지하기

//정지

 ole_1.object.Controls.stop()

 

//일시정지

// ole_1.object.Controls.pause()

5. 다음 곡으로 자동으로 넘어가기

ole media player의 Event에 보시면 Playstatechange() 이라고 있습니다.

NewState에 따라 처리하는 방식으로 했습니다.

endofstream()이나 Newstream()으로는 전혀 처리가 안되더라구요 ㅜㅜ

 

Newstate에 대하여서는 다 확인은 안해봤습니다

참조하세요^^

1 : 노래를 정상 혹은 비정상적으로 정지를 시킬때 발생합니다.

3 : 노래가 연주(재생)둥 일때 발생합니다.

8 : 노래의 연주가 정상적으로 종료되었을때 발생합니다.

9 : 스트림이 시작점 위치로 왔다는 의미 갔습니다.

 

자동으로 넘어갈때 Newstate의 옵션을 보면

8 -> 9로 넘어가는 것을 확인했습니다. ㅎㅎ

 

이것 때문에 고생많이 했습니다^^

 

//Playstatechange() script

If NewState = 9 and OldState = 8 Then
 if dw_1.rowcount() = 0 then
  messagebox('알림','연주 할 앨범을 선택하세요 ! ! ! ! !')
  return
 end if
 
  play_row++
  if play_row > dw_1.rowcount() then
   play_row = 1
  end if
  DW_1.SELECTROW(0,FALSE)
  DW_1.SELECTROW(play_row,TRUE)
  dw_1.scrolltorow(play_row)
  sle_1.text = dw_3.object.filelist[play_row]
  ole_1.object.url = sle_1.text
  ole_1.object.Controls.play()
  return
end if

//옵션체크하기위함

OldState = NewState

 

6. Instance 내용

long play_row, OldState

 

7. 기타 옵션

   - 볼륨 조절

      ole_1.object.settings.volume=100

 

이상 두서없이 제가 아는 내용에서 정리를 해보았습니다.

 

여러분께 도움이 되셨는지 모르겠습니다^^

Posted by 농부지기
,

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

 

 

☞   

 


(파빌 9.0 기준)

visible user object로 숫자판을 하나 만든다.

picture button을 이용하여 다음과 같이 만들었다.

 

해당 object에 instance 변수 선언:

GraphicObject which_control

 

Local External Functions 나 Global Exterbal Functions 에 다음을 선언한다.

SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"

 

user event 를 하나 만든다.

/****************************************************************

Event 명 : ue_clicked()

argument : string arg_tag

*****************************************************************/

if isvalid(which_control) then 
 CHOOSE CASE typeof(which_control)
  CASE  DataWindow!
   DataWindow    dw_which
   dw_which = which_control
   dw_which.setfocus()   
  CASE CommandButton! 
   CommandButton cb_which
     cb_which = which_control
     cb_which.setfocus() 
  CASE SingleLineEdit!
   SingleLineEdit sle_which
     sle_which = which_control
    sle_which.setfocus()
  CASE Editmask!
   EditMask    ed_which
   ed_which = which_control
   ed_which.setfocus()
  CASE ELSE
   //messagebox('' , 'else')
 END CHOOSE
else
   //messagebox('' , 'err' )
end if
choose case arg_tag
 case '1'
  keybd_event(49 , 0, 0, 0)
 case '2'
  keybd_event(50 , 0, 0, 0)
 case '3'
  keybd_event(51 , 0, 0, 0)
 case '4'
  keybd_event(52 , 0, 0, 0)
 case '5'
  keybd_event(53 , 0, 0, 0)
 case '6'
  keybd_event(54 , 0, 0, 0)
 case '7'
  keybd_event(55 , 0, 0, 0)
 case '8'
  keybd_event(56 , 0, 0, 0)
 case '9'
  keybd_event(57 , 0, 0, 0)
 case '0'
  keybd_event(48 , 0, 0, 0)
 case 'B'//back space
  keybd_event(8 , 0, 0, 0)
 case 'P' //점 
  keybd_event(110 , 0, 0, 0)
 case '+'
  keybd_event(107 , 0, 0, 0)
 case '-'
  keybd_event(109 , 0, 0, 0)
 case 'U'//위로
  keybd_event(38 , 0, 0, 0)
 case 'D'//아래로
  keybd_event(40 , 0, 0, 0)
 case 'L'//왼쪽
  keybd_event(37 , 0, 0, 0)
 case 'R'//오른쪽
  keybd_event(39 , 0, 0, 0)
 case 'DEL'
  keybd_event(46 , 0, 0, 0)
 case 'TAB'
  keybd_event(9 , 0, 0, 0)
end choose

/*****************************************************************/

각 버튼 클릭이벤트에는 버튼에 맞는 아규먼트를 넣어서 위의 이벤트를 실행한다.

예) 숫자1 버튼의 clicked 이벤트 :

     parent.event ue_clicked('1')

 

그리고, 이렇게 만든 오브젝트를 윈도우에서 붙여서 사용한다.(uo_keypad 로 가정)

만일, editmask가 있다면, 해당 editmask 의 getfocus() 이벤트에 다음과 같이 기술한다.

uo_keypad .which_control = getfocus() //해당 오브젝트의 instance 변수를 정의내린다

http://cafe.naver.com/pentaeduclub.cafe

Posted by 농부지기
,

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

 

☞   

 

**** LPAD함수 만들어 사용하기 *****

//paturn으로 채우기

==================================================================================================

global type lpad from function_object
end type

forward prototypes
global function string lpad (string as_data, char ac_paturn, integer ai_count)
end prototypes

global function string lpad (string as_data, char ac_paturn, integer ai_count);

    return as_data + fill(ac_paturn, ai_count - Len(as_data) )
end function
==================================================================================================

//밴공백으로 채우기

==================================================================================================

global type lpad from function_object
end type

forward prototypes
global function string lpad (string as_data, integer ai_count)
end prototypes

global function string lpad (string as_data, integer ai_count);

    return String( as_data, fill('@', ai_count) )
end function
==================================================================================================

 

**** RPAD함수 만들어 사용하기 *****

//paturn으로 채우기...

==================================================================================================

global type rpad from function_object
end type

forward prototypes
global function string rpad (string as_data, char ac_paturn, integer ai_count)
end prototypes

global function string rpad (string as_data, char ac_paturn, integer ai_count);

    return Reverse( Reverse(as_data) + fill(ac_paturn, ai_count - Len(as_data) ) )
end function
==================================================================================================

//빈공간으로 채우기

==================================================================================================

global type rpad from function_object
end type

forward prototypes
global function string rpad (string as_data, integer ai_count)
end prototypes

global function string rpad (string as_data, integer ai_count);

    return Reverse( String(Reverse(as_data), fill('@', ai_count ) ) )
end function
==================================================================================================

Posted by 농부지기
,

[ 파워빌더.공통함수 - 문자열을 배열로 만들기 ]

 

☞   첫 번째 방법

 

구분자 있는 스트링 변수를 나누어서  스트링 배열에 담아주는 함수 입니다.

 

예를 들어...

sOrg = "aaa;bbb;ccc"

sDiv = ';'  //구분자

 

= > sVal[1] => 'aaa'

= > sVal[2] => 'bbb'

= > sVal[3] => 'ccc'

 

//f_div_String( sOrg, sDiv, sVal[] )

 

Int i
Long lPos, lStart, lLen

i = 1
lStart = 1
lLen = Len(sOrg)

lPos = Pos(sOrg, sDiv, lStart)
if lPos < 1 then //구분자 없을 때
 sVal[1] = sOrg
 return
elseif lpos = 1 then //구분자 첫번째에 만날때
 lStart = lStart + Len(sDiv)
 lPos = Pos(sOrg, sDiv, lStart)
end if
 
do while lPos > 0
 sVal[i] = Mid(sOrg, lStart, lPos - lStart)
 if lLen = (lPos + Len(sDiv) - 1) then return

 i ++
 lStart = lPos + Len(sDiv)
 lPos = Pos(sOrg, sDiv, lStart)
loop

sVal[i] = mid(sOrg, lSTart)
return

☞  두 번째 방법

 

//===============================================
// 프로그램명 : 일정한 String로 분리된 String에서 N번째 String인출
// String gf_nth(Value string as_data, Value String as_Gubun, Value Integer al_nth)
//===============================================
String ls_rtn
Long ll_i, ll_strlen
Long ll_f, ll_t

if isNull(as_data) or isNull(al_nth) then
SetNull(ls_rtn)
return ls_rtn
end if

ll_f = 0
for ll_i = 1 to al_nth - 1
ll_f = Pos(as_data, as_Gubun, ll_f + 1)
if ll_f = 0 then
exit
end if
next

if ll_f = 0 and al_nth > 1 then
SetNull(ls_rtn)
return ls_rtn
end if

ll_t = Pos(as_data, as_Gubun, ll_f + 1)
if ll_t = 0 then
ll_t = Len(as_data) + 1
end if

if al_nth = 1 then
ls_rtn = String(Mid(as_data, ll_f + 1, ll_t - ll_f - 1))
else
ls_rtn = String(Mid(as_data, ll_f + Len(as_Gubun), ll_t - ll_f - Len(as_Gubun) ))
end if
return ls_rtn

Posted by 농부지기
,

[ 파워빌더.공통함수 - 음력을 양력으로 변환 ]

 

☞   

 

역시 [건우아빠]님께서 코치 한대로 만들었습니다.

아래의 양력->음력을 반대로

// 양력일자를 음력일자료 변환
//                   양력일자                 음력일자
// of_solarForlunar ( Ref String as_solarday, String as_lunarday )
integer i_rtn
integer YoonYN               // 윤년 여부를 저장하는 변수 1=윤년, 0=평년
integer ly, lm, ld           // 전해온 음력 인자값을 저장할 년, 월, 일 임시변수
String  sy, sm, sd           // 계산된 양력 년, 월, 일을 저장할 변수
long    y1, m1, i, j, y2, y3, leap // 임시변수
long    l, m, n, o, mm, td
String  ls_lunarday
String  ls_akk[], ls_aweek[], ls_amd[]

// 작업할 일자 만들기
ls_lunarday = as_lunarday

/* 이부분은 함수처리 알아서
ls_lunarday = of_change_string(ls_lunarday,',','')
ls_lunarday = of_change_string(ls_lunarday,'-','')
ls_lunarday = of_change_string(ls_lunarday,'/','')
ls_lunarday = of_change_string(ls_lunarday,'.','')
ls_lunarday = of_change_string(ls_lunarday,' ','') */
if Len(ls_lunarday) <> 8 then
 of_msgbox('날자를 잘못입력했습니다.')
 return -1
end if
sy = mid(ls_lunarday,1,4)
sm = mid(ls_lunarday,5,2)
sd = mid(ls_lunarday,7,2)

if integer(sy) < 1841 or 2043 < integer(sy) then
 of_msgbox('1841년 에서 2043년 까지 계산할수 없습니다.')
 return -1
end if

// 음력 윤달 상수와 요일, 말일 정의
of_solarTolunarconstant( ls_akk, ls_aweek, ls_amd ) //하단에 있습니다.

TRY
 ly = integer(sy)
 lm = integer(sm)
 ld = integer(sd)
 
 y1 = ly - 1841 // 1841년부터 현재가지 년도 차이
 m1 = lm - 1    // 전월
 leap = 0
 // 전월이 윤달인지 검사
 o = ( y1 * 12 ) + m1
 if integer(ls_akk[o]) > 2 then
  YoonYn = of_IsYoonYear ( integer(ly) )//하단에 있습니다.
  leap = YoonYn
 end if
 // 전월의 일자 수
 if leap = 1 then
  choose case integer(ls_akk[o])
   case 3 ; mm = 29
   case 4 ; mm = 30
   case 5 ; mm = 29
   case 6 ; mm = 30
  end choose
 else
  choose case integer(ls_akk[o])
   case 1 ; mm = 29
   case 2 ; mm = 30
   case 3 ; mm = 29
   case 4 ; mm = 29
   case 5 ; mm = 30
   case 6 ; mm = 30
  end choose
 end if
 // 전년도 까지의 알수 구하기
 td = 0
 for i = 1 to y1
  l = ( i - 1 ) * 12
  for j = 1 to 12
   o = l + j
   choose case integer(ls_akk[o])
    case 1 ; td = td + 29
    case 2 ; td = td + 30
    case 3 ; td = td + 58
    case 4 ; td = td + 59
    case 5 ; td = td + 59
    case 6 ; td = td + 60
   end choose
  next
 next
 //전월까지 일수 더하기
 for j = 1 to m1
  o = ( y1 * 12 ) + j
  choose case integer(ls_akk[o])
   case 1 ; td = td + 29
   case 2 ; td = td + 30
   case 3 ; td = td + 58
   case 4 ; td = td + 59
   case 5 ; td = td + 59
   case 6 ; td = td + 60
  end choose
 next
 
 // 금일까지 더하기
 td = td + ld + 22

 y1 = 1840
 do while true
  y1 ++
  YoonYn = of_IsYoonYear ( integer(y1) ) //하단에 있습니다.
  
  if YoonYn = 1 then
   y2 = 366
  else
   y2 = 365
  end if

  if td <= y2 then
   exit
  end if
  td = td - y2
 loop

 sy = String(y1)
 ls_amd[2] = String( y2 - 337 )
 m1 = 0
 do while true
  m1 ++
  if td <= long(ls_amd[m1]) then
   exit
  end if
  td = td - long(ls_amd[m1])
 loop

 sm = String( m1 )
 sd = String( td )
 y3 = long ( sy )
 td = ( y3 * 365 ) + long( y3 / 4 ) - long( y3 / 100 ) + long( y3 / 400 )
 for i = 1 to long ( sm )
  td = td + long (ls_amd[i])
 next

 td = td + long ( sd )

 as_solarday  = String(y3,'0000')
 as_solarday += String(long(sm),'00')
 as_solarday += String(long(sd),'00')
CATCH (RunTimeError Err)
 i_rtn = of_systemerrordisplay ( Err ) // 이부분은 양략->음력 부분에 있습니다.
 as_lunarday = ''
END TRY
return i_rtn
//===========================================

//of_solarTolunarconstant( ref string as_akk[], ref string as_aweek[], ref string as_amd[] )
String  ls_kk, ls_week, ls_md
String  ls_akk[], ls_aweek[], ls_amd[]
//1841
ls_kk  = "1,2,4,1,1,2,1,2,1,2,2,1,"
ls_kk += "2,2,1,2,1,1,2,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,4,1,2,1,2,1,"
ls_kk += "2,2,1,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,5,2,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,3,2,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,1,2,"
//1851
ls_kk += "2,2,1,2,1,1,2,1,2,1,5,2,"
ls_kk += "2,1,2,2,1,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,5,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,2,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,5,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "2,1,6,1,1,2,1,1,2,1,2,2,"
//1861
ls_kk += "1,2,2,1,2,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,1,2,2,1,2,2,3,1,2,"
ls_kk += "1,2,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,4,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,2,1,2,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,1,2,2,2,"
ls_kk += "1,2,2,3,2,1,1,2,1,2,2,1,"
ls_kk += "2,2,2,1,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,2,1,1,5,2,1,"
//1871
ls_kk += "2,2,1,2,2,1,2,1,2,1,1,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,4,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,2,1,"
ls_kk += "2,2,1,1,5,1,2,1,2,2,1,2,"
ls_kk += "2,2,1,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,4,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,2,1,2,1,1,2,"
//1881
ls_kk += "1,2,1,2,1,2,5,2,2,1,2,1,"
ls_kk += "1,2,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,2,1,2,"
ls_kk += "2,1,1,2,3,2,1,2,2,1,2,2,"
ls_kk += "2,1,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,5,2,1,1,2,1,2,1,2,"
ls_kk += "2,1,2,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,5,2,1,2,2,1,2,1,2,1,2,"
//1891
ls_kk += "1,2,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,5,2,2,1,2,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,5,1,2,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,1,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,5,2,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,5,2,2,1,2,"
//1901
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,3,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,2,1,"
ls_kk += "2,2,1,2,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,4,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,2,1,2,1,2,2,1,2,"
ls_kk += "1,5,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
//1911
ls_kk += "2,1,2,1,1,5,1,2,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,1,2,"
ls_kk += "2,2,1,2,5,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,3,2,1,2,2,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,5,2,2,1,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2,"
//1921
ls_kk += "2,1,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "2,1,2,2,3,2,1,1,2,1,2,2,"
ls_kk += "1,2,2,1,2,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,1,2,2,1,2,1,2,1,1,"
ls_kk += "2,1,2,5,2,1,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,5,1,2,1,1,2,2,1,2,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,1,2,2,2,"
ls_kk += "1,2,2,1,1,5,1,2,1,2,2,1,"
//1931
ls_kk += "2,2,2,1,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,2,1,1,2,1,2,"
ls_kk += "1,2,2,1,6,1,2,1,2,1,1,2,"
ls_kk += "1,2,1,2,2,1,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,4,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,2,1,"
ls_kk += "2,2,1,1,2,1,4,1,2,2,1,2,"
ls_kk += "2,2,1,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,1,2,1,2,1,"
//1941
ls_kk += "2,2,1,2,2,4,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,2,1,2,1,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,1,2,4,1,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,2,1,2,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,1,2,"
ls_kk += "2,5,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,3,2,1,2,1,2,"
ls_kk += "2,1,2,2,1,2,1,1,2,1,2,1,"
//1951
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,4,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,1,2,2,"
ls_kk += "2,1,4,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,5,2,1,2,2,"
ls_kk += "1,2,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,1,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,2,5,2,1,2,1,2,1,"
//1961
ls_kk += "2,1,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,2,3,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,1,2,2,1,"
ls_kk += "2,2,5,2,1,1,2,1,1,2,2,1,"
ls_kk += "2,2,1,2,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,1,2,1,5,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,2,1,2,1,2,2,1,2,"
//1971
ls_kk += "1,2,1,1,5,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,2,1,"
ls_kk += "2,2,1,5,1,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,5,2,1,1,2,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,1,"
ls_kk += "2,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,1,6,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,1,2,2,"
//1981
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2,"
ls_kk += "2,1,2,3,2,1,1,2,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "2,1,2,2,1,1,2,1,1,5,2,2,"
ls_kk += "1,2,2,1,2,1,2,1,1,2,1,2,"
ls_kk += "1,2,2,1,2,2,1,2,1,2,1,1,"
ls_kk += "2,1,2,2,1,5,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,2,1,1,5,1,2,1,2,2,2,2,"
//1991
ls_kk += "1,2,1,1,2,1,1,2,1,2,2,2,"
ls_kk += "1,2,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "1,2,5,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,2,1,1,2,1,2,"
ls_kk += "1,2,2,1,2,2,1,5,2,1,1,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,3,2,2,1,2,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,2,1,"
ls_kk += "2,2,1,1,2,1,1,2,1,2,2,1,"
//2001
ls_kk += "2,2,2,3,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,1,2,2,1,2,1,1,2,1,2,"
ls_kk += "1,5,2,2,1,2,1,2,2,1,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,1,5,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,2,1,2,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,1,2,"
ls_kk += "2,2,1,1,5,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
//2011
ls_kk += "2,1,2,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,6,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,1,2,5,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,1,2,2,"
ls_kk += "2,1,1,2,3,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,1,2,5,2,1,1,2,1,2,1,2,"
//2021
ls_kk += "1,2,2,1,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,2,2,1,2,1,2,1,2,"
ls_kk += "1,5,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,2,1,1,5,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,1,2,2,2,"
ls_kk += "1,2,2,1,5,1,2,1,1,2,2,1,"
ls_kk += "2,2,1,2,2,1,1,2,1,1,2,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,1,2,1,"
//2031
ls_kk += "2,1,5,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,5,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,4,1,1,2,1,2,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,2,1,1,2,1,"
ls_kk += "2,2,1,2,5,2,1,2,1,2,1,1,"
ls_kk += "2,1,2,2,1,2,2,1,2,1,2,1,"
//2041
ls_kk += "2,1,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,5,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2"
ls_week = "일,월,화,수,목,금,토"
ls_md = "31,0,31,30,31,30,31,31,30,31,30,31"
// String을 배열로 변경
of_StringToArray(ls_kk,   ',', ls_akk  )
of_StringToArray(ls_week, ',', ls_aweek)
of_StringToArray(ls_md,   ',', ls_amd  )

as_akk   = ls_akk
as_aweek = ls_aweek
as_amd   = ls_amd

return 0

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

// 윤년인지를 판단하는 함수
// integer of_IsYoonYear ( ai_Year )
integer i_rtn
if     mod(ai_Year,4  ) <> 0 then
 i_rtn = 0
elseif mod(ai_Year,100) <> 0 then
 i_rtn = 1
elseif mod(ai_Year,400) <> 0 then
 i_rtn = 0
else
 i_rtn = 1
end if

return i_rtn

Posted by 농부지기
,

[ 파워빌더.공통함수 - 양력을 음력으로 변환 ]

 

☞   

 

// 양력일자를 음력일자료 변환
//                   양력일자            음력일자
// of_solarTolunar ( String as_solarday, Ref String as_lunarday )
integer i_rtn
String  ls_kk, ls_week, ls_md
String  ls_akk[], ls_aweek[], ls_amd[]
String  sYEAR, sMONTH, sDAY // 양력일자를 저장할 변수
integer lYEAR, lMONTH, lDAY // 음력일자를 저장할 변수
integer YoonYN              // 윤년 여부를 저장하는 변수 1=윤년, 0=평년
String  Yoon
string  sy, sm, sd      // 전해온 양력 인자값을 저장할 년, 월, 일 임시변수
long    ly, lm, ld      // 계산된 음력 년, 월, 일을 저장할 변수
String  ls_solarday
long    td, td1, td2
Long    l, m, n, o
integer dt[]     // 매년의 음력일수를 저장할 배열 변수
integer mm, m1, m2

// 작업할 일자 만들기
ls_solarday = as_solarday
ls_solarday = of_change_string(ls_solarday,',','')
ls_solarday = of_change_string(ls_solarday,'-','')
ls_solarday = of_change_string(ls_solarday,'/','')
ls_solarday = of_change_string(ls_solarday,'.','')
ls_solarday = of_change_string(ls_solarday,' ','')
sy = mid(ls_solarday,1,4)
sm = mid(ls_solarday,5,2)
sd = mid(ls_solarday,7,2)

if integer(sy) < 1841 or 2043 < integer(sy) then
 //of_msgbox('1841년 에서 2043년 까지 계산할수 없습니다.')
 return -1
end if

//윤년여부를 체크
ls_amd[2] = '28'
if     mod(integer(sy),4  ) <> 0 then
 YoonYN = 0
elseif mod(integer(sy),100) <> 0 then
 YoonYN = 1
elseif mod(integer(sy),400) <> 0 then
 YoonYN = 0
else
 YoonYN = 1
end if
if YoonYn = 1 then ls_amd[2] = '29' // 윤년

// 음력 윤달 상수 정의
//1841
ls_kk  = "1,2,4,1,1,2,1,2,1,2,2,1,"
ls_kk += "2,2,1,2,1,1,2,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,4,1,2,1,2,1,"
ls_kk += "2,2,1,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,5,2,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,3,2,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,1,2,"
//1851
ls_kk += "2,2,1,2,1,1,2,1,2,1,5,2,"
ls_kk += "2,1,2,2,1,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,5,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,2,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,5,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "2,1,6,1,1,2,1,1,2,1,2,2,"
//1861
ls_kk += "1,2,2,1,2,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,1,2,2,1,2,2,3,1,2,"
ls_kk += "1,2,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,4,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,2,1,2,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,1,2,2,2,"
ls_kk += "1,2,2,3,2,1,1,2,1,2,2,1,"
ls_kk += "2,2,2,1,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,2,1,1,5,2,1,"
//1871
ls_kk += "2,2,1,2,2,1,2,1,2,1,1,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,4,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,2,1,"
ls_kk += "2,2,1,1,5,1,2,1,2,2,1,2,"
ls_kk += "2,2,1,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,4,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,2,1,2,1,1,2,"
//1881
ls_kk += "1,2,1,2,1,2,5,2,2,1,2,1,"
ls_kk += "1,2,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,2,1,2,"
ls_kk += "2,1,1,2,3,2,1,2,2,1,2,2,"
ls_kk += "2,1,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,5,2,1,1,2,1,2,1,2,"
ls_kk += "2,1,2,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,5,2,1,2,2,1,2,1,2,1,2,"
//1891
ls_kk += "1,2,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,5,2,2,1,2,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,5,1,2,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,1,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,5,2,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,5,2,2,1,2,"
//1901
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,3,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,2,1,"
ls_kk += "2,2,1,2,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,4,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,2,1,2,1,2,2,1,2,"
ls_kk += "1,5,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
//1911
ls_kk += "2,1,2,1,1,5,1,2,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,1,2,"
ls_kk += "2,2,1,2,5,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,3,2,1,2,2,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,5,2,2,1,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2,"
//1921
ls_kk += "2,1,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "2,1,2,2,3,2,1,1,2,1,2,2,"
ls_kk += "1,2,2,1,2,1,2,1,2,1,1,2,"
ls_kk += "2,1,2,1,2,2,1,2,1,2,1,1,"
ls_kk += "2,1,2,5,2,1,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,5,1,2,1,1,2,2,1,2,2,2,"
ls_kk += "1,2,1,1,2,1,1,2,1,2,2,2,"
ls_kk += "1,2,2,1,1,5,1,2,1,2,2,1,"
//1931
ls_kk += "2,2,2,1,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,2,1,1,2,1,2,"
ls_kk += "1,2,2,1,6,1,2,1,2,1,1,2,"
ls_kk += "1,2,1,2,2,1,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,4,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,2,1,"
ls_kk += "2,2,1,1,2,1,4,1,2,2,1,2,"
ls_kk += "2,2,1,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,1,2,1,2,1,"
//1941
ls_kk += "2,2,1,2,2,4,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,2,1,2,1,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,1,2,4,1,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,2,1,2,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,1,2,"
ls_kk += "2,5,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,3,2,1,2,1,2,"
ls_kk += "2,1,2,2,1,2,1,1,2,1,2,1,"
//1951
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,4,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,2,1,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,1,2,2,"
ls_kk += "2,1,4,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,5,2,1,2,2,"
ls_kk += "1,2,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,1,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,2,5,2,1,2,1,2,1,"
//1961
ls_kk += "2,1,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,2,3,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,1,2,2,1,"
ls_kk += "2,2,5,2,1,1,2,1,1,2,2,1,"
ls_kk += "2,2,1,2,2,1,1,2,1,2,1,2,"
ls_kk += "1,2,2,1,2,1,5,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,2,1,2,1,2,2,1,2,"
//1971
ls_kk += "1,2,1,1,5,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,2,1,"
ls_kk += "2,2,1,5,1,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,5,2,1,1,2,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,1,"
ls_kk += "2,2,1,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,1,6,1,2,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,1,2,2,"
//1981
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2,"
ls_kk += "2,1,2,3,2,1,1,2,2,1,2,2,"
ls_kk += "2,1,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "2,1,2,2,1,1,2,1,1,5,2,2,"
ls_kk += "1,2,2,1,2,1,2,1,1,2,1,2,"
ls_kk += "1,2,2,1,2,2,1,2,1,2,1,1,"
ls_kk += "2,1,2,2,1,5,2,2,1,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,1,2,1,2,2,1,2,2,"
ls_kk += "1,2,1,1,5,1,2,1,2,2,2,2,"
//1991
ls_kk += "1,2,1,1,2,1,1,2,1,2,2,2,"
ls_kk += "1,2,2,1,1,2,1,1,2,1,2,2,"
ls_kk += "1,2,5,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,2,1,2,1,2,1,1,2,1,2,"
ls_kk += "1,2,2,1,2,2,1,5,2,1,1,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,1,2,3,2,2,1,2,2,2,1,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,2,1,"
ls_kk += "2,2,1,1,2,1,1,2,1,2,2,1,"
//2001
ls_kk += "2,2,2,3,2,1,1,2,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,2,1,2,2,1,2,1,1,2,1,2,"
ls_kk += "1,5,2,2,1,2,1,2,2,1,1,2,"
ls_kk += "1,2,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,1,2,1,2,1,5,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,2,1,2,"
ls_kk += "2,1,1,2,1,1,2,1,2,2,1,2,"
ls_kk += "2,2,1,1,5,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
//2011
ls_kk += "2,1,2,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,6,2,1,2,1,1,2,1,2,1,"
ls_kk += "2,1,2,2,1,2,1,2,1,2,1,2,"
ls_kk += "1,2,1,2,1,2,1,2,5,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,2,2,1,2,2,"
ls_kk += "1,1,2,1,1,2,1,2,2,1,2,2,"
ls_kk += "2,1,1,2,3,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,2,1,2,2,"
ls_kk += "2,1,2,1,2,1,1,2,1,2,1,2,"
ls_kk += "2,1,2,5,2,1,1,2,1,2,1,2,"
//2021
ls_kk += "1,2,2,1,2,1,2,1,2,1,2,1,"
ls_kk += "2,1,2,1,2,2,1,2,1,2,1,2,"
ls_kk += "1,5,2,1,2,1,2,2,1,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,2,1,2,2,1,"
ls_kk += "2,1,2,1,1,5,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,2,1,2,2,2,"
ls_kk += "1,2,1,2,1,1,2,1,1,2,2,2,"
ls_kk += "1,2,2,1,5,1,2,1,1,2,2,1,"
ls_kk += "2,2,1,2,2,1,1,2,1,1,2,2,"
ls_kk += "1,2,1,2,2,1,2,1,2,1,2,1,"
//2031
ls_kk += "2,1,5,2,1,2,2,1,2,1,2,1,"
ls_kk += "2,1,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,5,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,2,1,2,2,2,1,"
ls_kk += "2,1,2,1,1,2,1,1,2,2,1,2,"
ls_kk += "2,2,1,2,1,4,1,1,2,1,2,2,"
ls_kk += "2,2,1,2,1,1,2,1,1,2,1,2,"
ls_kk += "2,2,1,2,1,2,1,2,1,1,2,1,"
ls_kk += "2,2,1,2,5,2,1,2,1,2,1,1,"
ls_kk += "2,1,2,2,1,2,2,1,2,1,2,1,"
//2041
ls_kk += "2,1,1,2,1,2,2,1,2,2,1,2,"
ls_kk += "1,5,1,2,1,2,1,2,2,2,1,2,"
ls_kk += "1,2,1,1,2,1,1,2,2,1,2,2"
ls_week = "일,월,화,수,목,금,토"
ls_md = "31,0,31,30,31,30,31,31,30,31,30,31"
// String을 배열로 변경
of_StringToArray(ls_kk,   ',', ls_akk  )
of_StringToArray(ls_week, ',', ls_aweek)
of_StringToArray(ls_md,   ',', ls_amd  )

TRY
 // 1840년까지 날수
 td1 = (1840 * 365) + (1840 / 4) - (1840 / 100) + (1840 / 400) + 23 
 // 1841년부터 작년까지의 날수 2009 -> 733407
 td2 = ( (long(sy) - 1) * 365) + integer((long(sy) - 1)/4) - integer((long(sy) - 1)/100) + integer((long(sy) - 1)/400)
 // 전월까지의 날수를 더함
 for l = 1 to integer(sm) - 1
  td2 = td2 + long(ls_amd[l])
 next
 // 현재일까지의 날수를 더함
 td2 = td2 + long(sd)
 // 양력현재일과 음력 1840년까지의 날수의 차이
 td = td2 - td1 + 1
 // 1841년부터 음력날수를 계산
 n = long(sy) - 1841 + 1
 for l = 1 to n
  dt[l] = 0
  for m = 1 to 12
   o = (l - 1) * 12 + (m - 1) + 1
   choose case integer(ls_akk[o])
    case 1 ; mm = 29
    case 2 ; mm = 30
    case 3 ; mm = 58 // 29 + 29
    case 4 ; mm = 59 // 29 + 30
    case 5 ; mm = 59 // 30 + 29
    case 6 ; mm = 60 // 30 + 30
   end choose
   dt[l] = dt[l] + mm
  next
 next
 // 1840년 이후의 년도를 계산 - 현재까지의 일수에서 위에서 계산된 1841년부터의 매년 음력일수를 빼가면수 년도를 계산
 ly = 1
 do while (td > dt[ly])
  td = td - dt[ly]
  ly = ly + 1
  if ly > UpperBound(dt) then exit
 loop

 lm = 1
 yoon = ''// 현재월이 윤달임을 표시할 변수
 do while true
  o = (ly - 1) * 12 + lm
  if integer(ls_akk[o]) <= 2 then
   mm = integer(ls_akk[o]) + 28
   if td > mm then
    td = td - mm
    lm = lm + 1
   else
    exit
   end if
  else
   choose case integer(ls_akk[o])
    case 3
     m1 = 29
     m2 = 29
    case 4
     m1 = 29
     m2 = 30
    case 5
     m1 = 30
     m2 = 29
    case 6
     m1 = 30
     m2 = 30
   end choose

   if td > m1 then
    td = td - m1
    if td > m2 then
     td = td - m2
     lm = lm + 1
    else
     yoon = "윤달"
    end if
   else
    exit
   end if
  end if
 loop

 ly = ly + 1840
 lm = lm
 ld = td
 
 if IsNull(yoon) or trim(yoon) = '' then yoon = '평달'
 if Len(yoon) > 0 then yoon += ':'
 as_lunarday = yoon + String(ly,'0000') + String(lm,'00') + String(ld,'00')

CATCH (RunTimeError Err)
 i_rtn = of_systemerrordisplay ( Err )
END TRY
return i_rtn

 

 

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

// integer of_systemerrordisplay ( runtimeerror ae_Error )
String ls_Message
String ls_title
ls_Message  = '에러NO: ' + String(ae_Error.Number) + '~r~n'
ls_Message

 

Posted by 농부지기
,

[ 파워빌더.공통함수 - 연월일 가감 ]

 

☞   

 

//함수 소스를 그대로 홀립니다.

//복사하시어 파일로 만들어 인포트 하세요

// 파일명은 gf_relativeymdt.srf 로 하세요

//===========이하 소스=================================

$PBExportHeader$gf_relativeymdt.srf
$PBExportComments$년월일시를 가감한다.
global type gf_relativeymdt from function_object
end type

forward prototypes
global function datetime gf_relativeymdt (string as_gubun, datetime adt_datetime, integer as_ad)
end prototypes

global function datetime gf_relativeymdt (string as_gubun, datetime adt_datetime, integer as_ad);// DateTime을 더하고 빼는 함수
// datetime gf_RelativeYMDT(string as_gubun, datetime adt_datetime, integer as_Ad)
// as_gubun -> ["Y", "M", "D", "T"] 년, 월 , 일, 시
// adt_datetime -> 변환될 일시
// as_Ad    -> 가감 숫자
DateTime ldt_datetime
String   ls_y, ls_m, ls_d, ls_time
Integer  li_y, li_m, li_d
Date     ld_date
time     lt_time
integer  li_mod
if as_Ad = 0 then return adt_datetime
ls_y  = String(adt_datetime, "YYYY")
ls_m  = String(adt_datetime, "MM")
ls_d  = String(adt_datetime, "DD")
ls_time = String(adt_datetime, "HH:MM:SS")
li_y     = Integer(ls_y)
li_m     = Integer(ls_m)
li_d     = Integer(ls_d)
lt_time  = time(ls_time)
ld_date  = Date(adt_datetime)
choose case as_gubun
 Case "Y" //년가감
  li_y = li_y + as_Ad
  ls_y = String(li_y, "0000")
  ld_date = Date(ls_y+"-"+ls_m+"-"+ls_d)
 Case "M" //월가감
  li_m = li_m + as_Ad
  if li_m = 0 then
   li_m = 12
   li_y = li_y - 1
  elseif li_m > 0 then
   if li_m > 12 then
    li_mod = 1
    li_m = li_m - 12
    Do While li_m > 12
     li_mod += 1
     li_m = li_m - 12
    Loop
    li_y = li_y + li_mod
   end if
  else
   if li_m < -12 then
    li_mod = 1
    li_m = li_m + 12
    Do While li_m < -12
     li_mod += 1
     li_m = li_m + 12
    loop
    li_y = li_y - li_mod
   else
    li_y = li_y - 1
    li_m = 12 + li_m
   end if
  end if
  ls_y = String(li_y, "0000")
  ls_m = String(li_m, "00")
  if ls_d = '31' then
   choose case ls_m
    case '01', '03', '05', '07', '08', '10', '12'
     ls_d = ls_d
    Case '02'
     if Mod(li_y, 4) = 0 or Mod(li_y, 400) = 0 then
      ls_d = '29'
     else
      ls_d = '28'
     end if
    Case '04', '06', '09', '11'
     ls_d = '30'
   end choose
  end if
  ld_date = Date(ls_y+"-"+ls_m+"-"+ls_d)
 Case "D" //일가감
  ld_date = RelativeDate ( ld_date, as_Ad )
 Case "T" //시가감
  lt_time = RelativeTime ( lt_time, as_Ad )
end choose

ldt_dateTime = DateTime(ld_date, lt_time)

return ldt_dateTime
end function

 

Posted by 농부지기
,

[ 파워빌더.공통함수 - enter To Tap 변경 ]

 

☞   

 
엔터키를 Tab키로 변경하는 이벤트입니다.
설정 변수 Boolean ib_enter_newrow  //엔터키가 마지막 Row로 왔을때 줄 추가 할지 여부
              String     is_last_col          // 마지막 컬럼명
              Boolean ib_enter_to_tab    // 엔터키를 Tab으로 쓸지 여부

Event ID : pbm_dwnprocessenter

String  ls_colunm
ls_colunm = GetColumnName()

If ib_enter_newrow AND &
   (RowCount() = GetRow() AND ls_colunm = is_last_col) Then
This.TriggerEvent("ue_add")
Return 1
End IF

/** Enter Key를 Tab Key 인식하게 한다. */
If ib_enter_to_tab Then
   send( handle(this), 256, 9 , 0 )
   return 1
End If




///// 마지막 컬럼 찾는 방법 (펑션으로 만들어서 DataWindow 생성 후에 호출하시면 될듯 하네요)
Integer li_colcount, li_tab_seq, li_loop, li_Cnt
String ls_Column
Integer li_max = 0, li_min = 32767

If This.DataObject = '' or IsNull(This.DataObject) Then Return

For li_loop = 1 To li_colcount
ls_Column = This.Describe("#" + String(li_loop) + ".Name") // 칼럼명
li_tab_seq = Integer(This.Describe(ls_Column + ".TabSequence")) // 칼럼 Tab Order
If li_tab_seq > 0 Then
If li_tab_seq < li_min Then // 최소값 
li_min = li_tab_seq
시작컬럼 = ls_Column
End If
If li_tab_seq > li_max Then // 최대값 
li_max = li_tab_seq
마지막컬럼 = ls_Column
End If
End If
Next

컬럼은 실제 입력 컬럼을(Tab Order가 존재하는) 찾아서 처리하기 때문에 Count의 맥스 컬럼이 아닌 Tab Order가 있는 마지막 컬럼을 찾습니다.

Posted by 농부지기
,