* Powerbuilder 10.5

 

 

 

저번 강의에서 로우를 선택할 수 있게 체크박스 형태의 칼럼을 dw를 만들었습니다.

이제 선택된 로우를 삭제하는 스크립트를 작성하겠습니다.

 

 

삭제버튼(cb_delete)의 Clicked 이벤트를 수정해야 하는데요.

 

 

두 가지 방법이 있다고 말씀드렸습니다.

첫번째 방법은 For Loop 를 사용해서 모든 로우의 del 칼럼 값을 체크해서 그 값이 1이면 삭제하는 방법이고

두번째 방법은 Do Loop 와 Find 함수를 사용해서 del 칼럼 값이 1인 것만 찾아 삭제하는 방법입니다.

 

 

 

w_list 의 삭제버튼(cb_delete) 의 clicked 이벤트를 엽니다.

 

기존 스크립트는 전부 코멘트 처리 합니다.

 

 

 

먼저 첫번째 방법으로 구현해 보겠습니다.

 

다음과 같이 스크립트를 작성합니다.

 

 

 

dw_emp.object.del[i]

 

 

dw_emp.getItemNumber(i, 'del')

 

와 동일합니다.

 

dw_emp 의 DataObject 인 d_emp 에서 칼럼도 하나의 object 입니다.

dw_emp.object.del[i] 는 del 칼럼값 가운데 i 번째 로우값을 가져오라는 뜻입니다.

 

DataWindow Object 접근 문법이 따로 있을 정도로 간단한 내용은 아닙니다.

기회가 되면 Object 접근 문법을 상세히 다루겠습니다.

 

dw_emp.deleteRow(i)

i - -

li_cnt - -

 

i 번째 로우를 삭제했으므로

i, li_cnt 의 값을 1만큼 감소시켰습니다.

 

lb_isDeleted 의 값은 한 개의 로우라도 삭제가 되면 true 가 됩니다.

(boolean 타입은 선언시 초기값이 false 입니다.)

 

그러므로 for~next 후의 lb_isDeleted 값이 false 이면 삭제된 로우가 없다는 뜻이 됩니다.

 

실행해보면 문제 없이 잘 작동합니다.

 

이 스크립트 대신 다음 스크립트도 가능합니다.

 

 

 

 

for i = li_cnt to 1 step -1

 

for~next 구문의 문법에는 step 키워드가 포함되어 있습니다.

step 은 for~next 구문 변수의(여기서는 i) increment(증가율)을 지정하는 역할을 합니다.

step -1

은 루프가 돌 때마다 i 값을 -1 만큼 증가시켜라 즉, 1만큼 감소시킨다는 뜻입니다.

step increment 는 생략가능하고 기본값은 step 1 입니다.

 

여기서 루프가 돌때마다 i 값은 li_cnt 부터 1씩 감소해서 1까지 변경됩니다.

 

 

 

 

두번째 방법으로 구현해 보겠습니다.

 

 

 

do ~ loop while 구분을 사용했습니다.

 

loop while 1=1

에서 1=1 은 항상 true 이므로 무한루프가 만들어집니다.

그리고 루프 안에 exit  명령을 줘서 어떤 조건이 되면 루프를 빠져 나오게 만들었습니다.

 

다음은 dw_emp.find....

 

 

Find method (DataWindows)

설명

dw 안에서 제시된 조건(expression)에 맞는 데이터가 있는 로우를 찾음.

문법

long dwcontrol.Find ( string expression, long start, long end )

반환값

검색 범위(start~end) 내에서 조건에 맞는 첫번째 로우 넘버를 반환.

조건에 맞는 로우가 없을 때는 0을 반환.

 

 

dw_emp.find("del = 1", li_start, li_cnt)

는 li_start 부터 검색해서 del = 1 인 조건에 맞는 첫번째 로우 넘버를 반환합니다.

 

dw_emp.deleteRow(li_find)

li_start = li_find

 

조건에 맞는 로우를 삭제하고 난 다음 li_start 값을 li_find 로 변경합니다.

li_start = li_find + 1 이 아니고 li_start = li_find 입니다.

dw_emp.deleteRow(li_find) 에 의해서 li_find 로우는 이미 삭제되었기 때문입니다.

 

 

수고하셨습니다.

 

 

지금까지의 소스를 첨부합니다.

 

pb_study.zip

 

 

 

 

Posted by 신선봉(닉네임)

댓글을 달아 주세요

  1. 후니 2014.09.17 15:25 신고  댓글주소  수정/삭제  댓글쓰기

    강의가 아주 쏙쏙 들어오네요^^;;

    반절정도 진행했는데..

    노고에 감사를 표합니다...

  2. 초보맨 2015.03.17 12:40 신고  댓글주소  수정/삭제  댓글쓰기

    이게 마지막 강의라니 안타깝습니다ㅜㅜ

  3. 레드콘 2015.03.26 17:35 신고  댓글주소  수정/삭제  댓글쓰기

    혹시 스크립트 폰트가 어떤걸 쓰는지 알수 있을까요?

  4. Daniel 2015.07.06 17:40 신고  댓글주소  수정/삭제  댓글쓰기

    그간 강의 잘봤습니다.
    pb 개발은 처음이라 막연했는데 신선봉님 덕분에 기초 닦고 가네요.
    그간 너무나 감사했습니다 :)

  5. 호미 2015.11.22 03:10 신고  댓글주소  수정/삭제  댓글쓰기

    중국에서 학교를 다니는데 파워빌더 수업을 들어야돼서 정말 힘들었는데 신선봉님 글을 찾게 되어서 과제도 어찌어찌 잘 하고 정말 감사합니다!!!

  6. Favicon of http://mrrootable.tistory.com BlogIcon Mr. Rootable 2016.04.25 11:02 신고  댓글주소  수정/삭제  댓글쓰기

    다른 툴에 비해 파워빌더 개발자들을 위한 커뮤니티가 활성화되어있지 않아 아쉬움이 많았던 차에 이런 블로그를 보니 반갑네요. 부디 더욱 활성화가 되어 목마른 파빌개발자들의 오아시스가 되길 바랍니다.

  7. 신성봉짱짱맨 2017.02.07 10:28 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다ㅜㅜ
    정말 도움 많이되고있습니다.
    시중에 책도 많이품절되서 없는데
    이걸로 파빌공부하고있어요!

  8. Anoni 2017.02.17 11:57 신고  댓글주소  수정/삭제  댓글쓰기

    공부에 많은 도움 되었어요 ㅠㅠ 감사합니다!

  9. 으어어에러시렁.. 2017.12.12 15:14 신고  댓글주소  수정/삭제  댓글쓰기

    문제가 있습니다 위 첫번째 방법을 사용하였을시 여태까지 작성해왔던 이벤트 중 하나인
    dw_emp 에 rowfocuschanged 이벤트에 없는 범위를 넘었거나 없는 로우 칼럼에 대하여 셀렉트로우 이벤트가 작동하게되어 심각한 오류 발생으로 파워빌더가 강제로 튕기게 합니다.
    isDeleted 인스턴스 변수로 선어하여 이구간을 이렇게 처리해버렸습니다 ㅠㅜ 팅기는 이유를 몰랐지만..디버깅을 열심히 하다가 발견했습니다.. 아마도 제가 주신 소스로 안하고 여태까지 과정을 다....하나에 적용시켜서 생긴 문제인 것 같습니다 ㅠㅜ
    if lb_isDeleted = true then return

    dw_emp.selectrow(0 , false)
    dw_emp.selectrow(currentrow , true)
    dw_emp.setfocus()
    dw_emp.scrolltorow(currentrow)