Cbuilder XE を使用しており、Mydac コンポーネントで Rave Report を使用したいのですが、Rave は標準の TQuery コンポーネントのみを認識し、Mydac バージョンを無視しているように思えます。
TMyQuery コンポーネントと possiby を使用して Rave レポートをフィードする方法があるかどうかお尋ねします。これは、そのようなクエリの結果の単純なリストを出力する簡単な例です。
Cbuilder XE を使用しており、Mydac コンポーネントで Rave Report を使用したいのですが、Rave は標準の TQuery コンポーネントのみを認識し、Mydac バージョンを無視しているように思えます。
TMyQuery コンポーネントと possiby を使用して Rave レポートをフィードする方法があるかどうかお尋ねします。これは、そのようなクエリの結果の単純なリストを出力する簡単な例です。
私は Delphi でこれを行う方法しか知らないので、CBuilder に相当するものに変換する必要があります。RAVE コンポーネントに関しては、Delphi と CBuilder が同一であると確信しています。プログラムでこれを行う方法はわかりませんが、RAVE レポート デザイナーを使用すると比較的簡単です。
RAVE TRvDataSetConnection コンポーネントを使用して、TMyQuery コンポーネントをレポートにリンクします。
通常、データ モジュールに TRvDataSetConnection コンポーネントをクエリと共にドロップします。TMyQuery ごとに 1 つの TRvDataSetConnection です。レポート デザイナーにフィールド名が表示されるようにするには、すべての SQL フィールドを TMyQuery コンポーネントに追加する必要があります。TMyQuery のフィールド エディタを開いて ^F を押すと、これを自動的に行うことができます。MySQL サーバーへの有効な接続がある場合、フィールドが入力され、適切なデータ型が割り当てられます。
次に、RAVE レポート デザイナー内で、新しいデータ オブジェクトを作成し、ダイレクト データ ビュー アイテムを選択します。DataView をデータモジュールの RvDataSetConnections に接続します。これで、TMyQuery のすべてのフィールドにアクセスできるようになりました。RAVE デザイナの DataView を、クエリの内容を表示するレポート バンドにリンクします。
プラン B は、FastReports を購入してインストールすることです。RAVEはかなり悪いです:-)
Raveを一般的な印刷ユーティリティとして使用する私自身の方法
void __fastcall TFormMain::Action_ReportExecute(TObject * Sender)
{
__try
{
Screen->Cursor = crHourGlass;
int maxrow = 0;
RvSystem1->Execute();
}
__finally
{
Screen->Cursor = crDefault;
}
}
RvSystem1Print:RvSystemコンポーネントのonPrintイベントです。実行時にビルドできないため、印刷ユーティリティが必要なフォームごとにコンポーネントを追加する必要があります。
void __fastcall TFormMain::RvSystem1Print(TObject * Sender)
{
int maxrow = 0;
String Fun = "[FormMain::RvSystem1Prin] ";
try
{
RvSystem1->SystemPreview->FormWidth = ( Screen->Width > 900 ) ? 900 : Screen->Width ;
RvSystem1->SystemPreview->FormHeight = Screen->Height * 0.9;
TBaseReport * report = (TBaseReport*) Sender;
UtilClientPmv::DBGridToRaveReport(DBGrid1, report, maxrow);
}
catch (Exception & ex)
{
Mylog(Fun + Sysutils::Format("ERROR=[%s] ", ARRAYOFCONST((ex.Message))));
}
}
DBGridToRaveReport:dbgrid(含まれている画像)にリンクされたテーブル内のすべてのレコードをスキャンして印刷します
int __fastcall UtilClientPmv::DBGridToRaveReport(TDBGrid * grid, TBaseReport * report, int maxrow)
{
String Fun = "[UtilClientPmv::DBGridToRaveReport] ";
TMWTable * mwTable = NULL;
int iret = IRET_OK;
try
{
mwTable = (TMWTable*) grid->DataSource->DataSet;
iret = MWTableToRaveReport(mwTable, report, maxrow);
}
catch (Exception & ex)
{
Util::mylog(Fun + Sysutils::Format("ERROR=[%s] ", ARRAYOFCONST((ex.Message))));
}
return iret;
}
MWTableToRaveReport:テーブル内のすべてのレコードをスキャンして印刷します(画像を含む)
int __fastcall UtilClientPmv::MWTableToRaveReport(TMWTable * mwTable, TBaseReport * report, int maxrow)
{
String fldName, fldValue, smsg, Fun = "[UtilClientPmv::MWTableToRaveReport] ";
int tot_row, tot_fld, tot_rec, iret = IRET_OK;
double x, y, y2, rpos, pgWidth;
TField * fld = NULL;
TBookmark bkMark; // TBookmark == TByteDynArray
Graphics::TBitmap * bitmap = NULL;
try
{
if (maxrow == 0)
{
maxrow = 1000;
}
__try
{
if (mwTable->Active == false)
{
mwTable->Active = true;
}
tot_row = mwTable->Data->RecordCount;
if (tot_row < 0)
{
throw Exception("RecordCount in Null");
}
if (tot_row > maxrow)
{
tot_row = maxrow;
}
report->StatusFormat = "Page %d";
report->Units = unMM;
pgWidth = report->PageWidth;
mwTable->DisableControls();
bkMark = mwTable->GetBookmark();
tot_fld = mwTable->FieldCount;
tot_rec = mwTable->RecordCount;
int irow = 1, icol;
mwTable->First();
report->SetFont("Courier New", 10);
report->PrintCenter("Report PmvManager", pgWidth / 2);
report->NewLine();
report->SetTab(10, pjLeft, 160, 0, 0, 0);
while (!mwTable->Eof)
{
smsg = Sysutils::Format("Record %03d / %03d", ARRAYOFCONST((irow, tot_row)));
report->PrintTab(smsg);
report->NewLine();
for (int icol = 0; icol < tot_fld; icol++)
{
String NumberFormat, strValue;
fld = mwTable->Fields->Fields[icol];
fldName = fld->DisplayName;
// int lnum = report->LineNum;
int lleft = report->LinesLeft();
if (lleft == 0)
{
report->NewPage();
}
if (fld->DataType == ftBlob)
{
smsg = Sysutils::Format("%30s : ", ARRAYOFCONST((fldName)));
report->PrintTab(smsg);
x = report->XPos;
y = report->YPos;
if (!fld->IsNull)
{
bitmap = new Graphics::TBitmap();
__try
{
TGraphicField * gFld = (TGraphicField*)fld;
if (gFld)
{
TMemoryStream * memStream = new TMemoryStream();
__try
{
gFld->SaveToStream(memStream);
if (memStream->Size > 1)
{
memStream->Seek(0, soFromBeginning);
bitmap->LoadFromStream(memStream);
report->PrintBitmapRect(x, y - 3, x + 12, y + 9, bitmap);
}
report->NewLine();
report->NewLine();
}
__finally
{
delete memStream;
memStream = 0;
}
}
}
__finally
{
delete bitmap;
bitmap = 0;
}
}
}
else
{
fldValue = fld->AsString;
smsg = Sysutils::Format("%30s : %s ", ARRAYOFCONST((fldName, fldValue)));
report->PrintTab(smsg);
}
report->NewLine();
}
irow++;
mwTable->Next();
x = report->XPos;
y = report->YPos;
report->MoveTo(2, y);
report->LineTo(pgWidth - 4, y);
report->MoveTo(x, y);
report->NewLine();
report->NewPara();
}
}
__finally
{
mwTable->GotoBookmark(bkMark);
mwTable->EnableControls();
mwTable->FreeBookmark(bkMark);
}
}
catch (Exception & ex)
{
Util::mylog(Fun + Sysutils::Format("ERROR=[%s] ", ARRAYOFCONST((ex.Message))));
}
return iret;
} // __________ UtilClientPmv::MWTableToRaveReport