|
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 없이 바로 해당컬럼에서 상/하 키 사용시 처리 위함
공통에 반영되어 있어 이 부분만 추출하여 별도로 만들기가 어렵네요.. 쩝 소스로 못올려 죄송합니다.. |