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

[파워빌더] ItemChanged이벤트에서 GetItem시 전의 값이나 맞지 않는 값을 가져올 경우

by 아유카와 2012. 7. 19.

   파워빌더로 개발을 하다보면 ItemChanged 이벤트에서 해당 DW의 데이터 값을 가져와 연산해주는 경우가 필요 합니다. 이럴 경우 문제가 생기는 경우가 종종있지요. 특히 자동 계산되는 Computed의 값을 가져올 때 그런 경우가 많은데요. 


이럴 경우는 dw_test.Post Getitem~~ 이런 형식으로 써주면 ItemChanged 이벤트가 다 완료되고 GetItem이 수행이 되니 데이터값을 정상으로 가져올 수 있습니다. 또는 윈도우 펑션을 만드는 방법이 있겠고요. 이벤트를 만들어 주는 방법도 있겠네요. 펑션이나 이벤트  앞에 POST를 넣어주면 위와 같은 효과를 얻을 수 있겠지요. 

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

가장 좋은 방법은 Itemchanged의 Data 값을 이용해서 윈도우 펑션으로 Data값을 인자로 넘겨주어 처리하는 방법일것 같습니다.( 이런경우사용하겠죠 : 하나의 Item이 수정되면 Dw의 모든 값들이 영향을 받는 경우.. 펑션으로 만들면 다른곳에서도 사용 할 수 있으니 더 나은것 같기도 합니다. )




  또다른 ItemChaged시 문제는 Item을 수정 후 다른 컬럼으로 이동하지 않고 상단의 툴바저장을 눌렀을 때 입니다. 저장에 코딩으로 관련 dw를 AcceptText()를 해주는 코드를 넣으면 Post가 작동해서 그런지 적용되기 전 값이 저장되는 경우를 볼 수 있습니다. 저장 이전에 어떻게든 ItemChanged가 돌아가도록 해줘야 하는데 말이죠. LoseFocus()에 AcceptText()를 넣었어도 툴바의 저장버튼을 누를땐 작동이 되지 않습니다. 하는 수 없이 윈도우나 POST를 빼고 윈도우 펑션이나 Event에 AcceptText()를 넣었습니다 .

--> 연구결과 LostFocus()를 발생시키기 위해서는 툴바의 Update() 이벤트 호출시 Post로 호출을 하면

됩니다!! 그러면 LostFocus()가 먼저 발생 될것이고 LostFocus()의 이벤트의 AcceptText()가 발생 되면서 값이 모두 세팅 된 후 Update가 수행 되므로 정상적인 값이 저장되는걸 확인 했습니다.( 하지만 Itemchangd안에 Event 불러올 떄 post를 썼다면 이 이벤트는 저장 후 일어 납니다. 조심! ) 이렇게 하면 아마도 Update()에 기술하던  AcceptText를 사용하지 않아도 되지 않을까 합니다. 또한 이벤트나 펑션에만 Post를 붙여주면 되겠지요. --> 툴바에서 따로 update를 호출 할 경우만 해당 됩니다. 


저나 파워빌더 하시는 분들에게 도움 되는 글이 되었기를.. 미래에 ^^ 홧팅!~!