Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 在运行时更改模式delphi 5/crystal 8.5_Oracle_Delphi_Crystal Reports 8.5 - Fatal编程技术网

Oracle 在运行时更改模式delphi 5/crystal 8.5

Oracle 在运行时更改模式delphi 5/crystal 8.5,oracle,delphi,crystal-reports-8.5,Oracle,Delphi,Crystal Reports 8.5,我现在有一个数据库,前端(delphi 5)连接一个用户名。 我们使用以下方法调用报告: with tcrpe.create(self) do try report_name := 'CrystalLotRecapSummary.rpt'; if fileexists(dmposting.tws_drive+'\tws\special\'+report_name) then ReportName := dmposting.tws_drive+'\t

我现在有一个数据库,前端(delphi 5)连接一个用户名。 我们使用以下方法调用报告:

with tcrpe.create(self) do
    try
      report_name := 'CrystalLotRecapSummary.rpt';
      if fileexists(dmposting.tws_drive+'\tws\special\'+report_name) then
        ReportName := dmposting.tws_drive+'\tws\special\'+Report_Name
      else
        ReportName := dmposting.tws_drive+'\tws\reports\harvest\'+Report_Name;
      WindowButtonBar.PrintSetupBtn := true;
      Paramfields.retrieve;
      ParamFields[0].Value := cmbCropYear.text;  // IN OLD REPORT
      ParamFields[1].Value := 'ALL';
      ParamFields[2].Value := real_to_str(unitfactor,0);  // IN OLD REPORT
      ParamFields[3].Value := cmbUnit.text; // IN OLD REPORT
      ConnectMethod := useConnect;
      Connect.Retrieve;
      Connect.Password := 'PASSWORD';
      Output := toWindow;
      Execute;
    finally
      CloseJob;
    end;
end; // PRINT SUMMARY BY WAREHOUSE
这个很好用。问题是我们现在将有两个模式(sysdba和sysdba2)

现在,crystal reports查询如下所示:

SELECT
LOT_RECAP."GROWING_YEAR", LOT_RECAP."GREEN", LOT_RECAP."ADJUSTED", LOT_RECAP."SHIPPED",
LOT_RECAP."WAREHOUSE_ID", LOT_RECAP."REMAINING", LOT_RECAP."LOT_ID",
LOT_RECAP."FINISH_DRYING", LOT_RECAP."NAME", LOT_RECAP."STATUS",
LOT_RECAP."COMMODITY_ID",
LOT_RECAP."VARIETY_ID", LOT_RECAP."PRODUCER_ID", LOT_RECAP."LR_AVMOISTURE",
LOT_RECAP."PROJECTED", LOT_RECAP."NOTE", LOT_RECAP."MASTER_ID",
LOT_RECAP."VARIETY_TYPE",
LOT_RECAP."CROP", LOT_RECAP."STORAGE_ONLY"
FROM
"SYSDBA"."LOT_RECAP" LOT_RECAP
WHERE
LOT_RECAP."GROWING_YEAR" = 2009 AND
LOT_RECAP."COMMODITY_ID" = 'RICE' AND
LOT_RECAP."STORAGE_ONLY" = 'FALSE'
ORDER BY
LOT_RECAP."LOT_ID" ASC

我需要找出一些方法让报表决定用户ID是否为sysdba,然后表是sysdba.lot\U recap,如果用户ID是sysdba2,那么表名是sysdba2.lot\U recap。顺便说一句,我要为大约300份报告做这件事。任何帮助都将不胜感激。如果我没有提供足够的信息,请让我知道

请参阅命令。

创建一个视图以合并两个表并通过新列“userid”进行选择:

现在修改您的select以从LOT_RECAP_ALL中选择并添加LOT_RECAP。“USERID”=“sysdba”(或sysdba2):

根据您的连接用户,您可能需要添加

grant select on LOT_RECAP_ALL to sysdba;


也许您还需要在sysdba(2)上添加select grants。lot\u recap给视图所有者。从这里看不出来,这取决于您的模式的访问权限。

确定问题终于解决了。通过进入报告本身,然后进入设置位置。如果我从位置中删除架构名称,Crystal reports将允许我根据登录时使用的用户名动态分配架构名称

有一个sysdba.lot\u repack\u all和一个sysdba2.lot\u repack all。当用户以sysdba登录查看报告时,我希望他们看到报告中填充了数据frm sysdba.lot_recap_all,如果他们以sysdba2登录,我希望他们看到报告中填充了sysda2.lot_recap_all中的数据。到目前为止,我发现的唯一方法是进入并创建两个不同的报告,而这正是我试图避免的。如果我这样做,我必须进入并手动编辑所有300个报告,然后我必须手动插入一条语句,以根据登录重新设计报告指向的位置,因为我向您展示的select语句查找完全合格的表,我不希望sydba能够访问Sysdb2,反之亦然,我想强制crystal根据我的登录名从sysdba或Sysdb2中提取数据,而不必手动执行。好的,最简单的解决方案是从select中删除模式限定符。如果不能使用完全限定表更改select语句,我看不出有任何方法可以欺骗oracle使用不同的表。地块重述是视图还是表格?如果它是一个视图,您仍然可以使用我的方法:重命名它,使用从重命名的原始视图中选择的我的视图,使用userid=USER进行授权和查询。或者在crystal中有一些方法,但我不知道。它是一个表,select语句必须在crystal reports中限定,如果它只是一个,我可能会这样做,但它有几百个报告。看起来真正的解决方案是删除crystal reports。我们一直在寻找一个借口,我可能会去快速报告,因为它看起来不需要完全合格,无论哪种方式,我都会花费大量的时间进行更改(耶…)
SELECT
LOT_RECAP."GROWING_YEAR", LOT_RECAP."GREEN", LOT_RECAP."ADJUSTED", LOT_RECAP."SHIPPED",
LOT_RECAP."WAREHOUSE_ID", LOT_RECAP."REMAINING", LOT_RECAP."LOT_ID",
LOT_RECAP."FINISH_DRYING", LOT_RECAP."NAME", LOT_RECAP."STATUS",
LOT_RECAP."COMMODITY_ID",
LOT_RECAP."VARIETY_ID", LOT_RECAP."PRODUCER_ID", LOT_RECAP."LR_AVMOISTURE",
LOT_RECAP."PROJECTED", LOT_RECAP."NOTE", LOT_RECAP."MASTER_ID",
LOT_RECAP."VARIETY_TYPE",
LOT_RECAP."CROP", LOT_RECAP."STORAGE_ONLY"
FROM
"LOT_RECAP_ALL" LOT_RECAP
WHERE
LOT_RECAP."GROWING_YEAR" = 2009 AND
LOT_RECAP."COMMODITY_ID" = 'RICE' AND
LOT_RECAP."STORAGE_ONLY" = 'FALSE' AND
LOT_RECAP."USERID" = 'sysdba' -- or sysdba2
ORDER BY
LOT_RECAP."LOT_ID" ASC
grant select on LOT_RECAP_ALL to sysdba;
grant select on LOT_RECAP_ALL to sysdba2;