본문 바로가기
프로그래밍/DB/파워빌더

[파워빌더] ItemChanged 이벤트, 값 적용이 이전의 값으로 적용되는 경우, DW이동시 ItemChanged 발생 안될시

by 아유카와 2012. 5. 10.

1.  일단 DW를 수정하고 다른 DW로 이동을 하게 되면 ItemChanged 이벤트가 발생이 되지 않는다. 조상단의 LosetFocus에  This.AcceptText() 코드를 넣어주어서 포커스를 잃어버릴때 강제로 ItemChanged가 발생하도록 해준다.


2. ItemChanged 이벤트에는 AcceptText()를 사용하지 않는것이 좋다. AcceptText() 자체가 또다시 ItemChanged를 호출하기 때문에 프로그램이 개발자가 원하는대로 작동하지 않을 수 있다.

굳이 호출 하고 싶다면 유저이벤트나 유저펑션에서 호출 해 주도록 하자.

ItemChanged에서 GetITemXXX의 명령어를 사용하면 값이 한단계씩 늦게 변경되는 경우를 자주 볼 수 있다. ItemChanged 이벤트 내 Data 값을 사용하거나 위와 같이 함수나 이벤트를 만들어 AcceptText() 처리 해주면 처리 가능 하다.


3. ItemChanged에서 Computed( 이 컴퓨티드가 ItemChanged에 의해 변경된 값을 원천으로 하는 값이라면 ) 의 값을 가져올 경우 ItemChanged에서 바로 Get하게 되면 제대로 된 값을 가져오지 못하므로 유저이벤트에서 가져오는 코드를 작성하고 Post Event로 유저 이벤트를 호출 하여 그 변경된 값을 제대로 가져 올 수 있다. 

프로젝트중 추가사항 -->  ItemChanged에서의 Post 이벤트 사용시 주의점 : 해당컬럼 변경 후 다른 버튼( 저장 등)을 누룰시 저장 이벤트가 일어난 후 해당 Post 이벤트가 일어나므로 조심해야 한다.  ItemChanged가 완전히 종료된 후 compute filed가 변경 되므로 compute filed에 변경하고 있는 컬럼의 합계값을 설정해 가져오려면 ItemChanged에서 호출하는 Event나 펑션을 Post로 하지말고 Event나 펑션 안에 AccpetText를 넣어주면 해결 된다. ( 위의 2번 형식을 사용하는게 좋아 보인다 )


4. ItemChanged의 Data 값은 현재 입력된 값을 가져온다. Dw 버퍼에 적용되기 전의 값을 가져온다.( ItemChanged에서 GetItemXXX으로 값을 가져오면 이전의 값을 가지고 있는것을 확인 할 수 있다. ItemChanged가 정상 처리 되고나서 GetItemXXX해야 입력한 값을 가지고 있으므로 ItemChanged 내부에서는 Data로 현제 입력된 값을 가지고 어떠한 가공을 처리 할 수 있다.


틀린 점이 있으면 댓글로 좀 알려주세요 ^^ 간만에 정리해봅니다.