我现在有一个数据库,它有一个用户名,前端(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我需要找出一些方法,让报告决定用户is是sysdba,那么表是sysdba.lot_recap,如果用户is是sysdba,那么表名是sysdba2.lot_recap。顺便说一句,我必须为大约300个报告做这件事。任何帮助都将不胜感激。如果我没有提供足够的信息,请让我知道
发布于 2012-07-31 00:21:13
Ok问题终于解决了。进入报告本身,然后转到Set Location。如果我从该位置删除模式名称,Crystal reports将允许我根据登录时使用的用户名动态分配模式名称。
发布于 2012-07-13 07:57:22
请参见ALTER SESSION SET CURRENT SCHEMA命令。
发布于 2012-07-13 16:57:43
创建一个视图来联合这两个表,并按新列“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
;现在修改您的select以从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上的select授权添加到视图所有者。从这里看不出来,这取决于您的模式的访问权限。
https://stackoverflow.com/questions/11461759
复制相似问题