파워빌더로 개발을 하다보면 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를 호출 할 경우만 해당 됩니다.
저나 파워빌더 하시는 분들에게 도움 되는 글이 되었기를.. 미래에 ^^ 홧팅!~!