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

 

☞   첫 번째 방법

 

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

 

예를 들어...

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 농부지기
,

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

 

☞   

 

입력된 문자열을 구분자로 분리하는 함수입니다.

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

global type f_parsetoken from function_object
end type

forward prototypes
global function integer f_parsetoken (string as_source, string as_token, ref string as_parsingitems[])
end prototypes

global function integer f_parsetoken (string as_source, string as_token, ref string as_parsingitems[]);/****************************************************************************************
Function    : f_parseToken [common]
Purpose     : 해당문자열의 token을 찾아 문자열을 나누어 array이에 저장하여 넘김
Scope       : public
Parameters  : al_source          (string/val)   - 원래의 문자열
              as_token           (string/val)   - 문자열안의 분리자
              as_parsingitems    (string/ref)   - 나뉘어진 문자열들을 저장하는 배열
Returns      :
Description  :
                  - 해당문자열의 특수문자열을 찾아 문자열을 나누어 문자배열에 저장
                  - 공백을 없애지 않음
      
Related      :
Author       :
Date         :
Modification:
 - 2009.02 : 박기순 : Init
****************************************************************************************/
integer li_start = 1, li_pos = 1, li_idx = 1, li_tokenLen

if isNull(as_source)  then
 return 0
end if

li_tokenLen = lenA(as_token)

do while(li_pos <> 0)
 li_pos = posA(as_source, as_token, li_start)
 if li_pos > 0 then
  as_parsingItems[li_idx] = midA(as_source, li_start, li_pos - li_start)
  li_start = li_pos + li_tokenLen
  li_idx ++
 end if
loop

as_parsingItems[li_idx] = midA(as_source, li_start)

return 0

end function

Posted by 농부지기
,

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

 

 

검색해보니 토큰으로 되어 있는 글에는 없어서 올립니다.

두 가지 형태가 들어가 있구요.

첫번째는

ls_parm = 'A!B!C'

일 경우 ..

ls_val1 = gf_tokenize(ls_parm, '!')

하면..

ls_val1 에는 'A' 가 들어가 있고, ls_parm 에는 'B!C' 가 남게 됩니다.

 

두번재는

ls_val1 = gf_tokenize(ls_parm, '!', 1)

하면..

ls_val1 에는 첫번째 토큰( !) 까지 값인 A 가 남고, ls_parm 은 그대로 'A!B!C' 값을 가지고 있게 됩니다.

 

/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

global type gf_tokenize from function_object
end type

forward prototypes
global function string gf_tokenize (ref string as_source, string as_separator)
global function string gf_tokenize (string as_source, string as_separator, integer ai_position)
end prototypes

global function string gf_tokenize (ref string as_source, string as_separator);/*********************************************************************/
// Function : gf_tokenize()
//  Return Value 
//     String  Tokenize 결과물
//  Arguments
//   Pass By Reference String as_source
//   Pass By ReadOnly  String as_separator
/**********************************************************************/
integer li_pos
string  ls_retValue

if isnull( as_source ) or IsNull( as_separator ) THEN
 String ls_Null

 SetNull( ls_Null )
 Return ls_Null
END IF

li_pos = Pos( as_source, as_separator ) 
IF li_pos = 0 THEN
 ls_retValue = as_source
 as_source = ""
ELSE
 ls_retValue = Mid( as_source, 1, li_pos - 1 )
 as_source = Right( as_source, Len(as_source) - (li_pos + Len( as_separator ) -1 ) )
END IF

Return ls_retValue
end function

global function string gf_tokenize (string as_source, string as_separator, integer ai_position)
/*********************************************************************/
// Function : gf_Tokenizer
//  Return Value
//     String  Tokenize 결과물
//  Arguments
//   Pass By ReadOnly  String as_source
//   Pass By ReadOnly  String as_separator
//   Pass By ReadOnly  integer ai_position(음수일 경우는 오른쪽부터 찾는다.)
/**********************************************************************/
integer count, start_pos = 1, str_length, end_pos = 0
string  ret_value, ls_source, ls_left_source
STring  ls_temp_source
integer li_pos, li_end_pos = 0
boolean end_chk = false, null_chk = false
String ls_Null
SetNull( ls_Null )
ls_source = as_source
if isnull( as_source ) or IsNull( as_separator ) THEN Return ''
IF ai_position = 0 THEN null_chk = true
IF ai_position < 0 THEN //뒤에서 찾는다.
 For count = 1 to ABS(ai_position)
   IF count > 1 THEN ls_source  = left(ls_source, end_pos - 1) 
    //as_separator 가 있는 마지막 위치를 구한다.
    //lastPos는 한글일 경우에도 1byte로 계산하므로, do loop을 이용해서 구한다.
    ls_temp_source = ls_source
    do
     li_pos = Pos( ls_temp_source, as_separator )
      If li_pos > 0 THEN
      li_end_pos += li_pos
       ls_temp_source  = mid(ls_temp_source, li_pos + Len(as_separator))
     END IF
    loop until(li_pos = 0)
   end_pos = li_end_pos
    IF end_pos = 0 and count < ai_position then
    null_chk = true
     exit
   ELSEIF end_pos = 0  THEN
   start_pos  = 1
   ELSE
   start_pos  = end_pos + Len(as_separator)  
   END IF  
 NEXT
 if null_chk then
    ret_value = ls_Null
 else
   ret_value = mid(ls_source, start_pos)
 end IF
ELSE //앞에서 찾는다..
 for count = 1 to ai_position
   IF count > 1 THEN ls_source  = mid(ls_source, end_pos + Len(as_separator))
   end_pos = pos(ls_source, as_separator, 1)
   IF end_pos = 0 and count < ai_position THEN
  null_chk = true
  exit
   ELSEIF end_pos = 0 THEN
  ls_left_source = ls_source
   ELSE
  ls_left_source = left(ls_source, end_pos - 1)
   END IF
 next
 if null_chk then
    ret_value = ls_Null
 else
   ret_value = ls_left_source
 end if
END IF
if isnull(ret_value) then ret_value = ''
return ret_value
end function

Posted by 농부지기
,

[ 파워빌더.공통함수 - bit연산 ]

 

 

☞   

 

비트연산이 필요해서 찾아보니 파워빌더에 있더군요...

sru파일입니다...

 

 

$PBExportHeader$n_cst_numerical.sru
forward
global type n_cst_numerical from nonvisualobject
end type
end forward

global type n_cst_numerical from nonvisualobject autoinstantiate
end type

forward prototypes
public function string of_binary (long al_decimal)
public function long of_decimal (string as_binary)
public function boolean of_getbit (long al_decimal, unsignedinteger ai_bit)
public function long of_bitwiseand (long al_value1, long al_value2)
public function long of_bitwisenot (long al_value)
public function long of_bitwiseor (long al_value1, long al_value2)
public function long of_bitwisexor (long al_value1, long al_value2)
end prototypes

public function string of_binary (long al_decimal);integer li_remainder 
string ls_binary='' 

//Check   parameters 
If   IsNull(al_decimal)   or   al_decimal<   0   Then 
string   ls_null 
SetNull(ls_null) 
Return   ls_null 
End   If 

If   al_decimal   =   0   Then 
Return   '0' 
End   If 

Do   Until   al_decimal=   0 
li_remainder   =   mod(al_decimal,   2) 
al_decimal   =   al_decimal   /2 

//Build   binary   string 
ls_binary   =   string(li_remainder)   +   ls_binary 
Loop 
Return   ls_binary
end function

public function long of_decimal (string as_binary);integer   li_cnt 
long ll_len 
char lch_char[] 
long ll_decimal=0 

//Check   parameters 
If   IsNull(as_binary)   or   Len(as_binary)<=0   then 
long   ll_null 
SetNull(ll_null) 
Return   ll_null 
End   If 

//Get   the   length 
ll_len   =   Len(as_binary) 

//Move   string   into   arrach   of   characters 
lch_char   =   as_binary 

For   li_cnt   =   1   to   ll_len 
//Make   sure   only   0's   and   1's   are   present 
If   (Not   lch_char[li_cnt]='1')   AND   (Not   lch_char[li_cnt]='0')   Then 
Return   -1 
End   If 
//Build   the   decimal   equivalent 
ll_decimal   =   ll_decimal   +   (long(lch_char[li_cnt])   *   (2   ^   (ll_len   -   li_cnt))) 
Next 

Return   ll_decimal
end function

public function boolean of_getbit (long al_decimal, unsignedinteger ai_bit);Boolean   lb_null 

//Check   parameters 
If   IsNull(al_decimal)   or   IsNull(ai_bit)   then 
SetNull(lb_null) 
Return   lb_null 
End   If 

//Assumption   ai_bit   is   the   nth   bit   counting   right   to   left   with 
//the   leftmost   bit   being   bit   one. 
//al_decimal   is   a   binary   number   as   a   base   10   long. 
If   Int(Mod(al_decimal   /   (2   ^(ai_bit   -   1)),   2))   >   0   Then 
Return   True 
End   If 

Return   False
end function

public function long of_bitwiseand (long al_value1, long al_value2);Integer li_Cnt 
Long ll_Result 
Boolean lb_Value1[32],   lb_Value2[32] 

//   Check   for   nulls 
If   IsNull(al_Value1)   Or   IsNull(al_Value2)   Then 
SetNull(ll_Result) 
Return   ll_Result 
End   If 

//   Get   all   bits   for   both   values 
For   li_Cnt   =   1   To   32 
lb_Value1[li_Cnt]   =   of_getbit(al_Value1,   li_Cnt) 
lb_Value2[li_Cnt]   =   of_getbit(al_Value2,   li_Cnt) 
Next 

//   And   them   together 
For   li_Cnt   =   1   To   32 
If   lb_Value1[li_Cnt]   And   lb_Value2[li_Cnt]   Then 
ll_Result   =   ll_Result   +   (2^(li_Cnt   -   1)) 
End   If 
Next 

Return   ll_Result 
end function

public function long of_bitwisenot (long al_value);Integer li_Cnt,   li_Count 
Long ll_Result 
string ls_Value,   ls_Result 

//   Check   for   nulls 
If   IsNull(al_Value)   Then 
SetNull(ll_Result) 
Return   ll_Result 
End   If 

//   return   a   binary   string   e.g.   100101 
ls_Value   =   of_binary(al_Value) 
li_Cnt   =   Len(ls_Value) 

//   change   0   to   1   and   1   to   0 
For   li_Count   =   1   To   li_Cnt 
If   Mid(ls_Value,   li_Count,   1)   =   '0'   Then 
ls_Result   =   ls_Result   +   '1' 
Else 
ls_Result   =   ls_Result   +   '0' 
End   If 
End   For 

//   return   the   result   in   decimal   form   e.g.   57 
Return   of_decimal(ls_Result)
end function

public function long of_bitwiseor (long al_value1, long al_value2);Integer li_Cnt 
Long ll_Result 
Boolean lb_Value1[32],   lb_Value2[32] 

//   Check   for   nulls 
If   IsNull(al_Value1)   Or   IsNull(al_Value2)   Then 
SetNull(ll_Result) 
Return   ll_Result 
End   If 

//   Get   all   bits   for   both   values 
For   li_Cnt   =   1   To   32 
lb_Value1[li_Cnt]   =   of_getbit(al_Value1,   li_Cnt) 
lb_Value2[li_Cnt]   =   of_getbit(al_Value2,   li_Cnt) 
Next 

//   Or   them   together 
For   li_Cnt   =   1   To   32 
If   lb_Value1[li_Cnt]   Or   lb_Value2[li_Cnt]   Then 
ll_Result   =   ll_Result   +   (2^(li_Cnt   -   1)) 
End   If 
Next 

Return   ll_Result
end function

public function long of_bitwisexor (long al_value1, long al_value2);Integer li_Cnt 
Long ll_Result 
Boolean lb_Value1[32],   lb_Value2[32] 

//   Check   for   nulls 
If   IsNull(al_Value1)   Or   IsNull(al_Value2)   Then 
SetNull(ll_Result) 
Return   ll_Result 
End   If 

//   Get   all   bits   for   both   values 
For   li_Cnt   =   1   To   32 
lb_Value1[li_Cnt]   =   of_getbit(al_Value1,   li_Cnt) 
lb_Value2[li_Cnt]   =   of_getbit(al_Value2,   li_Cnt) 
Next 

//   Perfor   the   XOR 
For   li_Cnt   =   1   To   32 
If   (lb_Value1[li_Cnt]   And   Not   lb_Value2[li_Cnt])   Or   & 
(Not   lb_Value1[li_Cnt]   And   lb_Value2[li_Cnt])   Then 
ll_Result   =   ll_Result   +   (2^(li_Cnt   -   1)) 
End   If 
Next 

Return   ll_Result
end function

on n_cst_numerical.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_numerical.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

Posted by 농부지기
,

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

 

☞   iif , 표현식에 따라 return값을 다르게 하는 함수

 

 

세 개의 인자값이 있습니다. 첫번째 값의 결과가 참일 경우에는 두번째 인자를 return 하고, 거짓일 경우에는 세 번째 인자를 return 합니다.

 

각 버전에 따라 함수오브젝트(iif)를 만드시고, 아래 스크립트를 복사하여 바꿔주세요.

 

global type iif from function_object
end type

forward prototypes
global function string iif (readonly boolean abExpression, readonly string asTruePart, readonly string asFalsePart)
global function long iif (readonly boolean abExpression, readonly long alTruePart, readonly long alFalsePart)
global function integer iif (readonly boolean abExpression, readonly integer aiTruePart, readonly integer aiFalsePart)
global function date iif (readonly boolean abExpression, readonly date adtTruePart, readonly date adtFalsePart)
global function time iif (readonly boolean abExpression, readonly time atTruePart, readonly time atFalsePart)
global function datetime iif (readonly boolean abExpression, readonly datetime adtTruePart, readonly datetime adtFalsePart)
global function decimal iif (readonly boolean abExpression, readonly decimal adTruePart, readonly decimal adFalsePart)
global function double iif (readonly boolean abExpression, readonly double adTruePart, readonly double adFalsePart)
end prototypes

global function string iif (readonly boolean abExpression, readonly string asTruePart, readonly string asFalsePart);if abExpression then
 return asTruePart
else
 return asFalsePart
end if
end function

global function long iif (readonly boolean abExpression, readonly long alTruePart, readonly long alFalsePart);if abExpression then
 return alTruePart
else
 return alFalsePart
end if
end function

global function integer iif (readonly boolean abExpression, readonly integer aiTruePart, readonly integer aiFalsePart);if abExpression then
 return aiTruePart
else
 return aiFalsePart
end if
end function

global function date iif (readonly boolean abExpression, readonly date adtTruePart, readonly date adtFalsePart);if abExpression then
 return adtTruePart
else
 return adtFalsePart
end if
end function

global function time iif (readonly boolean abExpression, readonly time atTruePart, readonly time atFalsePart);if abExpression then
 return atTruePart
else
 return atFalsePart
end if
end function

global function datetime iif (readonly boolean abExpression, readonly datetime adtTruePart, readonly datetime adtFalsePart);if abExpression then
 return adtTruePart
else
 return adtFalsePart
end if
end function

global function decimal iif (readonly boolean abExpression, readonly decimal adTruePart, readonly decimal adFalsePart);if abExpression then
 return adTruePart
else
 return adFalsePart
end if
end function

global function double iif (readonly boolean abExpression, readonly double adTruePart, readonly double adFalsePart);if abExpression then
 return adTruePart
else
 return adFalsePart
end if
end function

☞  

 

Posted by 농부지기
,

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

 

☞   

 

생각해보니... '-', '.' 등도 생각해야하고... 혹시 이게... '00.0.'  이라던지.... '00-00'

 

이렇게 되어 있어도 하나씩 체크해서는 숫자로 판단할 것 같더라구요~

 


/*============================================================*//* Function Name : BOOLEAN f_IsNumber (as_arg)                     */
/* Argument  Name :   as_arg                                                   */
/*               Type      STRING                                                   */
/*     Return Type :   BOOLEAN                                                */
/*============================================================*/
String ls_c
long ll_len, ll_a

ll_len = Len (as_str)

if ll_len = 0 then
   return FALSE
else
   for ll_a = 1 to ll_len
      ls_c = mid (as_str, ll_a, 1)
      choose case ls_c
         case '0' to '9', '-', '.'
         case else
             return FALSE
      end choose
   next
end if
 
if isnumber(as_str) then
   return TRUE
else
   return FALSE
end if
 

 

☞  

 

거냥 숫자아닌 다른 문자는 제하는 함수 만드는것이 편하지 않을까요?
대충 ....
/* string OnlyNumber(string as_String)
숫자 이외 모든 문자 지우기
*/
string ls_tmp, ls_char, ls_String = ''
ls_tmp = Trim(as_String)
Do While len(ls_tmp) > 0
ls_char = Left(ls_tmp,1)
choose case ls_char
case '0','1','2','3','4','5','6','7','8','9'
ls_String += ls_char
end choose
ls_tmp = Mid(ls_tmp,2)
Loop
return ls_String

 

 

Posted by 농부지기
,