0

フロント(デルファイ5)エンドが接続する1つのユーザー名を持つデータベースを今持っています。以下を使用してレポートを呼び出します。

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) を作成しようとしていることです。

現在、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_recap であり、ユーザー ID が sysdba2 である場合、テーブル名は sysdba2.lot_recap であるかどうかをレポートで判断する方法を見つける必要があります。ところで、私は約 300 件のレポートに対してこれを行う必要があります。どんな助けでも大歓迎です。十分な情報を提供していない場合はお知らせください

4

3 に答える 3

1

わかりました問題は最終的に把握されました。レポート自体に移動してから、[場所の設定] に移動します。場所からスキーマ名を削除すると、Crystal Reports では、サインインしたユーザー名に基づいてスキーマ名を動的に割り当てることができます。

于 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
;

次に、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 grants をビューの所有者に追加する必要があるかもしれません。ここからはわかりません。スキーマのアクセス権限によって異なります。

于 2012-07-13T08:57:43.433 に答える