我正在使用 Cbuilder XE,我想将 Rave Report 与 Mydac 组件一起使用,但在我看来,Rave 只识别标准 TQuery 组件并忽略 Mydac 版本。
我会问你是否有一种方法可以使用 TMyQuery 组件和 possiby 提供 Rave 报告,这是一个简单的示例,它打印此类查询结果的普通列表。
我正在使用 Cbuilder XE,我想将 Rave Report 与 Mydac 组件一起使用,但在我看来,Rave 只识别标准 TQuery 组件并忽略 Mydac 版本。
我会问你是否有一种方法可以使用 TMyQuery 组件和 possiby 提供 Rave 报告,这是一个简单的示例,它打印此类查询结果的普通列表。
我只知道如何在 Delphi 中执行此操作,因此您必须将其转换为 CBuilder 等价物。我很确定 Delphi 和 CBuilder 在 RAVE 组件方面是相同的。我不知道如何以编程方式执行此操作,但使用 RAVE 报表设计器相对容易。
我使用 RAVE TRvDataSetConnection 组件将 TMyQuery 组件链接到报告。
您通常将 TRvDataSetConnection 组件连同您的查询一起放在数据模块上 - 每个 TMyQuery 一个 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