Crystal Reports Java Viewer数据库连接器错误

2020-08-27 22:24发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们正在使用使用Java的Crystal Reports-Java报表组件(JRC)的基于服务器的报表查看器替换原来的Crystal Report Viewer(以前是在本地运行的Visual Basic应用程序)。 不幸的是,某些以前可以运行的报告现在在网页中返回数据库连接器错误。

我们的记录选择公式为:

{eMAR_order_data.FACILITY} = {?FacilityID}和{eMAR_order_data.PATID} = {?ClientID},并且(如果{?EpisodeNumber}从" 1"到" 999999",则{eMAR_order_data.EPISODE_NUMBER} = ToNumber({? EpisodeNumber}),否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{eMAR_order_data.tx_setting_code} =" O",如果{?EpisodeNumber} =" ALL",则1 = 1)和{eMAR_order_data.order_start_date} <= {?OrdersActiveThruDate} 和{eMAR_order_data.order_stop_eff_date}> = {?OrdersActiveFromDate}和(如果{?OrderTypes}中的{@OrderTypes>""然后{@OrderTypePacked})和(如果{?HideOrdersEnabled} =" Y",则{eMAR_order_data.hide_order_code} <>" Y",否则,如果{?HideOrdersEnabled} <>" Y",则1 = 1)和((如果{?VerifyOrderReg} =" 1",则{eMAR_order_data.rou_prn_other_code} <>" STAT"和{eMAR_order_data.pharmacy_verified_code} <>" N")或(如果{?VerifyOrderReg} <>" 1",则{eMAR_order_data.rou_prn_other_code} <>" STAT")或(如果{?VerifyOrderRegSTAT} =" 1",则{eMAR_order_data.rou_prn_other_code} =" STAT "和{eMAR_order_data.pharmacy_ver ified_code} <>" N")或(如果是{?VerifyOrderRegSTAT} <>" 1",则{eMAR_order_data.rou_prn_other_code} =" STAT"))

如果?EpisodeNumber是包含数字值的字符串,则此方法运行良好。 但是,如果字符串包含" ALL"或" ALLOUTPATIENT",则报告将产生"意外的数据库连接器错误"。

我玩过唱片选择公式,并替换了:

如果{?EpisodeNumber}从" 1"到" 999999",则{eMAR_order_data.EPISODE_NUMBER} = ToNumber({?EpisodeNumber})否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{eMAR_order_data.tx_setting_code} =" O" 否则,如果{?EpisodeNumber} =" ALL",则1 = 1

如果{?EpisodeNumber} =" ALL",则1 = 1,否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{eMAR_order_data.tx_setting_code} =" O",如果{?EpisodeNumber}在" 1"至" 999999" 然后{eMAR_order_data.EPISODE_NUMBER} = ToNumber({?EpisodeNumber})

这个新公式很好用。 我的问题是:为什么? 我们还有其他报告,我们也知道这些报告在以前运行良好的情况下也会失败。 由于Crystal用于临时报告,因此这可能会影响数百个报告。 有没有办法确定某种语法是否不适用于Java并识别那些报告?

我们正在为数据后端连接到Intersystems Cache 2017数据库。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们正在使用使用Java的Crystal Reports-Java报表组件(JRC)的基于服务器的报表查看器替换原来的Crystal Report Viewer(以前是在本地运行的Visual Basic应用程序)。 不幸的是,某些以前可以运行的报告现在在网页中返回数据库连接器错误。

我们的记录选择公式为:

{eMAR_order_data.FACILITY} = {?FacilityID}和{eMAR_order_data.PATID} = {?ClientID},并且(如果{?EpisodeNumber}从" 1"到" 999999",则{eMAR_order_data.EPISODE_NUMBER} = ToNumber({? EpisodeNumber}),否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{eMAR_order_data.tx_setting_code} =" O",如果{?EpisodeNumber} =" ALL",则1 = 1)和{eMAR_order_data.order_start_date} <= {?OrdersActiveThruDate} 和{eMAR_order_data.order_stop_eff_date}> = {?OrdersActiveFromDate}和(如果{?OrderTypes}中的{@OrderTypes>""然后{@OrderTypePacked})和(如果{?HideOrdersEnabled} =" Y",则{eMAR_order_data.hide_order_code} <>" Y",否则,如果{?HideOrdersEnabled} <>" Y",则1 = 1)和((如果{?VerifyOrderReg} =" 1",则{eMAR_order_data.rou_prn_other_code} <>" STAT"和{eMAR_order_data.pharmacy_verified_code} <>" N")或(如果{?VerifyOrderReg} <>" 1",则{eMAR_order_data.rou_prn_other_code} <>" STAT")或(如果{?VerifyOrderRegSTAT} =" 1",则{eMAR_order_data.rou_prn_other_code} =" STAT "和{eMAR_order_data.pharmacy_ver ified_code} <>" N")或(如果是{?VerifyOrderRegSTAT} <>" 1",则{eMAR_order_data.rou_prn_other_code} =" STAT"))

如果?EpisodeNumber是包含数字值的字符串,则此方法运行良好。 但是,如果字符串包含" ALL"或" ALLOUTPATIENT",则报告将产生"意外的数据库连接器错误"。

我玩过唱片选择公式,并替换了:

如果{?EpisodeNumber}从" 1"到" 999999",则{eMAR_order_data.EPISODE_NUMBER} = ToNumber({?EpisodeNumber})否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{eMAR_order_data.tx_setting_code} =" O" 否则,如果{?EpisodeNumber} =" ALL",则1 = 1

如果{?EpisodeNumber} =" ALL",则1 = 1,否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{eMAR_order_data.tx_setting_code} =" O",如果{?EpisodeNumber}在" 1"至" 999999" 然后{eMAR_order_data.EPISODE_NUMBER} = ToNumber({?EpisodeNumber})

这个新公式很好用。 我的问题是:为什么? 我们还有其他报告,我们也知道这些报告在以前运行良好的情况下也会失败。 由于Crystal用于临时报告,因此这可能会影响数百个报告。 有没有办法确定某种语法是否不适用于Java并识别那些报告?

我们正在为数据后端连接到Intersystems Cache 2017数据库。

付费偷看设置
发送
6条回答
Aaron 3364
1楼-- · 2020-08-27 23:01

您好,布莱恩,

我没有适合您的答案,但我已向开发人员发送了请求,以查看他们是否有想法。 我确实知道Java引擎的CR是CR引擎的完整重写版本。 您在COM VB应用程序中使用的CR引擎是用C/C ++编写的,而在CR for Java中使用的是纯Java。 因此,翻译中可能会遗漏一些东西。

我会让你知道我从开发人员那里听到的信息。

Shawn

95年老男孩
2楼-- · 2020-08-27 22:53

其他人都有这个吗? 问题? 我至少在两份报告中对此有所体会。 这会破坏某些报告,因为返回的数据量难以管理。 我可以通过编程寻找这种模式吗? 我们遇到的问题是,它在Crystal Report Developer版本14中只能以一种方式工作,但是在使用JRC进行查看时,其行为会有所不同。

CJones
3楼-- · 2020-08-27 22:49

Hi Brian,

Dev尝试过 复制问题,仅使用常规公式(无记录选择)时无法复制。 我们还尝试对SQL Server数据库(带有Xtreme示例数据库)使用记录选择公式。 我们使用公式:

如果{?EpisodeNumber}在" 1"到" 999999"中,则为false 否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则为true 否则,如果{?EpisodeNumber} =" ALL",则为true

其中EpisodeNumber是带有四个可能值" All"," ALLOUTPATIENT"," 1"和" 2"的列表的参数。

我们无法复制该问题-可能是特定于您正在使用的数据库。 您可以针对SQL Server数据库进行测试吗?

Shawn

一只江湖小虾
4楼-- · 2020-08-27 22:49

感谢您的回复。 您是否预计何时会收到开发人员的反馈(这几天或几周)?

hongfeng1314
5楼-- · 2020-08-27 22:49

嗨,布莱恩,

感谢您所做的所有工作 您要复制它。 我收到了报告,并能够解决问题并将报告传递给开发人员。 当我得到它时,我将传递他们的答复。

Shawn

compass1988
6楼-- · 2020-08-27 23:11

我已经在SQL Server中重新创建了此问题。 我已经将xtreme.mdb Access数据导入到SQL Server中以创建一个xtreme数据库。 我仅使用"订单"表创建报告。 我有"记录选择公式"的两种变体,下面是Crystal Reports版本14.0.2.34和Java Reporting Components生成的SQL查询。 注意,对于Crystal Reports中的相同值,查询是相同的,但是Java Reporting Components完全省略了SQLEpisodeNumber1.rpt中EpisodeNumber值" ALL"和" ALLOUTPATIENT"的WHERE子句。 这种差异导致大量数据从服务器传输到客户端,然后在客户端进行过滤。 查看器的以前的Visual Basic版本生成的SQL像Crystal Reports,而不是Java Reporting Components。

 SQLEpisodeNumber1.rpt结果:

   记录选择公式:
      {Orders.Shipped} = true
      并且,如果{?EpisodeNumber}从" 1"到" 999999",则{Orders.Order ID} = ToNumber({?EpisodeNumber})
      否则,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{Orders.Ship Via} =" UPS"
      否则,如果{?EpisodeNumber} =" ALL",则1 = 1

   从Crystal Reports版本14.0.2.346:
     EpisodeNumber =" 1"
     SQL查询:
       选择"订单"。"订单ID","订单"。"运送通过","订单"。"已发货"
       FROM" xtreme"。" dbo"。"订单""订单"
       在"订单"。"已发货" = 1和"订单"。"订单ID" = 1的位置

     EpisodeNumber ="所有人"
     SQL查询:
       选择"订单"。"订单ID","订单"。"运送通过","订单"。"已发货"
       FROM" xtreme"。" dbo"。"订单""订单"
       在"订单"。"已发货" = 1和"订单"。"通过运送" = N'UPS'
 
     EpisodeNumber ="所有"
     SQL查询:
       选择"订单"。"订单ID","订单"。"运送通过","订单"。"已发货"
       FROM" xtreme"。" dbo"。"订单""订单"
       在"订单"中。"已发货" = 1
 
   从使用Java Reporting Components编写的应用程序中:
     EpisodeNumber =" 1"
     SQL查询:
       选择"订单"。"已发货","订单"。"运送通过","订单"。"订单ID"来自" xtreme"。" dbo"。"订单""订单"
       在哪里("订单"。"已发货" = 1和"订单"。"订单ID" = 1)

     EpisodeNumber ="所有人"
     SQL查询:
       选择"订单"。"已发货","订单"。"运送通过","订单"。"订单ID"来自" xtreme"。" dbo"。"订单""订单"
 
     EpisodeNumber ="所有"
     SQL查询:
       选择"订单"。"已发货","订单"。"运送通过","订单"。"订单ID"来自" xtreme"。" dbo"。"订单""订单"
 
 SQLEpisodeNumber2.rpt结果:

   记录选择公式:
     {Orders.Shipped} = true
     并且,如果{?EpisodeNumber} =" ALLOUTPATIENT",则{Orders.Ship Via} =" UPS"
     否则,如果{?EpisodeNumber} =" ALL",则1 = 1
     否则,如果{?EpisodeNumber}从" 1"到" 999999",则{Orders.Order ID} = ToNumber({?EpisodeNumber})

   从Crystal Reports版本14.0.2.346:
     EpisodeNumber =" 1"
     SQL查询:
       选择"订单"。"订单ID","订单"。"运送通过","订单"。"已发货"
       FROM" xtreme"。" dbo"。"订单""订单"
       在"订单"。"已发货" = 1和"订单"。"订单ID" = 1的位置

     EpisodeNumber ="所有人"
     SQL查询:
       选择"订单"。"订单ID","订单"。"运送通过","订单"。"已发货"
       FROM" xtreme"。" dbo"。"订单""订单"
       在"订单"。"已发货" = 1和"订单"。"通过运送" = N'UPS'
 
     EpisodeNumber ="所有"
     SQL查询:
       选择"订单"。"订单ID","订单"。"运送通过","订单"。"已发货"
       FROM" xtreme"。" dbo"。"订单""订单"
       在"订单"中。"已发货" = 1

   从使用Java Reporting Components编写的应用程序中:
     EpisodeNumber =" 1"
     SQL查询:
       选择"订单"。"已发货","订单"。"运送通过","订单"。"订单ID"来自" xtreme"。" dbo"。"订单""订单"
       在哪里("订单"。"已发货" = 1和"订单"。"订单ID" = 1)

     EpisodeNumber ="所有人"
     SQL查询:
       选择"订单"。"已发货","订单"。"运送通过","订单"。"订单ID"来自" xtreme"。" dbo"。"订单""订单"
       在哪里("订单"。"已发货" = 1和"订单"。"运送通过" =" UPS")
 
     EpisodeNumber ="所有"
     SQL查询:
       选择"订单"。"已发货","订单"。"运送通过","订单"。"订单ID"来自" xtreme"。" dbo"。"订单""订单"
       WHERE("订单"。"已发货" = 1)

我们认为缺少WHERE子句和所导致的大查询(如果没有WHERE子句,我们的实际报告将联接多个表并可能生成数百万行)是导致数据库连接器错误的原因。

是否有一种方法可以解决此问题,以便由JRC生成WHERE子句,或者准确地确定JRC何时不生成WHERE子句,因此我们可以帮助确定客户编写的报告将失败或现在很长 运行时间是否取决于初始查询生成的数据量?

我无法附加实际报告(上面的插入文件按钮仅允许jpg等)。 我如何将这些报告发送给您,以便您自己查看结果?

谢谢

布莱恩

 

一周热门 更多>