Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 238

Practice PL/SQL Examples - Part 1

Thursday, September 17, 2009


Draw Charminar using Oracle PL/SQL
DECLARE given_front_space NUMBER := 50; given_space_btn_minars NUMBER := 150; total_building_width NUMBER := 150 + 9+9; -- calc the total width, middle space and the both the dome with with the wall star space_btn_front_dome1 NUMBER; space_btn_front_dome2 NUMBER; /* ####################### Procedure to get the cursor down by certain lines ##################*/ PROCEDURE print_blank_lines(no_of_blank_lines NUMBER) IS BEGIN FOR blank_lines IN 1 .. no_of_blank_lines LOOP DBMS_OUTPUT.NEW_LINE; END LOOP; END; /* ####################### END OF Procedure to get the cursor down by certain lines ##################*/ /* #################### Procedure to print space ############################*/ PROCEDURE print_space(len_of_space NUMBER) IS BEGIN FOR amt_of_space IN 1 .. len_of_space LOOP DBMS_OUTPUT.PUT(' '); END LOOP; END; /* #################### Procedure to print only one star ############################*/ /* ################ Procedure to print a 2 star and a 1 space ################################*/ PROCEDURE two_star_and_1space(space_btn_stars NUMBER)

IS BEGIN DBMS_OUTPUT.PUT('*'); print_space(space_btn_stars); DBMS_OUTPUT.PUT('*'); END; /* ################ Procedure to print a star and a space ################################*/

/*################## Procedure to print ! #################################################*/ PROCEDURE single_special(no_of_single NUMBER) IS BEGIN FOR single_char in 1 .. no_of_single LOOP DBMS_OUTPUT.PUT('!'); END LOOP; END; /*################## end of Procedure to print ! #################################################*/ /*################## Procedure to print * #################################################*/ PROCEDURE single_star(no_of_star NUMBER) IS BEGIN FOR single_char in 1 .. no_of_star LOOP DBMS_OUTPUT.PUT('*'); END LOOP; END; /*################## end of Procedure to print ! #################################################*/ /* ################### Procedure to print single ~ #########################################*/ PROCEDURE single_tilda(no_of_tilda NUMBER) IS

BEGIN FOR single_tilda_loop in 1 .. no_of_tilda LOOP DBMS_OUTPUT.PUT('~'); END LOOP; END; /* ################### end of Procedure to print single ~ #########################################*/ /* ################## Procedure to print hash # ################################################# */ PROCEDURE single_hash(no_of_hash NUMBER) IS BEGIN FOR single_hash_loop in 1 .. no_of_hash LOOP DBMS_OUTPUT.PUT('#'); END LOOP; END; /* ################## end of Procedure to print hash # ################################################# */ /* ###########################PROCEDURE to pring percent % #############################################*/ PROCEDURE single_percent(no_of_percent NUMBER) IS BEGIN FOR single_percent_loop in 1 .. no_of_percent LOOP DBMS_OUTPUT.PUT('%'); END LOOP; END; /* ########################### end of PROCEDURE to pring percent % #########################################*/

/* ###########################PROCEDURE to pring line | #############################################*/ PROCEDURE single_line(no_of_line NUMBER)

IS BEGIN FOR single_percent_loop in 1 .. no_of_line LOOP DBMS_OUTPUT.PUT('|'); END LOOP; END; /* ###########################end of PROCEDURE to pring line | #############################################*/

/* #################### Procedure to print ~! in a set ##################################*/ PROCEDURE special_char_verti(no_of_special NUMBER) IS BEGIN FOR special_char in 1 .. no_of_special LOOP DBMS_OUTPUT.PUT('~!'); END LOOP; END; /* #################### end of Procedure to print !~ in a set ##################################*/ --- ~~~~~~~ printing begins from here ~~~~~~~~~~~----/* ################Procedure to print the pines of Charminar #################################*/ PROCEDURE front_pines IS BEGIN -- print the 1st and 2nd pine tips print_space(given_front_space); -- print the space in front of the tip of the pine two_star_and_1space(given_space_btn_minars); -- prints the tip of the two front pines dbms_output.new_line; -- reduce the front space and the middle space by 1 and 2 to get the slant look of the pine given_front_space := given_front_space - 1;

given_space_btn_minars := given_space_btn_minars - 2; FOR tip_of_loop in 1 .. 2 LOOP -- prints the 1st pine in the front two pines print_space(given_front_space); two_star_and_1space(1); -- prints the 2nd pine in the front two pines print_space(given_space_btn_minars); two_star_and_1space(1); dbms_output.new_line; END LOOP; END; /* ################End of Procedure to print the pines of Charminar #################################*/ /*############### Procedure to print the two domes in the front two minars ########################*/ PROCEDURE front_domes IS BEGIN -- first front dome given_front_space := given_front_space - 2; -- remove 2,coz bulge from pine to dome space_btn_front_dome1 := 2 + 3 + 2; --ie space reduced frm front space, pines two stars and one space, -- and 4 space before the last star -- print first dome with the front space print_space(given_front_space); two_star_and_1space(space_btn_front_dome1); -- second front dome given_space_btn_minars := given_space_btn_minars - space_btn_front_dome1; -remove the btn_dome1,coz -- the center space starts from the middle and so consider the middle space 3 + two 2 sides

space_btn_front_dome2 := 2 + 3 + 2; -- print the second dome with the front space print_space( given_space_btn_minars); two_star_and_1space(space_btn_front_dome2); dbms_output.new_line;

-- first front dome for slant look given_front_space := given_front_space - 2; space_btn_front_dome1 := space_btn_front_dome1 + 2 + 2; -- second front dome for slant look given_space_btn_minars := given_space_btn_minars - 4 ; -- remove only 4 coz, dont have to consider the center space -- coz, the center space is already removed from the first star of the dome space_btn_front_dome2 := space_btn_front_dome2 + 2 + 2; -- space_btn_front_dome1 = space_btn_front_dome2 FOR top_domes in 1 .. 2 LOOP -- print first dome with the front space print_space(given_front_space); two_star_and_1space(space_btn_front_dome1);

-- print the second dome with the front space print_space( given_space_btn_minars); two_star_and_1space(space_btn_front_dome2); dbms_output.new_line;

END LOOP; END; /*############### END of Procedure to print the two domes in the front two minars

########################*/ /* ###################### Procedure to print the first horizontal line in front minars ################# */ PROCEDURE first_hori_frnt_minar(p_front_space NUMBER,p_space_btn_front_dome NUMBER,p_space_btn_minars NUMBER) IS BEGIN -- to print the 1st vertical bar in the 1st front minar print_space(p_front_space); single_special(1); special_char_verti(p_space_btn_front_dome/3); -- to print the 1st vertical bar in the 2nd front minar print_space(p_space_btn_minars); single_special(1); special_char_verti(p_space_btn_front_dome/3); dbms_output.new_line; END; /* ###################### end of Procedure to print the first vertical line in front minars #################*/ /* ################# Procedure to print the top poles of hte front minars ######################## */ PROCEDURE top_pole_frnt_minars(p_front_space NUMBER,p_space_btn_front_dome NUMBER,p_space_btn_minars NUMBER, len_of_pillar NUMBER) IS BEGIN FOR pillar_len in 1 .. len_of_pillar LOOP -- print the front space, before printing the minar print_space(p_front_space); two_star_and_1space(p_space_btn_front_dome); -- print the middle space, before printing the 2nd minar print_space(p_space_btn_minars); two_star_and_1space(p_space_btn_front_dome);

dbms_output.new_line; END LOOP; END; /* ################# END OF Procedure to print the top poles of hte front minars ######################## */ /* ################Procedure to print the second horizontal line in the front minars ###################### */ PROCEDURE second_hori_frnt_minar IS snd_vert_frnt_space NUMBER := given_front_space ; verti_lent NUMBER := space_btn_front_dome1; snd_verti_btn_minar NUMBER := given_space_btn_minars ; BEGIN -- prints the vertical line in the first minar print_space(snd_vert_frnt_space - 2); single_special(verti_lent+ 7); -- prints the vertical line in the second minar print_space(snd_verti_btn_minar - 4); single_special(verti_lent+ 7); DBMS_OUTPUT.NEW_LINE; END; /* ################END OF Procedure to print the second vertical line in the front minars ###################### */

/* ############### PROCEDURE to print the bottom part of front minar, with behind minars ################### */ PROCEDURE front_down_hind_top IS fbhu_front_space NUMBER := given_front_space; fbhu_dome_space NUMBER := space_btn_front_dome1; fbhu_middle_Sminar NUMBER := given_space_btn_minars/2; fbhu_Sminar_frontSpace NUMBER := given_space_btn_minars/4 ; fbhu_Sminar_backSpace NUMBER := given_space_btn_minars/4 - 4; -- -4 for cosmetic purpose fbhu_space_btn_Sminar NUMBER := 4;

-- print the first BIG minar PROCEDURE top4_big_minar1 IS BEGIN print_space(fbhu_front_space); -- front space of the the bottom minar two_star_and_1space(fbhu_dome_space); -- prints the stars with the dome space in btn END; -- print the last BIG minar PROCEDURE top4_big_minar2 IS BEGIN print_space( fbhu_Sminar_backSpace - 3); -- front space of the the bottom minar,-3 for cosmetic purpose two_star_and_1space(fbhu_dome_space); -- prints the stars with the dome space in btn END;

-- prints the 1st small minar PROCEDURE top4_small_minar1 IS BEGIN print_space(fbhu_Sminar_frontSpace -2); two_star_and_1space(fbhu_space_btn_Sminar); END; -- prints the 2nd small minar PROCEDURE top4_small_minar2 IS BEGIN print_space(fbhu_middle_Sminar - 4); two_star_and_1space(fbhu_space_btn_Sminar); END;

PROCEDURE build_verti_4pillars IS

BEGIN -- BUILD THE PILLARS OF ALL THE 4 MINARS FOR top_four_minars in 1 .. 2 LOOP top4_big_minar1; top4_small_minar1; top4_small_minar2; top4_big_minar2; DBMS_OUTPUT.NEW_LINE; END LOOP; END;

BEGIN top4_big_minar1; -- prints the first big minar -- prints the first SMALL minar pine print_space(fbhu_Sminar_frontSpace); DBMS_OUTPUT.PUT('^'); -- prints the second SMALL minar pine print_space(fbhu_middle_Sminar); DBMS_OUTPUT.PUT('^'); -- print the last BIG minar print_space(fbhu_Sminar_backSpace); -- front space of the the bottom minar two_star_and_1space(fbhu_dome_space); -- prints the stars with the dome space in btn -pritn the last big minar DBMS_OUTPUT.NEW_LINE; -- BUILD THE PILLARS OF ALL THE 4 MINARS build_verti_4pillars;

-- BUILD HIND MINAR VERTICAL DESIGN WITH TILDA top4_big_minar1; -- prints the first print_space(fbhu_Sminar_frontSpace -2); single_tilda(3); -- prints the vertical line in the first small minar print_space(fbhu_middle_Sminar - 4); single_tilda(3); -- prints the vetical line in the second small minar -- print the last BIG minar print_space( fbhu_Sminar_backSpace - 4); -- front space of the the bottom minar,-3 for cosmetic purpose two_star_and_1space(fbhu_dome_space); -- prints the stars with the dome space in btn dbms_output.new_line; -- Prints the bottom of the build_verti_4pillars; -- BUILD THE LAST HORIZONTAL LINE OF THE MINARS -- 1 big pillar hash print_space(fbhu_front_space-1); -- front space of the the bottom minar single_hash(7); -- 1 small pillar hash print_space(fbhu_Sminar_frontSpace - 4); single_hash(3); -- 2 small pillar hash print_space(fbhu_middle_Sminar - 4); single_hash(3); -- 2 big pillar hash print_space(fbhu_Sminar_backSpace - 4); -- front space of the the bottom minar single_hash(7); dbms_output.new_line;

END; /* ############### END OF PROCEDURE to print the bottom part of front minar, with behind minars ################### */

/* ################ PROCEDURE to print the top desing of the building ####################################### */ PROCEDURE curve_top_building IS BEGIN -- top CURVE desing of the building print_space(given_front_space); single_tilda(72); dbms_output.new_line; END; /* ################ end of PROCEDURE to print the top desing of the building ####################################### */

/* ################ Procedure to print the top most desing after the curve #################################*/ PROCEDURE top_building_design IS BEGIN FOR top_desing_loop in 1 .. 4 LOOP print_space(given_front_space); single_percent(63); dbms_output.new_line; END LOOP; END; /* ################ END OF Procedure to print the top most desing after the curve ############################*/

/* ############### Procedure to print the bottom pillar in the building ############################## */ PROCEDURE middle_building_design IS mid_build_toggle NUMBER; mid_build_sp2 NUMBER := 14; -- total_middle ie 150/2 = around 72/4 - 4 for !!! print_clock VARCHAR2(1) := 'Y'; PROCEDURE linePillar_space IS BEGIN -- prints the first | lines in the middle building design print_space(given_front_space); single_line(space_btn_front_dome1 * 2); --print the middle space between the two | design pillars in the building print_space(given_space_btn_minars); single_line(space_btn_front_dome1 * 2); dbms_output.new_line; END;

PROCEDURE clock_window IS BEGIN -- prints the first | lines in the middle building design print_space(given_front_space); single_line(space_btn_front_dome1 * 2); -- print the first top part of the window FOR top_window in 1 .. 3 LOOP print_space(mid_build_sp2); single_special(4); END LOOP; -- print the clock IF print_clock = 'Y' THEN print_space(mid_build_sp2); DBMS_OUTPUT.PUT('@');

mid_build_toggle := mid_build_sp2 ; ELSIF print_clock = 'N' THEN mid_build_toggle := (mid_build_sp2 * 2) + 4; -- *2 coz, the space before and after clock along with the 3 space occupied by the -- the clock, this is when the clock is not printed END IF; -- this prints the clock or no clock space print_space(mid_build_toggle); single_special(4);

-- print the second top part of the window FOR top_window in 1 .. 2 LOOP print_space(mid_build_sp2); single_special(4); END LOOP; -- print the second | line in the middle building design print_space(mid_build_sp2 - 3); -- -3 for cosmetic purpose single_line(space_btn_front_dome1 * 2); dbms_output.new_line; END; BEGIN linePillar_space; -- prints the middle part of the building with lines and spaces -- PRINTS THE MIDDLE DESIGN WITH THE WINDOWS AND THE CENTER CLOCK clock_window; print_clock := 'N'; clock_window;

END;

/* ############### end of Procedure to print the bottom pillar in the building ###################### */

/* ################ Procedure to print the 2nd middle part of the building ###########################*/ PROCEDURE mid_in_minar IS BEGIN FOR middle_space in 1 .. 3 LOOP -- prints the 1st pine in the front two pines print_space(given_front_space); two_star_and_1space(space_btn_front_dome1); -- prints the 2nd pine in the front two pines print_space(given_space_btn_minars + 2); two_star_and_1space(space_btn_front_dome2); dbms_output.new_line; END LOOP; END; /* ################ end of Procedure to print the 2nd middle part of the building ###########################*/

/* ########### Procedure to print the bottom of the building with the door ####################### */ PROCEDURE bottom_door IS space_before_door NUMBER := (given_space_btn_minars/2); space_after_door NUMBER:= given_space_btn_minars - space_before_door; door_middle_space NUMBER :=0; door_top VARCHAR2(1) := 'Y'; len_of_side_doors NUMBER := 5;

PROCEDURE enterence_door IS BEGIN FOR door_bend in 1 .. len_of_side_doors LOOP IF door_top = 'Y' THEN space_before_door := space_before_door - 7; door_middle_space := door_middle_space + 7 + 7 + 1; space_after_door := space_after_door - 8.1; END IF; -- prints the first bottom minar print_space(given_front_space); two_star_and_1space(space_btn_front_dome1); -- prints the left side of the door print_space(space_before_door); single_star(1); -- print the right side of the door print_space(door_middle_space); single_star(1); -- print the last bottom minar print_space(space_after_door); two_star_and_1space(space_btn_front_dome1); dbms_output.new_line; END LOOP; END;

BEGIN -- prints the first bottom minar print_space(given_front_space); two_star_and_1space(space_btn_front_dome1);

-- print the starting of the door print_space(space_before_door); single_star(1); -- print the second bottom minar print_space(space_after_door); two_star_and_1space(space_btn_front_dome1); dbms_output.new_line; enterence_door; -- to print the top part of the door door_top := 'N'; -- this is stop reducin the space values in front and behind the door len_of_side_doors := 11; -- inc's the length of the door after the bend space_before_door := space_before_door - 2; door_middle_space := door_middle_space + 4; space_after_door := space_after_door - 2; enterence_door;

END; /* ########### end of Procedure to print the bottom of the building with the door ####################### */

BEGIN -- get the cursor down by some lines print_blank_lines(5); -- Two pines of the front 2 minars front_pines; front_domes; first_hori_frnt_minar(given_front_space,space_btn_front_dome1,given_space_btn_minar s-1); -- -1 just for cosmetic purpose

top_pole_frnt_minars(given_front_space,space_btn_front_dome1,given_space_btn_mina rs, 3); second_hori_frnt_minar; front_down_hind_top; -- building design top_building_design; middle_building_design; curve_top_building; mid_in_minar; bottom_door; -- curve_top_building; END; Posted by And so It Begins at 7:38 PM 0 comments

Draw Empire State Building Using Oracle PL/SQL

DECLARE total_pyramid_length NUMBER; total_pyramid_width NUMBER;

left_pyramid_shade_count NUMBER :=0; middle_pyramid_shade_count NUMBER:= 0; right_pyramid_shade_count NUMBER:= 0; lines_printed_count NUMBER := 0; new_line_flag VARCHAR2(3) := 'YES'; check_which_building NUMBER; amt_of_space_interms_line NUMBER; middle_space NUMBER := 15; -- this is to keep the initial space between the two horizontal lines to be atleast 3 spaces print_middle_space NUMBER; noof_lines_occupied_in_1_space NUMBER := 1.5; -- no of lines occupied in one space increment_space_by NUMBER := 2; -- space should be incremented inbetween the lines to make it look like a moon space_occupied_in_middle NUMBER; noof_pics_left_side NUMBER; noof_pics_right_side NUMBER; building_1_width NUMBER; building_2_width NUMBER; building_3_width NUMBER; building_4_width NUMBER; building_5_width NUMBER; building_6_width NUMBER;

---- #### Procedur to print the shaded part in the background #### ---PROCEDURE print_shade(para_width NUMBER, next_line NUMBER) IS BEGIN FOR lines_printed IN 1 .. next_line LOOP FOR width_of_shade in 1 .. para_width

LOOP DBMS_OUTPUT.PUT('|'); END LOOP; IF new_line_flag = 'YES' THEN dbms_output.new_line; ELSIF new_line_flag = 'NO' THEN NULL; END IF; END LOOP; END;

---- #### END OF Procedur to print the shaded part in the background #### ----

----#### Procedure to print empty spaces #### ---PROCEDURE print_empty_space(width_of_space NUMBER) IS BEGIN FOR for_empty_space in 1.. width_of_space LOOP DBMS_OUTPUT.PUT(' '); END LOOP; END; ---- ####END OF procedure to print empty spaces #### ----

---- #### Procedure to calculate the left right shaded amount #### ---PROCEDURE calc_left_right_shade IS BEGIN amt_of_space_interms_line := (middle_pyramid_shade_count * 1.5); --taking 1 spaces occupies around 1.5 times the line left_pyramid_shade_count := CEIL((total_pyramid_width -

middle_pyramid_shade_count)/2); right_pyramid_shade_count := (total_pyramid_width - left_pyramid_shade_count) amt_of_space_interms_line; -- space occupies more --area when commpared to line so remove the extra lines that we calculted --taking 1.5 as a standard END; ---- #### END OF Procedure to calculate the left right shaded amount #### ----

---- #### Procedure to print buildings #### ---PROCEDURE print_buildings IS BEGIN IF check_which_building = 1 THEN middle_pyramid_shade_count := building_1_width; calc_left_right_shade; ELSIF check_which_building = 2 THEN middle_pyramid_shade_count := building_1_width + building_2_width; calc_left_right_shade; ELSIF check_which_building = 3 THEN middle_pyramid_shade_count := building_1_width + building_2_width + building_3_width; calc_left_right_shade; ELSIF check_which_building = 4 THEN middle_pyramid_shade_count := building_1_width + building_2_width + building_3_width + building_4_width; calc_left_right_shade; ELSIF check_which_building = 5 THEN middle_pyramid_shade_count := building_1_width + building_2_width + building_3_width + building_4_width + building_5_width; calc_left_right_shade; ELSIF check_which_building = 6

THEN middle_pyramid_shade_count := building_1_width + building_2_width + building_3_width + building_4_width + building_5_width + building_6_width; calc_left_right_shade; END IF; END; ---- #### END OF Procedure to print buildings #### ----

---- #### Procedure to Calculate the Left, Right , and Middle space #### ---PROCEDURE calc_lft_rt_middl(para_middle_space NUMBER) IS BEGIN space_occupied_in_middle := CEIL(middle_space * noof_lines_occupied_in_1_space); noof_pics_left_side := FLOOR((100 - (space_occupied_in_middle))/2); noof_pics_right_side := (100 - (noof_pics_left_side + space_occupied_in_middle) ); print_middle_space := middle_space; new_line_flag := 'NO'; print_shade(noof_pics_left_side,1); -- printing the line on the left side print_empty_space(print_middle_space); -- printing the space in between print_shade(noof_pics_right_side,1); -- printing the line of the right side DBMS_OUTPUT.NEW_LINE; END; ---- #### END OF Procedure to Calculate the Left, Right , and Middle space #### ----

---- #### Proceudre to print the moon on top of the building #### ----

PROCEDURE print_moon IS BEGIN -- top half of the circle FOR noof_line_with_space in 1 .. 2 LOOP calc_lft_rt_middl(middle_space); middle_space := middle_space + increment_space_by ; END LOOP; -- bottom half of the circle FOR bottom_half_circle in 1 .. 2 LOOP middle_space := middle_space - increment_space_by ; calc_lft_rt_middl(middle_space); END LOOP; new_line_flag := 'YES'; print_shade(100,2); -- prints the top part of the shade END; ---- #### END OF Proceudre to print the moon on top of the building #### ----

BEGIN total_pyramid_width:= 100; building_1_width := 1;

building_2_width := 2; building_3_width := 3; building_4_width := 8; building_5_width := 8; building_6_width := 8;

print_shade(100,5); -- prints the top part of the shade print_moon; -- calls the procedure to print the moon on top --print_shade(100,5); -- prints the top part of the shade FOR building_line_printed in 5 .. 50 -- lines printed is taken from 5 coz, 5 lines have already been printed in the print_shade LOOP IF building_line_printed BETWEEN 5 AND 9 THEN check_which_building := 1; ELSIF building_line_printed BETWEEN 10 AND 14 THEN check_which_building := 2; ELSIF building_line_printed BETWEEN 15 AND 19 THEN check_which_building := 3; ELSIF building_line_printed BETWEEN 20 AND 24 THEN check_which_building := 4; ELSIF building_line_printed BETWEEN 25 AND 29 THEN check_which_building := 5; ELSIF building_line_printed BETWEEN 30 AND 50 THEN check_which_building := 6; END IF; print_buildings; new_line_flag := 'NO'; print_shade(left_pyramid_shade_count,1);

new_line_flag := 'NO'; print_empty_space(middle_pyramid_shade_count);

new_line_flag := 'YES'; print_shade(right_pyramid_shade_count,1); END LOOP; END; Posted by And so It Begins at 7:37 PM 0 comments

Build Castle using Oracle PL/SQL

DECLARE /*********************************************************************** ******************************************/ /*-------------------------------------- BUILD CASTLE -----------------------------------------------------------*/ PROCEDURE build_castle(infront_space NUMBER, len_of_castle NUMBER) IS

blank_space_before_castle NUMBER := infront_space; blank_space_above_castle NUMBER := FLOOR(blank_space_before_castle/3); go_new_line VARCHAR2(2) := 'T';

----------- ^^^^^^^^^^ DECLARATIONS for FLAG ^^^^^^^^^ --------------space_infront_of_flag NUMBER := infront_space; -- space infront of flag breadth_of_flag NUMBER := FLOOR(len_of_castle/5); mid_len_flag_no_verti_lines NUMBER := (breadth_of_flag - 4); space_btn_flag_hori_lines NUMBER := (breadth_of_flag + (breadth_of_flag - 1))-2; -- (breadth_of_flag - 1) coz, count the star with space, except the last star whose blank space is outside the rite verti line -- substract 2 from the total coz, we shouldnt consider the two verti lines in the flag rod_len_in_flag NUMBER := (mid_len_flag_no_verti_lines + 2); -- keeping the len of flag same as the len of the rod of the flag -- add 2 here coz,two verti lines in flag are missing in the mid_len_of_flag next_line VARCHAR2(2) := 'F'; ---------- vvvvvvvvvvv END OF DECLARATIONS for FLAG vvvvvvvv ------------

----------- ^^^^^^^^^^ DECLARATIONS for Triangle ^^^^^^^^^ ---------------- keeping the first triangle the same length as the breath of the flag mid_len_of_1st_middle_triangle NUMBER := (breadth_of_flag - 2); -- substracting the hori line in the triangel and the tip of the triangle first_center_space_in_triangel NUMBER := 1; space_infront_tip_of_triangle NUMBER := infront_space;

---------- vvvvvvvvvvv END OF DECLARATIONS foR Triangle vvvvvvvv ------------

------- ^^^^^^^^^^ Declaration for tall building ^^^^^^^ -------------------top_castle_len NUMBER := (mid_len_flag_no_verti_lines +2) + rod_len_in_flag + (mid_len_of_1st_middle_triangle +2); -- calculates the length of the top part of the castle which includes -- the length of the flag with pole/rod and the length of the triangle tot_len_of_tall_building NUMBER := (len_of_castle - top_castle_len)-1; -- gives the len of the tallest building -- substract 1 coz, we are taking out the last base line in the castle individual_top_len_each_castle NUMBER := FLOOR(tot_len_of_tall_building/3); front_space_in_middle_castle NUMBER; middle_space_in_middle_castle NUMBER; -------- vvvvvvvvv END OF Declaration for tall building vvvvv ---------------

------------^^^^^^^^^^^^^^^^^ Declaration for the 2nd middle building ^^^^^^^^^ -------middle_space_2nd_building NUMBER; front_space_in_2nd_building NUMBER; middle_hori_line NUMBER; middle_space_in_small_tri NUMBER :=4; tot_middle_hori_space NUMBER; space_infront_smal_tri NUMBER; ----------- vvvvvvvvvvvvvvvv END OF Declaration for the 2nd middle building vvvvv --------

------------ ^^^^^^^^^^^ Declaration for the last building ^^^^^^^^^^ -------------no_of_stars_last_building NUMBER; middle_space_in_last_building NUMBER; spce_btn_hori_line_last_build NUMBER; spce_before_last_building NUMBER; door_space_bottom_middle NUMBER;

--------------- vvvvvvvvvvvv END OF Declaration for the last building vvvvvvvvvvv --------

------ ^^^^^^^^^^ Remainig Declarations ^^^^^^^^ ----------------top_of_the_door NUMBER; after_top_door VARCHAR2(2):= 'F'; upper_midle_verti_line NUMBER; lower_verti_line NUMBER; base_of_the_castle NUMBER; no_of_base_stars NUMBER; --------vvvvvvvv END OF Remaining Declarations vvvvvv ------------

---- #### Procedure to print space in castle #### ---PROCEDURE print_spaces(para_len_of_space NUMBER) IS BEGIN FOR for_len_of_space IN 1 .. para_len_of_space LOOP dbms_output.put(' '); END LOOP; END; ---- #### END OF Procedure to print space in castle #### ----

---- #### Procedure to print a space and a star #### ---PROCEDURE print_space_n_star(para_space_infront_of_star NUMBER) IS BEGIN print_spaces(para_space_infront_of_star ); dbms_output.put('*'); END; ---- #### END OF Procedure to print a space and a star #### ----

---- #### Procedure to print stars in a line #### ---PROCEDURE print_hori_stars_no_space(para_no_of_stars NUMBER, para_space_before_star NUMBER) IS BEGIN print_spaces(para_space_before_star); FOR for_no_of_stars IN 1 .. para_no_of_stars LOOP dbms_output.put('*'); END LOOP; END; ---- #### END OF Procedure to print stars in a line #### ----

---- #### Procedure to print a single vertical line #### ---PROCEDURE print_single_verti_line(para_no_of_verti_stars NUMBER, para_space_infront_of_rod NUMBER) IS BEGIN FOR for_print_single_vertei IN 1 .. para_no_of_verti_stars LOOP print_spaces(para_space_infront_of_rod); dbms_output.put('*'); IF next_line = 'T' THEN dbms_output.new_line; END IF; END LOOP; END; ---- #### Procedure to print a single vertical line #### ----

---- #### Procedure to print stars in horizontal line along with spaces #### ---PROCEDURE print_hori_stars_wit_space(para_no_of_verti_stars NUMBER,

para_space_infront NUMBER) IS BEGIN print_spaces(para_space_infront); -- prints the space infront of the hori line FOR for_len_of_hori_line IN 1 .. para_no_of_verti_stars LOOP dbms_output.put('*'); dbms_output.put(' '); END LOOP; END; ---- #### END OF Procedure to print stars in horizontal line along with spaces #### ----

---- #### Procedure to print two vertical line the Castle #### ---PROCEDURE print_two_verti_line_spaces(para_no_of_hori_stars NUMBER, para_space_btn_lines NUMBER, space_infront_verti_line NUMBER) IS BEGIN FOR for_2_verti_line IN 1 .. para_no_of_hori_stars LOOP print_spaces(space_infront_verti_line); dbms_output.put('*'); -- prints the first star in the left verti side of the two lines print_spaces(para_space_btn_lines); -- prints the space btn the two lines dbms_output.put('*'); -- prints the last star in the right verti side of the two lines IF go_new_line = 'T' THEN dbms_output.new_line; END IF; END LOOP; END; ---- #### END OF Procedure to print two vertical line the Castle #### ----

---- #### Procedure to print a triangle on the castle #### ---PROCEDURE print_triangle(para_mid_len_of_triangle NUMBER, para_space_infront_triangel NUMBER ) IS changing_tri_infront_space NUMBER := para_space_infront_triangel; base_stars_in_triangle NUMBER; BEGIN print_spaces(para_space_infront_triangel); dbms_output.put_line('*'); FOR for_no_of_middle_part IN 1 .. para_mid_len_of_triangle LOOP changing_tri_infront_space := changing_tri_infront_space - 1; -- dec the space infront of the triangle print_spaces(changing_tri_infront_space); dbms_output.put('*'); print_spaces(first_center_space_in_triangel); -- prints the center space in the triangle dbms_output.put('*'); dbms_output.new_line; first_center_space_in_triangel := first_center_space_in_triangel + 2; -- inc the center space in the triangle END LOOP; base_stars_in_triangle := CEIL(first_center_space_in_triangel/2); print_hori_stars_wit_space((base_stars_in_triangle+1),changing_tri_infront_space - 1); dbms_output.new_line; front_space_in_middle_castle := changing_tri_infront_space - 1; middle_space_in_middle_castle := ((base_stars_in_triangle + 1) + (base_stars_in_triangle))- 2; -- here wer are adding the stars along with the spaces so add base_stars + one less space than the tot stars, as the last space will be printed outside the range -- substract 2, coz removing the two vertical lines in building, we need only the spaces without the vertical lines END; ---- #### END OF Procedure to print a triangle on the castle #### ----

------ #### Procedure to print the tallesst middle building in the castle #### ---PROCEDURE print_tallest_middle_building(para_top_len_of_middle NUMBER) IS BEGIN print_two_verti_line_spaces(para_top_len_of_middle,middle_space_in_middle_castle,fro nt_space_in_middle_castle); middle_space_2nd_building := middle_space_in_middle_castle; END; ------ #### END OF Procedure to print the tallesst middle building in the castle #### ----

---- #### Procedure to print the small triangles on the small buildings #### ---PROCEDURE print_small_triangle(para_middle_2nd_building NUMBER, para_front_middle_castle NUMBER) IS small_tri_middle_space NUMBER := para_middle_2nd_building; right_of_small_triangle NUMBER := CEIL(small_tri_middle_space/2); small_tri_front_space NUMBER := (para_front_middle_castle right_of_small_triangle)-1 ; -- subtract 1,coz we shouldnt consider the space where the top star of the 2nd triangle occupies BEGIN print_spaces(small_tri_front_space); dbms_output.put('*'); go_new_line := 'F'; print_two_verti_line_spaces(1,middle_space_in_middle_castle,right_of_small_triangle); print_spaces(right_of_small_triangle); dbms_output.put('*');

dbms_output.new_line; front_space_in_2nd_building := small_tri_front_space; END; ---- #### END OF Procedure to print the small triangles on the small buildings #### ----

---- #### Procedure to print the second line in the small triangle #### ---PROCEDURE secnd_line_triangle(para_times NUMBER) IS BEGIN FOR secnd_line_triange IN 1 .. para_times LOOP go_new_line := 'F'; print_two_verti_line_spaces(1,middle_space_in_small_tri,(front_space_in_2nd_building -2)); print_two_verti_line_spaces(1,middle_space_in_middle_castle,1); print_two_verti_line_spaces(1,middle_space_in_small_tri,1); dbms_output.new_line; END LOOP; END; ---- #### END OF Procedure to print the second line in the small triangle #### ----

---- #### Procedure to print huge spaces infront of a single star #### ---PROCEDURE print_huge_space_n_star(para_huge_space NUMBER) IS BEGIN print_spaces(para_huge_space); dbms_output.put('*'); END;

---- #### END OF Procedure to print huge spaces infront of a single star #### ----

BEGIN ---- @@@@ Prints the flag on the top of the castle @@@@ ---print_hori_stars_wit_space( breadth_of_flag, space_infront_of_flag); -- this is to print the first hori line in the flag with stars and spaces dbms_output.new_line; -- to get the control to the next line after drawing the first hori line in the flag print_two_verti_line_spaces(mid_len_flag_no_verti_lines, space_btn_flag_hori_lines, space_infront_of_flag); -- prints the middle part of the flag, which has two hori lines and spaces in btn print_hori_stars_wit_space( breadth_of_flag, space_infront_of_flag); dbms_output.new_line; -- to get the control to the next line after drawing the first hori line in the flag next_line := 'T'; print_single_verti_line(rod_len_in_flag,space_infront_of_flag); ---- @@@@ END OF Prints the flag on the top of the castle @@@@ ---next_line := 'F';

---- @@@@ Print the triangle in the castle @@@@ ---print_triangle(mid_len_of_1st_middle_triangle, space_infront_tip_of_triangle); ---- @@@@ END OF Print the triangle in the castle @@@@ ----

---- @@@@ Print the top part of tallest middle castle building @@@@ ---print_tallest_middle_building(individual_top_len_each_castle-1); -- subtract 1, coz remvoing the base line in the upper part of the castle ---- @@@@ END OF Print the top part of tallest middle castle building @@@@ ----

---- @@@@ Print small triangle @@@@ ---print_small_triangle( middle_space_2nd_building,front_space_in_middle_castle) ; secnd_line_triangle(1) ; ---- @@@@ Print small triangle @@@@ ----

tot_middle_hori_space := (middle_space_in_small_tri + middle_space_in_middle_castle+ middle_space_in_small_tri)+ 6 + 2; -- this add the middle spaces in the two side 2nd buildings and the middle builiding -- along with the 6 vertical lines and 2 spaces btn the side building and the center building middle_hori_line := CEIL(tot_middle_hori_space/2)+1; space_infront_smal_tri := front_space_in_middle_castle (middle_space_in_small_tri+3); print_hori_stars_wit_space(middle_hori_line,space_infront_smal_tri); -- subtracting the space occupied by the 2nd building from -- the total left space from the center of the middle building dbms_output.new_line;

---- @@@@ Print the upper middle veretical lines upper_midle_verti_line := FLOOR(tot_len_of_tall_building/3)-2; FOR for_upper_middle_veret IN 1 .. upper_midle_verti_line LOOP print_two_verti_line_spaces(1, middle_space_2nd_building ,space_infront_smal_tri); print_two_verti_line_spaces(1, middle_space_2nd_building ,middle_space_in_middle_castle); dbms_output.new_line; END LOOP;

---- @@@@ Print the two hori lines for the bottom building of the castle middle_space_in_last_building := middle_space_2nd_building; spce_before_last_building := (space_infront_smal_tri - middle_space_in_last_building)1; -- calc front space of the last building, by subtracting the front space of the

-- middle space from last building from the front space of 2nd building -- and then 1 ie the vertical line of the 2nd building no_of_stars_last_building := FLOOR(middle_space_in_last_building/2)+2; -- half of the center space and add 2 -- for the corner stars on the two verti lines print_hori_stars_wit_space(no_of_stars_last_building,spce_before_last_building ); print_hori_stars_wit_space(1,(middle_space_2nd_building-1)); print_hori_stars_wit_space(1,(middle_space_in_middle_castle-1)); print_hori_stars_wit_space(no_of_stars_last_building,(middle_space_2nd_building-1)); dbms_output.new_line;

---- @@@@ Print the lower vertical lines lower_verti_line := ((tot_len_of_tall_building-2) - upper_midle_verti_line); FOR for_lower_part_castle IN 1 .. lower_verti_line LOOP print_two_verti_line_spaces(1, middle_space_in_last_building ,spce_before_last_building); -- prints the the vertical line of the last building in the lower part of castle IF(for_lower_part_castle = 6) THEN door_space_bottom_middle := FLOOR(middle_space_in_middle_castle/3); top_of_the_door := (middle_space_in_middle_castle - (door_space_bottom_middle *2)); print_single_verti_line(1,middle_space_2nd_building); -- prints the right side wall of the 2nd building print_hori_stars_no_space(top_of_the_door,door_space_bottom_middle); -- prints the top of hte door print_two_verti_line_spaces(1,middle_space_2nd_building,door_space_bottom_middle); -- prints the left and right side walls of the right 2nd building print_single_verti_line(1,middle_space_in_last_building); -- prints the right side wall of the last building after_top_door := 'T'; ELSE -- this has to be executed after the top of the door is printed in the bottom half of the castle IF after_top_door = 'T' THEN

print_two_verti_line_spaces(1,door_space_bottom_middle,middle_space_2nd_building); print_two_verti_line_spaces(1,door_space_bottom_middle,(top_of_the_door-2)); print_two_verti_line_spaces(1,middle_space_in_last_building,middle_space_2nd_buildin g); -- this is executed before the the top of the door is printed in the top half of the castle ELSIF after_top_door = 'F' THEN print_two_verti_line_spaces(1,middle_space_in_middle_castle,middle_space_2nd_buildi ng); print_two_verti_line_spaces(1,middle_space_in_last_building,middle_space_2nd_buildin g); END IF; END IF; dbms_output.new_line; END LOOP; --- base of the castle base_of_the_castle := (middle_space_in_last_building *2) + (middle_space_2nd_building *2) + middle_space_in_middle_castle +4; -- total + 4 coz, counting the vertical lines with the spaces in between no_of_base_stars := FLOOR(base_of_the_castle/2) +2; -- + 2 for the vertical lines in the begining and the end of the base line print_hori_stars_wit_space(no_of_base_stars,spce_before_last_building); dbms_output.new_line; END;

/*-------------------------------------- BUILD CASTLE -----------------------------------------------------------*/ /*********************************************************************** ******************************************/

BEGIN build_castle(30,25); END; Posted by And so It Begins at 7:36 PM 0 comments

Draw a CAR using Oracle PL/SQL

Draw a CAR using Oracle PL/SQL DECLARE len_of_car_top NUMBER := 20; -- taking length of car top as a constant value space_infront_of_car NUMBER := len_of_car_top * 3; -- Multiply by 3 to make enought space for the front of the car space_btn_frnt_back_glass NUMBER := len_of_car_top + 25; -- This is the space between the front and back glass equating to -- the len of the top of car,coz inc the space_infront_engine NUMBER; last_middle_space NUMBER; print_space VARCHAR2(1) := 'Y'; tot_car_width NUMBER; engine_line NUMBER; bumper_line NUMBER; tire_size1 NUMBER := 15; tire_size2 NUMBER := 15; tire_size3 NUMBER := 15;

---- #### Procedure to print empty space in the front before printing something #### ----

PROCEDURE print_empty_hori_space(para_len_of_empty_line NUMBER) IS BEGIN FOR empty_line_len in 1 .. para_len_of_empty_line LOOP DBMS_OUTPUT.PUT(' '); END LOOP; END; ----#### END of procedure to print empty space in the front before printing something #### ----

-- #### PROCEDURE to print a horizontal line of stars #### ---PROCEDURE print_hori_line(para_len_of_line NUMBER) IS BEGIN IF print_space = 'Y' THEN print_empty_hori_space(space_infront_of_car); -- multily by 3 to make enough space for the front engine END IF; FOR for_line_len in 1 .. para_len_of_line LOOP DBMS_OUTPUT.PUT('+'); END LOOP; END; ---- #### end of Procedure to print a horizontal line of stars #### ----

---- #### Procedure to print empty lines for the picture to move down #### ---PROCEDURE print_empty_lines(para_noof_empty_lines NUMBER) IS BEGIN FOR space_above in 1 .. para_noof_empty_lines LOOP dbms_output.new_line; END LOOP; END; ----#### End of Procedur to print empty line for the picture to move down #### ----

---- #### Procedrue to print slant lines of the car front and rear glass #### ---PROCEDURE print_frnt_rear_glasses(para_len_of_glass NUMBER) IS BEGIN FOR print_middle_space in 1 .. para_len_of_glass LOOP space_infront_of_car := space_infront_of_car - 4; -- this will reduce the space infront of the car to get a print_empty_hori_space(space_infront_of_car); --slant appears for the front glass of the car DBMS_OUTPUT.PUT('+'); print_empty_hori_space(space_btn_frnt_back_glass); DBMS_OUTPUT.PUT('+'); DBMS_OUTPUT.NEW_LINE; space_btn_frnt_back_glass := space_btn_frnt_back_glass + 6; END LOOP; space_infront_engine := space_infront_of_car; last_middle_space := space_btn_frnt_back_glass; --DBMS_OUTPUT.PUT_LINE(SPACE_INFRONT_ENGINE); --DBMS_OUTPUT.PUT_LINE(LAST_MIDDLE_SPACE); END;

---- ####END OF procedure to print slant lines of the care for front and rear glass #### ----

---- ####Procedure to print bumper and engine of the car #### ---PROCEDURE print_engine_n_bumper --(para_len_of_engineNbumper NUMBER) IS BEGIN engine_line := space_infront_of_car - 37; print_space := 'N'; print_empty_hori_space(25); print_hori_line(engine_line); print_empty_hori_space(LAST_MIDDLE_SPACE); print_hori_line(engine_line ); DBMS_OUTPUT.NEW_LINE; END; ---- ####END OF Procedure to print bumper and engine of the car #### ----

----#### Procedure to print the front and rear vertical lines in the car #### ---PROCEDURE frnt_rear_verti_lines IS BEGIN FOR len_of_front_verti_lines in 1 .. 3 LOOP print_empty_hori_space(25); DBMS_OUTPUT.PUT('*'); /* --delete

print_empty_hori_space(60); dbms_output.put('+'); print_empty_hori_space(7); dbms_output.put('+'); -- delete*/ tot_car_width := LAST_MIDDLE_SPACE - 10 ; print_empty_hori_space(engine_line + LAST_MIDDLE_SPACE + engine_line + 19); DBMS_OUTPUT.PUT('+'); DBMS_OUTPUT.NEW_LINE; END LOOP; END; ----#### END OF Procedure to print the front and rear vertical lines in the car #### ----

---- #### Procedure to print the bottom part of the car #### ---PROCEDURE bottome_of_car IS BEGIN print_empty_hori_space(25); print_hori_line(tot_car_width); DBMS_OUTPUT.NEW_LINE; END; ---- #### Procedure to print the bottom part of the car #### ----

---- #### Procedrue to print wheels of the car #### ---PROCEDURE wheels_of_car IS BEGIN FOR tire in 1 .. 2 LOOP

print_empty_hori_space(25); print_empty_hori_space(tire_size1); DBMS_OUTPUT.PUT('*'); print_empty_hori_space(tire_size2); dbms_output.put('*');

print_empty_hori_space(35); Print_empty_hori_space(tire_size3); DBMS_OUTPUT.PUT('*'); print_empty_hori_space(tire_size2); dbms_output.put('*'); tire_size1 := tire_size1 + 3 ; tire_size2 := tire_size2 - 8; tire_size3 := tire_size3 + 9;

dbms_output.new_line; END LOOP; END; ---- #### Procedrue to print wheels of the car #### ----

BEGIN print_empty_lines(5); -- this will print 5 empty lines, this will make the picture to go down by 5 lines print_hori_line(len_of_car_top); -- this will print a horizontal line dbms_output.new_line; print_frnt_rear_glasses(3); print_engine_n_bumper; frnt_rear_verti_lines;

bottome_of_car; wheels_of_car; END; Posted by And so It Begins at 7:35 PM 0 comments

PL/SQL Practice Example - Part 2


11)Count the Number of Characters in a word DECLARE PROCEDURE count_no_o(c VARCHAR2) IS cnt NUMBER := 0; val NUMBER := 0; inc NUMBER := 1; BEGIN LOOP FOR i IN 1 .. inc LOOP val := INSTR(c,'o',1,inc); END LOOP; IF val = 0 THEN dbms_output.put_line('No of O IS :' || cnt); END IF; EXIT WHEN val = 0; cnt := cnt +1; inc := inc + 1; END LOOP; END; BEGIN count_no_o('snoooooooooopy'); END;

12)Remove a letter form a word DECLARE PROCEDURE rem_o(n VARCHAR2) IS

name1 VARCHAR2(5); name2 VARCHAR2(5); x NUMBER; BEGIN x := INSTR(n,'o',1,1); name1 := SUBSTR(n,1,(x-1)); name2 := SUBSTR(n,(x+1),LENGTH(n)); dbms_output.put_line( name1 || name2); END; BEGIN rem_o('snoopy'); END; 13)Check for palindrome DECLARE PROCEDURE chk_palin(n CHAR) IS len NUMBER; half_way NUMBER; char1 CHAR; char2 CHAR; chk NUMBER := 0; num NUMBER; tab NUMBER; BEGIN len := LENGTH(n); <> FOR i IN 1 .. (FLOOR(len/2)) LOOP char1 := SUBSTR(n,i,1); num := len - chk; char2 := SUBSTR(n,num,1); dbms_output.put_line(char1); dbms_output.put_line(char2); chk := chk +1; IF char1 = char2 THEN tab := 1; ELSIF char1 != char2 THEN tab := 0; EXIT for_loop; END IF;

END LOOP; IF tab = 1 THEN dbms_output.put_line('THIS IS A PALIDROME'); ELSE dbms_output.put_line('this is not a palindrome'); END IF; END; BEGIN chk_palin('abcdcba'); END; 14)Count number of characters DECLARE PROCEDURE check_char(name CHAR) IS extract_char CHAR; incr_count NUMBER :=1; no_of_char NUMBER :=0; BEGIN LOOP extract_char := SUBSTR(name,incr_count,1); IF extract_char IS NULL OR extract_char = '' THEN EXIT WHEN extract_char IS NULL; ELSE no_of_char := no_of_char +1; END IF; incr_count := incr_count +1; END LOOP; dbms_output.put_line('no of chars:' || no_of_char); END check_char; BEGIN check_char('abcd'); END; 15)Print reverse of name DECLARE PROCEDURE reverse_of_name(name CHAR) IS

extract_char CHAR; BEGIN FOR i IN REVERSE 1 .. LENGTH(name) LOOP extract_char := SUBSTR(name,i,1); dbms_output.put(extract_char); END LOOP; dbms_output.new_line; END; 16)Change some value in a word (from jk001 to jk0025) BEGIN reverse_of_name('snoopy'); END; BEGIN FOR i IN 1 .. 25 LOOP dbms_output.put_line('jk' ||'00' ||i); END LOOP; END; 17)Captalize alternate Characters (aBcDeFgHiJkLmNoPqR) DECLARE PROCEDURE sent_name(n VARCHAR2) IS extract_char VARCHAR2(10); chk NUMBER := 0; BEGIN FOR i IN 1 .. LENGTH(n) LOOP extract_char := SUBSTR(n,i,1); IF (i MOD 2) = 0 THEN -- dbms_output.put(extract_char || ' This is Even'); dbms_output.put(UPPER(extract_char)); NULL; ELSIF (i MOD 2) > 0 THEN --dbms_output.put_line(extract_char || 'this is odd'); dbms_output.put((extract_char)); NULL; END IF; chk := chk +1;

END LOOP; dbms_output.new_line; END sent_name; BEGIN sent_name('abcdefghijklmnopqr'); END; 18)Add Number in a word (a0b1c2d3) DECLARE PROCEDURE sent_data(name VARCHAR2) IS extract_data CHAR; BEGIN FOR i IN 1 .. LENGTH(name) LOOP extract_data := SUBSTR(name,i,1); dbms_output.put( extract_data || (i-1)); END LOOP; dbms_output.new_line; END; BEGIN sent_data('abcd'); END; 19)Captalize all the first characters in a Sentence DECLARE PROCEDURE capi_ini(n VARCHAR2) IS extract_str VARCHAR2(1); chk NUMBER := 0; BEGIN FOR i IN 1 .. LENGTH(n) LOOP extract_str := SUBSTR(n,i,1);

--dbms_output.put_line('chk : ' || chk); IF chk = 0 THEN dbms_output.put(UPPER(extract_str)); ELSIF chk = 1 THEN dbms_output.put(LOWER(extract_str)); END IF; IF extract_str = ' ' THEN chk := 0; ELSE chk := 1; END IF; END LOOP; dbms_output.new_line; END; BEGIN capi_ini('this IS a CHECK to SEE if every thing is working properly'); END; 20)tHIS iS tO cONVERT tEXT DECLARE ttext VARCHAR2(25) := 'this is to convert text'; len_of_text NUMBER; extract_text VARCHAR2(1); after_space VARCHAR2(1) := 'T'; change_text VARCHAR2(25); --yes_cap VARCHAR2(1) := 'T'; BEGIN len_of_text := LENGTH(ttext); FOR for_check IN 1 .. len_of_text LOOP extract_text := SUBSTR(ttext, for_check,1); IF extract_text = ' ' THEN change_text := change_text || extract_text; after_space := 'T';

ELSIF extract_text <> ' ' THEN IF after_space = 'T' THEN change_text := change_text || LOWER(extract_text); ELSIF after_space = 'F' THEN change_text := change_text || UPPER(extract_text); END IF; after_space := 'F'; END IF; END LOOP; dbms_output.put_line(change_text); END; Posted by And so It Begins at 7:04 PM 2 comments

PL/SQL Practice Example - Part 1


1) Post 1 to 10 Numbers DECLARE PROCEDURE print_number( n1 NUMBER) IS tot NUMBER := n1 ; BEGIN FOR i IN 1 .. 10 LOOP dbms_output.put_line(tot); tot := tot + 1; END LOOP; END; BEGIN print_number(1); END;

2)Check if it is an even or odd number

DECLARE PROCEDURE check_even( numb1 NUMBER) IS BEGIN IF numb1 MOD 2 = 0 THEN dbms_output.put_line('this is an even number'); ELSE dbms_output.put_line('this is an odd number'); END IF; END; BEGIN check_even(24783957357925); END; 3)Print multiplication table DECLARE PROCEDURE multi_of_two( numb1 NUMBER) IS c NUMBER := numb1; BEGIN LOOP dbms_output.put_line (c); c:= c * 2; EXIT WHEN c > 50; END LOOP; END; BEGIN multi_of_two(2); END; 4)Count the no of o in a name DECLARE PROCEDURE count_a( name VARCHAR2)

IS COUNT1 NUMBER:=0; extract VARCHAR2(1); BEGIN FOR i IN 1 .. LENGTH(name) LOOP extract:= SUBSTR(name,i,1); IF extract = 'o' THEN COUNT1 := COUNT1 + 1; END IF; END LOOP; dbms_output.put_line(COUNT1); END; BEGIN count_a('snooooooooooooooooooopy'); END; 5)Count the number of characters and numbers in a given text DECLARE PROCEDURE cnt_char_numb(name VARCHAR2) IS extracted_letter VARCHAR2(1); cnt_numb NUMBER :=0; cnt_char NUMBER := 0;

BEGIN

FOR i IN 1 .. LENGTH(name)

LOOP extracted_letter := SUBSTR(name,i,1); IF TO_CHAR(extracted_letter) IN ('0','1','2','3','4','5','6','7','8','9')THEN cnt_numb := cnt_numb + 1; ELSE cnt_char := cnt_char + 1; END IF; END LOOP;

dbms_output.put_line('no of number : ' || cnt_numb); dbms_output.put_line('no of char : ' || cnt_char); END; BEGIN cnt_char_numb('snoopy123'); END; 6) * ** *** **** DECLARE PROCEDURE star(num NUMBER) IS chk NUMBER := 0; BEGIN LOOP chk := chk + 1; FOR i IN 1 .. chk LOOP

dbms_output.put('*'); END LOOP; dbms_output.new_line; EXIT WHEN chk > num; END LOOP; END; BEGIN star(3); END; 7)Sorting a given number DECLARE PROCEDURE sort_number(numb NUMBER) IS a NUMBER; b NUMBER; c NUMBER; numb1 NUMBER := numb; BEGIN FOR i IN 1 .. LENGTH(TO_CHAR(numb1)) LOOP IF c IS NOT NULL THEN numb1 := REPLACE(numb1,c); --dbms_output.put_line('AFTER REPLACE numb1: ' || numb1); END IF; a := SUBSTR(numb1,1,1); --dbms_output.put_line('value of a:' || a); FOR j IN 1 .. LENGTH(TO_CHAR(numb1)) LOOP b := SUBSTR(numb1,j,1); IF b < a THEN a := b; END IF; END LOOP; c := a; dbms_output.put_line(a); END LOOP; END;

BEGIN sort_number(9834567210); END; 8) **** *** ** * DECLARE PROCEDURE reverse_star(numb NUMBER) IS chk NUMBER := numb; BEGIN LOOP FOR i IN REVERSE 1 .. chk LOOP dbms_output.put('*'); END LOOP; chk := chk -1; dbms_output.new_line; EXIT WHEN chk < 1; END LOOP; END; BEGIN reverse_star(4); END; 9) ******** ****** **** ** * DECLARE PROCEDURE pyramid(n NUMBER) IS star VARCHAR2(1) := '*';

chk NUMBER := n; sp NUMBER := 0; BEGIN LOOP FOR i IN 1 .. chk LOOP dbms_output.put(star); END LOOP; sp := sp+ 1; dbms_output.new_line; IF chk > 1 THEN FOR j IN 1 .. sp LOOP dbms_output.put(' '); END LOOP; END IF; IF chk != 2 THEN chk := chk - 2; ELSIF chk = 2 THEN chk := 1; END IF; EXIT WHEN chk < 1; END LOOP; END; BEGIN pyramid(8); END; 10) * *** ***** ******* *********

DECLARE PROCEDURE reverse_pyramid(n NUMBER) IS

chk NUMBER := 1; sp NUMBER := (n/2)+1; BEGIN LOOP FOR j IN REVERSE 1 .. sp LOOP dbms_output.put(' '); END LOOP; FOR i IN 1 .. chk LOOP dbms_output.put('*'); END LOOP; dbms_output.new_line; chk := chk +2; sp := sp - 1; EXIT WHEN chk > 10 ; END LOOP; END; BEGIN reverse_pyramid(10); END;

[edit] What is PL/SQL and what is it used for?


SQL is a declarative language that allows database programmers to write a SQL declaration and hand it to the database for execution. As such, SQL cannot be used to execute procedural code with conditional, iterative and sequential statements. To overcome this limitation, PL/SQL was created. PL/SQL is Oracle's Procedural Language extension to SQL. PL/SQL's language syntax, structure and data types are similar to that of Ada. Some of the statements provided by PL/SQL: Conditional Control Statements:

IF ... THEN ... ELSIF ... ELSE ... END IF; CASE ... WHEN ... THEN ... ELSE ... END CASE;

Iterative Statements:

LOOP ... END LOOP; WHILE ... LOOP ... END LOOP; FOR ... IN [REVERSE] ... LOOP ... END LOOP;

Sequential Control Statements:


GOTO ...; NULL;

The PL/SQL language includes object oriented programming techniques such as encapsulation, function overloading, information hiding (all but inheritance). PL/SQL is commonly used to write data-centric programs to manipulate data in an Oracle database. Example PL/SQL blocks:
/* Remember to SET SERVEROUTPUT ON to see the output */ BEGIN DBMS_OUTPUT.PUT_LINE('Hello World'); END; / BEGIN -- A PL/SQL cursor FOR cursor1 IN (SELECT * FROM table1) -- This is an embedded SQL statement LOOP DBMS_OUTPUT.PUT_LINE('Column 1 = ' || cursor1.column1 || ', Column 2 = ' || cursor1.column2); END LOOP; END; /

[edit] What is the difference between SQL and PL/SQL?


Both SQL and PL/SQL are languages used to access data within Oracle databases. SQL is a limited language that allows you to directly interact with the database. You can write queries (SELECT), manipulate objects (DDL) and data (DML) with SQL. However, SQL doesn't include all the things that normal programming languages have, such as loops and IF...THEN...ELSE statements. PL/SQL is a normal programming language that includes all the features of most other programming languages. But, it has one thing that other programming languages don't have: the ability to easily integrate with SQL. Some of the differences:

SQL is executed one statement at a time. PL/SQL is executed as a block of code. SQL tells the database what to do (declarative), not how to do it. In contrast, PL/SQL tell the database how to do things (procedural).

SQL is used to code queries, DML and DDL statements. PL/SQL is used to code program blocks, triggers, functions, procedures and packages. You can embed SQL in a PL/SQL program, but you cannot embed PL/SQL within a SQL statement.

[edit] Should one use PL/SQL or Java to code procedures and triggers?
Both PL/SQL and Java can be used to create Oracle stored procedures and triggers. This often leads to questions like "Which of the two is the best?" and "Will Oracle ever desupport PL/SQL in favour of Java?". Many Oracle applications are based on PL/SQL and it would be difficult of Oracle to ever desupport PL/SQL. In fact, all indications are that PL/SQL still has a bright future ahead of it. Many enhancements are still being made to PL/SQL. For example, Oracle 9i supports native compilation of PL/SQL code to binaries. Not to mention the numerous PL/SQL enhancements made in Oracle 10g and 11g. PL/SQL and Java appeal to different people in different job roles. The following table briefly describes the similarities and difference between these two language environments: PL/SQL:

Can be used to create Oracle packages, procedures and triggers Data centric and tightly integrated into the database Proprietary to Oracle and difficult to port to other database systems Data manipulation is slightly faster in PL/SQL than in Java PL/SQL is a traditional procedural programming language

Java:

Can be used to create Oracle packages, procedures and triggers Open standard, not proprietary to Oracle Incurs some data conversion overhead between the Database and Java type Java is an Object Orientated language, and modules are structured into classes Java can be used to produce complete applications

PS: Starting with Oracle 10g, .NET procedures can also be stored within the database (Windows only). Nevertheless, unlike PL/SQL and JAVA, .NET code is not usable on non-Windows systems. PS: In earlier releases of Oracle it was better to put as much code as possible in procedures rather than triggers. At that stage procedures executed faster than triggers as triggers had to be re-compiled every time before executed (unless cached). In more recent

releases both triggers and procedures are compiled when created (stored p-code) and one can add as much code as one likes in either procedures or triggers. However, it is still considered a best practice to put as much of your program logic as possible into packages, rather than triggers.

[edit] How can one see if somebody modified any code?


The source code for stored procedures, functions and packages are stored in the Oracle Data Dictionary. One can detect code changes by looking at the TIMESTAMP and LAST_DDL_TIME column in the USER_OBJECTS dictionary view. Example:
SELECT OBJECT_NAME, TO_CHAR(CREATED, 'DD-Mon-RR HH24:MI') CREATE_TIME, TO_CHAR(LAST_DDL_TIME, 'DD-Mon-RR HH24:MI') MOD_TIME, STATUS FROM USER_OBJECTS WHERE LAST_DDL_TIME > '&CHECK_FROM_DATE';

Note: If you recompile an object, the LAST_DDL_TIME column is updated, but the TIMESTAMP column is not updated. If you modified the code, both the TIMESTAMP and LAST_DDL_TIME columns are updated.

[edit] How can one search PL/SQL code for a string/ key value?
The following query is handy if you want to know where certain tables, columns and expressions are referenced in your PL/SQL source code.
SELECT type, name, line FROM user_source WHERE UPPER(text) LIKE UPPER('%&KEYWORD%');

If you run the above query from SQL*Plus, enter the string you are searching for when prompted for KEYWORD. If not, replace &KEYWORD with the string you are searching for.

[edit] How does one keep a history of PL/SQL code changes?


One can build a history of PL/SQL code changes by setting up an AFTER CREATE schema (or database) level trigger (available from Oracle 8.1.7). This will allow you to easily revert to previous code should someone make any catastrophic changes. Look at this example:
CREATE TABLE SOURCE_HIST -- Create history table AS SELECT SYSDATE CHANGE_DATE, ALL_SOURCE.*

FROM

ALL_SOURCE WHERE 1=2;

CREATE OR REPLACE TRIGGER change_hist -- Store code in hist table AFTER CREATE ON SCOTT.SCHEMA -- Change SCOTT to your schema name DECLARE BEGIN IF ORA_DICT_OBJ_TYPE in ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY', 'TYPE', 'TYPE BODY') THEN -- Store old code in SOURCE_HIST table INSERT INTO SOURCE_HIST SELECT sysdate, all_source.* FROM ALL_SOURCE WHERE TYPE = ORA_DICT_OBJ_TYPE -- DICTIONARY_OBJ_TYPE IN 8i AND NAME = ORA_DICT_OBJ_NAME; -- DICTIONARY_OBJ_NAME IN 8i END IF; EXCEPTION WHEN OTHERS THEN raise_application_error(-20000, SQLERRM); END; / show errors

A better approach is to create an external CVS or SVN repository for the scripts that install the PL/SQL code. The canonical version of what's in the database must match the latest CVS/SVN version or else someone would be cheating.

[edit] How can I protect my PL/SQL source code?


Oracle provides a binary wrapper utility that can be used to scramble PL/SQL source code. This utility was introduced in Oracle7.2 (PL/SQL V2.2) and is located in the ORACLE_HOME/bin directory. The utility use human-readable PL/SQL source code as input, and writes out portable binary object code (somewhat larger than the original). The binary code can be distributed without fear of exposing your proprietary algorithms and methods. Oracle will still understand and know how to execute the code. Just be careful, there is no "decode" command available. So, don't lose your source! The syntax is:
wrap iname=myscript.pls oname=xxxx.plb

Please note: there is no legal way to unwrap a *.plb binary file. You are supposed to backup and keep your *.pls source files after wrapping them. However it is possible for skilled hackers to unwrap your wrapped Oracle PL/SQL code.

[edit] How can I know which stored PL/SQL code is wrapped?


The following query gives the list of all wrapped PL/SQL code:
select owner, name, type from dba_source where line = 1 and instr(text, ' wrapped'||chr(10))+instr(text, ' wrapped '|| chr(10)) > 0 order by 1, 2, 3 /

[edit] Can one print to the screen from PL/SQL?


One can use the DBMS_OUTPUT package to write information to an output buffer. This buffer can be displayed on the screen from SQL*Plus if you issue the SET SERVEROUTPUT ON; command. For example:
set serveroutput on begin dbms_output.put_line('Look Ma, I can print from PL/SQL!!!'); end; /

DBMS_OUTPUT is useful for debugging PL/SQL programs. However, if you print too much, the output buffer will overflow. In that case, set the buffer size to a larger value, eg.: set serveroutput on size 200000 If you forget to set serveroutput on type SET SERVEROUTPUT ON once you remember, and then EXEC NULL;. If you haven't cleared the DBMS_OUTPUT buffer with the disable or enable procedure, SQL*Plus will display the entire contents of the buffer when it executes this dummy PL/SQL block. To display an empty line, it is better to use new_line procedure than put_line with an empty string.

[edit] Can one read/write files from PL/SQL?


The UTL_FILE database package can be used to read and write operating system files. A DBA user needs to grant you access to read from/ write to a specific directory before using this package. Here is an example:
CONNECT / AS SYSDBA CREATE OR REPLACE DIRECTORY mydir AS '/tmp'; GRANT read, write ON DIRECTORY mydir TO scott;

Provide user access to the UTL_FILE package (created by catproc.sql):


GRANT EXECUTE ON UTL_FILE TO scott;

Copy and paste these examples to get you started: Write File
DECLARE fHandler UTL_FILE.FILE_TYPE; BEGIN fHandler := UTL_FILE.FOPEN('MYDIR', 'myfile', 'w'); UTL_FILE.PUTF(fHandler, 'Look ma, Im writing to a file!!!\n'); UTL_FILE.FCLOSE(fHandler); EXCEPTION WHEN utl_file.invalid_path THEN raise_application_error(-20000, 'Invalid path. Create directory or set UTL_FILE_DIR.'); END; /

Read File
DECLARE fHandler UTL_FILE.FILE_TYPE; buf varchar2(4000); BEGIN fHandler := UTL_FILE.FOPEN('MYDIR', 'myfile', 'r'); UTL_FILE.GET_LINE(fHandler, buf); dbms_output.put_line('DATA FROM FILE: '||buf); UTL_FILE.FCLOSE(fHandler); EXCEPTION WHEN utl_file.invalid_path THEN raise_application_error(-20000, 'Invalid path. Create directory or set UTL_FILE_DIR.'); END; /

NOTE: UTL_FILE was introduced with Oracle 7.3. Before Oracle 7.3 the only means of writing a file was to use DBMS_OUTPUT with the SQL*Plus SPOOL command.

[edit] Can one call DDL statements from PL/SQL?


One can call DDL statements like CREATE, DROP, TRUNCATE, etc. from PL/SQL by using the "EXECUTE IMMEDIATE" statement (native SQL). Examples:
begin EXECUTE IMMEDIATE 'CREATE TABLE X(A DATE)'; end; begin execute Immediate 'TRUNCATE TABLE emp'; end; DECLARE var VARCHAR2(100);

BEGIN var := 'CREATE TABLE temp1(col1 NUMBER(2))'; EXECUTE IMMEDIATE var; END;

NOTE: The DDL statement in quotes should not be terminated with a semicolon. Users running Oracle versions below Oracle 8i can look at the DBMS_SQL package (see FAQ about Dynamic SQL).

[edit] Can one use dynamic SQL statements from PL/SQL?


Starting from Oracle8i one can use the "EXECUTE IMMEDIATE" statement to execute dynamic SQL and PL/SQL statements (statements created at run-time). Look at these examples. Note that the statements within quotes are NOT semicolon terminated:
EXECUTE IMMEDIATE 'CREATE TABLE x (a NUMBER)'; -- Using bind variables...' sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)'; EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location; -- Returning a cursor... sql_stmt := 'SELECT * FROM emp WHERE empno = :id'; EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;

One can also use the older DBMS_SQL package (V2.1 and above) to execute dynamic statements. Look at these examples:
CREATE OR REPLACE PROCEDURE DYNSQL AS cur integer; rc integer; BEGIN cur := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(cur, 'CREATE TABLE X (Y DATE)', DBMS_SQL.NATIVE); rc := DBMS_SQL.EXECUTE(cur); DBMS_SQL.CLOSE_CURSOR(cur); END; /

More complex DBMS_SQL example using bind variables:


CREATE OR REPLACE PROCEDURE DEPARTMENTS(NO IN DEPT.DEPTNO%TYPE) AS v_cursor integer; v_dname char(20); v_rows integer; BEGIN v_cursor := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_cursor, 'select dname from dept where deptno > :x', DBMS_SQL.V7);

DBMS_SQL.BIND_VARIABLE(v_cursor, ':x', no); DBMS_SQL.DEFINE_COLUMN_CHAR(v_cursor, 1, v_dname, 20); v_rows := DBMS_SQL.EXECUTE(v_cursor); loop if DBMS_SQL.FETCH_ROWS(v_cursor) = 0 then exit; end if; DBMS_SQL.COLUMN_VALUE_CHAR(v_cursor, 1, v_dname); DBMS_OUTPUT.PUT_LINE('Deptartment name: '||v_dname); end loop; DBMS_SQL.CLOSE_CURSOR(v_cursor); EXCEPTION when others then DBMS_SQL.CLOSE_CURSOR(v_cursor); raise_application_error(-20000, 'Unknown Exception Raised: '|| sqlcode||' '||sqlerrm); END; /

[edit] What is the difference between %TYPE and %ROWTYPE?


Both %TYPE and %ROWTYPE are used to define variables in PL/SQL as it is defined within the database. If the datatype or precision of a column changes, the program automatically picks up the new definition from the database without having to make any code changes. The %TYPE and %ROWTYPE constructs provide data independence, reduces maintenance costs, and allows programs to adapt as the database changes to meet new business needs. %TYPE %TYPE is used to declare a field with the same type as that of a specified table's column. Example:
DECLARE v_EmpName emp.ename%TYPE; BEGIN SELECT ename INTO v_EmpName FROM emp WHERE ROWNUM = 1; DBMS_OUTPUT.PUT_LINE('Name = ' || v_EmpName); END; /

%ROWTYPE %ROWTYPE is used to declare a record with the same types as found in the specified database table, view or cursor. Examples:
DECLARE

v_emp emp%ROWTYPE; BEGIN v_emp.empno := 10; v_emp.ename := 'XXXXXXX'; END; /

[edit] How does one get the value of a sequence into a PL/SQL variable?
As you might know, one cannot use sequences directly from PL/SQL; Oracle prohibits this:
i := sq_sequence.NEXTVAL;

However, one can use embedded SQL statements to obtain sequence values:
select sq_sequence.NEXTVAL into :i from dual;

Note: This restriction has been removed in oracle 11g and the former syntax (direct assignment) can be used.

[edit] Can one execute an operating system command from PL/SQL?


There is no direct way to execute operating system commands from PL/SQL. PL/SQL doesn't have a "host" command, as with SQL*Plus, that allows users to call OS commands. Nevertheless, the following workarounds can be used: Database Pipes Write an external program (using one of the precompiler languages, OCI or Perl with Oracle access modules) to act as a listener on a database pipe (SYS.DBMS_PIPE). Your PL/SQL program then put requests to run commands in the pipe, the listener picks it up and run the requests. Results are passed back on a different database pipe. For a Pro*C example, see chapter 8 of the Oracle Application Developers Guide.
CREATE OR REPLACE FUNCTION host_command( cmd IN VARCHAR2 ) RETURN INTEGER IS status NUMBER; errormsg VARCHAR2(80); pipe_name VARCHAR2(30); BEGIN pipe_name := 'HOST_PIPE'; dbms_pipe.pack_message( cmd ); status := dbms_pipe.send_message(pipe_name); RETURN status; END;

External Procedure Listeners: From Oracle 8 one can call external 3GL code in a dynamically linked library (DLL or shared object). One can write a library in C/ C++ to do whatever is required. Defining this C/C++ function to PL/SQL makes it executable. Look at this External Procedure example. Using Java See example at http://www.orafaq.com/scripts/plsql/oscmd.txt DBMS_SCHEDULER In Oracle 10g and above, one can execute OS commands via the DBMS_SCHEDULER package. Look at this example:
BEGIN dbms_scheduler.create_job(job_name job_type job_action enabled auto_drop END; / exec dbms_scheduler.run_job('myjob'); => => => => => 'myjob', 'executable', '/app/oracle/x.sh', TRUE, TRUE);

[edit] How does one loop through tables in PL/SQL?


One can make use of cursors to loop through data within tables. Look at the following nested loops code example.
DECLARE CURSOR SELECT FROM ORDER dept_cur IS deptno dept BY deptno;

-- Employee cursor all employees for a dept number CURSOR emp_cur (v_dept_no DEPT.DEPTNO%TYPE) IS SELECT ename FROM emp WHERE deptno = v_dept_no; BEGIN FOR dept_rec IN dept_cur LOOP dbms_output.put_line('Employees in Department '|| TO_CHAR(dept_rec.deptno)); FOR emp_rec in emp_cur(dept_rec.deptno) LOOP

dbms_output.put_line('...Employee is '||emp_rec.ename); END LOOP; END LOOP; END; /

[edit] How often should one COMMIT in a PL/SQL loop? / What is the best commit strategy?
Contrary to popular belief, one should COMMIT less frequently within a PL/SQL loop to prevent ORA-1555 (Snapshot too old) errors. The higher the frequency of commit, the sooner the extents in the undo/ rollback segments will be cleared for new transactions, causing ORA-1555 errors. To fix this problem one can easily rewrite code like this:
FOR records IN my_cursor LOOP ...do some stuff... COMMIT; END LOOP; COMMIT;

... to ...
FOR records IN my_cursor LOOP ...do some stuff... i := i+1; IF mod(i, 10000) = 0 THEN COMMIT; END IF; END LOOP; COMMIT;

-- Commit every 10000 records

If you still get ORA-1555 errors, contact your DBA to increase the undo/ rollback segments. NOTE: Although fetching across COMMITs work with Oracle, is not supported by the ANSI standard.

Issuing frequent commits is bad, bad, BAD! Its the WORST thing you can do just dont do it! In the following example I will create around 7 million rows and then attempt to update a portion of them serially. In addition, I will issue a commit every thousandth row. Example 1.1: Creating a somewhat large table
SQL> create table big_employee_table

2 as 3 select rownum as eid 4 , e.* 5 from hr.employees e 6 , dba_objects do; Table created. Elapsed: 00:00:12.23 SQL> select count(*) 2 from big_employee_table; COUNT(*) ---------7838713 Elapsed: 00:00:08.11

Before I go on, notice that Oracles Create Table As (CTAS) method blazed thru table creation. Thats 7.84 Million rows in 12.23 seconds. Sometimes, this is the very best method of updating large data sets. The following block updates 100,000 rows, serially, committing every 1000 rows: Example 1.2: Updating serially
SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 declare cursor c is select * from big_employee_table where rownum <= 100000; begin for r in c loop update big_employee_table set salary = salary * 1.03 where eid = r.eid; if mod ( r.eid, 1000 ) = 0 then commit; end if; end loop; end; /

Observe that the update took more time than I have patience for ;). At 20 minutes I killed the session. It is painfully slow and should never be done. Moreover, it chewed up an entire CPU core for the duration. If youre only updating a few rows, why do it in PL/SQL at all? I like Tom Kytes approach (paraphrasing):
1. 2. 3. 4. Do If If If it in SQL. SQL cant do it, do it in PL/SQL. PL/SQL cant do it, do it in Java. Java cant do it ask yourself if it needs to be done.

The following block does the same work in bulk:

Example 1.3: Updating in bulk and committing at the end


SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 declare type obj_rowid is table of rowid index by pls_integer; lr_rowid lr_salary obj_rowid; dbms_sql.number_table;

cursor c is select rowid rid , salary from big_employee_table where rownum <= 100000; begin open c; loop fetch c bulk collect into lr_rowid , lr_salary limit 500; for a in 1 .. lr_rowid.count loop lr_salary ( a ) := lr_salary ( a ) * 1.03; end loop; forall b in 1 .. lr_rowid.count update big_employee_table set salary = lr_salary ( b ) where rowid in ( lr_rowid ( b )); exit when c%notfound; end loop; close c; commit; -- there! not in the loop exception when others then rollback; dbms_output.put_line ( sqlerrm ); end; /

PL/SQL procedure successfully completed. Elapsed: 00:00:02.11 SQL>

Notice that the update completed in 2 seconds! Ive seen faster but my two-gerbil sandbox machine doesnt have the power that our newer servers do. The point is that the update was incredibly fast and chewed up only 10% of one core. So, in answer to the question of how often should I commit? I say dont until you absolutely have to.

[edit] I can SELECT from SQL*Plus but not from PL/SQL. What is wrong?
PL/SQL respect object privileges given directly to the user, but does not observe privileges given through roles. The consequence is that a SQL statement can work in SQL*Plus, but will give an error in PL/SQL. Choose one of the following solutions:

Grant direct access on the tables to your user. Do not use roles!

GRANT select ON scott.emp TO my_user;

Define your procedures with invoker rights (Oracle 8i and higher);

create or replace procedure proc1 authid current_user is begin ...

Move all the tables to one user/schema.

[edit] What is a mutating and constraining table?


"Mutating" means "changing". A mutating table is a table that is currently being modified by an update, delete, or insert statement. When a trigger tries to reference a table that is in state of flux (being changed), it is considered "mutating" and raises an error since Oracle should not return data that has not yet reached its final state. Another way this error can occur is if the trigger has statements to change the primary, foreign or unique key columns of the table off which it fires. If you must have triggers on tables that have referential constraints, the workaround is to enforce the referential integrity through triggers as well. There are several restrictions in Oracle regarding triggers:

A row-level trigger cannot query or modify a mutating table. (Of course, NEW and OLD still can be accessed by the trigger). A statement-level trigger cannot query or modify a mutating table if the trigger is fired as the result of a CASCADE delete. Etc.

[edit] Can one pass an object/table as an argument to a remote procedure?


The only way to reference an object type between databases is via a database link. Note that it is not enough to just use "similar" type definitions. Look at this example:

-- Database A: receives a PL/SQL table from database B CREATE OR REPLACE PROCEDURE pcalled(TabX DBMS_SQL.VARCHAR2S) IS BEGIN -- do something with TabX from database B null; END; /

-- Database B: sends a PL/SQL table to database A CREATE OR REPLACE PROCEDURE pcalling IS TabX DBMS_SQL.VARCHAR2S@DBLINK2; BEGIN pcalled@DBLINK2(TabX); END; /

[edit] What is the difference between stored procedures and functions?


Functions MUST return a value, procedures don't need to. You can have DML (insert,update, delete) statements in a function. But, you cannot call such a function in a SQL query. For example, if you have a function that is updating a table, you cannot call that function from a SQL query. - select myFunction(field) from sometable; will throw error.

However an autonomous transaction function can.

You cannot call a procedure in a SQL query.

[edit] Is there a PL/SQL Engine in SQL*Plus?


No. Unlike Oracle Forms, SQL*Plus does not have an embedded PL/SQL engine. Thus, all your PL/SQL code is sent directly to the database engine for execution. This makes it much more efficient as SQL statements are not stripped off and sent to the database individually.

[edit] Is there a limit on the size of a PL/SQL block?


Yes, the max size is not an explicit byte limit, but related to the parse tree that is created when you compile the code. You can run the following select statement to query the size of an existing package or procedure:
SQL> select * from dba_object_size where name = 'procedure_name';

[edit] What are the PL/SQL compiler limits for block, record, subquery and label nesting?
The following limits apply: Level of Block Nesting: 255 Level of Record Nesting: 32 Level of Subquery Nesting: 254 Level of Label Nesting: 98

[edit] Can one COMMIT/ ROLLBACK from within a trigger?


A commit inside a trigger would defeat the basic definition of an atomic transaction (see ACID). Trigger logic is by definition an extension of the original DML operation. Changes made within triggers should thus be committed or rolled back as part of the transaction in which they execute. For this reason, triggers are NOT allowed to execute COMMIT or ROLLBACK statements (with the exception of autonomous triggers). Here is an example of what will happen when they do:
SQL> CREATE TABLE tab1 (col1 NUMBER); Table created. SQL> CREATE TABLE log (timestamp DATE, operation VARCHAR2(2000)); Table created. SQL> CREATE TRIGGER tab1_trig 2 AFTER insert ON tab1 3 BEGIN 4 INSERT INTO log VALUES (SYSDATE, 'Insert on TAB1'); 5 COMMIT; 6 END; 7 / Trigger created. SQL> INSERT INTO tab1 VALUES (1); INSERT INTO tab1 VALUES (1) * ERROR at line 1: ORA-04092: cannot COMMIT in a trigger ORA-06512: at "SCOTT.TAB1_TRIG", line 3 ORA-04088: error during execution of trigger 'SCOTT.TAB1_TRIG'

Autonomous transactions: As workaround, one can use autonomous transactions. Autonomous transactions execute separate from the current transaction.

Unlike regular triggers, autonomous triggers can contain COMMIT and ROLLBACK statements. Example:
SQL> CREATE OR REPLACE TRIGGER tab1_trig 2 AFTER insert ON tab1 3 DECLARE 4 PRAGMA AUTONOMOUS_TRANSACTION; 5 BEGIN 6 INSERT INTO log VALUES (SYSDATE, 'Insert on TAB1'); 7 COMMIT; -- only allowed in autonomous triggers 8 END; 9 / Trigger created. SQL> INSERT INTO tab1 VALUES (1); 1 row created.

Note that with the above example will insert and commit log entries - even if the main transaction is rolled-back! Remember that an "autonomous_transaction" procedure/function/trigger is a whole transaction in itself and so it must end with a commit or a rollback statement.

*********************************************************************** **************** NEEDED FOR A CODE TYPE FIELD(WITH PROPERTY->LOV->G_LOV) WHOSE DESCRIPTION IS GOING TO POPULATE THROUGH THE G_LOV AT RUN TIME IN THE NBT FIELD ATTACHED TO ITS NEXT POSITION ON THE CANVAS:WRITE FOLLOWING TWO TRIGGERS AT THE CODE FIELD(eg. PARTY_CODE AND ITS NBT FIELD IS NBT_PARTY_CODE) :-

TRG-->KEY_LISTVAL(FOR EMP, PARTY,CONSIGENN.......LOV IS G_LOV IE.GET_NEWLOV) -----------------

DECLARE L_ERR VARCHAR2(500); BEGIN GET_NEWLOV('PRTY',NULL,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN :BPURT003.PARTY_CODE := :GLOBAL.CODE; :BPURT003.NBT_PARTY_CODE := :GLOBAL.DES; END IF; END;

TRG-->WHEN_VALIDATE_ITEM ------------------------DECLARE L_ERR VARCHAR2(500); BEGIN IF :BPURT003.PARTY_CODE IS NOT NULL THEN :BPURT003.NBT_PARTY_CODE := GET_DESCRIPTION('PRTY',:BPURT003.PARTY_CODE,L_ERR); IF L_ERR IS NOT NULL THEN :CONTENT.MESSAGES := L_ERR; RAISE FORM_TRIGGER_FAILURE; END IF; END IF; END;

*********************************************************************** **************** FOR INSERTING SCRIPT IN NOTEPAD TO SQL PROMPT:-

SQL>@C:\VIEW_ABC.TXT (PRESS ENTER)

*********************************************************************** **************** WE MUST WRITE TWO TRIGGERS AT DETAIL (DATA) BLOCK LEVEL:PRE_INSERT TRIGGER::BQCST001.ENTERED_BY:=:GLOBAL.USER_ID; :BQCST001.ENTERED_DATE:=SYSDATE; PRE_UPDATE TRIGGER::BQCST001.MODIFIED_BY:=:GLOBAL.USER_ID; :BQCST001.MODIFIED_DATE:=SYSDATE;

*********************************************************************** ***************** TO CREATE A NEW USER WITH ITS SEPERATE TABLESPACE :create tablespace TSMAIN datafile 'E:\oracle\PRODUCT\10.2.0\oraDATA\SPMPUNEO\TSSPMMAIN.DBF' size 2000M default storage (initial 10k next 10k minextents 1 maxextents 121 pctincrease 50) online ;

DROP USER ETAWA CASCADE;--droped forcefully. CREATE USER SPMMAIN IDENTIFIED BY MAIN2008 DEFAULT TABLESPACE TSMAIN TEMPORARY TABLESPACE TEMP; GRANT CONNECT,RESOURCE,DBA TO SPMMAIN WITH ADMIN OPTION;

IMP USERID= SPMMAIN/MAIN2008@TEST FROMUSER=SPMMAIN TOUSER=SPMMAIN FILE=C:\ABC.DMP LOG=C:\IMP.LOG EXP USERID=<USER_NAME>\PASSWORD OWNER='NEO' COMPRESS=N FILE='C:\EMP.DMP LOG=C:\FILE.LOG; ---------------------------------------------------------------------------------------create tablespace TSOCAP datafile 'E:\oracle\oradata\NEOORC\TS_OCAP.DBF' size 500M default storage (initial 10k next 10k minextents 1 maxextents 121 pctincrease 50) online ;

CREATE USER OCA IDENTIFIED BY OCA DEFAULT TABLESPACE TSOCAP TEMPORARY TABLESPACE TEMP; GRANT CONNECT,RESOURCE,DBA TO OCA WITH ADMIN OPTION;

CREATE USER OCAPPAY IDENTIFIED BY PAY DEFAULT TABLESPACE TSOCAP TEMPORARY TABLESPACE TEMP; GRANT CONNECT,RESOURCE,DBA TO OCAPPAY WITH ADMIN OPTION;

IMP USERID= OCA/OCA FROMUSER= OCA TOUSER= OCA FILE=E:\OCAP\oca_dmp\OCAPNGT.DMP LOG=E:\OCAP\oca_dmp\IMP.LOG

IMP USERID= OCAPPAY/PAY FROMUSER= OCAPPAY TOUSER= OCAPPAY FILE=C:\pay2.DMP LOG=C:\pay2.LOG

*********************************************************************** ****************** FOR AUTHORISE BUTTON(CODE):WHEN_BUTTON_PRESSED

DECLARE P_ERR VARCHAR2(200); BEGIN

IF :BPRDT135.NBT_STATUS = 'AUTHORISED' THEN :CONTENT.errors := 'Plan Already Authorised';

ELSIF :BPRDT135.STATUS = 'V' THEN P_ERR := NULL; IF SHOW_ALERT('G_ALERT') = 88 THEN AUTH_PP('A',:BPRDT135.DOC_DATE,:BPRDT135.YEAR_NO,P_ERR); IF P_ERR IS NULL THEN COMMIT_FORM; :CONTENT.MESSAGES := 'Plan Authorised';

:CONTENT.ERRORS:=NULL; :BPRDT135.NBT_STATUS := GET_DOC_STATUS('A');

ELSE :CONTENT.ERRORS := P_ERR; END IF; END IF; --IF SHOW_ALERT('G_ALERT') = 88 THEN END IF; IF :BPRDT135.NBT_STATUS IS NULL THEN :CONTENT.MESSAGES :='To Authorise First Generate a Valid Plan'; raise form_trigger_failure; END IF; END;

*********************************************************************** ********************** FOR COMPLETED/REJECTED QUANTITY:-

WHEN_VALIDATE_ITEM IF :BPRDT136.COMPLETE_QTY >:BPRDT136.PLAN_QTY THEN :CONTENT.MESSAGES :='Completed Qty. cannot be more than Plan Qty.';

RAISE FORM_TRIGGER_FAILURE; END IF;

*********************************************************************** **********************

FOR PART NO:KEY_LISTVAL

DECLARE L_VAR VARCHAR2(50); L_ERR VARCHAR2(50); BEGIN :GLOBAL.MATCODE:=NULL; :GLOBAL.MATDES:=NULL; :GLOBAL.PARTNO:=NULL; L_VAR := ' MAT_CAT <> ''MC05'' '; GET_MATLOV('MATR',L_VAR,L_ERR); IF L_ERR IS NULL THEN :BPRDT137.MAT_CODE :BPRDT137.PART_DESC :BPRDT137.PART_NO := :GLOBAL.MATCODE; := :GLOBAL.MATDES; := :GLOBAL.PARTNO;

ELSE :CONTENT.ERRORS :=L_ERR; PAUSE; :CONTENT.ERRORS :=NULL; END IF; END;

-------------------------------------------------------------------------------------------WHEN VALIDATE ITEM (FOR ITEM,PART.........LOV IS M_LOV)

DECLARE L_DESC VARCHAR2(200); L_ERR VARCHAR2(200); BEGIN IF :BPRDT137.PART_NO IS NOT NULL THEN L_DESC := NULL; L_DESC := GET_MATDESCRIPTION ('PART',:BPRDT137.PART_NO,L_ERR);

IF L_ERR IS NULL THEN :BPRDT137.PART_DESC := SUBSTR(L_DESC,12,60); :BPRDT137.MAT_CODE := TO_NUMBER(SUBSTR(L_DESC,1,10)); :BPRDT137.NBT_UNIT := GET_UNIT(:BPRDT137.MAT_CODE,'I',L_ERR);

ELSE :CONTENT.ERRORS := L_ERR; :BPRDT137.PART_DESC := NULL; RAISE FORM_TRIGGER_FAILURE; END IF;

END IF;

END;

POST_QUERY

L_DESC :=GET_MATDESCRIPTION('MATR',:BPRDT137.MAT_CODE,L_ERR); IF L_ERR IS NULL THEN :BPRDT137.PART_DESC := SUBSTR(L_DESC,12) ; END IF; :BPRDT137.NBT_UNIT := GET_UNIT(:BPRDT137.MAT_CODE,'I',L_ERR); *********************************************************************** *********************** FOR POPULATE BUTTON CODE:WHEN_BUTTON_PRESSED

DECLARE CURSOR CUR_EMP IS SELECT * FROM BCOMT011 WHERE TYPE_ID = 'NSEM' AND NVL(TRANSFER_FLAG,'N') = 'N' ORDER BY CODE_DESC; BEGIN IF SHOW_ALERT('G_ALERT') = 88 THEN DELETE FROM BCOMT136 WHERE TS_DATE = :BCOMT137.TS_DATE; GO_BLOCK('BCOMT136');

CLEAR_BLOCK; FOR REC IN CUR_EMP LOOP CREATE_RECORD; :BCOMT136.TS_DATE :BCOMT137.TS_DATE; :BCOMT136.SR_NO := :SYSTEM.TRIGGER_RECORD; :BCOMT136.PROJ_ID := REC.CODE_VALUE; :BCOMT136.EMP_ID REC.TYPE_CODE; END LOOP; --FOR REC IN CUR_EMP LOOP FIRST_RECORD; END IF; END; *********************************************************************** ************************* FOR DEFAULT DATE PARAMETER:=>YEAR OPENING DATE := :=

SELECT MAX(YR_BEGIN_DATE) INTO :P_DATE_FR FROM BCOMT000; =>SYSDATE

:P_DATE_TO := TO_DATE(SYSDATE); *********************************************************************** ************************* for report button to call another report:-

srw.run_report('report=BFASR040SINPLANT '|| ' P_DOC_FR='||:DOC_NO1|| ' P_ORD_SERIES='||:ORD_SERIES); *********************************************************************** ************************* CONVERSION TO EXCEL FROM REPORT:-

procedure U_1ButtonAction is

cursor cur is SELECT A.EMP_CODE,A.EMP_TITLE ||' '||A.EMP_FNAME ||' '||A.EMP_LNAME EMP_NAME,A.EMP_DEPT,A.EMP_TYPE,EMP_DOJ FROM BPAYT030 A WHERE A.EMP_TYPE = DECODE(:P_EMPTYPE,'A',A.EMP_TYPE,:P_EMPTYPE) AND A.EMP_DEPT = DECODE(:P_EMPDEPT,'A',A.EMP_DEPT,:P_EMPDEPT) AND EMP_STATUS ='Y'; --AND A.JOB_TITLE = DECODE(:P_JOB,'A',A.EMP_DEPT,:P_JOB)

V_OUTFILE TEXT_IO.FILE_TYPE; V_OUTSTRING VARCHAR2(1000);

L_FILENAME L_SR L_DESC L_DESC1 NUMBER:=0;

VARCHAR2(100);

VARCHAR2(200); VARCHAR2(200);

begin L_FILENAME := 'C:\'||'EMPLOYEE LIST'|| TO_CHAR(SYSDATE,'DDMMRR')||'.CSV';

V_outfile := text_io.fopen(L_FILENAME,'W'); V_outstring := ','||','||'BCSTR010_MIGNEW1 '; TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING); V_outstring :=''; TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING);

V_outstring := 'Company Name: '||','||','||:P_COMP; TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING);

V_outstring := 'Month:'||','||TO_CHAR(:P_DATE_FROM,'MONTH'); TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING);

--EXCEL FILE HEADS V_outstring :='EMPLOYEE TYPE'||','|| 'DEPARTMENT'||','|| 'CODE'||','|| 'DOJ' ||','|| 'EMPLOYEE NAME';

TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING);

FOR REC IN CUR LOOP

SELECT CODE_DESC INTO L_DESC FROM BCOMT011 WHERE TYPE_CODE = REC.EMP_TYPE;

SELECT CODE_DESC INTO L_DESC1 FROM BCOMT011 WHERE TYPE_CODE = REC.EMP_DEPT;

--DATA IN EXCEL

V_outstring := L_DESC||','|| L_DESC1||','|| REC.EMP_CODE||','|| REC.EMP_DOJ||','|| REC.EMP_NAME;

TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING); END LOOP;

text_io.fclose(v_outfile); SRW.MESSAGE(100,'File '||L_FILENAME|| ' Generated Successfully....'); EXCEPTION

WHEN OTHERS THEN SRW.MESSAGE('1',SQLERRM); text_io.fclose(v_outfile); end;

*********************************************************************** ************************************

Export to Excel from Form :-(When Button Pressed)

DECLARE v_outfile text_io.file_type; v_outstring varchar2(1000); L_DocDate Varchar2(10); L_InvDate Varchar2(10); L_CheqDate Varchar2(10); BEGIN V_outfile := text_io.fopen('C:\SALESMIS.CSV','w'); V_outstring := ''; TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING);

GO_BLOCK('BFAST001'); FIRST_RECORD; WHILE :SYSTEM.LAST_RECORD <> 'TRUE' LOOP

l_docdate := to_char(:BFAST001.Doc_Date,'DD-MON-YY');

V_outstring := l_DocDate||','|| :BFAST001.Doc_No||','||

:BFAST001.Doc_Type||','|| :BFAST001.Acc_Code||','|| :BFAST001.Acc_Desc||','|| to_char(:BFAST001.NBT_Dr)||','|| to_char(:BFAST001.NBT_Cr)||','|| :BFAST001.Narr||','|| :BFAST001.Party_Code||','|| :BFAST001.Party_dESC||','|| :BFAST001.Emp_Code||','|| :BFAST001.Emp_Desc||','|| :BFAST001.Inv_No||','|| l_InvDate||','|| :BFAST001.Cheq_No||','|| l_CheqDate; TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING);

NEXT_RECORD;

--FOR LAST RECORD

IF :SYSTEM.LAST_RECORD = 'TRUE' THEN

V_outstring := l_DocDate||','|| :BFAST001.Doc_No||','|| :BFAST001.Doc_Type||','|| :BFAST001.Acc_Code||','|| :BFAST001.Acc_Desc||','|| to_char(:BFAST001.NBT_Dr)||','|| to_char(:BFAST001.NBT_Cr)||','|| :BFAST001.Narr||','|| :BFAST001.Party_Code||','|| :BFAST001.Party_dESC||','|| :BFAST001.Emp_Code||','|| :BFAST001.Emp_Desc||','||

:BFAST001.Inv_No||','|| l_InvDate||','|| :BFAST001.Cheq_No||','|| l_CheqDate; TEXT_IO.PUT_LINE(V_OUTFILE, V_OUTSTRING); END IF;

END LOOP; text_io.fclose(v_outfile); FIRST_RECORD; :content.messages := 'File (c:\gltran) Generated Successfully....'; END; *********************************************************************** ********************************** function CF_BALQTYFormula return Number is L_NUM begin L_NUM := NVL(:ORD_QTY,0) - NVL(:DI_QTY,0); RETURN L_NUM; NUMBER(10);

EXCEPTION WHEN OTHERS THEN RETURN NULL;

end;

*********************************************************************** ********************* function CF_1Formula return Number is l_tot_amt number(10,2);

begin l_tot_amt := ((:rate*:ord_qty)/:rate_per)-:disc_amt+:sales_tax_amt+:excs_amt+:misc_amt; return (l_tot_amt); end;

(:issue_qty-(:oil_qty + :req_qty))

*********************************************************************** **************************** function CF_PCNTFormula return Number is L_PCNT NUMBER; begin L_PCNT := ((nvl(:ISSUE_QTY,0) * 100)/nvl(:CS_ISSUE_QTY,0)); return (L_PCNT); end; *********************************************************************** ******************************

report to pdf conversion by button :-

procedure U_1ButtonAction is l_path VARCHAR2(1000):=' '; l_DESC VARCHAR2(300):=' '; begin IF :P_PARTY != 'A' THEN SELECT SUBSTR(PARTY_FNAME,1,8)||'-'||SUBSTR(CORR_CITY,1,4)||','|| SUBSTR(CORR_STATE,1,10) INTO L_DESC FROM BCOMT001 WHERE PARTY_CODE = :P_PARTY; l_path := 'C:\'||L_DESC||'-'||SYSDATE||'.pdf'; ELSE l_path := 'C:\'||'ALL-'||SYSDATE||'.pdf'; END IF;

srw.run_report('maximize=yes report=BCOMR050_RMNDLTTR DESFORMAT=PDF DESTYPE=FILE DESNAME='||''''||L_PATH||''''|| ' P_PARTY =' ||''''||:P_PARTY||''''|| ' P_DOCNO =' ||''''||:P_DOCNO||''''|| ' P_DATEFR=' ||''''||:P_DATEFR||''''|| ' P_DATETO=' ||''''||:P_DATETO||'''');

srw.message(1000, 'PDF SUCESSFULLY GENERATED : '|| L_PATH);

EXCEPTION when srw.run_report_failure then srw.message(30, 'Error mailing reports.'); raise srw.program_abort;

END;

*********************************************************************** *************************** BALANCE DIFF:SELECT YEAR_NO,SUM(OPEN_BAL_DR),SUM(OPEN_BAL_CR),SUM(OPEN_BAL_DR)SUM(OPEN_BAL_CR) DIFF FROM BFAST104 GROUP BY YEAR_NO *********************************************************************** *** alter table bcomt028 add sr_no number(10); alter table bcomt028 add doc_series varchar2(100); *********************************************************************** ***

ALTER TABLE emp ADD CONSTRAINT PK_EMP PRIMARY KEY (sal);

*********************************************************************** **** Viewing Constraint information: SELECT CONSTARINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = bpost030;

VIEWING COLUMN CONSTRAINT : SELECT CONSTRAINT_NAME,COLUMN_NAME FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'BPOST030' *********************************************************************** *********** ALTER TABLE supplier MODIFY supplier_name varchar2(100) not null;

*********************************************************************** ********** SELECT TOOLKIT.DECRYPT(USER_PAASSWD) FROM BCOMT097 WHERE USER_ID = 'BHUJ';

*********************************************************************** ********* FOR VIEWING TABLE SPACE:-

DESC DBA_USERS;

create tablespace TSIBSNEW datafile 'E:\oracle\oradata\NEOORC\TS_IBSNEW.DBF' size 10000M default storage (initial 10k next 10k minextents 1 maxextents 121 pctincrease 50) online ;

CREATE USER IBSNEW IDENTIFIED BY IBSNEW DEFAULT TABLESPACE TSIBSNEW TEMPORARY TABLESPACE TEMP; GRANT CONNECT,RESOURCE,DBA TO IBSNEW WITH ADMIN OPTION; *********************************************************************** **************** DELETING MANY LIKE TABLES:-

create or replace PROCEDURE delete_many_tables (tablename IN VARCHAR2) IS cur begin cur:= dbms_sql.OPEN_CURSOR(); for t in (select object_name from user_objects where object_type='TABLE' and object_name like tablename) loop execute immediate integer;

'drop table ' ||t.object_name|| ' cascade constraints'; end loop; dbms_sql.close_cursor(cur); end delete_many_tables;

EXECUTE DELETE_MANY_TABLES('DEPT%'); ********************************************************************** ALTER DATABASE DATAFILE 'E:\oracle\product\10.2.0\oradata\neoorc\TS_krish.DBF' RESIZE 1500M *********************************************************************** ** WHEN COLUMN SHIFT IN EXCEL THE IN SELECT STATEMENT USE BELOW STATEMENT. REPLACE(CORR_ADD1,',','-')

---------------PRE INSER FOR DOC_NO ----DECLARE L_DOCNO NUMBER(8):=0; P_ERR VARCHAR2(100); BEGIN

:BPRDT185.ENTERED_BY

:= :GLOBAL.USER_ID;

:BPRDT185.ENTERED_DATE := :GLOBAL.SYSDATE;

:BPRDT185.DOC_DATE P_ERR

:= :GLOBAL.SYSDATE;

:= NULL;

SELECT NVL(MAX(DOC_NO),0) INTO L_DOCNO FROM BPRDT185;

L_DOCNO

:= L_DOCNO + 1;

IF P_ERR IS NULL THEN :BPRDT185.DOC_NO :BPRDT185.STATUS := L_DOCNO; := 'V'; := 'Document Saved VIDE NO. '||

:CONTENT.MESSAGES TO_CHAR( L_DOCNO); ELSE :CONTENT.ERRORS

:= P_ERR;

RAISE FORM_TRIGGER_FAILURE; END IF; :BPRDT185.NBT_STATUS exception when others then :content.errors :=sqlerrm; END; ------------PRE INSERT FOR DOC_NO ----------:= GET_DOC_STATUS(:BPRDT185.STATUS);

/********* ENTERING THE USER NAME FOR THE ENTRY OF RECORDS *********/

DECLARE L_DOCNO NUMBER(8); P_ERR VARCHAR2(100); L_YRNO VARCHAR2(2); E_DELIV EXCEPTION; L_CODE NUMBER(3); L_COUNT NUMBER(3); L_ERR VARCHAR2(500); L_YEAR_NO NUMBER(4); L_DOC_COUNT NUMBER(3);

BEGIN

/**IF NVL(:BCOMT050.DOC_NO,0) <= 0 THEN :CONTENT.MESSAGES := 'DOCUMENT NO. CAN NOT BE NULL......'; RAISE FORM_TRIGGER_FAILURE; END IF;*/

IF :BCOMT050.DELV_DATE IS NULL THEN :CONTENT.MESSAGES := 'DELIVERY DATE CAN NOT BE NULL......'; RAISE FORM_TRIGGER_FAILURE;

--------------------ADDED BY DIVYA ON 17-JUL-06--------------ELSIF VALIDATE_HEADER(P_ERR) = 0 then :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE;

--------------------ADDED BY DIVYA ON 17-JUL-06--------------END IF;

IF :BCOMT050.PARTY_CODE IS NULL THEN :CONTENT.MESSAGES := 'PARTY CODE CANNOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; END IF;

IF :BCOMT050.PARTY_CODE IS NOT NULL THEN SELECT COUNT(PARTY_CODE)INTO L_COUNT FROM BCOMT001 WHERE PARTY_CODE = :BCOMT050.PARTY_CODE;

IF L_COUNT = 0 THEN GENERATE_SUPPLIER(P_ERR); END IF;

ELSE GENERATE_SUPPLIER(P_ERR); END IF;

IF :BCOMT050.DESPATCH_MODE IS NULL THEN :CONTENT.MESSAGES := 'DESPTACH MODE CANNOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; ELSIF :BCOMT050.PAYMENT_TERM IS NULL THEN :CONTENT.MESSAGES := 'PAYMENT TERM CANNOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; ELSIF :BCOMT050.INSPECTION IS NULL THEN :CONTENT.MESSAGES := 'INSPECTION CANNOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; ELSIF :BCOMT050.EXPY_DATE IS NULL THEN :CONTENT.MESSAGES := 'EXPIRY DATE CAN NOT BE NULL......'; RAISE FORM_TRIGGER_FAILURE; END IF;

:GLOBAL.G_YEAR_NO := VALIDATE_DATE(:GLOBAL.COMPANY_ID, :BCOMT050.DOC_DATE,L_ERR);

L_YRNO := SUBSTR(:GLOBAL.G_YEAR_NO,3,2); :BCOMT050.YEAR_NO := :GLOBAL.G_YEAR_NO;

:BCOMT050.ENTERED_BY := :GLOBAL.USER_ID; :BCOMT050.ENTERED_DATE := SYSDATE; :BCOMT050.ORD_STAT P_ERR := NULL; := 'V';

--L_DOCNO :=:BCOMT050.DOC_NO ; IF NVL(:PARAMETER.P_FLAG,'N') ='Y' THEN IF :BCOMT050.DOC_NO IS NULL THEN :CONTENT.MESSAGES := 'PLEASE ENTER PURCHASE ORDER NO FIRST'; RAISE FORM_TRIGGER_FAILURE; ELSE SELECT COUNT(*) INTO L_DOC_COUNT FROM BCOMT050 WHERE DOC_NO = :BCOMT050.DOC_NO AND YEAR_NO = :GLOBAL.G_YEAR_NO; IF L_DOC_COUNT > 0 THEN :CONTENT.MESSA GES := 'THIS NO ALREADY EXISTS. PLEASE CHANGE NO'; RAISE FORM_TRIGGER_FAILURE; END IF; END IF; L_DOCNO := :BCOMT050.DOC_NO; ELSIF NVL(:PARAMETER.P_FLAG,'N') ='N' THEN

L_DOCNO := GET_DOC_NO(:GLOBAL.G_YEAR_NO, :BCOMT050.DOC_TYPE,'T', P_ERR); END IF;

IF P_ERR IS NULL THEN :BCOMT050.TEMPNO :BCOMT050.TEMPNO := L_DOCNO; := :BCOMT050.DOC_NO;

:BCOMT050.ORD_STAT := 'V'; :CONTENT.MESSAGES :BCOMT050.DOC_NO := 'Successfully Saved '; := L_DOCNO;

:PARAMETER.FEAT_CODE := :BCOMT050.DOC_NO; ELSE :CONTENT.ERRORS := P_ERR;

RAISE FORM_TRIGGER_FAILURE; END IF; :BCOMT050.ORD_STAT_DES := GET_DOC_STATUS(:BCOMT050.ORD_STAT); IF :BCOMT050.CB_REQ <> 'NO' THEN :BCOMT050.DOC_SERIES := 'PO/'|| TO_CHar(:BCOMT050.DOC_NO)||:BCOMT050.CB_REQ ; ELSE :BCOMT050.DOC_SERIES := 'PO/'||TO_CHar(:BCOMT050.DOC_NO);

END IF; EXCEPTION

WHEN E_DELIV THEN GO_ITEM('BCOMT050.DELV_DATE'); :CONTENT.ERRORS := 'Delivery Date Cannot be less than Order Date'; GO_ITEM('BCOMT050.DELV_DATE'); END; -----------------WHEN NEW FORM INSTANCE ----------if :BSTRT030.DOC_DATE IS NULL THEN :BSTRT030.DOC_DATE := TO_DATE(SYSDATE); END IF; ----------WHEN VALIDATE ITEM ---------DECLARE L_YEAR_NO NUMBER(4) := 0; L_ERR BEGIN L_YEAR_NO := VALIDATE_DATE(:GLOBAL.COMPANY_ID, :BSTRT030.DOC_DATE,L_ERR); IF L_YEAR_NO <= 0 THEN :CONTENT.ERRORS := L_ERR; RAISE FORM_TRIGGER_FAILURE; ELSE VARCHAR2(200);

IF :BSTRT030.YEAR_NO > 0 AND :BSTRT030.YEAR_NO <> L_YEAR_NO THEN :CONTENT.ERRORS := 'YEAR IS CHANGING. DELETE THIS VOUCHER AND RE ENTER IT'; RAISE FORM_TRIGGER_FAILURE; ELSE IF :GLOBAL.YEAR_NO = L_YEAR_NO THEN IF :BSTRT030.DOC_DATE IS NULL THEN :CONTENT.MESSAGES:= 'Invalid Date'; RAISE FORM_TRIGGER_FAILURE; ELSE :GLOBAL.DOC_DATE := :BSTRT030.DOC_DATE; END IF; ELSE :GLOBAL.G_YR_NO := L_YEAR_NO; :GLOBAL.YEAR_NO := L_YEAR_NO; END IF; END IF; END IF; END; ---------------key listval -------DECLARE

P_ERR VARCHAR2(100):= NULL; L_VAR VARCHAR2(100) := NULL;

BEGIN

L_VAR := null; GET_NEWLOV('STOR',L_VAR,P_ERR); IF P_ERR IS NULL THEN IF :GLOBAL.CODE IS NOT NULL THEN :BSTRT030.STORE_ID := LTRIM(RTRIM(:GLOBAL.CODE)); :BSTRT030.NBT_STORE := :GLOBAL.DES; END IF; ELSE :CONTENT.ERRORS := P_ERR; END IF;

EXCEPTION WHEN OTHERS THEN :CONTENT.ERRORS := SQLERRM;

END; ----------when validate item

---------DECLARE P_ERR VARCHAR2(100):=NULL; L_DESC VARCHAR2(200):=NULL; BEGIN IF :BSTRT030.STORE_ID IS NOT NULL THEN L_DESC := GET_DESCRIPTION('STOR',:BSTRT030.STORE_ID,P_ERR); IF P_ERR IS NULL THEN :BSTRT030.NBT_STORE := L_DESC; ELSE :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE;

END IF; ELSE :CONTENT.ERRORS := ' Store Cannot Be Null'; RAISE FORM_TRIGGER_FAILURE; END IF; END; ---------------keylistval -------declare

l_var varchar2(50); l_err varchar2(100); begin l_var := NULL; get_newlov('EMPY',L_VAR,l_err);

IF :GLOBAL.CODE IS not NULL THEN :BSTRT030.EMP_CODE:=:GLOBAL.CODE; :BSTRT030.NBT_EMP_DESC:=:GLOBAL.DES; end if; end; ------when validate item ----DECLARE L_DESC VARCHAR2(50); P_ERR VARCHAR2(100); BEGIN P_ERR:=NULL; L_DESC:= NULL; L_DESC:= GET_DESCRIPTION('EMPY',:BSTRT030.EMP_CODE,P_ERR); IF L_DESC IS NULL THEN :BSTRT030.EMP_CODE:= NULL;

:CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; ELSE :BSTRT030.NBT_EMP_DESC :=L_DESC; END IF; END; -------key next item -GO_ITEM('BSTRT031.PART_NO'); ----------m_lov -keylistval -------declare l_var varchar2(50); l_err varchar2(100); begin

l_var := NULL;

get_MATLOV('MATR',l_var,l_err);

IF L_ERR IS NULL THEN IF :GLOBAL.CODE IS NOT NULL THEN :BSTRT031.MAT_CODE :BSTRT031.PART_NO := :GLOBAL.CODE; := :GLOBAL.NO;

:BSTRT031.NBT_PART_DESC := :GLOBAL.DES; end if;

ELSE :CONTENT.ERRORS := L_ERR; END IF;

EXCEPTION WHEN OTHERS THEN :CONTENT.ERRORS := SQLERRM;

--go_item('BSTRT033.QTY'); end;

----------when validate item

-------DECLARE L_DESC VARCHAR2(100); L_ERR VARCHAR2(100); BEGIN

IF :BSTRT031.PART_NO IS NOT NULL THEN

L_DESC := GET_MATDESCRIPTION ('PART',:BSTRT031.PART_NO,L_ERR);

IF L_ERR IS NULL THEN :BSTRT031.NBT_PART_DESC := SUBSTR(L_DESC,12); :BSTRT031.MAT_CODE := TO_NUMBER(SUBSTR(L_DESC,1,10)); SELECT BASE_UNIT INTO :BSTRT031.NBT_UNIT FROM BCOMT002 WHERE PART_NO = :BSTRT031.PART_NO; ELSE :CONTENT.ERRORS := L_ERR; :BSTRT031.NBT_PART_DESC := NULL; RAISE FORM_TRIGGER_FAILURE; END IF;

END IF;

EXCEPTION WHEN NO_DATA_FOUND THEN :CONTENT.ERRORS := 'Part No. Is Not Valid'; Raise Form_Trigger_Failure; END;

----------for parameter code doc_NO --------KEY_LISTVAL -------DECLARE L_VAR VARCHAR2(50); L_ERR VARCHAR2(100);

BEGIN L_VAR := ':PARAMETER.DOC_TYPE'; SET_LOV_PROPERTY ('G_LOV', LOV_SIZE, 135,200);

SET_LOV_COLUMN_PROPERTY ('G_LOV', 1, WIDTH, 0); SET_LOV_COLUMN_PROPERTY ('G_LOV', 2, WIDTH, 80); SET_LOV_COLUMN_PROPERTY ('G_LOV', 2, TITLE, 'Type No.');

GET_NEWLOV1('DOCN', L_VAR, L_ERR);

IF :GLOBAL.CODE IS NOT NULL THEN :BSTRT030.DOC_NO := TO_NUMBER(:GLOBAL.CODE);

:BSTRT030.DOC_TYPE := SUBSTR(:GLOBAL.DES,1,3); :NB_DIS_DOCTYPE := GET_DESCRIPTION('DTYP',:BSTRT030.DOC_TYPE,L_ERR); END IF;

IF L_ERR IS NOT NULL THEN :CONTENT.MESSAGES:=L_ERR; ELSE :CONTENT.MESSAGES:=' '; END IF; END; ------------------------KEY LIST VAL FOR PARTY CODE WITH PARAMETER ----------

IF :BSTRT030.DOC_TYPE = 'GAS' THEN SET_ITEM_PROPERTY('BSTRT030.PARTY_CODE',LOV_NAME,'L_LOV_PARTY _GAS'); LIST_VALUES; ELSIF :BSTRT030.DOC_TYPE = 'GRS' THEN SET_ITEM_PROPERTY('BSTRT030.PARTY_CODE',LOV_NAME,'L_LOV_PARTY _GRS'); LIST_VALUES; ELSIF :BSTRT030.DOC_TYPE = 'GNR' THEN

SET_ITEM_PROPERTY('BSTRT030.PARTY_CODE',LOV_NAME,'L_LOV_PARTY' ); LIST_VALUES; END IF; ----------------M_LOV ---select 'xxxxxxxxxx' matcode,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'partno, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'matdesc from dual --------GRN_NO KEYLISTVAL ----------

IF :BSTRT030.DOC_TYPE = 'GAS' AND :BSTRT030.PARTY_CODE IS NOT NULL THEN SET_ITEM_PROPERTY('BSTRT030.GRN_NO',LOV_NAME,'L_LOV_GRN_GAS'); LIST_VALUES; POPULATE_GRN_DATA; ELSIF :BSTRT030.DOC_TYPE = 'GRS' AND :BSTRT030.PARTY_CODE IS NOT NULL THEN SET_ITEM_PROPERTY('BSTRT030.GRN_NO',LOV_NAME,'L_LOV_GRN_GRS '); LIST_VALUES; POPULATE_GRN_DATA;

ELSIF :SYSTEM.BLOCK_STATUS = 'QUERY' THEN :CONTENT.ERRORS := 'Field Cannot be Modified'; RAISE FORM_TRIGGER_FAILURE; END IF; ---------PARAMETER CODE --------L_LOV_PARTY_GAS ----SELECT DISTINCT B.PARTY_FNAME||' '||B.PARTY_LNAME,C.PARTY_CODE FROM BCOMT001 B,BSTRT010 C WHERE B.PARTY_CODE = C.PARTY_CODE

AND C.GRN_STATUS = 'A' ORDER BY B.PARTY_FNAME||' '||B.PARTY_LNAME,C.PARTY_CODE --------------L_LOV_GRN_GAS ------------SELECT DOC_NO,DOC_TYPE FROM BSTRT010 WHERE GRN_STATUS = 'A' AND PARTY_CODE = :BSTRT030.PARTY_CODE ORDER BY DOC_NO --------block level trigger ---------pre record -Enable_Disable_Form;

---------pre insert -------DECLARE L_DOCNO NUMBER(8); P_ERR VARCHAR2(100);

BEGIN /*IF :BSTRT030.STORE_ID IS NULL THEN :CONTENT.MESSAGES := 'STORE CAN NOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; */ --------------BY TAJINDER DT 25-AUG-06 ----------------------------IF VALIDATE_HEADER(P_ERR) = 0 THEN :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; --------------BY TAJINDER DT 25-AUG-06 -----------------------------

END IF;--IF VALIDATE_HEADER(P_ERR) = 0 THEN

:BSTRT030.ENTERED_BY := :GLOBAL.USER_ID; :BSTRT030.ENTERED_DATE := SYSDATE; :BSTRT030.YEAR_NO P_ERR := :GLOBAL.YEAR_NO;

:= NULL;

L_DOCNO := GET_DOC_NO(:GLOBAL.YEAR_NO, :BSTRT030.DOC_TYPE,'T', P_ERR);

IF P_ERR IS NULL THEN :BSTRT030.DOC_NO :BSTRT030.TEMPNO := L_DOCNO; := L_DOCNO;

:BSTRT030.DOCNO_TEXT := L_DOCNO; :BSTRT030.DOC_STATUS := 'V';

:BSTRT030.DIS_STATUS := 'VALID'; :CONTENT.MESSAGES TO_CHAR( L_DOCNO); ELSE :CONTENT.ERRORS := P_ERR; := 'Document Saved VIDE NO. '||

RAISE FORM_TRIGGER_FAILURE; END IF;

END; ----------pre update -------DECLARE P_ERR VARCHAR2(100); BEGIN /*IF :BSTRT030.STORE_ID IS NULL THEN :CONTENT.MESSAGES := 'STORE CAN NOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; */ --------------BY TAJIDNER DT 25-AUG-06 ----------------------------IF VALIDATE_HEADER(P_ERR) = 0 THEN :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; --------------BY TAJIDNER DT 25-AUG-06 ----------------------------END IF;--IF VALIDATE_HEADER(P_ERR) = 0 THEN

:BSTRT030.MODIFIED_BY := :GLOBAL.USER_ID; :BSTRT030.MODIFIED_DATE := SYSDATE; :BSTRT030.TRN_FLAG := 'N';

END; ----------post query ---DECLARE P_ERR VARCHAR2(100);

BEGIN P_ERR:=NULL; :BSTRT030.NBT_STORE := GET_DESCRIPTION('STOR',:BSTRT030.STORE_ID,P_ERR); :BSTRT030.DIS_PARTY := GET_DESCRIPTION ('PRTY',:BSTRT030.PARTY_CODE,P_ERR); :NB_DIS_DOCTYPE := GET_DESCRIPTION('DTYP',:BSTRT030.DOC_TYPE,P_ERR); :BSTRT030.DIS_STATUS := GET_DOC_STATUS(:BSTRT030.DOC_STATUS); :BSTRT030.DOCNO_TEXT := :BSTRT030.DOC_NO; END;

---------post query other block

---DECLARE P_ERR VARCHAR2(100); BEGIN P_ERR :=NULL; :BSTRT031.NBT_PART_DESC := GET_DESCRIPTION('MATR',:BSTRT031.MAT_CODE,P_ERR);

SELECT BASE_UNIT INTO :BSTRT031.NBT_UNIT FROM BCOMT002 WHERE PART_NO = :BSTRT031.PART_NO; END;

---------pre insert ------DECLARE P_ERR VARCHAR2(100); BEGIN

--------------BY TAJINDER DT 25-AUG-06 ----------------------------IF VALIDATE_DETAIL(P_ERR) = 0 THEN :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; END IF;--IF VALIDATE_DETAIL(P_ERR) = 0 THEN

--------------BY TAJINDER DT 25-AUG-06 -----------------------------

:BSTRT031.ENTERED_BY := :GLOBAL.USER_ID; :BSTRT031.ENTERED_DATE := SYSDATE; :BSTRT031.STATUS END; ------------program UNIT ENABLE DISABLE FORM ---------PROCEDURE Enable_Disable_Form IS := 'V';

BEGIN

IF :BSTRT030.DOC_STATUS = 'V' THEN SET_BLOCK_PROPERTY('BSTRT030',UPDATE_ALLOWED,PROPERTY_TRUE); SET_BLOCK_PROPERTY('BSTRT030',DELETE_ALLOWED,PROPERTY_TRUE); SET_BLOCK_PROPERTY('BSTRT031',UPDATE_ALLOWED,PROPERTY_TRUE); SET_BLOCK_PROPERTY('BSTRT031',INSERT_ALLOWED,PROPERTY_TRUE); SET_BLOCK_PROPERTY('BSTRT031',DELETE_ALLOWED,PROPERTY_TRUE);

ELSE SET_BLOCK_PROPERTY('BSTRT030',UPDATE_ALLOWED,PROPERTY_FALSE); SET_BLOCK_PROPERTY('BSTRT030',DELETE_ALLOWED,PROPERTY_FALSE); SET_BLOCK_PROPERTY('BSTRT031',UPDATE_ALLOWED,PROPERTY_FALSE); SET_BLOCK_PROPERTY('BSTRT031',DELETE_ALLOWED,PROPERTY_FALSE); END IF;

END; --------------VALIDATE HEADER --------FUNCTION validate_HEADER(p_err out varchar) RETURN number IS BEGIN

--IF :BSTRT030.DOC_DATE > SYSDATE OR :BSTRT030.DOC_DATE IS NULL THEN --P_ERR := 'Doc date can not be null or greater than system date'; --return 0; IF :BSTRT030.STORE_ID IS NULL THEN P_ERR := 'Store id can not be null'; return 0; ELSIF :BSTRT030.PARTY_CODE IS NULL THEN

P_ERR := 'Party code can not be null'; return 0; ELSIF :BSTRT030.EMP_CODE IS NULL THEN P_ERR := 'Employee code can not be null'; return 0; ELSE RETURN 1; END IF; RETURN 1; END; --------------validate_detail ---------FUNCTION validate_detail(p_err out varchar) RETURN number IS BEGIN

IF :BSTRT031.PART_NO IS NULL THEN P_ERR := 'Part no. can not be null'; return 0; ELSE RETURN 1;

END IF;

RETURN 1; END; ---------SELECT A.PART_COMM FROM BCOMT051 A,BSTRT011 B WHERE A.PART_NO =B.PART_NO;

---------select PARTY_TITLE, PARTY_FNAME , PARTY_LNAME from bcomt001 A,BFASR041LABEL B WHERE A.VENDOR_CODE =B.VENDOR_CODE;

----SELECT A.PARTY_TITLE||''||A.PARTY_FNAME||''||A.PARTY_LNAME INTO L_NAME FROM BCOMT001 A,BFASR041LABEL B WHERE A.VENDOR_CODE =B.VENDOR_CODE ; RETURN L_NAME; EXCEPTION ------SELECT A.PARTY_CODE FROM BCOMT001 A , BCOMT011 B WHERE B.TYPE_CODE=A.PARTY_CAT; ----------------

SELECT PARTY_TITLE||''||PARTY_FNAME||''||PARTY_LNAME INTO L_NAME FROM BCOMT001 WHERE VENDOR_CODE =:P_PARTYCODE ; RETURN L_NAME;

============================ DECLARE L_DOCNO NUMBER(8):=0; P_ERR VARCHAR2(100); BEGIN

:BVERT001.ENTERED_BY

:= :GLOBAL.USER_ID;

:BVERT001.ENTERED_DATE := :GLOBAL.SYSDATE; :BVERT001.DOC_DATE :BVERT001.YEAR_NO P_ERR := :GLOBAL.SYSDATE; := :GLOBAL.YEAR_NO;

:= NULL;

SELECT NVL(MAX(DOC_NO),0) INTO L_DOCNO FROM BVERT001;

L_DOCNO

:= L_DOCNO + 1;

IF P_ERR IS NULL THEN

:BVERT001.DOC_NO :BVERT001.STATUS

:= L_DOCNO; := 'V'; := 'Document Saved VIDE NO. '||

:CONTENT.MESSAGES TO_CHAR( L_DOCNO); ELSE :CONTENT.ERRORS

:= P_ERR;

RAISE FORM_TRIGGER_FAILURE; END IF; :BVERT001.NBT_STATUS exception when others then :content.errors :=sqlerrm; END; := GET_DOC_STATUS(:BVERT001.STATUS);

================== DECLARE L_SRNO NUMBER := 1; BEGIN IF :SYSTEM.RECORD_STATUS = 'NEW' THEN IF GET_BLOCK_PROPERTY('BVERT002',CURRENT_RECORD) = 1 THEN L_SRNO := 1; ELSE PREVIOUS_RECORD; L_SRNO := :BVERT002.SR_NO+1;

CREATE_RECORD; END IF; :BVERT002.SR_NO := L_SRNO; END IF; END;

========= DECLARE L_SRNO NUMBER(5) := 1; BEGIN LAST_RECORD; L_SRNO := NVL(:BVERT002.SR_NO,0) + 1; CREATE_RECORD; :BVERT002.SR_NO := NVL(L_SRNO,1); END;

========== :BVERT002.ENTERED_BY := :GLOBAL.USER_ID;

:BVERT002.ENTERED_DATE := :GLOBAL.SYSDATE; :BVERT002.DOC_NO :BVERT002.YEAR_NO := :BVERT001.DOC_NO; := :BVERT001.YEAR_NO;

=========

:BVERT002.MODIFIED_BY

:= :GLOBAL.USER_ID;

:BVERT002.MODIFIED_DATE := :GLOBAL.SYSDATE;

==== IF :BVERT002.TRN_FLAG='Y' THEN SET_ITEM_PROPERTY('BVERT002.LOCK_DATE',VISIBLE,PROPERTY_TRUE); ELSE SET_ITEM_PROPERTY('BVERT002.LOCK_DATE',VISIBLE,PROPERTY_FAL SE); END IF;

=========== PROCEDURE Enable_Disable_Item IS begin

If :BVERT001.STATUS = 'A' then Set_Block_Property('BVERT001',UPDATE_ALLOWED,PROPERTY_FALSE); Set_Block_Property('BVERT001',DELETE_ALLOWED,PROPERTY_FALSE); Set_Block_Property('BVERT002',UPDATE_ALLOWED,PROPERTY_FALSE); Set_Block_Property('BVERT002',INSERT_ALLOWED,PROPERTY_FALSE); Set_Block_Property('BVERT002',DELETE_ALLOWED,PROPERTY_FALSE);

ELSE Set_Block_Property('BVERT001',UPDATE_ALLOWED,PROPERTY_TRUE); Set_Block_Property('BVERT001',DELETE_ALLOWED,PROPERTY_TRUE); Set_Block_Property('BVERT002',UPDATE_ALLOWED,PROPERTY_TRUE); Set_Block_Property('BVERT002',INSERT_ALLOWED,PROPERTY_TRUE); Set_Block_Property('BVERT002',DELETE_ALLOWED,PROPERTY_TRUE);

END IF;

END;

-------------pre record

------IF :STATUS='V' THEN :NBT_STATUS:='VALID'; set_block_property('testingtranhead',update_allowed,property_true); set_block_property('testingtrandet',update_allowed,property_true); ELSIF :STATUS='A' THEN

:NBT_STATUS:='AUTHORIZED'; set_block_property('testingtranhead',update_allowed,property_false); set_block_property('testingtrandet',update_allowed,property_false); set_block_property('testingMASTER',update_allowed,property_false); END IF; -------------directory_name,

file_name, file_filter, message , dialog_type, select_file ,

========== declare AppID PLS_INTEGER; begin AppID := get_file_name('c:\windows\temp\winworld.fmx c:\resume\'||':bvert002.location'||'.doc',DDE.APP_MODE_NORMAL); end;

----------

to invoke popup the Browse file location window declare f varchar2(255); -- f is a variable for filename begin f:=get_file_name; /* get_file_name is a function that invoke the Browse file location window*/ :block.text:=f; /* :block.text is a database item that store the filename in a database column*/ end; ============================ declare AppID PLS_INTEGER; begin

AppID := DDE.App_Begin('C:\Program Files\Microsoft Office\Office10\WINWORD.EXE d:\expspm\'||':bvert002.location'||'.doc',DDE.APP_MODE_NORMAL);

end;

==================== WHEN_NEW_ITEM_INSTANCE ----------

EDIT_TEXTITEM; --------FOR ITEM LOV --GET LOV1 --------KEY_LISTVAL ----declare l_var varchar2(50); L_ERR VARCHAR2(100); CODE1 VARCHAR2(50); begin l_var := null;

GET_LOV1('IMTEGRP',l_var,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN :CONTENT.GRP_DESC := :GLOBAL.CODE; :CONTENT.GRP_CODE := :GLOBAL.DES; END IF;

GO_BLOCK('TESTINGMASTER');

SET_BLOCK_PROPERTY('TESTINGMASTER',DEFAULT_WHERE,'GROUP_C ODE ='''||:CONTENT.GRP_DESC||'''');

EXECUTE_QUERY; -- GO_BLOCK('CONTENT'); end; ---------KEY_NEXT_ITEM ----------DECLARE L_VAR VARCHAR2(100); BEGIN GO_BLOCK('TESTINGMASTER'); L_VAR:='GROUP_CODE='''':CONTENT.GRP_DESC'''; SET_BLOCK_PROPERTY('TESTINGMASTER',DEFAULT_WHERE,'GROUP_COD E ='||':CONTENT.GRP_DESC'); EXECUTE_QUERY; END; --------------code for IMPORTING WHEN BUTTON PRESSED --------declare SRNO NUMBER;

CURSOR C1 IS

SELECT METHOD_CODE, STANDARD_EQUIPEMENT,IS_STANDARDNO,EFFECTIVE_FROMDATE, CHK_SPECIFICATIONS,ACCEPTANCE_CRITERIA, OPTIONAL FROM TESTINGMASTER WHERE GROUP_CODE=:CONTENT.IMPORTCODE;

-- cursor for fetching method to import.

begin if :content.grp_desc is null then :content.messages:='No IMTE Type is selected.Please Select IMTE Type First.'; elsif :content.importcode is null then :content.messages:='No IMTE Type is selected for Import.Please Select IMTE Type First.'; else SELECT MAX(TO_NUMBER(SRNO)) INTO SRNO FROM TESTINGMASTER WHERE GROUP_CODE=:CONTENT.GRP_DESC; IF SQL%FOUND THEN IF SRNO>=0 THEN SRNO:=SRNO+1; ELSE SRNO:=1; END IF; -ELSE

END IF;

GO_BLOCK('TESTINGMASTER'); CLEAR_BLOCK;

FOR REC IN C1 LOOP CREATE_RECORD; :SRNO:=SRNO; :METHOD_CODE:=REC.METHOD_CODE; :GROUP_CODE:=:CONTENT.GRP_DESC; :STANDARD_EQUIPEMENT:=REC. STANDARD_EQUIPEMENT; :IS_STANDARDNO:=REC.IS_STANDARDNO; :EFFECTIVE_FROMDATE:=REC.EFFECTIVE_FROMDATE; :CHK_SPECIFICATIONS:=REC.CHK_SPECIFICATIONS; :ACCEPTANCE_CRITERIA:=REC.ACCEPTANCE_CRITERIA; :OPTIONAL:=REC.OPTIONAL;

SRNO:=SRNO+1; END LOOP ; end if; END;

-------------

code for lov key listval declare l_var varchar2(50); L_ERR VARCHAR2(100); CODE1 VARCHAR2(50); begin l_var := null;

GET_LOV1('IMTEGRP',l_var,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN :CONTENT.importcode := :GLOBAL.CODE; --DO_KEY('ENTER_QUERY'); :CONTENT.importdesc := :GLOBAL.DES; -- :TESTINGMASTER.GROUP_CODE:=:GLOBAL.CODE; -- CODE1:=:GLOBAL.CODE; END IF; --SHOW_LOV('G_LOV');

end; -------

pre text item --:rmsincedate:=sysdate; ---------key listval ---------declare l_var varchar2(500); L_ERR VARCHAR2(100); L_GRP VARCHAR2(50); L_GRP_DESC VARCHAR2(100); begin

l_var := 'ITEM_CODE '||' NOT IN (SELECT ITEMCODE FROM REJECTEDMISSING where curstatus='||0||')';

if :REJECTEDMISSING.groupcode is not null then l_var:= 'ITEM_CODE '||' NOT IN (SELECT ITEMCODE FROM REJECTEDMISSING where curstatus='||0||') AND group_code ='||:REJECTEDMISSING.groupcode ; end if;

GET_LOV1('IMTE',l_var,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN :REJECTEDMISSING.NBT_IMTE := :GLOBAL.DES;

:REJECTEDMISSING.ITEMCODE := :GLOBAL.CODE;

--IF IMTE TYPE NOT SELECTED IF :REJECTEDMISSING.groupcode IS NULL THEN SELECT A.GROUP_CODE,A.G_DESC INTO L_GRP,L_GRP_DESC FROM ITEMCATGGRP A,ITEMMASTER B WHERE A.GROUP_CODE=B.GROUP_CODE AND B.ITEM_CODE=:REJECTEDMISSING.ITEMCODE;

:REJECTEDMISSING.groupcode:=L_GRP; :REJECTEDMISSING.NBT_IMTETYPE :=L_GRP_DESC;

END IF; END IF;

end; --------when validate item -------DECLARE P_ERR VARCHAR2(100); L_PARTY VARCHAR2(50):='';

L_PARTY_DESC VARCHAR2(100):=''; l_count number:=0; L_GRP VARCHAR2(50); L_GRP_DESC VARCHAR2(100); BEGIN

--MESSAGE('11');PAUSE; IF :REJECTEDMISSING.ITEMCODE IS NOT NULL THEN --to check whether IMTE already exist in rejectedmissing table select count(*) into l_count from rejectedmissing where :REJECTEDMISSING.itemcode in (SELECT ITEMCODE FROM REJECTEDMISSING where curstatus='0');

if l_count>0 then :content.errors:='This IMTE already missing'; raise form_trigger_failure; end if;

if :REJECTEDMISSING.groupcode is not null then --to check whether enterd IMTE is valid for selected IMTE Type select count(*) into l_count from itemmaster where :REJECTEDMISSING.itemcode=item_code and group_code=:REJECTEDMISSING.groupcode ; if l_count=0 then

:content.errors:='Invalid IMTE for selected IMTE Type.'; raise form_trigger_failure; end if; end if;

:REJECTEDMISSING.NBT_IMTE := GET_DESC('IMTE', :REJECTEDMISSING.ITEMCODE,P_ERR); else :content.messages:='Select IMTE No.'; raise form_trigger_failure; END IF;

if p_err is not null then :content.errors:=p_err; raise form_trigger_failure; end if;

--IF IMTE TYPE NOT SELECTED IF :REJECTEDMISSING.groupcode IS NULL THEN SELECT A.GROUP_CODE,A.G_DESC INTO L_GRP,L_GRP_DESC FROM ITEMCATGGRP A,ITEMMASTER B WHERE A.GROUP_CODE=B.GROUP_CODE

AND B.ITEM_CODE=:REJECTEDMISSING.ITEMCODE;

:REJECTEDMISSING.groupcode:=L_GRP; :REJECTEDMISSING.NBT_IMTETYPE :=L_GRP_DESC;

END IF;

--FOR FINDING CURRENT LOCATION SELECT PARTYCODE,PARTYDESC INTO L_PARTY,L_PARTY_DESC FROM PARTYMASTER A,ITEMBALANCES B WHERE A.PARTYCODE=B.CUR_PARTY_CODE AND B.ITEM_CODE=:REJECTEDMISSING.ITEMCODE;

:REJECTEDMISSING.PARTYCODE:=L_PARTY; :REJECTEDMISSING.NBT_PARTY:=L_PARTY_DESC;

exception when form_trigger_failure then raise form_trigger_failure;

when others then :content.errors:=sqlerrm;

END;

---------------post_query ---DECLARE P_ERR VARCHAR2(100); BEGIN IF :REJECTEDMISSING.GROUPCODE IS NOT NULL THEN -PAUSE;

:REJECTEDMISSING.NBT_IMTETYPE := GET_DESC('IMTEGRP', :REJECTEDMISSING.GROUPCODE,P_ERR); END IF; IF :REJECTEDMISSING.ITEMCODE IS NOT NULL THEN :REJECTEDMISSING.NBT_IMTE := GET_DESC('IMTE', :REJECTEDMISSING.ITEMCODE,P_ERR); END IF; IF :REJECTEDMISSING.PARTYCODE IS NOT NULL THEN :REJECTEDMISSING.NBT_PARTY := GET_DESC('PARTY', :REJECTEDMISSING.PARTYCODE,P_ERR); END IF; /* IF P_ERR IS NOT NULL THEN :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; END IF;*/

EXCEPTION

WHEN OTHERS THEN BEGIN p_err := NULL; -- RETURN L_DESC; END; END; ----------pre insert

DECLARE L_ID NUMBER:=0;

BEGIN

if :rejectedmissing.groupcode is null then :content.messages:='Enter IMTE Type.'; raise form_trigger_failure; end if;

if :rejectedmissing.itemcode is null then :content.messages:='Enter IMTE.';

raise form_trigger_failure; end if;

if :rejectedmissing.rmsincedate is null then :content.messages:='Enter Missing Since Date.'; raise form_trigger_failure; end if;

--SELECT MAX(TO_NUMBER(srno)) INTO L_ID FROM rejectedmissing;

/* IF SQL%FOUND THEN IF L_ID>=0 THEN L_ID:=L_ID+1; ELSE L_ID:=1; END IF ;

:rejectedmissing.srNO:=L_ID; ELSE :rejectedmissing.srNO:=L_ID; END IF;*/ select max(nvl(TO_NUMBER(srno),0))+1 into l_id from rejectedmissing; :rejectedmissing.srNO:=L_ID; :rejectedmissing.CURSTATUS:=0;

EXCEPTION WHEN FORM_TRIGGER_FAILURE THEN RAISE FORM_TRIGGER_FAILURE; WHEN OTHERS THEN :CONTENT.ERRORS:=SQLERRM; end;

------------post insert --------update itembalances set status='4' where item_code=:itemcode; --------post-update -------update itembalances set status='4' where item_code=:itemcode; --------key list val ---------declare l_var varchar2(500); L_ERR VARCHAR2(100);

begin

l_var:= 'ITEM_CODE '||'IN (SELECT ITEMCODE FROM REJECTEDMISSING where curstatus='||0||')';

GET_LOV1('IMTE',l_var,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN --message('1'|| :GLOBAL.CODE||:GLOBAL.des); pause; :REJECTEDMISSING.NBT_IMTE := :GLOBAL.DES; :REJECTEDMISSING.ITEMCODE := :GLOBAL.CODE; END IF;

GO_BLOCK('REJECTEDMISSING');

SET_BLOCK_PROPERTY('REJECTEDMISSING',DEFAULT_WHERE,'ITEMCO DE ='''||:REJECTEDMISSING.ITEMCODE||'''');

EXECUTE_QUERY; EXCEPTION WHEN OTHERS THEN :CONTENT.ERRORS:=SQLERRM;

end; ----------when validate item -------DECLARE P_ERR VARCHAR2(100); L_PARTY VARCHAR2(50); L_PARTY_DESC VARCHAR2(100); BEGIN

IF :REJECTEDMISSING.ITEMCODE IS NOT NULL THEN :REJECTEDMISSING.NBT_IMTE := GET_DESC('IMTE', :REJECTEDMISSING.ITEMCODE,P_ERR); END IF;

END; ----------------keynext item

-------DECLARE BEGIN GO_BLOCK('PRODUCTPROCESS');

SET_BLOCK_PROPERTY('PRODUCTPROCESS',DEFAULT_WHERE,'PRODUC TCODE ='''|| :CONTENT.NBT_PRODUCTCODE ||'''');

EXECUTE_QUERY; END;

-------------key-exeqry(execute query) ------GO_BLOCK('PRODUCTPROCESS');

SET_BLOCK_PROPERTY('PRODUCTPROCESS',DEFAULT_WHERE,'PRODUCT CODE ='''|| :CONTENT.NBT_PRODUCTCODE ||'''');

EXECUTE_QUERY; ----------pre insert -DECLARE L_COUNT NUMBER:=0; BEGIN --check for blank process code if :PRODUCTPROCESS.processcode is null then

:content.messages:='Enter Process Code'; raise form_trigger_failure; end if;

--check for unique process code SELECT COUNT(*) INTO L_COUNT FROM PRODUCTPRoCESS WHERE PROCESSCODE=:PRODUCTPROCESS.PROCESSCODE; IF l_COUNT>0 THEN :CONTENT.MESSAGES:=''' '||:PRODUCTPROCESS.PROCESSCODE||''' already exists. Enter another Process code'; raise form_trigger_failure; END IF;

--check for blank process description if :PRODUCTPROCESS.processdescription is null then :content.messages:='Enter Process Description'; raise form_trigger_failure; end if;

:PRODUCTPROCESS.PRODUCTCODE:=:CONTENT.NBT_PRODUCTCODE; END; ---WHEN NEW FORM INSTANCE

----------if :BSTRT030.DOC_DATE IS NULL THEN :BSTRT030.DOC_DATE := TO_DATE(SYSDATE); END IF; ----------WHEN VALIDATE ITEM ---------DECLARE L_YEAR_NO NUMBER(4) := 0; L_ERR BEGIN L_YEAR_NO := VALIDATE_DATE(:GLOBAL.COMPANY_ID, :BSTRT030.DOC_DATE,L_ERR); IF L_YEAR_NO <= 0 THEN :CONTENT.ERRORS := L_ERR; RAISE FORM_TRIGGER_FAILURE; ELSE IF :BSTRT030.YEAR_NO > 0 AND :BSTRT030.YEAR_NO <> L_YEAR_NO THEN :CONTENT.ERRORS := 'YEAR IS CHANGING. DELETE THIS VOUCHER AND RE ENTER IT'; RAISE FORM_TRIGGER_FAILURE; ELSE IF :GLOBAL.YEAR_NO = L_YEAR_NO THEN IF :BSTRT030.DOC_DATE IS NULL THEN VARCHAR2(200);

:CONTENT.MESSAGES:= 'Invalid Date'; RAISE FORM_TRIGGER_FAILURE; ELSE :GLOBAL.DOC_DATE := :BSTRT030.DOC_DATE; END IF; ELSE :GLOBAL.G_YR_NO := L_YEAR_NO; :GLOBAL.YEAR_NO := L_YEAR_NO; END IF; END IF; END IF; END; ---------key listval -------DECLARE P_ERR VARCHAR2(100):= NULL; L_VAR VARCHAR2(100) := NULL;

BEGIN

L_VAR := null; GET_NEWLOV('STOR',L_VAR,P_ERR);

IF P_ERR IS NULL THEN IF :GLOBAL.CODE IS NOT NULL THEN :BSTRT030.STORE_ID := LTRIM(RTRIM(:GLOBAL.CODE)); :BSTRT030.NBT_STORE := :GLOBAL.DES; END IF; ELSE :CONTENT.ERRORS := P_ERR; END IF;

EXCEPTION WHEN OTHERS THEN :CONTENT.ERRORS := SQLERRM;

END;

-------------when validate item ---------DECLARE P_ERR VARCHAR2(100):=NULL; L_DESC VARCHAR2(200):=NULL; BEGIN IF :BSTRT030.STORE_ID IS NOT NULL THEN

L_DESC := GET_DESCRIPTION('STOR',:BSTRT030.STORE_ID,P_ERR); IF P_ERR IS NULL THEN :BSTRT030.NBT_STORE := L_DESC; ELSE :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE;

END IF; ELSE :CONTENT.ERRORS := ' Store Cannot Be Null'; RAISE FORM_TRIGGER_FAILURE; END IF; END; ------------keylistval -------declare l_var varchar2(50); l_err varchar2(100); begin l_var := NULL; get_newlov('EMPY',L_VAR,l_err);

IF :GLOBAL.CODE IS not NULL THEN :BSTRT030.EMP_CODE:=:GLOBAL.CODE; :BSTRT030.NBT_EMP_DESC:=:GLOBAL.DES; end if; end; ------when validate item ----DECLARE L_DESC VARCHAR2(50); P_ERR VARCHAR2(100); BEGIN P_ERR:=NULL; L_DESC:= NULL; L_DESC:= GET_DESCRIPTION('EMPY',:BSTRT030.EMP_CODE,P_ERR); IF L_DESC IS NULL THEN :BSTRT030.EMP_CODE:= NULL; :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; ELSE :BSTRT030.NBT_EMP_DESC :=L_DESC; END IF; END;

-------key next item -GO_ITEM('BSTRT031.PART_NO'); ----------m_lov -keylistval -------declare l_var varchar2(50); l_err varchar2(100); begin

l_var := NULL;

get_MATLOV('MATR',l_var,l_err);

IF L_ERR IS NULL THEN IF :GLOBAL.CODE IS NOT NULL THEN :BSTRT031.MAT_CODE :BSTRT031.PART_NO := :GLOBAL.CODE; := :GLOBAL.NO;

:BSTRT031.NBT_PART_DESC := :GLOBAL.DES;

end if;

ELSE :CONTENT.ERRORS := L_ERR; END IF;

EXCEPTION WHEN OTHERS THEN :CONTENT.ERRORS := SQLERRM;

--go_item('BSTRT033.QTY'); end;

----------when validate item -------DECLARE L_DESC VARCHAR2(100); L_ERR VARCHAR2(100); BEGIN

IF :BSTRT031.PART_NO IS NOT NULL THEN

L_DESC := GET_MATDESCRIPTION ('PART',:BSTRT031.PART_NO,L_ERR);

IF L_ERR IS NULL THEN :BSTRT031.NBT_PART_DESC := SUBSTR(L_DESC,12); :BSTRT031.MAT_CODE := TO_NUMBER(SUBSTR(L_DESC,1,10)); SELECT BASE_UNIT INTO :BSTRT031.NBT_UNIT FROM BCOMT002 WHERE PART_NO = :BSTRT031.PART_NO; ELSE :CONTENT.ERRORS := L_ERR; :BSTRT031.NBT_PART_DESC := NULL; RAISE FORM_TRIGGER_FAILURE; END IF;

END IF;

EXCEPTION WHEN NO_DATA_FOUND THEN :CONTENT.ERRORS := 'Part No. Is Not Valid'; Raise Form_Trigger_Failure;

END;

------------for parameter code doc_NO --------KEY_LISTVAL -------DECLARE L_VAR VARCHAR2(50); L_ERR VARCHAR2(100);

BEGIN L_VAR := ':PARAMETER.DOC_TYPE'; SET_LOV_PROPERTY ('G_LOV', LOV_SIZE, 135,200);

SET_LOV_COLUMN_PROPERTY ('G_LOV', 1, WIDTH, 0); SET_LOV_COLUMN_PROPERTY ('G_LOV', 2, WIDTH, 80); SET_LOV_COLUMN_PROPERTY ('G_LOV', 2, TITLE, 'Type No.');

GET_NEWLOV1('DOCN', L_VAR, L_ERR);

IF :GLOBAL.CODE IS NOT NULL THEN :BSTRT030.DOC_NO := TO_NUMBER(:GLOBAL.CODE);

:BSTRT030.DOC_TYPE := SUBSTR(:GLOBAL.DES,1,3); :NB_DIS_DOCTYPE := GET_DESCRIPTION('DTYP',:BSTRT030.DOC_TYPE,L_ERR); END IF;

IF L_ERR IS NOT NULL THEN :CONTENT.MESSAGES:=L_ERR; ELSE :CONTENT.MESSAGES:=' '; END IF; END; ------------KEY LIST VAL FOR PARTY CODE WITH PARAMETER ----------

IF :BSTRT030.DOC_TYPE = 'GAS' THEN SET_ITEM_PROPERTY('BSTRT030.PARTY_CODE',LOV_NAME,'L_LOV_PARTY _GAS'); LIST_VALUES; ELSIF :BSTRT030.DOC_TYPE = 'GRS' THEN

SET_ITEM_PROPERTY('BSTRT030.PARTY_CODE',LOV_NAME,'L_LOV_PARTY _GRS'); LIST_VALUES; ELSIF :BSTRT030.DOC_TYPE = 'GNR' THEN

SET_ITEM_PROPERTY('BSTRT030.PARTY_CODE',LOV_NAME,'L_LOV_PARTY' ); LIST_VALUES; END IF; ----------------M_LOV ---select 'xxxxxxxxxx' matcode,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'partno, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'matdesc from dual --------GRN_NO KEYLISTVAL ---------IF :BSTRT030.DOC_TYPE = 'GAS' AND :BSTRT030.PARTY_CODE IS NOT NULL THEN SET_ITEM_PROPERTY('BSTRT030.GRN_NO',LOV_NAME,'L_LOV_GRN_GAS'); LIST_VALUES; POPULATE_GRN_DATA;

ELSIF :BSTRT030.DOC_TYPE = 'GRS' AND :BSTRT030.PARTY_CODE IS NOT NULL THEN SET_ITEM_PROPERTY('BSTRT030.GRN_NO',LOV_NAME,'L_LOV_GRN_GRS '); LIST_VALUES; POPULATE_GRN_DATA;

ELSIF :SYSTEM.BLOCK_STATUS = 'QUERY' THEN :CONTENT.ERRORS := 'Field Cannot be Modified'; RAISE FORM_TRIGGER_FAILURE; END IF; ---------PARAMETER CODE --------L_LOV_PARTY_GAS ----SELECT DISTINCT B.PARTY_FNAME||' '||B.PARTY_LNAME,C.PARTY_CODE FROM BCOMT001 B,BSTRT010 C WHERE B.PARTY_CODE = C.PARTY_CODE AND C.GRN_STATUS = 'A' ORDER BY B.PARTY_FNAME||' '||B.PARTY_LNAME,C.PARTY_CODE --------------L_LOV_GRN_GAS -------------

SELECT DOC_NO,DOC_TYPE FROM BSTRT010 WHERE GRN_STATUS = 'A' AND PARTY_CODE = :BSTRT030.PARTY_CODE ORDER BY DOC_NO --------block level trigger ---------pre record -Enable_Disable_Form;

---------pre insert -------DECLARE L_DOCNO NUMBER(8); P_ERR VARCHAR2(100); BEGIN /*IF :BSTRT030.STORE_ID IS NULL THEN :CONTENT.MESSAGES := 'STORE CAN NOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; */ --------------BY TAJINDER DT 25-AUG-06 -----------------------------

IF VALIDATE_HEADER(P_ERR) = 0 THEN :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; --------------BY TAJINDER DT 25-AUG-06 -----------------------------

END IF;--IF VALIDATE_HEADER(P_ERR) = 0 THEN

:BSTRT030.ENTERED_BY := :GLOBAL.USER_ID; :BSTRT030.ENTERED_DATE := SYSDATE; :BSTRT030.YEAR_NO P_ERR := :GLOBAL.YEAR_NO;

:= NULL;

L_DOCNO := GET_DOC_NO(:GLOBAL.YEAR_NO, :BSTRT030.DOC_TYPE,'T', P_ERR);

IF P_ERR IS NULL THEN :BSTRT030.DOC_NO :BSTRT030.TEMPNO := L_DOCNO; := L_DOCNO;

:BSTRT030.DOCNO_TEXT := L_DOCNO; :BSTRT030.DOC_STATUS := 'V'; :BSTRT030.DIS_STATUS := 'VALID'; :CONTENT.MESSAGES TO_CHAR( L_DOCNO); ELSE :CONTENT.ERRORS := P_ERR; := 'Document Saved VIDE NO. '||

RAISE FORM_TRIGGER_FAILURE; END IF;

END; ----------pre update -------DECLARE P_ERR VARCHAR2(100); BEGIN /*IF :BSTRT030.STORE_ID IS NULL THEN :CONTENT.MESSAGES := 'STORE CAN NOT BE NULL'; RAISE FORM_TRIGGER_FAILURE; */ --------------BY TAJIDNER DT 25-AUG-06 ----------------------------IF VALIDATE_HEADER(P_ERR) = 0 THEN :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; --------------BY TAJIDNER DT 25-AUG-06 ----------------------------END IF;--IF VALIDATE_HEADER(P_ERR) = 0 THEN :BSTRT030.MODIFIED_BY := :GLOBAL.USER_ID; :BSTRT030.MODIFIED_DATE := SYSDATE; :BSTRT030.TRN_FLAG := 'N';

END; ----------post query ---DECLARE P_ERR VARCHAR2(100);

BEGIN P_ERR:=NULL; :BSTRT030.NBT_STORE := GET_DESCRIPTION('STOR',:BSTRT030.STORE_ID,P_ERR); :BSTRT030.DIS_PARTY := GET_DESCRIPTION ('PRTY',:BSTRT030.PARTY_CODE,P_ERR); :NB_DIS_DOCTYPE := GET_DESCRIPTION('DTYP',:BSTRT030.DOC_TYPE,P_ERR); :BSTRT030.DIS_STATUS := GET_DOC_STATUS(:BSTRT030.DOC_STATUS); :BSTRT030.DOCNO_TEXT := :BSTRT030.DOC_NO; END;

---------post query other block ---DECLARE P_ERR VARCHAR2(100); BEGIN

P_ERR :=NULL; :BSTRT031.NBT_PART_DESC := GET_DESCRIPTION('MATR',:BSTRT031.MAT_CODE,P_ERR);

SELECT BASE_UNIT INTO :BSTRT031.NBT_UNIT FROM BCOMT002 WHERE PART_NO = :BSTRT031.PART_NO; END;

---------pre insert ------DECLARE P_ERR VARCHAR2(100); BEGIN

--------------BY TAJINDER DT 25-AUG-06 ----------------------------IF VALIDATE_DETAIL(P_ERR) = 0 THEN :CONTENT.ERRORS := P_ERR; RAISE FORM_TRIGGER_FAILURE; END IF;--IF VALIDATE_DETAIL(P_ERR) = 0 THEN --------------BY TAJINDER DT 25-AUG-06 -----------------------------

:BSTRT031.ENTERED_BY := :GLOBAL.USER_ID; :BSTRT031.ENTERED_DATE := SYSDATE;

:BSTRT031.STATUS END; ------------NBT_PRODUCTCODE ---------declare l_var varchar2(50);

:= 'V';

L_ERR VARCHAR2(100);

begin l_var := null;

GET_LOV1('PRODUCT',l_var,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN

:CONTENT.NBT_PRODUCTCODE := :GLOBAL.CODE; :CONTENT.NBT_PRODUCT_DESC := :GLOBAL.DES; END IF;

GO_BLOCK('PRODUCTPROCESS');

SET_BLOCK_PROPERTY('PRODUCTPROCESS',DEFAULT_WHERE,'PRODUCT CODE ='''|| :CONTENT.NBT_PRODUCTCODE ||'''');

EXECUTE_QUERY; -- GO_BLOCK('CONTENT'); end; ---------WHEN VALIDATE ITEM ----------

DECLARE P_ERR VARCHAR2(100); BEGIN

if :content.nbt_productcode is not null then :content.nbt_product_desc:=get_desc('PRODUCT',:content.nbt_productcode,P_ERR); end if; if p_err is not null then raise form_trigger_failure; end if;

end; ---------------KEY NEXT ITEM ---------DECLARE

BEGIN GO_BLOCK('PRODUCTPROCESS');

SET_BLOCK_PROPERTY('PRODUCTPROCESS',DEFAULT_WHERE,'PRODUC TCODE ='''|| :CONTENT.NBT_PRODUCTCODE ||'''');

EXECUTE_QUERY; END;

-------------KEY EXEQRY ------GO_BLOCK('PRODUCTPROCESS');

SET_BLOCK_PROPERTY('PRODUCTPROCESS',DEFAULT_WHERE,'PRODUCT CODE ='''|| :CONTENT.NBT_PRODUCTCODE ||'''');

EXECUTE_QUERY; -------------

PRE INSERT --DECLARE L_COUNT NUMBER:=0;

BEGIN --check for blank process code if :PRODUCTPROCESS.processcode is null then :content.messages:='Enter Process Code'; raise form_trigger_failure; end if;

--check for unique process code SELECT COUNT(*) INTO L_COUNT FROM PRODUCTPRoCESS WHERE PROCESSCODE=:PRODUCTPROCESS.PROCESSCODE; IF l_COUNT>0 THEN :CONTENT.MESSAGES:=''' '||:PRODUCTPROCESS.PROCESSCODE||''' already exists. Enter another Process code'; raise form_trigger_failure; END IF;

--check for blank process description if :PRODUCTPROCESS.processdescription is null then :content.messages:='Enter Process Description'; raise form_trigger_failure; end if;

:PRODUCTPROCESS.PRODUCTCODE:=:CONTENT.NBT_PRODUCTCODE;

END;

------------KEY LISTVAL ------declare l_var varchar2(100); L_ERR VARCHAR2(100);

begin l_var := null;

GET_LOV1('PROCESSDESC',l_var,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN -- MESSAGE(LENGTH(:GLOBAL.DES));PAUSE; :PRODUCTPROCESS.PROCESSDESCRIPTION:= :GLOBAL.DES; -- :ITEMMASTER.NBT_PROCESSDES := :GLOBAL.DES; END IF;

exception when others then :content.errors:=sqlerrm;

END;

--------key listval ----declare l_var varchar2(50); L_ERR VARCHAR2(100);

begin

l_var:= 'PARTYTYPE =''Department''';

GET_LOV1('PARTY',l_var,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN :PRODUCTMASTER.NBT_PARTY := :GLOBAL.DES; :PRODUCTMASTER.PARTYCODE := :GLOBAL.CODE; END IF;

end;

--------------when validate item --------DECLARE P_ERR VARCHAR2(100); BEGIN P_ERR:=NULL; IF :PRODUCTMASTER.PARTYCODE IS NOT NULL THEN :PRODUCTMASTER.NBT_PARTY := GET_DESC('PARTY', :PRODUCTMASTER.PARTYCODE,P_ERR); IF P_ERR IS NOT NULL THEN RAISE FORM_TRIGGER_FAILURE; END IF; END IF;

end; -------------post INSERT ---------INSERT INTO PRODUCTPROCESS(PROCESSCODE,PRODUCTCODE,PROCESSDESCRIPTION) VALUES(:PRODUCTMASTER.PRODUCTCODE || '01',:PRODUCTMASTER.PRODUCTCODE,'Not Applicable' ); -----------------------

CREATE TABLE BVERT001 ( DOC_NO DOC_DATE YEAR_NO DOC_TYPE CLIENT_NAME REMARKS STATUS ENTERED_BY ENTERED_DATE MODIFIED_BY MODIFIED_DATE AUTHORISED_BY AUTHORISED_DATE NUMBER(8) , DATE , NUMBER, VARCHAR2(50), VARCHAR2(100), VARCHAR2(500) , VARCHAR2(1), VARCHAR2(50), DATE, VARCHAR2(50), DATE, VARCHAR2(50), DATE,

CONSTRAINT PK_BVERT001 PRIMARY KEY(DOC_NO,YEAR_NO) );

-------CREATE TABLE BVERT002 ( DOC_NO DOC_DATE NUMBER(8) , DATE ,

YEAR_NO DOC_TYPE SR_NO MODULE_NAME FORM_NAME FORM_DESC FUNCTION_ID STATUS USER_NAME ENTERED_BY ENTERED_DATE MODIFIED_BY MODIFIED_DATE AUTHORISED_BY AUTHORISED_DATE

NUMBER, VARCHAR2(50), NUMBER , VARCHAR2(100), VARCHAR2(100), VARCHAR2(100), VARCHAR2(50), VARCHAR2(1), VARCHAR2(100), VARCHAR2(50), DATE, VARCHAR2(50), DATE, VARCHAR2(50), DATE,

CONSTRAINT PK_BVERT002 PRIMARY KEY(DOC_NO,YEAR_NO,SR_NO) );

========= INSERT INTO BVERT001( DOC_NO ,DOC_DATE,YEAR_NO,DOC_TYPE ,CLIENT_NAME,REMARKS,STATUS ) VALUES (1,'07-APR-11',2010,'MARS','MAHLE PRIVATE LIMITED','TEST','V');

INSERT INTO BPVRT001( DOC_NO ,DOC_DATE,YEAR_NO,DOC_TYPE ,CLIENT_NAME,REMARKS,STATUS ) VALUES (1,'06-APR-11',2010,'MARSA','SPM PRIVATE LIMITED','TESTA','V');

========= INSERT INTO BVERT002( DOC_NO ,DOC_DATE,YEAR_NO,DOC_TYPE ,SR_NO,MODULE_NAME, FORM_NAME,FORM_DESC,FUNCTION_ID,STATUS,USER_NAME,TRN_FLAG) VALUES (1,'25-MAR-11',2011,'HMM',1,'MASTERS','MISSCELENEOUS','DESCRIPTION TOTALLY','BBFAST300R01','V','ANAMIKA','Y');

--INSERT INTO BPVRT002( DOC_NO ,DOC_DATE,YEAR_NO,DOC_TYPE ,SR_NO,MODULE_NAME, FORM_NAME,FORM_DESC,FUNCTION_ID,STATUS,USER_NAME) VALUES (1,'25-MAR-11',2011,'HMM',2,'MASTERS','MISSCELENEOUS','DESCRIPTION TOTALLY','BBFAST300R01','V','AMIT'); -------ALTER TABLE BVERT002 ADD TRN_FLAG VARCHAR2(1);

----------------ALTER TABLE BVERT002

ADD LOCATION VARCHAR2(1); ------------ALTER TABLE BVERT002 DROP COLUMN LOC_DATE ; ------ALTER TABLE BVERT002 ADD UNLOCK_DATE DATE;

------------ALTER TABLE BVERT002 ADD LOCK_DATE DATE;

-------ALTER TABLE BVERT002 ADD UNBLOCK_DATE DATE; -------ALTER TABLE BVERT002 DROP COLUMN LOCATION ; ---------ALTER TABLE BVERT002 ADD LOCATION VARCHAR2(500) ;

--------------

ATTENDANCE POPULATE CODE(for new row insertion in new table to see web ibs form bpayt475) ---DECLARE CURSOR CUR_EMP IS SELECT distinct cardno FROM BPAYT_ATTENDANCE WHERE ATTD_DATE BETWEEN '01-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR') AND LAST_DAY(:BPAYT475.POP_MONTH) ORDER BY CARDNO;

CURSOR CUR_DET (P_EMP NUMBER)IS SELECT a.EMP_CODE,b.cardno,b.ATTD_DATE,b.IN1, T_1,T_2,T_3,T_4,T_5,T_6,T_7,T_8,T_9,T_10,T_11,T_12,T_13,T_14,T_15,T_1 6,T_17,T_18,T_19,T_20,T_21,T_22,T_23,T_24,T_25,T_26,T_27,T_28,T_29,T_30,T_31 FROM BPAYT476 A,BPAYT_ATTENDANCE B WHERE A.EMP_CODE(+) = B.CARDNO AND A.EMP_CODE = P_EMP AND TO_CHAR(A.POP_MONTH,'MON-RR') = TO_CHAR(B.ATTD_DATE,'MON-RR') --and in1 is not null ORDER BY A.EMP_CODE,B.ATTD_DATE;

L_SR NUMBER(10):=0; L_ROWS NUMBER(10):=0;

BEGIN DELETE FROM BPAYT476 WHERE DOC_ID = :BPAYT475.DOC_ID;

FOR REC IN CUR_EMP LOOP L_SR := L_SR+1; INSERT INTO BPAYT476(DOC_ID,SR_NO,EMP_CODE,POP_MONTH,T_1,T_2,T_3,T_4,T_5,T_6, T_7 ,T_8,T_9,T_10,T_11,T_12,T_13,T_14,T_15,T_16,T_17,T_18,T_19,T_20,T_21,T_2 2,T_23,T_24,T_25,T_26,T_27,T_28,T_29,T_30,T_31) VALUES (:BPAYT475.DOC_ID,L_SR,REC.CARDNO,:BPAYT475.POP_MONTH,'N','N','N','N',' N','N','N' ,'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N'); COMMIT; END LOOP;

GO_BLOCK('BPAYT476'); EXECUTE_QUERY; FIRST_RECORD; LAST_RECORD; L_ROWS := :SYSTEM.TRIGGER_RECORD; FIRST_RECORD;

FOR I IN 1..L_ROWS LOOP

FOR REC IN CUR_DET(:BPAYT476.EMP_CODE) LOOP IF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '01' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_1 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '02' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_2 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '03' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_3 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '04' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_4 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '05' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_5 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '06' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_6 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '07' AND

TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_7 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '08' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_8 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '09' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_9 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '10' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_10 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '11' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_11 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '12' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_12 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '13' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_13 := 'Y';

ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '14' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_14 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '15' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_15 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '16' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_16 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_17 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_18 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_19 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN

:BPAYT476.T_20 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_21 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_22 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_23 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_24 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_25 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_26 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND

TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_27 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_28 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_29 := 'Y'; ELSIF REC.IN1 IS NOT NULL AND TO_CHAR(REC.ATTD_DATE,'DD') = '17' AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN :BPAYT476.T_30 := 'Y'; END IF; END LOOP; NEXT_RECORD; END LOOP; COMMIT_FORM; FIRST_RECORD;

END;

----------------

FOR UPDATION CODE ---------

DECLARE CURSOR CUR(P_EMP NUMBER) IS /** SELECT DISTINCT A.CARDNO,A.PUNCH_DATE,A.ATTD_DATE,A.IN1,A.OUT1,A.TOTAL_DURATI ON ,A.SHIFT_CODE,A.DAY_STATUS, B.FR_SHIFT_TIME,B.TO_SHIFT_TIME,A.EMP_CODE FROM BPAYT_ATTENDANCE A, BPAYT003 B WHERE A.SHIFT_CODE = B.SHIFT_CODE AND A.EMP_CODE = P_EMP AND A.ATTD_DATE BETWEEN '01-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR') AND LAST_DAY(:BPAYT475.POP_MONTH) AND CARDNO = 1005 ORDER BY CARDNO; **/

SELECT a.EMP_CODE,b.cardno,b.ATTD_DATE,b.IN1,b.shift_from,b.shift_to, T_1,T_2,T_3,T_4,T_5,T_6,T_7,T_8,T_9,T_10,T_11,T_12,T_13,T_14,T_15,T_1 6,T_17,T_18,T_19,T_20,T_21,T_22,T_23,T_24,T_25,T_26,T_27,T_28,T_29,T_30,T_31 FROM BPAYT476 A,BPAYT_ATTENDANCE B WHERE A.EMP_CODE(+) = B.CARDNO

AND A.EMP_CODE = P_EMP AND TO_CHAR(A.POP_MONTH,'MON-RR') = TO_CHAR(B.ATTD_DATE,'MON-RR') --and in1 is not null ORDER BY A.EMP_CODE,B.ATTD_DATE;

L_SR NUMBER(10):=0; L_ROWS NUMBER(10):=0; BEGIN COMMIT_FORM; L_ROWS := :SYSTEM.TRIGGER_RECORD; -FIRST_RECORD; FOR I IN 1..L_ROWS LOOP FOR REC IN CUR(:BPAYT476.EMP_CODE) LOOP IF :BPAYT476.T_1 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE =REC.SHIFT_from, =REC.SHIFT_to = '01'

CARDNO =REC.EMP_CODE AND ATTD_DATE = '01-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_1 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '01-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); END IF; =NULL, =NULL = '01'

IF :BPAYT476.T_2 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE = '02'

SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '02-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to

ELSIF :BPAYT476.T_2 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '02-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '02'

IF :BPAYT476.T_3 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '03-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '03'

ELSIF :BPAYT476.T_3 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE =NULL, =NULL = '03'

AND ATTD_DATE = '03-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

END IF;

IF :BPAYT476.T_4 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '04-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '04'

ELSIF :BPAYT476.T_4 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE = '04'

SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '04-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL

END IF;

IF :BPAYT476.T_5 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '05-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '05'

ELSIF :BPAYT476.T_5 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '05-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '05'

END IF;

IF :BPAYT476.T_6 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 =REC.SHIFT_from, =REC.SHIFT_to = '06'

WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '06-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_6 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '06-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '06'

END IF;

IF :BPAYT476.T_7 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') = '07'

AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '07-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to

ELSIF :BPAYT476.T_7 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '07-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '07'

END IF;

IF :BPAYT476.T_8 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '08-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '08'

ELSIF :BPAYT476.T_8 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 =NULL, = '08'

OUT1 WHERE

=NULL

CARDNO =REC.EMP_CODE AND ATTD_DATE = '08-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

END IF;

IF :BPAYT476.T_9 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '09-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '09'

ELSIF :BPAYT476.T_9 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '09-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '09'

END IF;

IF :BPAYT476.T_10 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE =REC.SHIFT_from, =REC.SHIFT_to = '10'

CARDNO =REC.EMP_CODE AND ATTD_DATE = '10-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_10 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '10-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '10'

END IF;

IF :BPAYT476.T_11 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN = '11'

UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '11-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to

ELSIF :BPAYT476.T_11 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '11-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '11'

END IF;

IF :BPAYT476.T_12 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '12-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '12'

ELSIF :BPAYT476.T_12 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 =NULL, =NULL = '12'

WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '12-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

END IF;

IF :BPAYT476.T_13 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '13-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '13'

ELSIF :BPAYT476.T_13 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') = '13'

AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '13-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL

END IF;

IF :BPAYT476.T_14 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE =REC.SHIFT_from, =REC.SHIFT_to = '14'

AND ATTD_DATE = '14-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_14 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '14-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '14'

END IF;

IF :BPAYT476.T_15 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE = '15'

SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '15-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to

ELSIF :BPAYT476.T_15 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '15-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '15'

END IF;

IF :BPAYT476.T_16 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '16-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '16'

ELSIF :BPAYT476.T_16 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 =NULL, =NULL = '16'

WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '16-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

END IF;

IF :BPAYT476.T_17 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '17-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '17'

ELSIF :BPAYT476.T_17 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') = '17'

AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '17-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL

END IF;

IF :BPAYT476.T_18 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE =REC.SHIFT_from, =REC.SHIFT_to = '18'

AND ATTD_DATE = '18-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_18 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '18-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '18'

END IF;

IF :BPAYT476.T_19 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN = '19'

UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '19-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to

ELSIF :BPAYT476.T_19 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '19-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '19'

END IF;

IF :BPAYT476.T_20 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '20-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '20'

ELSIF :BPAYT476.T_20 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 =NULL, = '20'

OUT1 WHERE

=NULL

CARDNO =REC.EMP_CODE AND ATTD_DATE = '20-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

END IF;

IF :BPAYT476.T_21 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '21-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '21'

ELSIF :BPAYT476.T_21 = 'N'

AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN

= '21'

UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '21-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL

END IF;

IF :BPAYT476.T_22 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE =REC.SHIFT_from, =REC.SHIFT_to = '22'

AND ATTD_DATE = '22-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_22 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '22-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '22'

END IF;

IF :BPAYT476.T_23 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE = '23'

SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '23-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to

ELSIF :BPAYT476.T_23 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '23-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '23'

END IF;

IF :BPAYT476.T_24 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '24-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '24'

ELSIF :BPAYT476.T_24 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE =NULL, =NULL = '24'

CARDNO =REC.EMP_CODE AND ATTD_DATE = '24-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

END IF;

IF :BPAYT476.T_25 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '25-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '25'

ELSIF :BPAYT476.T_25 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN = '25'

UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '25-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL

END IF;

IF :BPAYT476.T_26 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '26-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '26'

ELSIF :BPAYT476.T_26 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '26-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '26'

END IF;

IF :BPAYT476.T_27 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 =REC.SHIFT_from, = '27'

OUT1 WHERE

=REC.SHIFT_to

CARDNO =REC.EMP_CODE AND ATTD_DATE = '27-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_27 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '27-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '27'

END IF;

IF :BPAYT476.T_28 = 'Y'

AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN

= '28'

UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '28-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to

ELSIF :BPAYT476.T_28 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '28-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '28'

END IF;

IF :BPAYT476.T_29 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '29-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '29'

ELSIF :BPAYT476.T_29 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET = '29'

IN1 OUT1 WHERE

=NULL, =NULL

CARDNO =REC.EMP_CODE AND ATTD_DATE = '29-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

END IF;

IF :BPAYT476.T_30 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '30-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =REC.SHIFT_from, =REC.SHIFT_to = '30'

ELSIF :BPAYT476.T_30 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '30-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '30'

END IF;

IF :BPAYT476.T_31 = 'Y' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE =REC.SHIFT_from, =REC.SHIFT_to = '31'

CARDNO =REC.EMP_CODE AND ATTD_DATE = '31-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR');

ELSIF :BPAYT476.T_31 = 'N' AND TO_CHAR(REC.ATTD_DATE,'DD') AND TO_CHAR(REC.ATTD_DATE,'MONRR')=TO_CHAR(:BPAYT476.POP_MONTH,'MON-RR') THEN UPDATE BPAYT_ATTENDANCE SET IN1 OUT1 WHERE CARDNO =REC.EMP_CODE AND ATTD_DATE = '31-'|| TO_CHAR(:BPAYT475.POP_MONTH,'MON-RR'); =NULL, =NULL = '31'

END IF;

COMMIT; END IF; END LOOP; --NEXT_RECORD; END LOOP; COMMIT_FORM; -FIRST_RECORD;

EXCEPTION WHEN OTHERS THEN NULL;

END;

----------------CODE FOR VALIDATE ITEM (EK HI PARTY_CODE ENTRY NI HOGI) -------WHEN VALIDATE ITEM --------DECLARE P_ERR VARCHAR2(100); L_DESC VARCHAR2(100);

BEGIN IF :system.BLOCK_STATUS<>'QUERY' THEN IF :BCOMT001.PARTY_CODE IS NOT NULL THEN P_ERR:=NULL;

IF :PARAMETER.P_TYPE = 'COMPANY' THEN SELECT MAX(PARTY_FNAME) INTO L_DESC FROM BCOMT001 WHERE PARTY_CODE = :BCOMT001.PARTY_CODE;

IF NVL(:GLOBAL.MERGE,'N') = 'Y' THEN GET_PARTY_DATA(:BCOMT001.PARTY_CODE); END IF; --IF NVL(:GLOBAL.MERGE,'N') = 'N' THEN ELSE SELECT MAX(PARTY_FNAME) INTO L_DESC FROM BCOMT001 WHERE PARTY_CODE = :BCOMT001.PARTY_CODE; END IF; --IF :PARAMETER.P_TYPE = 'COMPANY' THEN

IF L_DESC IS NOT NULL THEN :CONTENT.MESSAGES := 'RECORD ALREADY EXISTS..'||L_DESC; RAISE FORM_TRIGGER_FAILURE; ELSE

:BCOMT001.CNSG_CODE := :BCOMT001.PARTY_CODE; :CONTENT.MESSAGES END IF; END IF; --IF :BCOMT001.PARTY_CODE IS NOT NULL THEN END IF; --IF :system.BLOCK_STATUS<>'QUERY' THEN END; ---------KEY LIST VAL -------declare L_VAR varchar2(50); L_ERR VARCHAR2(100); begin L_VAR := ' PARTY_TYPE = ''C'' '; get_newlov('PRTY',L_VAR,L_ERR); IF :GLOBAL.CODE IS NOT NULL THEN :BCOMT001.PARTY_CODE := :GLOBAL.CODE; -:BCOMT001.PARTY_FNAME := :GLOBAL.DES; END IF; IF L_ERR IS NOT NULL THEN :CONTENT.MESSAGES:=L_ERR; ELSE :CONTENT.MESSAGES:=''; := '';

END IF; end; -------CODE FOR(POULATE CODE FOR DATE BETWEEN TOW DATES) --------PROCEDURE POPULATE_DATA_NEW IS BEGIN

IF :CONTENT.NBT_SEARCH = 'E' THEN GO_BLOCK('BPAYT005'); SET_BLOCK_PROPERTY('BPAYT005',DEFAULT_WHERE,'ATTD_DATE BETWEEN :CONTENT.NBT_DATE AND :CONTENT.NBT_DATE1 AND EMP_CODE IN (SELECT EMP_CODE FROM BPAYT030 WHERE comp_locn= nvl(:content.locn_id,comp_locn) AND EMP_CODE =nvl(:content.EMP_CODE,EMP_CODE) ) AND (IN_TIME IS NOT NULL OR OUT_TIME IS NOT NULL) ORDER BY EMP_CODE,IN_TIME DESC'); ELSIF :CONTENT.NBT_SEARCH = 'D' THEN GO_BLOCK('BPAYT005'); SET_BLOCK_PROPERTY('BPAYT005',DEFAULT_WHERE,'ATTD_DATE BETWEEN :CONTENT.NBT_DATE AND :CONTENT.NBT_DATE1

AND EMP_CODE IN (SELECT EMP_CODE FROM BPAYT030 WHERE comp_locn= nvl(:content.locn_id,comp_locn) AND EMP_CODE =nvl(:content.EMP_CODE,EMP_CODE) ) AND (IN_TIME IS NOT NULL OR OUT_TIME IS NOT NULL) ORDER BY ATTD_DATE,IN_TIME DESC'); END IF; EXECUTE_QUERY; first_RECORD;

EXCEPTION WHEN OTHERS THEN :CONTENT.ERRORS := SQLERRM;

END; -CALL KRENGE (WHEN BUTTON PREESED) ---

IF TO_NUMBER(TO_CHAR(:CONTENT.NBT_DATE,'D')) ='1' THEN SET_ALERT_PROPERTY('G_ALERT',ALERT_MESSAGE_TEXT,'Do You Want To Populate Attendace On Sunday '); IF SHOW_ALERT('G_ALERT') =88 THEN

POPULATE_DATA_NEW; --LATE_TIME(:EMP_CODE); END IF; ELSE POPULATE_DATA_NEW; --LATE_TIME(:EMP_CODE); END IF;

-------------POPULATE TIME(LIST WISE) -------PROCEDURE POPULATE_TIME IS L_NO NUMBER(5):=0;

BEGIN IF :NBT_SHIFT IS NOT NULL THEN SELECT FR_SHIFT_TIME ,TO_SHIFT_TIME INTO :CONTENT.NBT_INTIME,:CONTENT.NBT_OTIME FROM BPAYT003 WHERE SHIFT_CODE = :NBT_SHIFT; END IF;

IF :CONTENT.NBT_INTIME IS NOT NULL OR :CONTENT.NBT_OTIME IS NOT NULL THEN GO_BLOCK('BPAYT005'); LAST_RECORD; L_NO := :SYSTEM.TRIGGER_RECORD; FIRST_RECORD; FOR CUR IN 1..L_NO LOOP

:BPAYT005.IN_TIME := :CONTENT.NBT_INTIME; :BPAYT005.OUT_TIME := :CONTENT.NBT_OTIME; :BPAYT005.SHIFT := :CONTENT.NBT_SHIFT;

NEXT_RECORD; END LOOP; FIRST_RECORD; END IF;--IF :CONTENT.NBT_TIME IS NOT NULL THEN

END; -----------------POPULATE LOCATION(LIST WISE) ---------

PROCEDURE POPULATE_LOCNDATA IS

CURSOR CUR_USER IS SELECT ROWNUM LIST_IND, B.MAPPING_ID,B.MAPPING_DESC FROM BPAYT001 A,BPAYT0012 B WHERE A.YR_STATUS = 'O' ORDER BY MAPPING_DESC;

L_INDEX NUMBER(2) := 0;

BEGIN CLEAR_LIST ('CONTENT.LOCN_ID'); FOR CUR_REC IN CUR_USER LOOP ADD_LIST_ELEMENT ('CONTENT.LOCN_ID', CUR_REC.LIST_IND, CUR_REC.MAPPING_DESC, CUR_REC.MAPPING_ID); END LOOP;

EXCEPTION WHEN OTHERS THEN NULL; END; ------CODE FOR TIME DIFFERENCE ---------PROCEDURE TIME_DIFF IS

l_in l_out

number;

number;

l_duration number; hour m_in minute s_in second number; number; number; number; number;

t_duration varchar2(20); begin IF :BPAYT005.IN_TIME IS NOT NULL AND :BPAYT005.OUT_TIME IS NOT NULL THEN

l_duration:=(:BPAYT005.out_time - :BPAYT005.in_time);

l_in:=l_duration*24; hour:=trunc(l_in); m_in:=(l_in-hour)*60; minute:=trunc(m_in); s_in:=(m_in-minute)*60; second:=round(s_in); IF second = 60 THEN second := 0; minute := minute +1; END IF; t_duration:=hour||':'||minute||':'||second;

:BPAYT005.DURATION :=t_duration; END IF; END; --------LEAVE DATE -----FUNCTION LEAVE_DATE RETURN NUMBER IS L_COUNT NUMBER(2) :=0; BEGIN

L_COUNT :=0;

IF :BPAYT005.ATTD_DATE IS NOT NULL AND :BPAYT005.EMP_CODE IS NOT NULL THEN SELECT COUNT(EMP_CODE) INTO L_COUNT FROM BPAYT065 WHERE :BPAYT005.ATTD_DATE BETWEEN FROM_DATE AND TO_DATE AND EMP_CODE = :BPAYT005.EMP_CODE AND STATUS ='A';

IF L_COUNT >0 THEN :BPAYT005.DAY_STATUS :='LEAVE'; END IF; END IF;

RETURN(L_COUNT); EXCEPTION WHEN OTHERS THEN RETURN(L_COUNT); END; -------LATE TIME -------

PROCEDURE LATE_TIME(P_EMPCODE IN NUMBER ) IS

L_LATETIME NUMBER ; L_SHIFTTIME DATE; L_INTIME DATE; L_COUNT NUMBER :=0; BEGIN

--SELECT A.SHIFT_CODE,TO_CHAR(A.FR_SHIFT_TIME,'HH24:MI') SHIFT_TIME,A.LOCN_ID,A.SHIFT_FLAG FROM BPAYT003 A --WHERE A.SHIFT_CODE IN (SELECT SHIFT_CODE FROM BPAYT030 B) ; SELECT COUNT(*) INTO L_COUNT FROM BPAYT005 WHERE ATTD_DATE=:CONTENT.NBT_DATE AND IN_TIME IS NOT NULL;

IF L_COUNT > 0 THEN FOR I IN 1..L_COUNT LOOP SELECT A.FR_SHIFT_TIME SHIFT_TIME INTO L_SHIFTTIME FROM BPAYT003 A WHERE A.SHIFT_CODE IN (SELECT SHIFT_CATG FROM BPAYT030 B WHERE EMP_CODE=P_EMPCODE);

--MESSAGE(P_EMPCODE);PAUSE; SELECT IN_TIME INTO L_INTIME FROM BPAYT005 WHERE IN_TIME IS NOT NULL AND EMP_CODE = P_EMPCODE;

L_LATETIME := L_INTIME - L_SHIFTTIME;

:LATE_BY := L_LATETIME; END LOOP; END IF;

EXCEPTION WHEN OTHERS THEN :CONTENT.ERRORS := SQLERRM;

END; --------

You might also like