Q&A

  • Crystal Report 질문요.. ^^
도움을 주셔서 어느정도 진전을 보이고 있는데 잘 안되는 부분이 있어서요..

1.
현재 ms-sql2000에 OLE 접근하고 있는데요..

report := Application1.OpenReport('d:\test.rpt', crOpenReportByTempCopy);

report.Database.Tables.Item[1].SetLogOnInfo('아이피','DB명','Login ID', 'Password');

위 방식으로는 로그인이 되는데...

아래 방식으로 하니.. 로그인을 못하더라구요.. ^^;; 왜 그런지요..
Application1.LogOnServer('p2ssql.dll', '아이피','DB명','Login ID', 'Password');

2.
그리고 서브리포트를 사용할때 서브 리포트의 로그인 정보는 따로 안 적어줘도 되는 건가요?

3. TUpDown을 이용해서.. 여러 페이지가 존재할 때 페이지에 접근할려구 하는데요.. 잘 안되서요..
////////////////////////////
  if Button = btPrev then
    CRViewer91.ShowPreviousPage
  else if Button = btNext then
    CRViewer91.ShowNextPage;

CRViewer91.GetCurrentPageNumber;
/////////////////////////
위 구문을 반복해서 실행하면..  CRViewer91.GetCurrentPageNumber;에서 에러가 발생하네요.. ^^;; 왜 그런지요..

4. 전체 페이지를 구하려고..하는데 잘 안되네요..
CRViewer91.GetLastPageNumber(); 구문을 이용해서 하려는데
파라미터가 잘 안맞는지 제대로 수행이 안되요..


생각하는게 처음에 전체 페이지를 구해서 TUpdown에 max값을 구하고
위 아래로 버튼을 눌러 페이지를 이동하려 하거든요..

부족한게 많이 질문만 계속 올립니다. 불쌍한 저에게 구원의 손길을.. ^^;;
3  COMMENTS
  • Profile
    서기원 2004.09.01 19:20
    3,4번에 대한 답변입니다.

    OnDownloadFinished에서 GetCurrentPageNumber와 getLastPageNum을 호출하시면 원하시는 결과를 얻을 수 있을 겁니다.

    저도 다른곳에서 호출했더니 제대로 값을 가져오지 않아서 고생 좀 했습니다..--;;

    1,2번도 해결하시길 바라면서 즐프하세요..

  • Profile
    오재열 2004.09.01 20:27
    흠... 그럼.. 어떻게 적어야 하지요???

    procedure TForm1.CRViewer91DownloadFinished(Sender: TObject;
      loadingType: TOleEnum);
    var
      ntotPage : integer;
      nBool : WordBool;
    begin

      CRViewer91.GetLastPageNumber(ntotPage, nBool);
      pnlPage.Caption := intTostr(CRViewer91.GetCurrentPageNumber);

    end;

    이렇게 적으니까 처음에 데이터를 로딩?? 할 필요가 있을 때는 이 부분이 호출되는데 이미 한번 보았던 페이지를 볼 경우 이부분이 호출이 되지 않더라구요..

    저는 statusbar에 현재 보고 있는 페이지 번호를 호출할려구 하거든요..

    그리고.. 처음에 로딩했을 때는..

    마지막 번호 ntotPage에 지금까지 보았던 페이지중 마지막이 호출되네요..
    (전체 페이지가 10페이지 일때 1페이지부터 3페이지를 봤다면.. 다시 호출되면 4페이지가 마지막 페이지라고 적히던데...흠흠)

    어찌 해야 하는지요... ^^;;


  • Profile
    오재열 2004.09.02 20:06
    계속 고민을 하다가.. 데브피아에서 힌트를 얻어 나름대로 노가다형식으로 구현해서 적었네요..

    GetLastpageNumber하고 GetCurrentPageNumber를 사용하기에는 좀 무리가 있는 거 같구요..

    저는 TUpDown을 만들어서 그걸 가지고 페이지 이동하구요.. Status바에
    '현재페이지/전체 페이지' 이런 식으로 표현합니다.  

    전역변수로
    nCurPage, nTPage : integer; 현재 페이지, 전체페이지


    1. 리포트 Open시에..
    var
       report : IReport;
       PrintingStatus : IPrintingStatus;
    begin

       report := Application1.OpenReport('rpt파일명', crOpenReportByTempCopy);

    ////////// 중간에 데이터 연결, 파리미터 연결, formula필드 연결등등/////

       CRViewer91.ReportSource := report;

       PrintingStatus := report.PrintingStatus;
       nCurPage := 1;
       nTPage := PrintingStatus.NumberOfPages;
       udPage.Max := nTPage;
       stbPrev.Panels.Items[0].Text := '1' + ' / ' + IntToStr( nTPage );

       CRViewer91.ViewReport;

       report := nil;
       PrintingStatus := nil;

       Application1.Destroy;


    2. 화면 확대에 대해서는 Combobox를 넣고..
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
      iZoom : integer;
    begin
      iZoom := 100;
      Case ComboBox1.ItemIndex of
        // 페이지 너비
        0 : iZoom := 1;
        // 전체 페이지
        1 : iZoom := 2;
        //400
        2 : iZoom := 400;
        //300
        3 : iZoom := 300;
        //200
        4 : iZoom := 200;
        //150
        5 : iZoom := 150;
        //100
        6 : iZoom := 100;
        //75
        7 : iZoom := 75;
        //50
        8 : iZoom := 50;
        //25
        9 : iZoom := 25;
      end;

      CRViewer91.Zoom(iZoom);

    end;

    3. 페이지 넘기기..
    (TUpdown의 Associate는 지정안하구요.. 판넬 하나 가져다 붙여 놓고.. 적었어요..Associate를 지정하니까.. caption이 잘 안움직여서요.. ^^;;)
    procedure TForm1.udPageClick(Sender: TObject; Button: TUDBtnType);
    begin
      if Button = btPrev then
      begin
        if nCurPage <= 1 then exit;
        CRViewer91.ShowPreviousPage;
        nCurPage := nCurPage - 1;
      end
      else if Button = btNext then
      begin
        if nCurpage >= nTPage then exit;
        CRViewer91.ShowNextPage;
        Inc(nCurPage);
      end;

      pnlPage.Caption := IntToStr(nCurPage);
      stbPrev.Panels.Items[0].Text := pnlPage.Caption + ' / ' + IntToStr( nTPage );
    end;