الانتقال إلى المحتوى

طريقة عمل ازرار لترتيب (Sort) الـ Tabular block


khaled

Recommended Posts

السلامُ عليكم
نتيجه للقصور الكثير الذي يوجد في الـ developer يتوجب احياناً على المبرمج ان يقوم بعمل ما يحتاجه بنفسه .
لا شك انه في بعض الاحيان يكون لديك Tabular block يحوي المئات او الالاف من السجلات , وعملية البحث عن معلومه معينه يكون من الصعب الحصول عليها خاصة عندما تكن البيانات غير مرتبه .
لذلك قمت بعمل كود برمجي عام يمكن ان نقوم بوضعه في الـobject libarary ومن ثم نستخدمه مع اي Form نستطيع من خلاله استبدال الـPrompet التابع لكل حقل في الـ Tabular block الى زر يمكن ان نستخدمه في عملية الترتيب .


وإليكم الخطوات :
1-نقوم بعمل Control Block ونضع به عدد كبير من الازرار وليكن عدد 65 زر حسب اكبر عدد متوقع من الحقول ممكن ان يكون موجود في الـtabular block ولتكن تسميت الازرار B1 ,B2 ........B65
2- نعمل package يحوي عدد 2 procedures الاول لعمل ترتيب للازرار ووضعها بدلام من الـ Prompets والثاني لعمل ترتيب عندما نضغط على اي زر .
وهذا كود الـ package specification.

PACKAGE Sort_pkg IS

 PROCEDURE Arrange_buttons (p_Block_name VARCHAR2);
PROCEDURE Sort_Block (p_Column_Name VARCHAR2
   , p_Block_Name VARCHAR2 := NULL);

END;



كود الـ package body

PACKAGE BODY SORT_PKG IS

 	g_Block_Name VARCHAR2(200);
 	g_Last_Block_Name VARCHAR2(200);
 	g_Last_Column_Name VARCHAR2(200);

 	FUNCTION Is_Item_Sortable(p_Item VARCHAR2) RETURN NUMBER
 	IS
   l_ret_val NUMBER := -1;
   l_is_visible varchar2(30);
   l_calc_mode varchar2(30);
   l_column_name varchar2(200);
   l_is_database_item varchar2(30);
 	BEGIN
   if p_item is null then
   	return (-1);
   end if;

   l_column_name:=Get_item_property(P_item,column_name);
   	l_is_visible := get_item_property(p_item, VISIBLE);
--    	l_is_database_item := get_item_property(p_item, DATABASEITEM);
   IF l_is_visible = 'TRUE'
     and l_column_name is not null      	
   	-- and	l_is_database_item = property_true
   	-- and	l_calc_mode is none 
   	THEN
   	l_ret_val := 1; -- means sortable
   ELSIF l_is_visible='TRUE' AND l_column_name is null then 
     l_ret_val:=0; --calculated item button shud apper but disapled
   ELSE
     l_ret_val:=-1;
   END IF;
   
   RETURN l_ret_Val;
   exception 
   	when others then
     return (-1);
 	END;      
 	
 	PROCEDURE Arrange_buttons (p_Block_name VARCHAR2)
 	IS
   Cur_item VARCHAR2(200):=p_Block_name || '.' || Get_block_property(p_Block_name,first_item);
   Lst_item VARCHAR2(200):=p_Block_name || '.' || Get_block_property(p_Block_name,last_item);
 	Type Button_record is record
   (	
     X number,
     Y number,
     W number,
     L varchar2(200),
     c_name varchar2(200)
   );
 	B_rec Button_record;
 	B_Name varchar2(200);
 	I integer:=0;
 	l_is_Sort boolean := TRUE;
 	BEGIN
   g_Block_Name := p_Block_Name;
--    go_item(Cur_item);
    Loop
--      Cur_item:=:System.cursor_item;
     	Exit when Cur_item IS NULL;
     	IF Is_Item_Sortable(cur_item)=1
       OR Is_Item_Sortable(cur_item)=0 THEN -- l_is_sort then
       i:=i+1;
       B_name:='B'||i;
       --Get The text item property
       B_rec.x:=Get_item_property(cur_item,x_pos);
       B_rec.y:=Get_item_property(cur_item,y_pos);
       B_rec.w:=Get_item_property(cur_item,width);
       B_rec.l:=Get_item_property(cur_item,PROMPT_TEXT );
       B_rec.c_name:=Get_item_property(cur_item,column_name);
       --Set the button property 
       Set_item_property(B_name,x_pos,B_rec.x);
       Set_item_property(B_name,y_pos,B_rec.y-15);
       Set_item_property(B_name,width,B_rec.w);
       Set_item_property(B_name,label, B_rec.L);
       Set_item_property(B_name,hint_text, B_rec.c_name);
       Set_item_property(B_name,visible, PROPERTY_TRUE);
       Set_item_property(B_name,enabled, PROPERTY_TRUE);
       set_item_property(cur_item, PROMPT_TEXT, ' ');
       IF Is_Item_Sortable(cur_item)=0 THEN
       	Set_item_property(B_name,enabled, PROPERTY_FALSE);
       END IF;
       
     END IF;
     	cur_item := get_item_property(cur_item, NEXTITEM);
     	EXIT WHEN cur_item is null;
     	cur_item := p_block_name || '.' || cur_item;
--      	next_item;
--      	Exit when Cur_item = Lst_item;
    End loop;
 	END;

 	PROCEDURE Sort_block (p_Column_Name VARCHAR2
   , p_Block_Name VARCHAR2 := NULL)
 	IS
--    Cur_item VARCHAR2(200):=p_Block_Name || '.' ||get_item_property(:system.cursor_item,hint_text);
   order_by_list varchar2(200) := p_Column_Name;
   l_Block_Name VARCHAR2(200) := p_Block_Name;
 	BEGIN
   --msg (Cur_item);
   if l_block_name is null then
   	l_block_name := g_Block_Name;
   end if;
   if l_block_name is null then
   	message('block name is not set, please call arrange_buttons first');
   	raise form_trigger_failure;
   end if;
   
   IF g_Last_Block_Name = l_Block_Name THEN
   	if g_last_Column_Name is not null then
     order_by_list := order_by_list || ', ' || g_last_column_name;
   	end if;
   ELSE
   	g_Last_Column_Name := NULL;
   END IF;
   
--     set_block_property(p_Block_Name,order_by, get_item_property(:system.cursor_item,hint_text));
    set_block_property(l_Block_Name,order_by, order_by_list);
    g_last_block_name := l_block_name;
    g_last_column_name := p_column_name;
   go_block(l_Block_Name);
   if form_success then
   	execute_query;
--    	go_item(Cur_item);
   	go_item(l_block_name || '.' || p_column_name);
   end if;
 	END;  	
END;



3- الان نحتاج الى ان نحدد الـtabular block الذي نحتاج ان نستبدل الـprompet الخاص به الى ازرار وتكن كالاتي
في الـ Trigger المسمى When-new-form-instanceالخاص بالـForm
اعمل

sort_pkg.arrange_buttons('emp');


حيث ان emp هو اسم الـTabular block الذي نريد ان نعمل له ترتيب

الان نفذ الـForm ثم لاحظ انك تستطيع ان ترتب البيانات الموجوده في الـ block بمجرد الضغط على الزر .

ملاحظه :
الـobject مصمم بحيث ان يمكن ان يعمل مع اي فورم وذلك بوضعه في object libarary ومن ثم استخدامه مع اي فورم وهنا تكمن فائده الـGeneric coding.
فكل ما عليك فقط هو ان تضع الـpackage والـ control block الموجود به الازرار في object group ومن ثم تضع الـ object group في object libaray .

وهذا هو Form جاهز يحوي الـblock والـ package

Sort.fmb

رابط هذا التعليق
شارك

  • بعد 2 سنة...
  • بعد 4 شهور...
  • بعد 2 سنة...

الحمد لله والصلاه والسلام علي رسول الله صلي الله عليه وسلم
اللهم ربنا يا اله كل شئ وخالق كل شئ لا تسالنا عن شئ واغفر لنا كل شئ
انا واخي الكريم واخواننا وجميع المسلمين والمسلمات والمؤمنين والمؤمنات من اول الخلق الي يوم الدين وكل من له علينا حق واغتبناه او بهتناه او نلنا منه بما لا يرضيك واجعله له نورا يوم القيامه
اللهم ربنا ما بيينا وبين جلالتك فاغفره لنا فانت الغفور الرحيم لا غفور غيرك وما بيننا وبين عبادك فتحمله عنا فانت الله الواحد القهار الديان الله امين وصلي اللهم علي سيدنا محمد وعلي اله وصحبه اجميعن ومن بتعه باحسان الي يوم الدين
امين امين امين امين امين

رجاء وضع الفورم لانه تم حذفه حتي تتم الاستفاده المثلي ولك مني جزيل الشكر والعرفان

رابط هذا التعليق
شارك

  • بعد 3 سنة...
  • بعد 8 شهور...

هل يتم كتابة اى كود على الزر لانه لا يفعل اى شئ

وشكرا على المجهود الرائع

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية