[ 파워빌더.DataWindow - Error Log 파일 생성 ]

 

dw의 DB Error 시  Err Log를 기록하는 팁입니다..

dw의 조상오브젝트에 넣으면 편하겠죠..

 

<dw의 dberror 이벤트에..>

 

//This.ScrollToRow(Row)

 

Long  lFileNum

 

IF 개발자유저이면.. THEN
 lFileNum = FileOpen('c:\dberror.txt', LineMode!, Write!, LockWrite!, Append!)
 FileWrite(lFileNum, String(today(), "yyyy.mm.dd hh:mm:ss") + ":" + 사용자ID + "/" + 사용자명 + " (Error Code : " + string(sqldbcode) + ")~n~n" + sqlsyntax + "~n~n" + sqlerrtext)
 FileClose(lFileNum)
END IF

//오라클일때... sqlca.DBParm 에.. DisableBind=1 추가하면 sqlerrtext 가 자세하게 나온다네요..

Posted by 농부지기
,

[ 파워빌더.DataWindow - 내부 Object를 배열에 담기  ]

 

☞   

 

dw 내의 모든 오브젝트들의 이름을  string 배열에 넣어 주는 함수 입니다..

 

/* f_GetObjects( dwWhich, ref  sReturn[] ) */

 

Long  lFind
String sCol, sObjects
  
sObjects = dwWhich.Describe('DataWindow.Objects')
sObjects = sObjects + '~t'

DO
 lFind = Pos(sObjects, '~t')
 
 IF lFind > 0 THEN
  sCol = Left(sObjects, lFind - 1)
  
  sReturn[UpperBound(sReturn[]) + 1] = sCol

  sObjects = Mid(sObjects, lFind + 1)
 END IF
LOOP WHILE lFind > 0

Posted by 농부지기
,

[ 파워빌더.DataWindow - 동적 버튼 생성 ]

 

☞   

 

ls_modify = "create button(band=Background"
ls_modify += " x='0' y='0'"
ls_modify += " height='150'"
ls_modify += " width='300' "
ls_modify += " name=b_new1 "
ls_modify += ' text="자동" '
ls_modify += ' pointer="HyperLink!" '
ls_modify += " )"
dw_1.Modify(ls_modify)

이렇게 하면 버튼이 하나 만들어집니다.

 

그리고 이번튼이 눌렸을때 작동하는 이벤트는

DW ButtonClicked Event에서

choose case dwo.name
 case 'b_new1'
  messagebox(parent.title, '안녕' )

 Case 'b_Select'

   gf_GetSawonList( w_sawonlist, '부장', '', '')

 :

 :
end choose

 

이렇게 만들어둔 함수를 호출합니다.

 

현재 동적으로 이벤트를 만드는 방법은 모르겠습니다.(없는지 있는지도 잘모르겠습니다.)

 

Posted by 농부지기
,

[ 파워빌더.DataWindow - 그리드에서 컬럼 위치 정하기  ]

 

☞   

  데이타윈도우 그리드(Grid)형식에서 컬럼(Column) 위치 정하는 방법인데요.

미친바람돌이(okssamji)님이 질문게시판에 올리신 질문/답변글보다가 작성해봅니다.

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

아시겠지만, Grid형식에서는 컬럼의 위치를 사용자 마음대로 정할수 없습니다.
그렇지만 상황에따라 특정 컬럼의 위치를 보여야할때도.. 감춰야할때도 있을텐데요.
그때 사용하면 좋은 방법인 것 같아서 올려봅니다.

위의 그림에서 getrow가 만약 감춰야하는 컬럼이라면 보통은 visible 설정값을 '0'으로 해놓습니다.
이렇게하면 분명 컬럼은 사라지지만 만약 다시 설정값을 '1'로 바꿔놓을 경우 맨 뒤로 이동해버리게됩니다.

(그렇다고 Grid에서 움직일수도없고..답답하겠죠 ? ^^)

위치를 원하는곳으로 옮기고싶다면 다른 컬럼들도 visible 값을 전부 '0'으로 변경한다음 원하는 순서대로 '1'값을주어
화면상에 나타내주면됩니다. 조금 번거로운 방법이긴하지만 Tabular방식이나 FreeForm같이 자유롭게 위치지정을 할 수
없으므로 유용한 Tip 이라는 생각이 드네요 !

한가지 덧붙이자면..
Width 설정값을 '0' 해주면 보이지는않습니다만 마우스로 해당 부분의 위치에 갖다댄다음 늘려주면 다시 활성화됩니다.
dw자체에 아예 손을 못대면 모를까..; 이건 바람직한 방법은 아닌 것 같네요.

원글에 답변달아주셨던분들 감사드립니다. -0-

 

 

Posted by 농부지기
,

[ 파워빌더.DataWindow - Procedure dw 업데이트  ]

 

☞   

 

피비에서는 데이터윈도우를 디비에 업데이트(인서트,델리트,업데이트)할떄

 

프로시저를 데이터윈도우에 붙여서 액세스가 가능 합니다.

 

장점은 저장시 복잡한 업무 로직을 프러시저에서 해결 할 수 있음으로 클라이언트 로직이

 

가벼워 질수 있는것과 유지 보수가 용이 하다는 점입니다. 데이터를 저장 하면서 체크하는 로직이 엄청 많다거나

 

여러 테이블을 핸드링 해야 할때 좋고.. 주요 업무 로직을 서버쪽에 두기 때문에 쓰리티어 효과도 낼 수 있습니다.

 

각설 하고 다들 아시겠지만 모르시는 분들을 위해 무조건 따라하기 시작...

 

환경은 오라클 10g 유저명은 스코트 유저로 부서 테이블에 인서트 업데이트 하는 로직을 예로 설명..

 

일단 부서테이블에 자료를 넣는 프러시저를 컴파일 합니다. 스크립트는 아래꺼 긁어서 컴파일..

 

CREATE OR REPLACE PROCEDURE  prc_dept (A_DEPTNO NUMBER,
                                       A_DNAME VARCHAR2,
                                       A_LOC VARCHAR2
                             ) As

Begin

 UPDATE DEPT
    SET DNAME  = A_DNAME,
        LOC    = A_LOC
  WHERE DEPTNO = A_DEPTNO ;
 
  IF SQL%NOTFOUND THEN
     INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (A_DEPTNO, A_DNAME, A_LOC) ;
 
 
  END IF;


End ;

 

부서코드 부서명 위치를 입력 받아 부서 테이블에 넣는 초 간단 프러시저 입니다.

(부서코드 낫 파운드 떨어지면 무조건 신규로 입력이 들어 가면 됩니다.)

 

프러시저 컴파일 하고 나서 데이터 윈도우 그립니다.

 

 

프러시저 업데이트 메뉴 선택..

 

탭이 세개가 나옵니다. 인서트 업데이트 델리트에 대해서 프로시저를 각각 지정 할 수 있습니다

 

미리 컴파일한 프러시저를 선택 합니다.

 

dw 상의 컬럼과 프러시저 상의 인풋 아귀먼트를 연결 합니다.

(나중에 dw상의 컬럼 값이 프러시저 아규먼트로 넘어 갑니다.)

프러시저가 인서트나 업데이트일떄 같이 사용가능한 프러시저이기에 업데이트, 인서트탭 똑같이 지정 하고 오케 버튼..

로우 업데이트 프로퍼티는 안하셔도 됩니다.

 

데이터 윈도우 저장시 해당 로우에 대해서 신규 수정 삭제에 대해서 해당 I/O에 대해서 정의된 프러시저를

태웁니다.

 

-----------------------

1분만에 만든 초간단 클라이언트 화면..예제..

 

오픈

// Profile SCOTT
SQLCA.DBMS = "O90 Oracle9i (9.0.1)"
SQLCA.LogPass = "tiger"
SQLCA.LogId = "scott"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
connect;
dw_1.SetTransObject(SQLCA)

 

조회

dw_1.Retrieve()

 

입력

dw_1.InsertRow(0)

 

저장

if dw_1.Update() = 1 Then 
 Commit;
Else
 Rollback;
End If

 

Posted by 농부지기
,

[ 파워빌더.DataWindow - function ]

 

  

 

Delete 버퍼를 지우기 : dw_1.RowsDiscard(1, dw_1.DeletedCount(), Delete!)

rowcount()
modifiedcount()
filteredCount()
deletedCount()

 

Posted by 농부지기
,

[ 파워빌더.DataWindow - Print 응용 ]

 

☞  한페이지에 row를 10개만 출력하고 다음 페이지로 넘기고 싶을때 조치 방법

 


다음의 expression을 갖는 computed field control을 만든다..
 -> Ceiling(getrow() / 10)   // 10은 row의 수

그 다음에는 이 computed field control로 Group을 만든다음에

New Page on Group Break 속성을 켜주면 됨

☞  인쇄 전 미리보기 설정

 

dw_1.INSERTROW(0)

DW_1.modify("datawindow.print.Preview        = YES") 
DW_1.modify("datawindow.print.Preview.Rulers = NO")
DW_1.modify("datawindow.print.orientation = 1")  //가로

Posted by 농부지기
,

[ 파워빌더.DataWindow - Type 알아내기  ]

 

☞   

 

DW의 Type에 대하여 문의 하신 분이 있었는데

오늘 잠깐 보다보니 예전에 이런 소스를 만들어서 사용했더군요

해서 참고 하세요

우선 nonvisualobject를 만드세요(있으면 그냥 넣으세요)

------- 이렇게 함수 하나 만드세요 ---------

/* String GetDWType ( powerobject apo_obj )
*/
String ls_DWtype, ls_syntax
datawindow ldw
datastore lds
datawindowchild ldwc

ls_syntax = ''
if IsValid( apo_obj ) then
 choose case apo_obj.TypeOf()
  case datawindow!
   ldw = apo_obj
   ls_syntax = ldw.Describe("DataWindow.Syntax")
  case datastore!
   lds = apo_obj
   ls_syntax = lds.Describe("DataWindow.Syntax")
  case datawindowchild!
   ldwc = apo_obj
   ls_syntax = ldwc.Describe("DataWindow.Syntax")
 end choose
end if
if Trim(ls_syntax) = '' or IsNull(ls_syntax) then
 ls_DWtype = 'Not Object ...'
else
 ls_DWtype = GetDWType( ls_syntax )
end if

return ls_DWtype

-------- 다음과 같이 중복으로 하나더 만드세요 ------

/* String GetDWType ( string as_syntax )
*/
string s_DWType
integer i_rtn = 0
DataStore lds
lds = create DataStore
lds.create( as_syntax, s_DWType )
if Len(s_DWType) = 0 then
 choose case lds.Describe("DataWindow.Processing")
  case '0'
   if Pos(as_syntax,'report') > 0 then
    /* 하위에 report가 있으면 composite */
    s_DWType = 'composite'
   else
    if long(lds.Describe("DataWindow.Header.Height")) = 0 then
     /* Header Height 가 0 이면 */
     s_DWType = 'freefrom'
    else
     //if long(lds.Describe("DataWindow.Rows_Per_Detail")) > 0 then rows_per_detail
     if Pos(as_syntax,'rows_per_detail') > 0 then
      /* 단수가 있으면 n-up */
      s_DWType = 'n-up'
     else
      //if Pos(Lower(as_syntax), 'group') > 0 then
       /* group 이 있으면 group */
      // s_DWType = 'group'
      //else
       s_DWType = 'tabular'
      //end if
     end if
    end if
   end if
  case '1'
   s_DWType = 'grid'
  case '2'
   s_DWType = 'label'
  case '3'
   s_DWType = 'graph'
  case '4'
   s_DWType = 'crosstab'
  case '5'
   s_DWType = 'composite'
  case '6'
   s_DWType = 'ole20'
  case '7'
   s_DWType = 'richtext'
  case '8'
   s_DWType = 'treeview'
 end choose
end if
return s_DWType
/*
 
 choose case in_df.GetDWType(ls_syntax)
  case 'composite'
  case 'crosstab'
  case 'freefrom'
  case 'graph'
  case 'grid'
  case 'group'
  case 'label'
  case 'n-up'
  case 'ole20'
  case 'richtext'
  case 'tabular'
  case 'treeview'
 end choose

*/

 

Posted by 농부지기
,

[ 파워빌더.DataWindow - RowsCopy ]

 

☞   

 

같은 DW를 복사할려면 RowsCopy를 사용합니다.

헌데 같은 테이블을 쓰지만 한쪽은 조인되어 있고 한쪽은 그냥 한개의 테이블이다.

보통 엑셀로 자료를 내릴때 불편하지요

복사되는 DW의 컬럼을 기준으로 원본에서 자료를 복사해 봤습니다.

 

PS,. 이름이 다르더라도 컬럼번호를 이용하는 방법도 있습니다.

 

//wf_savecopy(adw, tdw)
string ls_objects, ls_column[], ls_col, ls_coltype
long   ll_pos, row, irow
integer i
tdw.Reset()
ls_objects = tdw.describe ("Datawindow.Objects")
ls_objects += '~t'
ll_pos = 0 ; ll_pos = pos(ls_objects, '~t')
Do While ll_pos > 0
 ls_col = Left(ls_objects, ll_pos - 1 )
 if tdw.describe(ls_col + ".type") = 'column' then
  ls_column[UpperBound(ls_column) + 1] = ls_col
 end if
 ls_objects = Mid(ls_objects, ll_pos + 1 )
 ll_pos = 0
 ll_pos = pos(ls_objects, '~t')
Loop

for row = 1 to adw.rowcount()
 irow = tdw.insertrow(0)
 for i = 1 to UpperBound(ls_column)
  ls_coltype = tdw.describe(ls_column[i] + ".coltype")
  if pos(ls_coltype,'(') > 0 then ls_coltype = Left(ls_coltype, pos(ls_coltype,'(') - 1)
  choose case ls_coltype
   case 'decimal'
    tdw.SetItem(irow, ls_column[i], adw.GetItemDecimal (row, ls_column[i]) )
   case 'number', 'long'
    tdw.SetItem(irow, ls_column[i], adw.GetItemNumber  (row, ls_column[i]) )
   case 'char'
    tdw.SetItem(irow, ls_column[i], adw.GetItemString  (row, ls_column[i]) )
   case 'date'
    tdw.SetItem(irow, ls_column[i], adw.GetItemDate    (row, ls_column[i]) )
   case 'datetime'
    tdw.SetItem(irow, ls_column[i], adw.GetItemDateTime(row, ls_column[i]) )
  end choose
 next
next

 

Posted by 농부지기
,

[ 파워빌더.DataWindow - 라인 선택  ]

 

☞   여러 라인 선택

 

윈도우 탐색기를 보면 Ctrl + Click의 경우 계속해서 선택하고, Shift + Click의 경우

처음과 나중클릭을 전부 선택하는 기능이 있습니다. 이 기능을 DataWindow에 적용하는 방법입니다. 

 

    먼저 Global 함수를 만듭니다.

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

    함수명 :gf_multi_select

    전달값 :a_dw(datawindow),al_row(현재row)

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

 

    long  w_selrow, i

 

    if al_row <= 0 then return

 

     if keydown(keyshift!)then

         w_selrow = a_dw.GetSelectedRow(0)

         if w_selrow > 0 then

               for i = min(w_selrow,al_row) to max(w_selrow, al_row)

                        a_dw.SelectRow(i,true)

               next

         else

               a_dw.SelectRow(al_row,true)

         end if

     elseif keydown(KeyControl!) then

         if a_dw.isSelected(al_row) then

               a_dw.SelectRow(al_row,false)

         else

               a_dw.SelectRow(al_row,true)

         end if

      else

         if a_dw.isSelected(al_row) then

               a_dw.SelectRow(0,false)

         else

               a_dw.SelectRow(0,false)

               a_dw.SelectRow(al_row,true)

         end if

       end if 

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

 

    이 함수를 해당 Datawindow의 Clicked Event에서 부르면 됩니다.

 

    Clicked Event Script

    if row < 1 then return

    gf_multi_select(this,row)

☞  선택 row갯수 파악

 

ll_selectedcount = Long(dw_1.Describe("Evaluate('sum(if(isselected(),1,0) for all)',1)"))

☞  row에 마우스 Over 되면 row 색 변하게 하기

 

[mousemove]
Event ID : pbm_mosemove


long ll_pos
String dwobject
string ls_row

dwobject = dw_data.GetObjectAtPointer()
ll_pos = Pos(dwobject, "~t")
IF ll_pos > 0 THEN
ls_row = Mid(dwobject, ll_pos + 1)
END IF

IF Long(ls_row) = 0 THEN RETURN

dw_data.Modify("DataWindow.Detail.Color=~"553648127~tif ( getrow() = " + ls_row + ", rgb(255,240,240), rgb(255,255,255) )~"")

 

Posted by 농부지기
,