안녕하세요 ODAC에 관련된 질문입니다
팁란에 김지훈님이 작성하신 내용중 일부입니다
================================================
* 추가사항
제가 하는 프로젝트의 경우 워낙 데이터가 많다보니(이동통신회사) 보고서 조회시 속도문제가 가장 큽니다.(물론 데어터의 정확성은 기본이구요)
데이터를 조회해서 그리드로 보여줄때 FetchRow를 기본row 25 개로 지정해서 조회를 하는데
사용자가 다시 그리드의 pagedown을 하여 데이터를 더 가져오거나,(25 record 단위)
그리드 스크롤을 최하단으로 끌어내리면 모든 데이터를 한꺼번에 가져오게 되는데 이경우 화면이 정지된것처럼
보여 이부분에 대해 odac 소스를 약간 수정해서 refresh 되도록 현재가져오는 데이터의 record 건수를 실시간으로 보여주도록 처리했습니다.
최초 25건을 그리드에 뿌려주고, 그리드는 마지막 데이터를 가져올때까지 계속 Fetchrow 만큼 데이터를 그리드에 추가해 주면서 record count는 refresh 해주게 됩니다. 물론 사용자는 다른 작업을 할 수 있습니다. 그리드로 원하는 데이터를 선택할 수 있습니다. 폼의 위치를 옮길수 도 있구요. 중간에 멈추게 할 수도 있구요.
(화면이 멈춰있는 것보단 덜 답답하더군요)
OraClass.pas 소스에서 ( 실시간 record 건수 가져오는 부분)
function TOCIRecordSet.FetchArray(FetchBack: boolean = False): boolean;
를 약간 수정을 하였습니다.
최하단에 현재까지 진행된 FetchedRows 를 그리드가 있는 폼으로 메세지를 날립니다.
SendMessage( TARGET_FORM.Handle, WM_USER_FETCHEDROWS, Command.FFetchedRows, 0 );
실제 db 프로그램을 작성하신 분이라면 금방 이해하실 만한 내용이라
실제 소스에서 구현된 세세한 부분은 제외 시켰습니다.
===========================================
저희도 DBGrid에 ODAC를 이용하여 개발중인데요
많은양의 데이터를 DBGrid에 출력했을때 스크롤를 마지막으로 내리면 행이 걸린거 처럼 나타납니다
그래서 팁란에 김지훈님이 작성하신 내용을 보고 소스를 수정중인데 잘안되네요
일단 TARGET_FORM은 프로세스에서 찾아서 핸들을 구했는데 메세지가 전달이 안됩니다
위방법을 성공하신분은 답변 꼭 부탁드립니다
그럼 즐거운 주말 보내세요.....
그리드가 있는 폼에서 메세지를 못 받는 경우라면 아래 처럼 받는 부분에 대한 처리를 추가 하셨는지요?
--선언부
//20060324 kjh
procedure WmFetchRows(var Msg :TMessage); message WM_USER_FETCHEDROWS;
--구현부
procedure TfrmReportResult.WmFetchRows(var Msg :TMessage);
begin
//if uf_CheckOpenForm = True then exit;
fThreadQry.DisableControls;
//if Trim(LabelEa.Hint) = '' then
//begin
IF Msg.WParam > 0 THEN
LabelEa.Caption := 'Rec = ' + IntToStr(Msg.WParam) ; // + ' / ' + LabelEa.Hint;
//end
//else
//begin
// LabelEa.Caption := 'Rec = ' + IntToStr(Msg.WParam) + ' / ' + LabelEa.Hint;
//end;
fThreadQry.EnableControls;
application.ProcessMessages;
end;