프린터로 출력하던 함수(Writeln)를 파일로 출력하려면...
간단하게 하려면 TStringList 객체를 만들고 Add() 메소드 인자로 m_msg를 넘겨주어 추가한 후, 마자막에 SaveToFile 하면 됩니다. 조금은 더 복잡하지만 TFileStream을 쓸 수도 있습니다.
그리고... 효과적으로 하겠다는 것이 속도 개선을 말씀하시는 거라면...
1. FieldByName이 엄청나게 많이 쓰였죠? 이게 속도를 제법 까먹습니다. 필드의 정확한 위치를 아실테니, Fields[0] 이런 식으로 인덱스로 지정해주세요. FieldByName이 많았을 경우에는 속도가 상당히 빨라집니다.
2. FormatFloat() 함수도 꽤 느린 함수입니다. 복잡한 포맷을 처리하는 포맷 종류의 함수들이 대부분 그렇습니다. 대충 보니 복잡한 포맷이 아닌 거 같은데, 직접 처리해보시죠.
3. 만약 써넣을 데이터량이 엄청나게 크다면.. 예를 들어 수십메가 단위가 넘어간다면... 파일에 써넣는 시간이 문제가 될 수도 있습니다. 만약 그렇다면 메모리맵드 파일 방식을 써볼 것을 권합니다.
4. 아시겠지만, 뭐니뭐니해도 쿼리 자체의 속도가 빨라야 합니다. 만에 하나라도 데이터베이스 테이블의 bno 필드에 인덱스가 안잡혀있다면 꼭 인덱스를 추가해야겠지요.
5. RightStr은 왜 쓰셨는지 모르겠습니다.
이승근 님이 쓰신 글 :
: 아래에 문장이 예전에 직접 프린터로 출력하는 문을 구성했던 내용입니다...
: 이번에 데이터를 텍스트화일로 전환해야 하는데 이 구성문을 응용해 해보려하는데 한가지 질문이 있습니다...
: 필드간의 구분을 tab으로 해야합니다...
: 즉 텍스트화일을 만들고 바로 엑셀에서 불러올수 있어야 하거든요...
: 물론 아예 엑셀파일로 만들면 간단하지 싶지만 엑셀은 단지 제대로 만들어졌는지 확인용이고 실제로
: 텍스트화일을 만들어 디스크에 보관해 외부로 보내주어야 합니다...
: 엑셀로 먼저 만들고 그곳에서 텍스트로 만들어봄이 어떻냐고 하시는 분들이 간혹 계시던데 사용자가 이중일을
: 해야하는 문제가 있어서 막바로 텍스트화일을 만들어 주었으면 하네요...
: 어떻게 하면 되는지 또 아래 문장보다 더 효과적으로 전환할 수 있는 방법이 있는지 좀 알려주십시요...
:
: procedure Tjunpyo2F.SetPrint;
: var PrinterF : Textfile;
: m_msg : string;
: m_row : Integer;
: begin
: AssignFile(PrinterF,'LPT1');
: ReWrite(PrinterF);
:
: with main_0.work1 do
: begin
: Close;
: SQL.Clear;
: SQL.Add('Select * from ' + mfilename);
: SQL.Add('Where prtsort >= :a1 ');
: SQL.Add(' and prtsort <= :a2 ');
: SQL.Add('Order By bno');
: Parambyname('a1').AsFloat := CEdit91.Value ;
: Parambyname('a2').AsFloat := CEdit92.Value + 0.5;
: Open;
: First;
: end;
: while not main_0.work1.Eof do
: begin
: m_msg := LeftStr(main_0.work1.FieldByName('sdt').AsString + ' ',13);
: m_msg := m_msg + ' ' + RightStr(' ' + main_0.work1.FieldByName('bno').AsString,4);
: m_msg := m_msg + ' ' + RightStr(' ' + main_0.work1.FieldByName('sno').AsString,4);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0.0',main_0.work1.FieldByName('ton').AsFloat),4);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0',main_0.work1.FieldByName('g1').AsFloat),6);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0',main_0.work1.FieldByName('g2').AsFloat),6);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0',main_0.work1.FieldByName('g3').AsFloat),6);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0',main_0.work1.FieldByName('g4').AsFloat),6);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0.0',main_0.work1.FieldByName('f').AsFloat),7);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0.0',main_0.work1.FieldByName('d').AsFloat),7);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0.0',main_0.work1.FieldByName('ap').AsFloat),7);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0.0',main_0.work1.FieldByName('total').AsFloat),8);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0',main_0.work1.FieldByName('dtemp').AsFloat),6);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0',main_0.work1.FieldByName('htemp').AsFloat),6);
: m_msg := m_msg + ' ' + RightStr(' ' + Formatfloat('0',main_0.work1.FieldByName('atemp').AsFloat),4);
: Writeln(PrinterF,m_msg);
: :
: :
:
: main_0.work1.Next;
: end;
: CloseFile(PrinterF);
: end;
|