COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE ADDREPORT 
(
  TREENAME VARCHAR(30),
  FOLDERNAME VARCHAR(64),
  PROCEDURENAME VARCHAR(32),
  REPORTNAME VARCHAR(64),
  TARGETRANK INTEGER,
  REPORTVENDOR VARCHAR(64),
  REPORTFILENAME VARCHAR(64),
  STANDARDREPORTTF VARCHAR(1),
  ROLEWITHACCESS VARCHAR(15)
)
RETURNS
(
  RESULTSTRING VARCHAR(240)
)
AS
BEGIN EXIT; END ^

ALTER PROCEDURE ADDREPORT 
(
  TREENAME VARCHAR(30),
  FOLDERNAME VARCHAR(64),
  PROCEDURENAME VARCHAR(32),
  REPORTNAME VARCHAR(64),
  TARGETRANK INTEGER,
  REPORTVENDOR VARCHAR(64),
  REPORTFILENAME VARCHAR(64),
  STANDARDREPORTTF VARCHAR(1),
  ROLEWITHACCESS VARCHAR(15)
)
RETURNS
(
  RESULTSTRING VARCHAR(240)
)
AS
/* This procedure Adds a report to a Report Tree. */
/* TreeName must be the name of an existing Report Tree */
/* FolderName must be the name of an existing Folder */
declare variable   RptSetKey INTEGER;
declare variable   RptMasKey INTEGER;
declare variable   RptSetNodKey INTEGER;
declare variable   MasNodKey INTEGER;
declare variable   FolderRankInTree INTEGER;
declare variable   MaxRankInFolder INTEGER;
declare variable   ExtFolderName VARCHAR(240);
declare variable   DummyInt INTEGER;
declare variable   DummyStr30 varchar(30);
begin   /* program block */
/*Make sure RPTNAME is unique*/
/*If not, Exit */
  select
    count(*)
  from
    RptMas
  where
    Upper(RptName)=Upper(:ReportName)
  into :DummyInt;
  If (DummyInt>0) then
  begin
    ResultString = 'Refused: Report Name is not unique.';
  end
  else
  begin
/*Look up Report Set Key */
/*If not found, Exit */
  select
    max(RptSetKey)
  from
    RptSet
  where
    Upper(RptSetDes)=Upper(:TreeName)
  into :RptSetKey;
  If (RptSetKey is null) then
  begin
    ResultString = 'Refused: Tree Name does not match known Trees.';
  end
  else
  begin
  /*Look up FolderRankInTree of Folder matching FolderName */
    select
      max(RptSetNodRnk)
    from
      RptSetNod
    where
      RptSetKey=:RptSetKey
      and Upper(RptSetNodDes)=Upper(:FolderName)
    into :FolderRankInTree;
    /* If Folder not found, Set up Report Folder. */
    if (FolderRankInTree is null) then
    begin
      select
        max(RptSetNodRnk)
      from
        RptSetNod
      where
        RptSetKey=:RptSetKey
      into :FolderRankInTree;
      FolderRankInTree = FolderRankInTree + 1;
      execute procedure newrptsetfolder (:TreeName, '/', :FolderName, '', :FolderRankInTree)
      returning_values :DummyInt, :DummyInt, :DummyInt, :MasNodKey;
    end
    else
    /* If Folder IS found, identify its MasNodKey */
    begin
      select
        max(RptSetNodKey)
      from
        RptSetNod
      where
        RptSetKey=:RptSetKey
        and Upper(RptSetNodDes)=Upper(:FolderName)
      into :MasNodKey;
    end
    /*Register Report*/
    execute procedure DeclareRptMas (:ProcedureName, :ReportName, :ReportVendor, :ReportFileName, '')
    returning_values :RptMasKey;
    /*Set Ranks*/
    /*Identify topmost rank in Folder*/
    select
      max(RptSetNodRnk)
    from
      RptSetNod
    where
      MasNodKey=:MasNodKey
    into :MaxRankInFolder;
    if (MaxRankInFolder is null) then begin MaxRankInFolder = 0; end
    /*If TargetRank is 0, target the end of the stack*/
    if (TargetRank =0) then begin TargetRank = (MaxRankInFolder +1); end
    /*If appropriate, reduce TargetRank */
    if (TargetRank > (MaxRankInFolder +1) ) then begin TargetRank = (MaxRankInFolder +1); end
    /*If necessary, make a gap in the ranks*/
    for select RptSetNodKey
        from RptSetNod
        where MasNodKey = :MasNodKey
          and RptSetNodRnk >= :TargetRank
        into :RptSetNodKey do
    begin
      update RptSetNod set RptSetNodRnk = (RptSetNodRnk + 1)
      where RptSetNodKey = :RptSetNodKey;
    end
    /*Associate Report with Report Folder*/
    ExtFolderName = '/' || FolderName;
    execute procedure NewRptSetRpt (:TreeName, :ExtFolderName, '', '', :TargetRank, :ReportName)
    returning_values :DummyInt, :DummyInt, :DummyInt, :DummyInt;
    /*Set StandardTF flag*/
    update rptmas set stdreptf=:StandardReportTF where rptmaskey=:RptMasKey;
    /*Assign Role Access*/
    execute procedure setreportroles (:ReportName, :RoleWithAccess)
    returning_values :DummyStr30;
    update rptsetnod 
    set lmxrolkey=(select lmxrolkey from lmxrol where lmxrollab='REPORTING') 
where lmxrolkey is null; ResultString = 'Accepted.'; end end end ^ SET TERM ; ^ COMMIT WORK; SET AUTODDL ON;