[ 파워빌더.DDDW - filter.방향키 제어 ]

 

 

dddw row 조건에 따라 filter를 이용해서 제어 하는 부분중 상하키를 이용하여 이동될때 제어하는 예제가

 

까리보이님께서 올려 주신 http://cafe.naver.com/pentaeduclub/942 가 있는데.. 이를 달리 datastore 없이 사용하게 변경해 보았습니다..

 

1. child 필터시 SetValidate 사용

DatawindowChild ldw_child
Long ll_FilteredCount

 

/* 그냥 DatawindowChild  구한 겁니다 */

If uf_getchild ( as_col , ldw_child ) Then

    /* filter 조건을 datacolumn에 Set 합니다. */
    ldw_Child.SetValidate (as_col_code, as_filter )
    ldw_Child.SelectRow ( 0 , False )
    ldw_child.SetDetailHeight( 1, ldw_child.rowcount(), 0)
    /*

        다른 예제를 보면 부정형으로 되어 있는데 여기선 긍정형 입니다. 

        예를 들어 dept_cd 가 '10' 인 자료만 filter 를 할경우 dept_cd ='10' 이죠 긍정형 으로 

    */
    ldw_child.setfilter( as_filter )
    ll_FilteredCount = ldw_child.filter()
    ldw_child.SetDetailHeight( 1, ldw_child.Rowcount(), Long(ldw_child.describe("datawindow.detail.height")))
    ldw_child.setfilter( "" )
    ldw_child.filter( )
    ldw_child.setSort( "#1 A, #2 A" )
    ldw_child.Sort( )
 Return ll_FilteredCount
Else
 Return 0
End If

 

2. uf_setitem ( row , dwo, any )

choose case Mid(this.describe(dwo.name + ".coltype"),1,5)
 case "long", "ulong","real", "numbe"
  messagebox ('setitem',this.SetItem(al_row,String(dwo.name), Long(aa_data)))
 case "doubl"
  this.SetItem(al_row,String(dwo.name), Double(aa_data))
 case "decim" //al
  this.SetItem(al_row,String(dwo.name), Dec(aa_data))
 case "date"
  this.SetItem(al_row,String(dwo.name), Date(aa_data))
 case "datet" //ime
  this.SetItem(al_row,String(dwo.name), DateTime(aa_data))
 case "time"
  this.SetItem(al_row,String(dwo.name), Time(aa_data))
 case "char("
  this.SetItem(al_row,String(dwo.name), aa_data)
 case else
end choose

// itemchanged Event 재 호출

This.event itemchanged( al_row, dwo, String(aa_data))

3. uf_getitem ( row, col, buffer, true or false )

any la_item

choose case Mid(this.describe(as_col + ".coltype"),1,5)
 case "long", "ulong","real", "numbe"
  la_item = this.getItemNumber(al_row, as_col, adwbf_buffer, ab_org)
 case "decim" //al
  la_item = this.getItemDecimal(al_row, as_col, adwbf_buffer, ab_org)
 case "date"
  la_item = this.getItemDate(al_row, as_col, adwbf_buffer, ab_org)
 case "datet" //ime
  la_item = this.getItemDateTime(al_row, as_col, adwbf_buffer, ab_org)
 case "time"
  la_item = this.getItemTime(al_row, as_col, adwbf_buffer, ab_org)
 case "char("
  la_item = this.getItemString(al_row, as_col, adwbf_buffer, ab_org)
 case else
end choose

return la_item

 

4. 제어 함수 만들기 (function name : uf_dropdown , 파레메타는 itemchanged 와 동일합니다.)

datawindowchild adwc_child
 

/* 그냥 DatawindowChild  구한 겁니다 */  
If io_child.uf_getchild( dwo.name, adwc_child ) Then
    Long ll_find, ll_row , ll_idx
 String ls_rule, ls_datacolumn
 // Drop Down Name Get
 ls_datacolumn = Describe(dwo.name+".dddw.datacolumn")
 
 // Column Type 에 따라 입력된 값의 Row Search
 If Mid(adwc_child.describe(ls_datacolumn + ".coltype"),1,5) = 'char(' Then
  ll_row = adwc_child.Find (ls_datacolumn + "='" + data +"'", 1, adwc_child.RowCount())
 Else
  ll_row = adwc_child.Find (ls_datacolumn + "=" + data, 1, adwc_child.RowCount())
 End If
 
 // Column Validate Get
 ls_rule = adwc_child.getvalidate( Integer ( adwc_child.describe( ls_datacolumn +".id") ) )

 // Validate 가 없으면 정상 Return
 If f_snvl ( ls_rule , '' ) = '' Then
  Return 0
 End If
 // Column Type에 따라 Validate 검증
 If Mid(adwc_child.describe(ls_datacolumn + ".coltype"),1,5) = 'char(' Then
  ll_find = adwc_child.Find (ls_datacolumn + "='" + data +"' and " + ls_rule , 1, adwc_child.RowCount())
 Else
  ll_find = adwc_child.Find (ls_datacolumn + "=" + data +" and " + ls_rule , 1, adwc_child.RowCount())
 End If

 If ll_find = 0 Then
  If KeyDown(KeyUpArrow!) Then
   If ll_row > 1 Then
    //하단으로 부터 동일 Rule자료 찾기
    For ll_idx =  ll_row - 1 To 1  STEP -1
     ll_find = adwc_child.Find (ls_rule , ll_idx, ll_row - 1)
     If ll_find > 0 Then Exit
    Next
   Else
    // 이전 값으로 대체
    This.Post uf_setitem (row,  dwo, uf_getitem( row, dwo.name, Primary!, True) )
    Return 0
   End If
  Else
   // 현 위치 보다 아래에서 찾기
   ll_find = adwc_child.Find (ls_rule , ll_row + 1, adwc_child.RowCount())
  End If
  
  If ll_find > 0 Then
   adwc_child.SelectRow(0, False)
   adwc_child.SetRow(ll_find)
   adwc_child.ScrollToRow(ll_find)
   adwc_child.SelectRow(ll_find, True)
   If Mid(adwc_child.describe(ls_datacolumn + ".coltype"),1,5) = 'char(' Then
    This.Post uf_setitem (row,  dwo, adwc_child.GetItemString(ll_find,ls_datacolumn) )
   Else
    This.Post uf_setitem (row,  dwo, adwc_child.GetItemNumber(ll_find,ls_datacolumn))
   End If
   Return 0
  Else
   // 이전 값으로 대체

   /* column datatype 에 따라 Setitem 해 준겁니다 */
   This.Post uf_setitem (row,  dwo, uf_getitem( row, dwo.name, Primary!, True) )
   Return 0
  End If
 Else
  // Validate 정상 Return
  Return 0
 End If
Else
 Return 0
End If

Return 0

 

5. event 에 반영 (itemchanged)

//Drop Down 처리

uf_dropdown ( row, dwo, data )

Return 0

 

6. 실제 사용

    ---> 적용하려는 dw constructor에서 filter 초기화 

         --> drop down click 없이 바로 해당컬럼에서 상/하 키 사용시 처리 위함

   --->  해당 Column에서 pbm_dwndropdown event 발생시 child filter

   ---> 만약 filter 조건이 변경할 경우 변경되는 column itemchanged 에서 filter 재설정

         --> drop down click 없이 바로 해당컬럼에서 상/하 키 사용시 처리 위함

 

공통에 반영되어 있어 이 부분만 추출하여 별도로 만들기가 어렵네요.. 쩝  소스로 못올려 죄송합니다..

☞  

 

Posted by 농부지기
,