0

我现在有一个数据库,前端(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

这工作得很好。问题是我们现在将有 2 个模式(sysdba 和 sysdba2)。

现在水晶报告查询看起来像:

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_recap,如果用户 ID 是 sysdba2,那么表名是 sysdba2.lot_recap。顺便说一句,我必须为大约 300 份报告执行此操作。任何帮助将不胜感激。如果我没有提供足够的信息,请告诉我

4

3 回答 3

1

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

于 2012-07-30T16:21:12.753 回答
0

请参阅ALTER SESSION SET CURRENT SCHEMA命令。

于 2012-07-12T23:57:22.470 回答
0

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

create view LOT_RECAP_ALL as
 select 'sysdba' userid, l.* from sysdba.lot_recap l
 union all
 select 'sysdba2' userid, l.* from sysdba2.lot_recap l
;

现在修改您的选择以从 LOT_RECAP_ALL 中选择并添加 LOT_RECAP."USERID" = 'sysdba'(或 sysdba2):

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;

也许您还需要将 sysdba(2).lot_recap 上的选择授权添加到视图所有者。不能从这里看出这一点,这取决于您的架构的访问权限。

于 2012-07-13T08:57:43.433 回答