아래 구문을.. 스트링 그리드 수만큼 돌립니다..
근데.. 문제가 뭐냐면 이 구문을 실행초기에는 progressbar가 1초에 하나씩 올라가는데..
시간이 지날수록 그 증가속도가 현저하게 떨아진다는거에 있습니다.
처음 4개는 1초에 하나씩 올라가는데..나중에는 10개를 올리는데 걸리는 시간이 무려 30분..
그리고 나중에는 10개에 한시간.. 이렇게 속도가 떨어진다는거죠.. 완료가 될때까지는 무려 6시간이나 걸리구요.
참고로 처리건수는 21만건 정도 입니다..
있던 소스에 주석만 좀 넣은 후 그냥 올려서 변수라던지 이런 부분에서 많이 헷갈리실것 같네요..
근데. 지우고 재정리해서 올리기에는 정작 문제점 부분을 놓치지나 않을까 해서 여과 없이 그대로 올렸습니다.
부디 고수님드의 조언 부탁드립니다..
with stgRecord do
begin
// 입금의 결과코드 저장 후 스트링그리드에 결과코드를 보여주기 위해 ColCount + 1 증가.
ColCount := ColCount + 1;
ColWidths[ColCount-1] := 100;
Cells[ColCount-1,0] := '입금결과코드';
probSave.Visible := True;
probSave.Max := stgRecord.RowCount - 1;
probSave.Position := 0;
// 스트링 그리드 row 수만큼 루프문 돌리기
for k := 1 to stgRecord.RowCount - 1 do
begin
// 프로그래스바 화면에 보이기..
j := 1; // 스트링그리드의 컬럼카운트..
{배열에 변수만큼 for문 돌리기.. 이부분이 들어간 이유는 스트링그리드에 읽어오는 값이 고정적이지 않아서 들어간 부분입니다.
필요한 텍스트 파일을 읽어서 스트링 그리드에 뿌려주는데..
그 스트링그리드에 읽어들인 값의 Col의 위치와 이차원배열로 선언된분의 위치와 동일하게 맞춰 나가는 부분이지요.
예를들어서. ar_SOFILE_R(c_cCustID, 9, 8)(c_Filler, 1, X)...
이런식으로 배열에 데이터가 들어가 있는데.. 이 값과.. 입금시 필요한 스트링리드의 값고 동일할경우..
해당변수에 값을 입력하는 구문입니다..}
for i := 0 to 30 do
begin
if ar_SoFile_R[i][0] = '' then
Break
else if (ar_SOFILE_R[i][0] = c_Filler) or
(ar_SOFILE_R[i][0] = c_DATAClass) then
Continue
else begin
// 데이터 넣기..
m_TmpStr := stgRecord.Cells[j,k];
{가입자아이디}
if ar_SOFile_R[i][0] = c_Custid then
m_CuStID := StrToInt(Trim(m_TmpStr))
{가입자아이디}
else if ar_SOFile_R[i][0] = c_Seq then
m_Seq := StrToInt(Replace_Str( Trim(m_TmpStr),',') )
{입금일자}
else if ar_SOFile_R[i][0] = c_ReceDate then
begin
m_ReceDate := m_TmpStr;
stgRecord.Cells[j,k] := m_TmpStr;
end
{이체일자}
else if ar_SOFile_R[i][0] = c_ReceByDate then
begin
m_ReceByDate := m_TmpStr;
stgRecord.Cells[j,k] := m_TmpStr;
end
{입금금액}
else if ar_SOFile_R[i][0] = c_Rece then
m_Rece := StrToInt(Replace_Str(Trim(m_TmpStr),','))
{결과코드}
else if ar_SOFIle_R[i][0] = c_ResultCode then
begin
if (Trim(m_TmpStr) = 'A') or
(Trim(m_TmpStr) = 'R') then // A장표나 Reject건..
Continue
end;
{공백일경우에는 무시}
INC(j);
end;
end; // 배열 For문 끝나는 시점
// 배열끝내고 데이터 처리부분..
with QTransBill do
begin
// 입금의 결과코드 가져오는 부분.. 가입자가 있는지 없는지만 체크..
SQL.Clear;
SQL.Add('exec sp_C0018_CustExist_S :pr_CustID, :pr_Payment ');
Parameters.ParamByName('pr_CustID').Value := m_CusTId;
Parameters.ParamByName('pr_Payment').Value := StringCode_Search('[',']',cobPayment.Text);
open;
// 증가된 ColCount에 결과코드 보여주기
Cells[ColCount-1,k] := FindField('Result').AsString;
m_ResultCode := StringCode_Search('[',']',FindField('Result').AsString);
if m_ResultCode = '00' then // 정상적일경우에는
begin
// adoquery문의 파람값 add 속도를 줄이기 위해 TADOStoredProc 를 사용..
with QReceiptSave_001 do
begin
// 입금내역 우선순위 정하기
Parameters.ParamByName('@pr_Flag').Value := 'S1';
Parameters.ParamByName('@pr_CustID').Value := m_CuStID;
Parameters.ParamByName('@pr_BillYYMM').Value := Copy(edtBillYYMM.Text,1,4) + Copy(edtBillYYMM.Text,6,2);
Parameters.ParamByName('@pr_BillClass').Value := m_BillClass;
Parameters.ParamByName('@pr_Billchar').Value := m_BillChar;
Parameters.ParamByName('@pr_BillCodeM').Value := m_BillCodeM;
Parameters.ParamByName('@pr_Text_S').Value := '';
Parameters.ParamByName('@pr_Text_A').Value := '';
Parameters.ParamByName('@pr_TrsSub_Code').Value := mp_SUB_Code;
Parameters.ParamByName('@pr_MSO_Code').Value := mp_MSO_Code;
Parameters.ParamByName('@pr_UserID').Value := mpub_UserID;
ExecProc;
Close;
end;
// 입금내역 저장하기
m_SQLTEXT := '';
m_SQLTEXT := m_SQLTEXT + 'exec sp_C0018_Receipt_Save_002 :pr_CustID, :pr_befBillNum, :pr_BeforeGubun, :pr_ReceDate, :pr_ReceByDate, ';
m_SQLTEXT := m_SQLTEXT + ':pr_Window, :pr_Rece, :pr_TrsSubCode, :pr_TrsUserid, :pr_Mso_Code, :pr_Userid ';
SQL.Clear;
SQL.Text := m_SQLTEXT;
Parameters.ParamByName('pr_CustID').Value := m_CustID;
//전표번호 ('I' + 발생일자(8) + 가입자아이디(8) + 순번(4))
Parameters.ParamByName('pr_befBillNum').Value := Replace_Str(mp_Today,'-') + Format('%.8d',[m_CuStID]);
if spdBefBill.Down = False then
m_TmpStr := 'G' // 가수금
else
m_TmpStr := 'S'; // 선금
parameters.ParamByName('pr_BeforeGubun').Value := m_TmpStr;
Parameters.ParamByName('pr_ReceDate').Value := m_ReceDate;
Parameters.ParamByName('pr_ReceByDate').Value := m_ReceByDate;
Parameters.ParamByName('pr_Window').Value := m_Window;
Parameters.ParamByName('pr_Rece').Value := m_Rece;
Parameters.ParamByName('pr_TrsSubCode').Value := mp_Sub_Code;
Parameters.ParamByName('pr_TrsUserid').Value := mpub_UserID;
Parameters.ParamByName('pr_MSO_Code').Value := mp_MSO_Code;
Parameters.ParamByName('pr_Userid').Value := mpub_UserID;
execsql;
end;
end;
probSave.Position := probSave.Position + 1;
end;
얼마전에 팁에서인가 봤던것 같은데...
ADO의 SQL에 쿼리를 ADD하게 되면, 내부적인 버그인지 몰라도 점차 속도가 느려진다고 본것 같습니다.
SQL.Add( query ) 를 SQL.Text:=query; 로 바꾸어 보시기 바랍니다.
그럼, 즐프~