2012-07-12 42 views
0

我現在有一個數據庫,前面(delphi 5)端連接到一個用戶名。 我們使用以下報告稱爲報告:在運行時改變模式delphi 5/crystal 8.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,如果用戶標識是sysdba2,那麼表名是sysdba2.lot_recap。順便說一句,我必須爲約300份報告做這件事。任何幫助將不勝感激。如果我沒有提供足夠的信息,請讓我知道

回答

1

好的問題終於想通了。通過進入報告本身,然後去設置位置。如果我從位置中刪除模式名稱,Crystal Reports將允許我根據用戶名登錄時動態分配模式名稱。

0

創建一個視圖來聯合兩個表和一個新的列選擇「用戶id」:

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上添加選擇授權給視圖所有者。無法從這裏告訴它,取決於您的模式的訪問權限。

+0

theres a sysdba.lot_recap_all,and a sysdba2.lot_recap all。當用戶使用登錄名查看sysdba報告時,我希望他們查看填充了數據frm sysdba.lot_recap_all的報告,並且如果他們以sysdba2身份登錄,我希望他們使用sysda2.lot_recap_all中的數據填充數據。我迄今發現的唯一方法是進入並創建2個不同的報告,這就是我試圖避免的。如果我這樣做,我必須手動編輯所有300個報告,然後我必須手動插入一條語句,以重新設計報告根據登錄名指向 – Tidmore 2012-07-13 13:01:14

+0

,因爲我向您展示的選擇語句查找完全quakified表,theres沒有辦法只看'LOT_RECAP_ALL'我不希望sydba有權訪問sysdba2,反之亦然,我想強制水晶從任何sysdba或sysdba2基於我的登錄無需進入並手動執行它們 – Tidmore 2012-07-13 13:05:06

+0

那麼,最簡​​單的解決方案就是從select中刪除模式限定符。 如果您不能使用完全限定表更改select語句,那麼我看不出使用不同表來更改Oracle的方法。 LOT_RECAP是一個視圖還是一個表?如果是視圖,您仍然可以使用我的方法:重命名它,使用我的視圖選擇重命名的原始視圖,執行授權並使用userid = USER進行查詢。 或者有一些方法在水晶,但我不知道。 – GWu 2012-07-13 14:13:26