CREATE OR REPLACE PACKAGE BODY efnow251$ IS -- FUNCTION dad_path RETURN VARCHAR2 IS BEGIN RETURN(lower(owa_util.get_cgi_env('REQUEST_PROTOCOL') || '://' || owa_util.get_cgi_env('HTTP_HOST') || owa_util.get_cgi_env('SCRIPT_NAME') || '/')); END dad_path; PROCEDURE find_passed_net_points( p_nepo_array IN owa_util.vc_arr , p_network_point_array OUT network_point_array ) IS CURSOR c_nepo( cp_id IN NUMBER ) IS SELECT REPLACE(REPLACE(name,chr(13),''),chr(10),'') name FROM network_points WHERE nepo_id = cp_id; -- l_count NUMBER := 0; l_name network_points.name%TYPE; -- BEGIN -- IF NVL(p_nepo_array.COUNT,0) > 0 THEN FOR i IN p_nepo_array.FIRST .. p_nepo_array.LAST LOOP -- l_name := NULL; l_count := l_count + 1; -- -- Fetch the network point name OPEN c_nepo( TO_NUMBER(p_nepo_array(i)) ); FETCH c_nepo INTO l_name; IF c_nepo%FOUND THEN -- valid network point p_network_point_array(l_count).nepo_id := TO_NUMBER(p_nepo_array(i)); p_network_point_array(l_count).name := l_name; ELSE l_count := l_count - 1; END IF; CLOSE c_nepo; -- END LOOP; END IF; -- END find_passed_net_points; PROCEDURE get_nepg_details( p_nepg_id IN NUMBER , p_nepg_record OUT network_point_groups%ROWTYPE , p_network_point_array OUT network_point_array ) IS -- Cursor to get the full nepg row CURSOR c_nepg IS SELECT * FROM network_point_groups WHERE nepg_id = p_nepg_id; -- -- Cursor to get all network points for this contract CURSOR c_nepo IS SELECT nepm.nepo_id net_point_id , nepo.name nepo_name FROM network_point_mappings nepm , network_points nepo WHERE nepm.nepo_id = nepo.nepo_id AND nepm.nepg_id = p_nepg_id ORDER BY nepo.name; -- l_count NUMBER := 0; -- BEGIN -- OPEN c_nepg; FETCH c_nepg INTO p_nepg_record; CLOSE c_nepg; -- FOR r IN c_nepo LOOP l_count := l_count + 1; -- p_network_point_array(l_count).nepo_id := r.net_point_id; p_network_point_array(l_count).name := r.nepo_name; -- END LOOP; -- END get_nepg_details; PROCEDURE get_avail_net_points( p_network_point_array IN OUT network_point_array , p_avail_net_points OUT network_point_array ) IS -- Cursor to select ALL network points CURSOR c_nepo IS SELECT nepo_id , REPLACE(REPLACE(name,chr(13),''),chr(10),'') name FROM network_points WHERE nepo_type <> 'V' ORDER BY name; -- l_array_pos NUMBER := 0; l_out_pos NUMBER := 0; -- l_holder_record network_point_record; -- BEGIN -- -- Need to ensure that we are dealing with like on like -- i.e. both the given array and the cursor must be sorted by name -- So sort the array - this is belt and braces approach as the array SHOULD arrive sorted correctly -- The Bubble Sort method. -- (yes there are MUCH better ways to sort - this algorithm I remember off the top off my head though) IF NVL(p_network_point_array.COUNT,0) > 0 THEN FOR i IN 1..p_network_point_array.COUNT LOOP -- FOR j IN 1..(p_network_point_array.COUNT-1) LOOP -- IF p_network_point_array(j).name > p_network_point_array(j+1).name THEN -- l_holder_record := p_network_point_array(j+1); p_network_point_array(j+1) := p_network_point_array(j); p_network_point_array(j) := l_holder_record; -- END IF; -- END LOOP; -- END LOOP; END IF; -- -- Ok, so lets go l_array_pos := 1; OPEN c_nepo; FETCH c_nepo INTO l_holder_record; -- WHILE c_nepo%FOUND AND l_array_pos <= p_network_point_array.COUNT LOOP -- IF p_network_point_array(l_array_pos).name > l_holder_record.name THEN -- Output the current cursor detail to the OUT array l_out_pos := l_out_pos + 1; p_avail_net_points(l_out_pos).nepo_id := l_holder_record.nepo_id; p_avail_net_points(l_out_pos).name := l_holder_record.name; -- FETCH c_nepo INTO l_holder_record; -- ELSIF p_network_point_array(l_array_pos).name = l_holder_record.name THEN -- Move both on l_array_pos := l_array_pos + 1; FETCH c_nepo INTO l_holder_record; -- ELSE -- Move the array position on - shouldn't realy happen as this means there -- will be a foreign key violation soon... l_array_pos := l_array_pos + 1; END IF; -- END LOOP; -- -- If we still have rows in the cursor - output the values WHILE c_nepo%FOUND LOOP -- Output the current cursor detail to the OUT array l_out_pos := l_out_pos + 1; p_avail_net_points(l_out_pos).nepo_id := l_holder_record.nepo_id; p_avail_net_points(l_out_pos).name := l_holder_record.name; -- FETCH c_nepo INTO l_holder_record; -- END LOOP; -- CLOSE c_nepo; -- END get_avail_net_points; PROCEDURE nepg_js IS BEGIN -- htp.p(' function setListForSubmit( onOff, listId ) { var theList = document.getElementById( listId ); if (onOff == "on") { for (var i=0; i // WWW: http://www.mattkruse.com/ // // NOTICE: You may use this code for any purpose, commercial or // private, without any further permission from the author. You may // remove this notice from your final code if you wish, however it is // appreciated by the author if at least my web site address is kept. // =================================================================== '); htp.p(' /* OptionTransfer.js Last Modified: 7/12/2004 DESCRIPTION: This widget is used to easily and quickly create an interface where the user can transfer choices from one select box to another. For example, when selecting which columns to show or hide in search results. This object adds value by automatically storing the values that were added or removed from each list, as well as the state of the final list. COMPATABILITY: Should work on all Javascript-compliant browsers. USAGE: // Create a new OptionTransfer object. Pass it the field names of the left // select box and the right select box. var ot = new OptionTransfer("from","to"); // Optionally tell the lists whether or not to auto-sort when options are // moved. By default, the lists will be sorted. ot.setAutoSort(true); // Optionally set the delimiter to be used to separate values that are // stored in hidden fields for the added and removed options, as well as // final state of the lists. Defaults to a comma. ot.setDelimiter("|"); // You can set a regular expression for option texts which are _not_ allowed to // be transferred in either direction ot.setStaticOptionRegex("static");'); htp.p(' // These functions assign the form fields which will store the state of // the lists. Each one is optional, so you can pick to only store the // new options which were transferred to the right list, for example. // Each function takes the name of a HIDDEN or TEXT input field. // Store list of options removed from left list into an input field ot.saveRemovedLeftOptions("removedLeft"); // Store list of options removed from right list into an input field ot.saveRemovedRightOptions("removedRight"); // Store list of options added to left list into an input field ot.saveAddedLeftOptions("addedLeft"); // Store list of options radded to right list into an input field ot.saveAddedRightOptions("addedRight"); // Store all options existing in the left list into an input field ot.saveNewLeftOptions("newLeft"); // Store all options existing in the right list into an input field ot.saveNewRightOptions("newRight"); // IMPORTANT: This step is required for the OptionTransfer object to work // correctly. // Add a call to the BODY onLoad="" tag of the page, and pass a reference to // the form which contains the select boxes and input fields. BODY onLoad="ot.init(document.forms[0])" // ADDING ACTIONS INTO YOUR PAGE // Finally, add calls to the object to move options back and forth, either // from links in your page or from double-clicking the options themselves. // See example page, and use the following methods: ot.transferRight(); ot.transferAllRight(); ot.transferLeft(); ot.transferAllLeft();'); htp.p(' NOTES: 1) Requires the functions in selectbox.js */ function OT_transferLeft() { moveSelectedOptions(this.right,this.left,this.autoSort,this.staticOptionRegex); this.update(); } function OT_transferRight() { moveSelectedOptions(this.left,this.right,this.autoSort,this.staticOptionRegex); this.update(); } function OT_transferAllLeft() { moveAllOptions(this.right,this.left,this.autoSort,this.staticOptionRegex); this.update(); } function OT_transferAllRight() { moveAllOptions(this.left,this.right,this.autoSort,this.staticOptionRegex); this.update(); } function OT_saveRemovedLeftOptions(f) { this.removedLeftField = f; } function OT_saveRemovedRightOptions(f) { this.removedRightField = f; } function OT_saveAddedLeftOptions(f) { this.addedLeftField = f; } function OT_saveAddedRightOptions(f) { this.addedRightField = f; } function OT_saveNewLeftOptions(f) { this.newLeftField = f; } function OT_saveNewRightOptions(f) { this.newRightField = f; } function OT_update() { var removedLeft = new Object(); var removedRight = new Object(); var addedLeft = new Object(); var addedRight = new Object(); var newLeft = new Object(); var newRight = new Object(); for (var i=0;i0) { str=str+delimiter; } str=str+val; } return str; } function OT_setDelimiter(val) { this.delimiter=val; } function OT_setAutoSort(val) { this.autoSort=val; } function OT_setStaticOptionRegex(val) { this.staticOptionRegex=val; } function OT_init(theform) { this.form = theform; if(!theform[this.left]){alert("OptionTransfer init(): Left select list does not exist in form!");return false;} if(!theform[this.right]){alert("OptionTransfer init(): Right select list does not exist in form!");return false;} this.left=theform[this.left]; this.right=theform[this.right]; for(var i=0;i // WWW: http://www.mattkruse.com/ // // NOTICE: You may use this code for any purpose, commercial or // private, without any further permission from the author. You may // remove this notice from your final code if you wish, however it is // appreciated by the author if at least my web site address is kept. // =================================================================== // ------------------------------------------------------------------- // autoComplete (text_input, select_input, ["text"|"value"], [true|false]) // Use this function when you have a SELECT box of values and a text // input box with a fill-in value. Often, onChange of the SELECT box // will fill in the selected value into the text input (working like // a Windows combo box). Using this function, typing into the text // box will auto-select the best match in the SELECT box and do // auto-complete in supported browsers. // Arguments: // field = text input field object // select = select list object containing valid values // property = either "text" or "value". This chooses which of the // SELECT properties gets filled into the text box - // the ''value'' or ''text'' of the selected option // forcematch = true or false. Set to ''true'' to not allow any text // in the text box that does not match an option. Only // supported in IE (possible future Netscape). // ------------------------------------------------------------------- function autoComplete (field, select, property, forcematch) { var found = false; for (var i = 0; i < select.options.length; i++) { if (select.options[i][property].toUpperCase().indexOf(field.value.toUpperCase()) == 0) { found=true; break; } } if (found) { select.selectedIndex = i; } else { select.selectedIndex = -1; } if (field.createTextRange) { if (forcematch && !found) { field.value=field.value.substring(0,field.value.length-1); return; } var cursorKeys ="8;46;37;38;39;40;33;34;35;36;45;"; if (cursorKeys.indexOf(event.keyCode+";") == -1) { var r1 = field.createTextRange(); var oldValue = r1.text; var newValue = found ? select.options[i][property] : oldValue; if (newValue != field.value) { field.value = newValue; var rNew = field.createTextRange(); rNew.moveStart(''character'', oldValue.length) ; rNew.select(); } } } } '); END autocomplete_js; PROCEDURE selectbox_js IS BEGIN htp.p('// =================================================================== // Author: Matt Kruse // WWW: http://www.mattkruse.com/ // // NOTICE: You may use this code for any purpose, commercial or // private, without any further permission from the author. You may // remove this notice from your final code if you wish, however it is // appreciated by the author if at least my web site address is kept. // =================================================================== // HISTORY // ------------------------------------------------------------------ // April 20, 2005: Fixed the removeSelectedOptions() function to // correctly handle single selects // June 12, 2003: Modified up and down functions to support more than // one selected option /* DESCRIPTION: These are general functions to deal with and manipulate select boxes. Also see the OptionTransfer library to more easily handle transferring options between two lists COMPATABILITY: These are fairly basic functions - they should work on all browsers that support Javascript. */ // ------------------------------------------------------------------- // hasOptions(obj) // Utility function to determine if a select object has an options array // ------------------------------------------------------------------- function hasOptions(obj) { if (obj!=null && obj.options!=null) { return true; } return false; } // ------------------------------------------------------------------- // selectUnselectMatchingOptions(select_object,regex,select/unselect,true/false) // This is a general function used by the select functions below, to // avoid code duplication // ------------------------------------------------------------------- function selectUnselectMatchingOptions(obj,regex,which,only) { if (window.RegExp) { if (which == "select") { var selected1=true; var selected2=false; } else if (which == "unselect") { var selected1=false; var selected2=true; } else { return; } var re = new RegExp(regex); if (!hasOptions(obj)) { return; } for (var i=0; i (b.text+"")) { return 1; } return 0; } ); for (var i=0; i object as follows: // onDblClick="moveSelectedOptions(this,this.form.target) // This way, when the user double-clicks on a value in one box, it // will be transferred to the other (in browsers that support the // onDblClick() event handler). // ------------------------------------------------------------------- function moveSelectedOptions(from,to) { // Unselect matching options, if required if (arguments.length>3) { var regex = arguments[3]; if (regex != "") { unSelectMatchingOptions(from,regex); } } // Move them over if (!hasOptions(from)) { return; } for (var i=0; i=0; i--) { var o = from.options[i]; if (o.selected) { from.options[i] = null; } } if ((arguments.length<3) || (arguments[2]==true)) { sortSelect(from); sortSelect(to); } from.selectedIndex = -1; to.selectedIndex = -1; } // ------------------------------------------------------------------- // copySelectedOptions(select_object,select_object[,autosort(true/false)]) // This function copies options between select boxes instead of // moving items. Duplicates in the target list are not allowed. // ------------------------------------------------------------------- function copySelectedOptions(from,to) { var options = new Object(); if (hasOptions(to)) { for (var i=0; i=0; i--) { if (obj.options[i].selected) { if (i != (obj.options.length-1) && ! obj.options[i+1].selected) { swapOptions(obj,i,i+1); obj.options[i+1].selected = true; } } } } // ------------------------------------------------------------------- // removeSelectedOptions(select_object) // Remove all selected options from a list // (Thanks to Gene Ninestein) // ------------------------------------------------------------------- function removeSelectedOptions(from) { if (!hasOptions(from)) { return; } if (from.type=="select-one") { from.options[from.selectedIndex] = null; } else { for (var i=(from.options.length-1); i>=0; i--) { var o=from.options[i]; if (o.selected) { from.options[i] = null; } } } from.selectedIndex = -1; } // ------------------------------------------------------------------- // removeAllOptions(select_object) // Remove all options from a list // ------------------------------------------------------------------- function removeAllOptions(from) { if (!hasOptions(from)) { return; } for (var i=(from.options.length-1); i>=0; i--) { from.options[i] = null; } from.selectedIndex = -1; } // ------------------------------------------------------------------- // addOption(select_object,display_text,value,selected) // Add an option to a list // ------------------------------------------------------------------- function addOption(obj,text,value,selected) { if (obj!=null && obj.options!=null) { obj.options[obj.options.length] = new Option(text, value, false, selected); } } '); END selectbox_js; PROCEDURE nepg_css IS BEGIN -- htp.p(' #p_customer_id { width : 250px; } #p_customer_name { width : 250px; } #p_contract_number { width : 250px; } #p_template_name { width : 250px; } #p_template_desc { width : 400px; } .contact { width : 250px; } .datefield { width : 80px; } .selectItemsDiv { position : relative; top : 10px; float : left; width : 270px; border : 1px solid; } .selectBoxDiv { height : 87px; overflow : hide; border : 1px solid; } .inheritedCat { background-color : #E6E6E6; } .inheritedPar { background-color : #E6E6E6; } .listTableHeadRow { background-color : #D9D9D9; border-left-width : 1px; border-left-style : solid; border-left-color : #F21C0A; border-right-width : 1px; border-right-style : solid; border-right-color : #F21C0A; border-top-width : 1px; border-top-style : solid; border-top-color : #F21C0A; border-bottom-width : 1px; border-bottom-style : solid; border-bottom-color : #F21C0A; } .selectListWidth { width : 264px; } .selectListWidthTH { background-color : #D9D9D9; border-left-width : 1px; border-left-style : solid; border-left-color : #F21C0A; border-right-width : 1px; border-right-style : solid; border-right-color : #F21C0A; border-top-width : 1px; border-top-style : solid; border-top-color : #F21C0A; border-bottom-width : 1px; border-bottom-style : solid; border-bottom-color : #F21C0A; } .selectListButtonTD { text-align : center } .selectListButton { font-size : smaller; } '); -- END nepg_css; PROCEDURE display_message( p_success IN VARCHAR2 , p_error IN VARCHAR2 , p_err_msg IN VARCHAR2 , p_ins_or_upd IN VARCHAR2 ) IS BEGIN -- IF p_success = 'Y' THEN -- Success! htp.p(''||caco_utilities.get_module_text(876)||'

'); ELSIF p_error = 'Y' THEN htp.p(''); IF p_ins_or_upd = 'INSERT' THEN htp.p(caco_utilities.get_module_text(2334)); -- Insert failed ELSE htp.p(caco_utilities.get_module_text(2340)); -- Update failed END IF; htp.p('
'); htp.p(''||p_err_msg||'

'); END IF; -- END display_message; PROCEDURE display_buttons( p_ins_or_upd IN VARCHAR2 ) IS l_url VARCHAR2(255) := NULL; BEGIN -- Insert or Update Button htp.p(''); -- l_url := dad_path||'efnow250$.startup'; -- htp.p(''); -- Cancel -- END display_buttons; PROCEDURE display_nepg_code( p_code IN VARCHAR2, p_ins_or_upd IN VARCHAR2 ) IS BEGIN -- htp.p(' '||caco_utilities.get_module_text(3901)||' *'); -- Network Point Group ID htp.p(' '); IF p_ins_or_upd = 'INSERT' THEN htp.p(''); ELSE -- make the field non updatable by diverting focus to nepg name htp.p(''); END IF; htp.p('   '); -- END display_nepg_code; PROCEDURE display_nepg_name( p_name IN VARCHAR2 ) IS BEGIN -- htp.p(' '||caco_utilities.get_module_text(116)||' *'); -- Name htp.p('   '); -- END display_nepg_name; PROCEDURE display_nepg_status( p_status IN VARCHAR2 ) IS BEGIN -- Status htp.p(' '||caco_utilities.get_module_text(2114)||' *'); -- Status htp.p(' '); -- END display_nepg_status; PROCEDURE display_network_points( p_network_point_array IN network_point_array , p_avail_net_points IN network_point_array ) IS BEGIN -- Output the Network Points lists htp.p('
'); -- Network Points htp.p('
'||caco_utilities.get_module_text(2277)||'
'); -- END display_network_points; PROCEDURE startup( p_ins_or_upd IN VARCHAR2 DEFAULT 'INSERT' , p_success IN VARCHAR2 DEFAULT NULL , p_nepg_id IN network_point_groups.nepg_id%TYPE DEFAULT 0 , p_nepg_name IN VARCHAR2 DEFAULT NULL , p_nepg_code IN VARCHAR2 DEFAULT NULL , p_nepg_status IN contracts.status%TYPE DEFAULT NULL , p_error IN VARCHAR2 DEFAULT NULL , p_err_msg IN VARCHAR2 DEFAULT NULL , p_nepo_id IN owa_util.vc_arr DEFAULT g_vc_arr ) IS -- l_ins_or_upd VARCHAR2(6) := 'INSERT'; l_network_point_array network_point_array; l_avail_net_points network_point_array; -- l_onload_options VARCHAR2(255) := NULL; -- l_code_position VARCHAR2(4) := '0000'; -- l_nepg_record network_point_groups%ROWTYPE; l_nepg_id network_point_groups.nepg_id%TYPE; l_nepg_code VARCHAR2(2000); l_nepg_name VARCHAR2(2000); l_nepg_status network_point_groups.status%TYPE; -- BEGIN -- IF NOT caco_security.security_check(g_package_name) THEN RETURN; END IF; -- -- Ensure any passed parameters are correct -- IF p_error IS NOT NULL AND p_error = 'Y' THEN l_code_position := '0010'; -- -- Here we have to build the screen from the originally submitted data -- that has NOT been saved to the DB -- -- get the bits required for a nepg -- Lets deal with Network Points -- There are probably many so lets create an array by searching the array find_passed_net_points( p_nepo_id -- this is the passed in array of nepo_id's , l_network_point_array ); -- -- Put all other nepg parameters into local variables l_ins_or_upd := p_ins_or_upd; l_nepg_id := p_nepg_id; l_nepg_name := p_nepg_name; l_nepg_code := p_nepg_code; l_nepg_status := p_nepg_status; -- ELSE -- Was this a successful Insert or Update? IF p_success = 'Y' THEN l_code_position := '0500'; -- Just grab the data from the DB using the Contract ID or Template Id IF p_nepg_id IS NOT NULL AND p_nepg_id > 0 THEN l_code_position := '0510'; -- l_ins_or_upd := 'UPDATE'; -- -- Get the details for the contract from the DB -- get_nepg_details( p_nepg_id , l_nepg_record , l_network_point_array ); -- l_code_position := '0520'; -- More work required here to set the variables correctly... l_nepg_id := p_nepg_id; l_nepg_name := l_nepg_record.name; l_nepg_code := l_nepg_record.code; l_nepg_status := l_nepg_record.status; -- ELSE l_code_position := '0550'; -- What happens if neither have been sent? -- This shouldn't happen as success can only -- come from the efno_contracts program units NULL; END IF; -- ELSE l_code_position := '0800'; -- Template not changed - real new or update. -- IF p_nepg_id IS NOT NULL AND p_nepg_id > 0 THEN l_code_position := '0820'; -- l_ins_or_upd := 'UPDATE'; -- -- Get the details for the contract from the DB get_nepg_details( p_nepg_id , l_nepg_record , l_network_point_array ); -- l_code_position := '0830'; -- l_nepg_id := p_nepg_id; l_nepg_name := l_nepg_record.name; l_nepg_code := l_nepg_record.code; l_nepg_status := l_nepg_record.status; -- END IF; -- -- END IF; -- end of successful insert/update IF -- END IF; -- end of error screen build or ins/upd -- l_code_position := '0900'; -- -- Get all network points and then filter list to ensure that only -- the unselected ones are left in the resultant array l_code_position := '1000'; -- get_avail_net_points( l_network_point_array -- array of already selected network points , l_avail_net_points ); -- returning list of remaining net points -- l_code_position := '2000'; -- wsgl.openpagehead(caco_utilities.get_module_text(3900)); -- Maintain Network Point Groups -- --wsgl.metatag; --htp.p(''); caco_system.content_type; htp.p(''); htp.p(' '); htp.p(' '); htp.p(' '); htp.p(' '); htp.p(' '); -- htp.p(wsgjsl.openscript); wsgjsl.output_invoke_cal_js('efnow251$' ,'scrollbars=no,resizable=no,width=320,height=350'); htp.p(wsgjsl.closescript); -- -- initialise javascript object htp.p(' '); -- l_onload_options := 'onload="'; l_onload_options := l_onload_options||'opt.init(document.getElementById(''nepgForm''));"'; -- wsgl.closepagehead; wsgl.openpagebody(FALSE, l_onload_options ); htp.p(caco_system.menu); -- -- l_code_position := '2100'; -- -- Now we get to actually build the page..... htp.p('
'); -- htp.p('
'); -- l_code_position := '2010'; -- -- Output a hidden input to track if changes have been made to any of the parameters IF p_error = 'Y' THEN htp.p(''); ELSE htp.p(''); END IF; -- l_code_position := '2020'; -- -- Put out all remaining hidden fields htp.p(''); -- htp.p(''); -- l_code_position := '2030'; -- htp.p('

'||caco_utilities.get_module_text(3900)||'

'); -- Maintain Network Point Groups -- l_code_position := '2040'; -- -- Put out success or error messages from completed or failed insert/update display_message( p_success => p_success , p_error => p_error , p_err_msg => p_err_msg , p_ins_or_upd => p_ins_or_upd ); -- l_code_position := '2050'; -- htp.p(' '); -- l_code_position := '2500'; -- display_nepg_code( l_nepg_code, l_ins_or_upd ); -- display_nepg_name( l_nepg_name ); -- display_nepg_status( l_nepg_status ); -- Horizontal line - to separate the above from the other minutae htp.p(' '); -- htp.p(''); -- -- Close the details table htp.p('

'); -- htp.p('''*'''||caco_utilities.get_module_text(2202)||''); -- '*' Denotes a mandatory field -- l_code_position := '2800'; -- -- Top level details done -- Now write out the select list -- --htp.p('

'||caco_utilities.get_module_text(2277)||'

'); -- Network Points -- htp.nl; htp.nl; l_code_position := '2810'; -- We need some buttons....required here due to CSS problems below the select lists. display_buttons(l_ins_or_upd); -- l_code_position := '2820'; -- display_network_points( l_network_point_array , l_avail_net_points ); -- l_code_position := '2900'; -- htp.p(chr(10)||'
'); -- Close of div just inside -- -- Close nepgForm htp.p('
'); -- Close nepg_border_div htp.p('
'); -- -- Close centrecontent div htp.p(''); -- wsgl.closepagebody; -- EXCEPTION WHEN others THEN caco_debug.putline('efnow251$.startup: ' ||'Position in Code : '||l_code_position||' : '||chr(10) ||sqlerrm(sqlcode)); -- Write an error and carry on cout_err.report_and_go( p_exception_number => sqlcode , p_exception_message => 'Position in Code : '||l_code_position ||' : '||chr(10)||sqlerrm(sqlcode) , p_source => 'efnow251$.startup'); -- RAISE; END startup; /** -- FUNCTION about -- -- Returns the version number and VSS header for this package -- -- %return The version number and VSS header for this package */ FUNCTION about RETURN VARCHAR2 IS BEGIN RETURN ( g_package_name || CHR(10) ||g_revision||chr(10)|| g_header ); END about; -- BEGIN -- NULL; -- END EFNOW251$; /