[ 파워빌더.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 농부지기
,

[ 파워빌더.DataWindow - titlebar 존재 시 이동 금지  ]

 

 

데이터윈도우를 가끔 윈도우창처럼 titlebar 를 활성화해서 사용할때가 있습니다.

그렇게 되면 데이터윈도우 창이 마우스로 move가 가능하게 되는데요.

못움직이게 고정해버리는 방법입니다.

 

우선 datawindow의 이벤트를 새로 추가합니다.

( Event ID : pbm_syscommand 를 생성한 후 아래와 같이 스크립트 기재 )

 

Uint a
a = Message.WordParm
CHOOSE CASE a
 CASE 61456, 61458
  Message.Processed = True
  Message.ReturnValue = 0
END CHOOSE
RETURN

Posted by 농부지기
,

[ 파워빌더.DataWindow - 컬럼 Clpboard에 복사 ]

 

 

☞   

 

//Click 한 자료를 ClipBoard 로 카피
If Row > 0 and dwo.type = "column"  and Not(string(dwo.name) = 'datawindow' ) Then
       If Not IsNull(dwo.Primary[row]) Then ::Clipboard(String(dwo.Primary[row]))
End If

말 그대로 선택한 Column의 데이타를 Clipboard에 담는 Script 입니다. (Click! Event에서 사용하시면 되겠죠..)

Posted by 농부지기
,

[ 파워빌더.DataWindow -  Expression 활용하기 ]

 

 

expression 은 파워빌더에서 쿼리에서 못다한 혹은 쿼리가 약한 분들에게 많은 장점을 제공하기도 합니다.

동적으로 조건에 따라 여러가지 설정도 할 수 있구요.

 

그 중에서 설마 이런 곳에서도 될까? 하는 곳을 소개 시켜 드릴께요.

 

바로 sortgroup 결정할때 가능합니다.

그럼 filter도 되겠죠? 나머진 응용해서 함 찾아서 해보세요..

 

sort 를 선택하시면, 보통은 컬럼만 옮겨놓습니다.

그런데, 해당 컬럼을 클릭하면 다음과 같은 expression 화면이 나옵니다.

 

여기서 if 문 안에서 in 을 사용해도 되는 걸 눈치채신 분도 계시나요? ^^ (저도 그냥 써봤습니다. 되더군요..)

 

이와 더불어 group 지정 할때도 그냥 컬럼만 넣으셨나요?

마찬가지로 컬럼을 넣으신 후 expression을 지정하실 수 있어요

 

 

 

 

Posted by 농부지기
,