首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时更改模式delphi 5/ crystal 8.5

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

Stack Overflow用户
提问于 2012-07-13 06:38:04
回答 3查看 602关注 0票数 0

我现在有一个数据库,它有一个用户名,前端(delphi 5)连接到这个数据库。我们使用以下内容来调用报告:

代码语言:javascript
复制
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查询如下所示:

代码语言:javascript
复制
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个报告做这件事。任何帮助都将不胜感激。如果我没有提供足够的信息,请让我知道

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-31 00:21:13

Ok问题终于解决了。进入报告本身,然后转到Set Location。如果我从该位置删除模式名称,Crystal reports将允许我根据登录时使用的用户名动态分配模式名称。

票数 1
EN

Stack Overflow用户

发布于 2012-07-13 07:57:22

请参见ALTER SESSION SET CURRENT SCHEMA命令。

票数 0
EN

Stack Overflow用户

发布于 2012-07-13 16:57:43

创建一个视图来联合这两个表,并按新列“userid”进行选择:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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

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

代码语言:javascript
复制
grant select on LOT_RECAP_ALL to sysdba;

代码语言:javascript
复制
grant select on LOT_RECAP_ALL to sysdba2;

也许您还需要将sysdba(2).lot_recap上的select授权添加到视图所有者。从这里看不出来,这取决于您的模式的访问权限。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11461759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档