create or replace package body wsgl is
-- Current version of WSGL
WSGL_VERSION constant varchar2(30) := '6.5.22.0.0';
v_current_client_id varchar2(240);
--------------------------------------------------------------------------------
-- Define types for pl/sql tables of number(10), varchar(20) and boolean
-- for use internally in layout
type typNumberTable is table of number(10)
index by binary_integer;
type typString20Table is table of varchar2(20)
index by binary_integer;
type typBooleanTable is table of boolean
index by binary_integer;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--
-- Define the features and subfeatures tables for browsers
--
--
type featuresRecT is record
(
browser varchar2 (50),
feature varchar2 (50),
supported boolean
);
type featuresTableT is table of featuresRecT index by binary_integer;
featuresTable featuresTableT;
--------------------------------------------------------------------------------
-- Define Layout variables. These retain their value only for the
-- duration of the creation of a single page.
LayNumOfCols number(3) := 0;
LayCurrentCol number(3) := 0;
LayColumnWidths typNumberTable;
LayColumnAlign typString20Table;
LayPageCenter typBooleanTable;
LayOutputLine Long;
LayPaddedText Long;
LayDataSegment Long;
LayEmptyLine boolean := TRUE;
LayActionCreated boolean := FALSE;
LayStyle number(1) := LAYOUT_TABLE;
LayBorderTable boolean := FALSE;
LayVertBorderChars varchar2(4);
LayHoriBorderChars varchar2(2000);
LayCustomBullet varchar2(256) := '';
LayNumberOfPages number(2) := 0;
LayNumberOfRLButs number(2) := 0;
LayMenuLevel number(3) := -1;
LayInBottomFrame boolean := false;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Define variable to hold URL currently being built.
CurrentURL varchar2(2000);
URLComplete boolean := false;
URLCookieSet boolean := false;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Declare private procedure for padding preformatted text
procedure LayoutPadTextToLength(p_text in out varchar2,
p_length in number,
p_align in varchar2);
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Declare private procedure for where clause predicates
function BuildWherePredicate(p_field1 in varchar2,
p_field2 in varchar2,
p_sli in varchar2,
p_datatype in number,
p_where in out varchar2,
p_date_format in varchar2,
p_caseinsensitive in boolean,
p_outerjoin in boolean default FALSE) return varchar2;
function CaseInsensitivePredicate(p_sli in varchar2,
p_field in varchar2,
p_operator in varchar2) return varchar2;
--------------------------------------------------------------------------------
FUNCTION gettext(p_text IN VARCHAR2) RETURN VARCHAR IS
--
/**
-- Private function gettext added for dynamic boilerplate functionality.
-- This function uses the module_text table to retrieve the specific text for
-- the specified tag in the language for the currently connected user.
*/
--
v_return VARCHAR2(32767);
v_delim VARCHAR2(1) := '#';
v_translation module_text.text%TYPE;
v_number NUMBER;
--
FUNCTION lookup( p_number IN NUMBER
, p_language IN system_users.LANGUAGE%TYPE) RETURN VARCHAR2 IS
--
CURSOR cur_mt( p_number IN NUMBER
, p_language IN system_users.LANGUAGE%TYPE) IS
SELECT mt.text
FROM module_text mt
WHERE mt.text_number = p_number
AND mt.LANGUAGE = p_language;
--
v_return module_text.text%TYPE;
--
BEGIN
--
OPEN cur_mt(p_number, p_language);
FETCH cur_mt
INTO v_return;
--
IF cur_mt%NOTFOUND THEN
--
v_return := 'UNKNOWN';
--
END IF;
--
CLOSE cur_mt;
--
RETURN v_return;
--
END lookup;
--
BEGIN
--
v_return := p_text;
--
LOOP
--
IF instr(v_return, v_delim, 1, 1) > 0 AND instr(v_return, v_delim, 1, 2) > 0 AND instr(v_return, v_delim, 1, 3) > 0 AND instr(v_return, '>#INVALID!#<', 1, 1) = 0 THEN
--
BEGIN
--
v_number := to_number(substr(v_return, instr(v_return, v_delim, 1, 2) + 1, instr(v_return, v_delim, 1, 3) - instr(v_return, v_delim, 1, 2) - 1));
--
EXCEPTION
WHEN OTHERS THEN
v_number := NULL;
END;
--
IF v_number IS NOT NULL THEN
--
v_return := substr(v_return, 1, instr(v_return, v_delim, 1, 1) - 1) || lookup(v_number, caco_utilities.get_syus_lang) || substr(v_return, instr(v_return, v_delim, 1, 3) + 1);
--
ELSE
--
-- Not subsitituting anything, just exit to avoid infinite loop
--
EXIT;
--
END IF;
--
ELSE
--
EXIT;
--
END IF;
--
END LOOP;
--
RETURN v_return;
--
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, 'WSGL.gettext
' || SQLERRM);
END gettext;
--------------------------------------------------------------------------------
-- Name: Info
--
-- Description: Display information about WSGL. Useful for debugging purposes.
--
-- Parameters: p_full is a full list reequired (no if called from About)
-- p_app name of application system
-- p_mod name of module
--
--------------------------------------------------------------------------------
procedure Info(p_full in boolean default true,
p_app in varchar2 default null,
p_mod in varchar2 default null,
p_usr in varchar2 default null ) is
cursor c1 is
select product, version, status
from product_component_version
where upper(product) like '%ORACLE%SERVER%'
or upper(product) like '%PL/SQL%'
order by product;
current_user varchar2(255);
begin
if p_usr is not null then
current_user := p_usr;
else
current_user := GetUser;
end if;
if p_full then
DefinePageHead(MsgGetText(101,WSGLM.DSP101_WSGL_INFO));
OpenPageBody;
DefaultPageCaption(MsgGetText(101,WSGLM.DSP101_WSGL_INFO));
end if;
LayoutOpen(LAYOUT_TABLE, TRUE);
LayoutRowStart;
LayoutHeader(50, 'LEFT', NULL);
LayoutHeader(50, 'LEFT', NULL);
LayoutRowEnd;
LayoutRowStart;
LayoutData(MsgGetText(102,WSGLM.DSP102_WSGL));
LayoutData(WSGL_VERSION);
LayoutRowEnd;
LayoutRowStart;
LayoutData(MsgGetText(103,WSGLM.DSP103_USER));
LayoutData(current_user);
LayoutRowEnd;
for c1rec in c1 loop
LayoutRowStart;
LayoutData(c1rec.product);
LayoutData(c1rec.version||' '||c1rec.status);
LayoutRowEnd;
end loop;
if not p_full then
LayoutRowStart;
LayoutData(MsgGetText(105,WSGLM.DSP105_WEB_SERVER));
LayoutData(owa_util.get_cgi_env('SERVER_SOFTWARE'));
LayoutRowEnd;
LayoutRowStart;
LayoutData(MsgGetText(106,WSGLM.DSP106_WEB_BROWSER));
LayoutData(owa_util.get_cgi_env('HTTP_USER_AGENT'));
LayoutRowEnd;
LayoutRowStart;
LayoutData(MsgGetText(125,WSGLM.DSP125_REPOS_APPSYS));
LayoutData(p_app);
LayoutRowEnd;
LayoutRowStart;
LayoutData(MsgGetText(126,WSGLM.DSP126_REPOS_MODULE));
LayoutData(p_mod);
LayoutRowEnd;
end if;
LayoutClose;
if p_full then
htp.header(LayNumberOfPages, MsgGetText(104,WSGLM.DSP104_ENVIRONMENT));
owa_util.print_cgi_env;
ClosePageBody;
end if;
--
-- Bespoke copyright information
--
htp.br;
htp.p(htf.italic('© Advantica Ltd.'));
htp.br;
--
exception
when others then
raise_application_error(-20000, 'WSGL.Info
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: IsSupported
--
-- Description: Maps HTML and Javascript features to browsers to determine if
-- the browser being used supports a given feature or subfeature
--
-- Parameters: feature IN the main feature we want to know if the browser
-- supports
--------------------------------------------------------------------------------
function IsSupported (feature in varchar2) return boolean is
browser varchar2(2000) := owa_util.get_cgi_env ('HTTP_USER_AGENT');
featureSupport boolean := True;
begin
-- Browser string must be unique
featuresTable (1).browser := 'MOZILLA/2.__%';
featuresTable (1).feature := 'NOSCRIPT';
featuresTable (1).supported := False;
-- Search the features table for a matching entry
for i in 1..featuresTable.count
loop
if (upper (browser) like upper (featuresTable (i).browser)) and
(upper (feature) = upper (featuresTable (i).feature))
then
featureSupport := featuresTable (i).supported;
end if;
end loop;
return featureSupport;
end IsSupported;
--------------------------------------------------------------------------------
-- Name: LayoutOpen
--
-- Description: This procedure is used to set up information which will
-- control how data/fields are layed out in the generated
-- pages. A number of layout styles are supported, defined
-- by the constants LAYOUT_TABLE, LAYOUT_BULLET etc
--
-- Parameters: p_layout_style IN The layout style
-- p_border IN If layout style is TABLE, should the
-- table have a border
-- p_custom_bullet IN If the layout style is CUSTOM, the
-- expression to use as the custom bullet
--------------------------------------------------------------------------------
procedure LayoutOpen(p_layout_style in number,
p_border in boolean,
p_custom_bullet in varchar2,
p_no_spacing in boolean) is
begin
-- Initialise the layout parameters
LayStyle := p_layout_style;
LayCustomBullet := p_custom_bullet;
LayBorderTable := p_border;
LayVertBorderChars := ' ';
LayHoriBorderChars := NULL;
LayNumOfCols := 0;
LayCurrentCol := 0;
if (LayStyle = LAYOUT_BULLET)
then
-- Open List
htp.ulistOpen;
elsif (LayStyle = LAYOUT_NUMBER)
then
-- Open List
htp.olistOpen;
elsif (LayStyle = LAYOUT_TABLE)
then
-- If tables are requested, check that the current browser
-- supports them, if not, default to PREFORMAT
if (TablesSupported) then
htp.para;
-- Open Table
if (p_border) then
htp.tableOpen('BORDER');
else
if p_no_spacing then
htp.tableOpen(cattributes=>'BORDER=0 cellspacing=0 cellpadding=4');
else
htp.tableOpen;
end if;
end if;
else
LayoutOpen(LAYOUT_PREFORMAT, p_border, p_custom_bullet);
end if;
elsif (LayStyle = LAYOUT_PREFORMAT)
then
-- Open Preformat
htp.preOpen;
if (p_border) then
LayVertBorderChars := '|';
end if;
else
-- Start a new paragraph if WRAP
htp.para;
end if;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutOpen
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutClose
--
-- Description: End the layout area.
--
-- Parameters: None
--
--------------------------------------------------------------------------------
procedure LayoutClose is
begin
if LayCurrentCol <> LayNumOfCols then
LayCurrentCol := LayNumOfCols;
LayoutRowEnd;
end if;
if (LayStyle = LAYOUT_BULLET)
then
htp.ulistClose;
elsif (LayStyle = LAYOUT_NUMBER)
then
htp.olistClose;
elsif (LayStyle = LAYOUT_TABLE)
then
htp.tableClose;
elsif (LayStyle = LAYOUT_PREFORMAT)
then
if LayBorderTable then
htp.p(LayHoriBorderChars);
end if;
htp.preClose;
end if;
htp.para;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutClose
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutRowStart
--
-- Description: Starts a 'row' in the current layout style. This may be
-- a real row if it is a table, or a new list item for lists
-- etc.
--
-- Initialises the variable LayOutputLine which is used to
-- build the entire 'row' until it is printed using
-- LayoutRowEnd().
--
-- Parameters: p_valign IN The verical alignment of the row if TABLE
--
--------------------------------------------------------------------------------
procedure LayoutRowStart(p_valign in varchar2,
p_attrs in varchar2) is
begin
if LayCurrentCol <> LayNumOfCols then
return;
end if;
LayCurrentCol := 0;
LayEmptyLine := TRUE;
if (LayStyle = LAYOUT_BULLET) or
(LayStyle = LAYOUT_NUMBER)
then
-- Add list item marker
LayOutputLine := htf.ListItem;
elsif (LayStyle = LAYOUT_CUSTOM)
then
-- Add the Custom Bullet
LayOutputLine := LayCustomBullet || ' ';
elsif (LayStyle = LAYOUT_TABLE)
then
-- Start a new row
LayOutputLine := htf.tableRowOpen(cvalign=>p_valign, cattributes=>p_attrs);
elsif (LayStyle = LAYOUT_PREFORMAT)
then
LayOutputLine := LayVertBorderChars;
end if;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutRowStart
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutRowEnd
--
-- Description: If anything in the current row, it is output using htp.p()
-- procedure, and then LayOutputLine is cleared.
--
-- Parameters: None
--
--------------------------------------------------------------------------------
procedure LayoutRowEnd is
l_loop number(4) := 0;
begin
if LayCurrentCol <> LayNumOfCols then
return;
end if;
if not LayEmptyLine
then
if (LayStyle = LAYOUT_BULLET) or
(LayStyle = LAYOUT_NUMBER)
then
htp.p(LayOutputLine);
elsif (LayStyle = LAYOUT_CUSTOM)
then
htp.p(LayOutputLine);
htp.nl;
elsif (LayStyle = LAYOUT_TABLE)
then
htp.p(LayOutputLine || htf.tableRowClose);
else
if LayStyle = LAYOUT_PREFORMAT and LayBorderTable then
if LayHoriBorderChars is null then
LayHoriBorderChars := '-';
for l_loop in 1..LayNumOfCols loop
LayHoriBorderChars := LayHoriBorderChars || rpad('-', LayColumnWidths(l_loop) + 1, '-');
end loop;
end if;
htp.p(LayHoriBorderChars);
end if;
htp.p(LayOutputLine);
end if;
end if;
LayOutputLine := '';
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutRowEnd
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutHeader
--
-- Description: This is used when layout style is TABLE or PREFORMAT and
-- defines the 'Columns' of the table. Each has a width
-- (not used for TABLE), an alignment and a title. The pl/sql
-- tables LayColumnWidths and LayColumnAlign are initilaised in
-- order that later calls to LayoutData will be correctly
-- position data/fields.
--
-- This procedure has no effect when layout style is not
-- TABLE or PREFORMAT,
--
-- Parameters: p_width IN Column width
-- p_align IN Horizontal alignment or data in this column
-- p_title IN Title, if any
-- p_id IN IDs feature: ID attribute, if any
--
--------------------------------------------------------------------------------
procedure LayoutHeader(p_width in number,
p_align in varchar2,
p_title in varchar2,
p_id in varchar2 DEFAULT null) is
l_width number(5);
l_title VARCHAR2(1000);
begin
l_title := gettext(p_title);
LayNumOfCols := LayNumOfCols + 1;
LayCurrentCol := LayNumOfCols;
-- Only applicable if TABLE or PREFORMAT
if ( (LayStyle != LAYOUT_TABLE) and
(LayStyle != LAYOUT_PREFORMAT)
) then
return;
end if;
-- If a title is defined, check if it is longer than the width of the
-- data in the column, in which case PREFORMAT column would need to be
-- wider
if l_title is not null then
l_width := length(l_title);
else
l_width := 0;
end if;
-- Record the required column width
if l_width > p_width then
LayColumnWidths(LayCurrentCol) := l_width;
else
LayColumnWidths(LayCurrentCol) := p_width;
end if;
-- Record the required column alignment
LayColumnAlign(LayCurrentCol) := p_align;
-- If TABLE, create table header
if (LayStyle = LAYOUT_TABLE)
then
-- IDs Feature: For tables related to result list print the ID attribute.
if p_id is not null then
LayOutputLine := LayOutputLine || htf.tableHeader(l_title, p_align, cattributes=>'ID="'||p_id||'"');
else
LayOutputLine := LayOutputLine || htf.tableHeader(l_title, p_align);
end if;
if l_title is not null then
LayEmptyLine := FALSE;
end if;
-- If PREFORMAT, simulate table header
elsif (LayStyle = LAYOUT_PREFORMAT)
then
LayPaddedText := htf.bold(l_title);
LayoutPadTextToLength(LayPaddedText,
LayColumnWidths(LayCurrentCol),
LayColumnAlign(LayCurrentCol));
LayOutputLine := LayOutputLine || LayPaddedText || LayVertBorderChars;
if l_title is not null then
LayEmptyLine := FALSE;
end if;
end if;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutHeader
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutData
--
-- Description: Add the text to LayOutputLine in the current layout style,
-- in prepeartion for being written out by a call to
-- LayoutRowEnd.
--
-- Parameters: p_text IN The text (or field definition etc, any html)
-- to be output.
-- p_align IN The alignment for this item if different from
-- previous rows. (Default null).
-- p_id IN ID attribute.
--
--------------------------------------------------------------------------------
procedure LayoutData(p_text in varchar2,
p_align in varchar2 DEFAULT null,
p_id in varchar2 DEFAULT null) is
l_align varchar2(30);
l_text VARCHAR2(32767);
begin
l_text := gettext(p_text);
LayCurrentCol := LayCurrentCol + 1;
LayEmptyLine := FALSE;
if p_align is null then
if (LayStyle = LAYOUT_TABLE) or (LayStyle = LAYOUT_PREFORMAT) then
l_align := LayColumnAlign(LayCurrentCol);
end if;
else
l_align := p_align;
end if;
if (LayStyle = LAYOUT_TABLE)
then
-- Add Table data, with specified alignment
-- IDs feature
if p_id is not null then
LayOutputLine := LayOutputLine ||
htf.tableData(l_text, l_align, cattributes=>'ID="'||p_id||'"');
else
LayOutputLine := LayOutputLine ||
htf.tableData(l_text, l_align);
end if;
elsif (LayStyle = LAYOUT_PREFORMAT)
then
-- Create a copy of p_text in LayPaddedText, padded in such a way as to
-- be the correct width and with the correct alignment
LayPaddedText := nvl(l_text, ' ');
if (LayCurrentCol <= LayNumOfCols) then
LayoutPadTextToLength(LayPaddedText,
LayColumnWidths(LayCurrentCol),
l_align);
else
LayPaddedText := LayPaddedText || ' ';
end if;
LayOutputLine := LayOutputLine || LayPaddedText || LayVertBorderChars;
else
-- For styles other than TABLE and PREFORMAT, simply add the text to
-- LayOutputLine
LayOutputLine := LayOutputLine || l_text || ' ';
end if;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutData
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutData
--
-- Description: LayoutData overloaded with a date parameter
--
-- Parameters: p_date IN The date to be displayed
--
--------------------------------------------------------------------------------
procedure LayoutData(p_date in date) is
begin
LayoutData(to_char(p_date));
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutData2
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutData
--
-- Description: LayoutData overloaded with a number parameter
--
-- Parameters: p_number IN The number to be displayed
--
--------------------------------------------------------------------------------
procedure LayoutData(p_number in number) is
begin
LayoutData(to_char(p_number));
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutData3
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutPadTextToLength
--
-- Description: Pads the given string to the specified length and alignment.
-- Anything that appears between < and > will not be counted
-- when determining the width because it is assumed this is
-- HTML tags which are not displayed.
--
-- Parameters: p_text IN/OUT The text to be padded
-- p_length IN The width to pad to
-- p_align IN The alignment (LEFT/CENTER/RIGHT)
--
--------------------------------------------------------------------------------
procedure LayoutPadTextToLength(p_text in out varchar2,
p_length in number,
p_align in varchar2) is
l_loop number(4) := 0;
l_count number(4) := 0;
l_pad number(4) := 0;
l_pre varchar2(1000);
l_post varchar2(1000);
l_ignore boolean := FALSE;
begin
for l_loop in 1..length(p_text) loop
if substr(p_text, l_loop, 1) = '<' then
l_ignore := TRUE;
elsif l_ignore then
if substr(p_text, l_loop - 1, 1) = '>' then
l_ignore := FALSE;
end if;
end if;
if (not l_ignore) then
l_count := l_count + 1;
end if;
end loop;
l_pad := p_length - l_count;
if l_pad > 0 then
if p_align = 'LEFT' then
l_pre := '';
l_post := rpad(' ', l_pad);
elsif p_align = 'CENTER' then
if l_pad > 1 then
l_pre := rpad(' ', floor(l_pad / 2));
l_post := rpad(' ', ceil(l_pad / 2));
else
l_pre := '';
l_post := rpad(' ', l_pad);
end if;
elsif p_align = 'RIGHT' then
l_pre := rpad(' ', l_pad);
l_post := '';
end if;
p_text := l_pre || p_text || l_post;
end if;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutPadTextToLength
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutComputed
--
-- Description: Draws a computed item and its prompt on a new row.
--
-- Parameters: p_prompt_col in number Column to display item prompt
-- p_prompt in varchar2 Item prompt text
-- p_item_col in number Column to display item value
-- p_item in varchar2 Item value text
-- p_total_cols in number Total no of cols in record list
-- p_row_attrs in varchar2 Attributes to assign to table row
--
--
-- BUG 1331123 :: Made sure procedure can cope if p_prompt_col >= p_item_col by
-- displaying prompt and item value in same column as the
-- original code did when prompt and item column = 1.
--------------------------------------------------------------------------------
procedure LayoutComputed ( p_prompt_col in number,
p_prompt in varchar2,
p_item_col in number,
p_item in varchar2,
p_total_cols in number,
p_row_attrs in varchar2) is
i integer;
prompt_col number := p_prompt_col;
begin
LayoutRowStart(p_attrs=>p_row_attrs);
if ( p_prompt_col > p_item_col )
then
prompt_col := p_item_col;
end if;
for i in 1..(prompt_col - 1)
loop
LayoutData(' ');
end loop;
if ( prompt_col = p_item_col )
then
LayoutData(p_prompt || ' ' || p_item);
else
LayoutData(p_prompt, 'RIGHT');
for i in (prompt_col + 1)..(p_item_col - 1)
loop
LayoutData(' ');
end loop;
LayoutData(p_item);
end if;
for i in (p_item_col + 1)..p_total_cols
loop
LayoutData(' ');
end loop;
LayoutRowEnd;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutComputed
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: LayoutTextLine
--
-- Description: Draws a row containing the specified text. The text may span the
-- entire line. This is used for embedding lines of text within
-- tables.
--
-- Parameters: p_text IN The text to display.
--
--------------------------------------------------------------------------------
procedure LayoutTextLine ( p_text in varchar2 )
is
begin
LayCurrentCol := LayNumOfCols;
LayoutRowStart('TOP');
if (LayStyle = LAYOUT_TABLE) then
LayOutputLine := LayOutputLine || htf.tableData( cvalue=>p_text, ccolspan=>LayNumOfCols );
else
LayOutputLine := LayOutputLine || p_text;
end if;
LayCurrentCol := LayNumOfCols;
LayEmptyLine := false;
LayoutRowEnd;
exception
when others then
raise_application_error(-20000, 'WSGL.LayoutTextLine
'||SQLERRM);
end;
--------------------------------------------------------------------------------
-- Name: SkipData
--
-- Description: For B2151065.
--
--
--------------------------------------------------------------------------------
procedure SkipData
is
begin
LayCurrentCol := LayCurrentCol + 1;
end;
--------------------------------------------------------------------------------
-- Name: Separator
--
-- Description: Draws a row containing a line from column p_from_col to
-- p_to_col. Used to seperate computed items from data items
-- on the record list.
--
-- Parameters: p_from_col IN Column number for beginning of line.
-- p_to_col IN Column number for end of line.
-- p_total IN Total number of columns in record list
--
--------------------------------------------------------------------------------
procedure Separator ( p_from_col in number,
p_to_col in number,
p_total in number,
p_attrs in varchar2) is
i integer;
j integer;
l_string varchar2(255);
begin
LayoutRowStart(p_attrs=>p_attrs);
for i in 1..(p_from_col - 1) loop
LayoutData(' ');
end loop;
for i in p_from_col..p_to_col loop
if (LayStyle = LAYOUT_TABLE) then
LayoutData('