الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة تغيير لون الحقل على حسب التاريخ

مغلق
بدأه naif224 في 13 نوفمبر 2005 · 7 رد · 1,544 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لقد عملت فورم من نوع Tabulare ، وضعت فيها الـ id,name,hiredate

ثم عملت مقارنة بعد كل fetch في الـ cursor حيث : إذا كان الـ sysdate أكبر من او يساوي الـ hiredate

فيغير لون حقل الـ ID إلى الأحمر ، أما اذا كان اصغر منه فيغير لون حقل الـ ID الى الأخضر .

ولكن لم ينفع حيث لا يقارن sysdate بالـ hiredate

IF(SYSDATE >= :HIREDATE)THEN

لما كتبت هذه الجملة " لا يقارن sysdate بالـ hiredate " لم اقصد انه يعطيني رسالة خطأ أنما النتيجة التي بالفورم ليس صحيحة

ولكن لما اكتبله :

IF(SYSDATE >= :SYSDATE+1)THEN

فانه يعطي النتيجة بالشكل الصحيح ، ولكني اريده يقارن الـ SYSDATE بالـ HIREDATE

هذا هو كود الـ Tabulare :

DECLARE

  	CURSOR INFO IS SELECT ID,NAME,HIREDATE
  	FROM TEST ;

BEGIN GO_BLOCK('TEST');
  	FIRST_RECORD;
  	OPEN INFO;
  	LOOP

  		FETCH INFO INTO :TEST.ID,:TEST.NAME,:TEST.HIREDATE; IF(SYSDATE >= :HIREDATE)THEN
  			set_item_property('ID',background_color,'r100g25b0');
  			ELSE
  			set_item_property('ID',background_color,'r25g100b0');
  		END IF;

  		NEXT_RECORD;
  		EXIT WHEN INFO%NOTFOUND;

  	END LOOP;
  	CLOSE INFO;
  	FIRST_RECORD;

END;

أضفت الجدول والقيم في ملف من نوع txt وكذلك الفورم ، ارجو مراجعة الفورم وحل المشكلة

ولن انسى الذي يساعدني بالدعاء له : اللهم اجعل مثواه الجنة من يساعدني في حل هذه المشكلة ،، اللهم آمين

Desktop.rar

#2

الأخ naif224

لاحظ أن ID في الـ Canvas هو عبارة عن كتلة واحدة (عنصر واحد) وإذا غيرت اللون فإنه يتغيير للكتلة كامل وليس لسطر واحد فقط

ولاحظ أن بياناتك ثلاثة أسطر ولكن يتم إضافة سطر رابع والسطر الرابع هو حقل فارغ

ففي الدورة الأولى يغيير اللون إلى اللون الأحمر وكذللك في الثانية

أما في الدورة الثالثة وهي عندما لا يتحقق الشرط فإنه يغيير اللون إلى الأخضر

وكذلك يدور دورة رابعة والخاصة بالحقل الفارغ والحقل الفارغ أكيد سيذهب إلى الجزء else لإن الشرط غير متحقق فيغيير اللون الى الأخضر

فيثبت عليه أي الكتلة كامل سوف يصبح لونها أخضر

ولتفادي الحقل الإضافي إنقل الكود التالي:

EXIT WHEN INFO%NOTFOUND;

إلى أسفل الكود

FETCH INFO INTO :TEST.ID,:TEST.NAME,:TEST.HIREDATE;

حتى يصبح بهذا الشكل:

set_window_property(FORMS_MDI_WINDOW,window_state,maximize);
set_window_property( 'WINDOW1',window_state,maximize);
DECLARE

 	 CURSOR INFO IS SELECT ID,NAME,HIREDATE
 	 FROM TEST;
   
BEGIN
 	 GO_BLOCK('TEST');
 	 FIRST_RECORD;
 	 OPEN INFO;
 	 LOOP
    FETCH INFO INTO :TEST.ID,:TEST.NAME,:TEST.HIREDATE;
    EXIT WHEN INFO%NOTFOUND; 
     IF(SYSDATE >= :HIREDATE)THEN
     	 set_item_property('ID',background_color,'r100g25b0');
     ELSE
     	 set_item_property('ID',background_color,'r25g100b0');
    END IF;
    NEXT_RECORD;  
 	 END LOOP;
 	 CLOSE INFO;
 	 FIRST_RECORD;
 	 
END;

حتي يخرج من الدوارة قبل أن ينتقل إلى السطر الرابع الإضافي

وسوف يتم تغيير لون ID إلى اللون حسب شرط أخر قيد

يمكنك إضافة قيد أخر يكون موقعه بالأخير يحقق الشرط أي إجعل hiredate أكبر من sysdate ثم نفذ (بعد تغيير الكود)

سوف تلاحظ أن اللون يتغير إلى الأحمر وليس الأخضر كما كان.

تم تعديل هذه المشاركة بواسطة إسكندر في 13 نوفمبر 2005 في 12:15

#3

اشكرك ألف ألف شكر على ردك على هذا الموضوع .........

ولكن يا أخ اسكندر لقد اخذت الكود الي انت كاتبه ووضعته في الفورم ، ولكن لم يؤدي المطلوب عمله حيث اظهر لي جميع الـ ID باللون الأخضر ..

سوف تجد في اول رد ملف مرفق desktop.rar . أرجو ان تنزله وترى ذلك حيث يعطيني الحقول خضراء .

#4

اخ نايف

خطوتان يجب ان تنفذهما

الأولى تغير الكود كما أوضحت في ردي السابق وللتذكير هو

set_window_property(FORMS_MDI_WINDOW,window_state,maximize);
set_window_property( 'WINDOW1',window_state,maximize);
DECLARE

  CURSOR INFO IS SELECT ID,NAME,HIREDATE
  FROM TEST;
  
BEGIN
  GO_BLOCK('TEST');
  FIRST_RECORD;
  OPEN INFO;
  LOOP
   FETCH INFO INTO :TEST.ID,:TEST.NAME,:TEST.HIREDATE;
   EXIT WHEN INFO%NOTFOUND; 
    IF(SYSDATE >= :HIREDATE)THEN
      set_item_property('ID',background_color,'r100g25b0');
    ELSE
      set_item_property('ID',background_color,'r25g100b0');
   END IF;
   NEXT_RECORD;  
  END LOOP;
  CLOSE INFO;
  FIRST_RECORD;
  
END;

الخطوة الثانية وهي إضافة قيد جديد في آخر الجدول test يكون فيه hiredate أقل من sysdate أي شرط if يجب ان يتحقق في آخر قيد. يمكنك نسخ الكود التالي إلى SQL *Plus:

delete from test;
-------------------------------------------------
INSERT INTO TEST VALUES(10,'ALI','03/02/2005');
INSERT INTO TEST VALUES(20,'SALEM','05/11/2005');
INSERT INTO TEST VALUES(30,'MOH','25/11/2005');
INSERT INTO TEST VALUES(40,'ESK','09/11/2005');
COMMIT;

فقد ذكرت لك في ردي السابق بأن اللون يطبق فقط على أخر قيد

طبق هذا ومنتظر ردك...

#5

ولكني يا أخ اسكندر اريد من الون ان يطبق على مستوى كل قيد

أي لابد ان يكون السجل :

(10,'ALI','03/02/2005');          لابد على حسب الشرط أن يكون لون الـ ID حقة باللون الأحمر

(20,'SALEM','05/11/2005');    لابد على حسب الشرط أن يكون لون الـ ID حقة باللون الأحمر

(30,'MOH','25/11/2005');         لابد على حسب الشرط أن يكون لون الـ ID حقة باللون الأخضر         ،،،،،،

(40,'ESK','09/11/2005');           لابد على حسب الشرط أن يكون لون الـ ID حقة باللون الأحمر

أرجو ان تكون وضحتلك الصورة .................

#6

أي الـ ID رقم 10 :

بالون الأحمر على حسب الشرط الذي هو ان الـ sysdate >= hiredate

أي الـ ID رقم 20 :

بالون الأحمر على حسب الشرط الذي هو ان الـ sysdate >= hiredate

أي الـ ID رقم 30 :

بالون الأخضر على حسب الشرط الذي هو ان الـ sysdate >= hiredate

أي الـ ID رقم 40 :

بالون الأحمر على حسب الشرط الذي هو ان الـ sysdate >= hiredate

#7

أخ نايف

أنا فاهم قصدك

ولكن وكما قلت لك فأن ID في بلك البيانات هنا عبارة عن كتلة واحدة لإنك عندما كونت بلوك البيانات جعلته من نوع Tabulare وهذا النوع يتعامل مع أي عنصر فيه ككتلة واحدة

أي إذا غيرت لون سطر واحد فيه فان جميع الأسطر تأخذ نفس اللون (هذا على حسب علمي)

وإنما حاولت بردي السابق أن أثبت لك بأن البرنامج يشتغل طبيعي وأنه يأخذ أخر لون. ولا يمكن جعله يأخذ أكثر من لون...

#8

السلام عليكم ورحمة الله وبركاتة

اخي naif224 اجابة سوالك موجود في Help لو استعملت فكرك قليلا

واليلك المثال في ال block Tabulare لابد ان تحدد السجل الحالي اثناء loop

مع ملاحظة انشاء visual attributes باللون الذي ترغبة الاحمر مثلا g1

DECLARE

cur_itm VARCHAR2(80);

cur_block VARCHAR2(80) := :System.Cursor_Block;

BEGIN

cur_itm := Get_Block_Property( cur_block, FIRST_ITEM );

WHILE ( cur_itm IS NOT NULL ) LOOP

cur_itm := cur_block||'.'||cur_itm;

Display_Item( cur_itm, 'g1');

cur_itm := Get_Item_Property( cur_itm, NEXTITEM );

END LOOP;

END;

مع ملاحظة ان ماكتبة الاخوان مادة علمية قيمة لايستهان بها ولهم والشكر والدعاء

بأذن الله سوف تحل المشكله والله يوفق الجميع لما يحبه ويرضاه،،،،،

هذا الموضوع مغلق.

مواضيع مشابهة