Crystal Reports 2016如何动态访问带生成名称的数据库字段?
Crystal Reports 2016 动态访问数据库字段的解决方法
Crystal Reports的公式编辑器不支持直接通过字符串动态引用数据库字段或公式字段,你当前写法里的{@varFieldName}会被当成名为varFieldName的公式字段,而不是解析成你动态生成的字段名,这就是字段不被识别的核心原因。以下是可行的解决思路:
方法一:提前绑定字段,用数组映射(最直接)
- 先把
databaseName.fieldName6到databaseName.fieldName45所有字段都添加到报表的字段资源管理器中(必须加载到报表里,CR只能访问已加载的字段)。 - 用数组按顺序存储这些字段,再通过循环索引访问:
Local NumberVar i; Local StringVar array tmp_arr := []; // 按顺序定义要访问的字段数组 Local StringVar array fieldList := [ {databaseName.fieldName6}, {databaseName.fieldName7}, // ... 依次添加到fieldName45 {databaseName.fieldName45} ]; // 循环遍历数组(数组索引从1开始,共39个元素) For i := 1 To UBound(fieldList) Do ( tmp_arr := tmp_arr + Split(fieldList[i], "@"); // 这里写你处理数组的逻辑 );
方法二:用Select Case映射索引与字段
如果不想写长数组,可以用条件判断直接映射循环变量到对应字段:
Local NumberVar i; Local StringVar array tmp_arr := []; Local StringVar currentFieldValue; For i := 6 To 45 Do ( // 根据i的值匹配对应字段 currentFieldValue := Select i Case 6: {databaseName.fieldName6} Case 7: {databaseName.fieldName7} // ... 依次添加到Case 45 Case 45: {databaseName.fieldName45} Default: ""; tmp_arr := tmp_arr + Split(currentFieldValue, "@"); // 处理数组的逻辑 );
方法三:通过SDK动态访问(适合嵌入式开发)
如果你是用.NET/Java SDK开发嵌入式报表,可以在代码层面动态获取字段值(脱离CR Designer操作):
// C# SDK示例 ReportDocument report = new ReportDocument(); report.Load("你的报表路径.rpt"); for(int i = 6; i <= 45; i++) { string fieldName = $"databaseName.fieldName{i}"; // 获取字段值 object fieldValue = report.Database.Tables["对应表名"].Fields[fieldName].CurrentValue; // 后续处理逻辑 }
关键注意事项
- 所有要访问的数据库字段必须提前添加到报表中,CR无法访问未加载的字段。
- CR公式语言是静态类型,不支持动态解析字符串为字段引用,必须显式绑定字段。
内容的提问来源于stack exchange,提问作者klediooo
相关产品推荐
相关产品推荐

