الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

شي غريب يا اخوان ... جملة In لا تأخذ اكثر من 1000 خيار

Featured Replies

بتاريخ:

بسم الله الرحمن الرحيم


اخواني الاعزاء قمت بتصميم شاشة تقوم بعرض ارقام المواد وتفاصيلها بشكل TABULAR ويوجد في البداية Check box بحيث انني اقوم باختيار جميع
ارقام المواد المطلوب عرضها في التقرير عن طريق وضع ال check box والغريب في الموضوع اننا قمت باستخدام طريقتين وكلاهما لم ينجح .

طبعا لتقريب الصورة اكثر يمكنكم مراجعة هذا الرابط
http://www.araboug.org/ib/index.php?showtopic=17676
وحيث اننتي طبقت الفكرتين في الملف المرفق .... ولكن للاسف بدون اي فائدة .

لماذا لم تنجح الطريقتين وما هما :-


1- الطريقة الاولى تعتمد على عمل function يتم بعثه للتقرير عن طريق باراميتر يقوم بتخزين جميع ارقام المواد وعرضها وذلك باستخدام جملة in

طبعا هذا هو الكود للتنفيذ

REPORT2('JABR','P_SEQ='||get_seq_check);




وهذا هو الفانكشن الموجود داخل الفورم

FUNCTION get_seq_check RETURN varchar2  IS

Cond4 varchar2(8000) ;
slash	PLS_INTEGER;
BEGIN
go_block('FIX_MASTER_FILE');
first_record;
Loop
If   :CHECK_SELECT=1	 Then 
Cond4:=Cond4||:seq||',';
End if;
Exit when :system.last_record = 'TRUE';
next_record;
End loop;
slash := instr(Cond4,',',-1);
Return (substr(Cond4,1,(slash-1)));

EXCEPTION 

WHEN OTHERS THEN
MESSAGE(SQLERRM||:seq);
MESSAGE(SQLERRM||:seq);

END;



وهذا هو البروسيجر المستخدم REPORTS2)


PROCEDURE REPORT2 (p_report VARCHAR2,p_report_otherparam VARCHAR2 default null)
IS 

 repid	  REPORT_OBJECT;  
 v_rep	  VARCHAR2(8000);  
 rep_status VARCHAR2(8000);  
 vcFile	 VARCHAR2(8000);
 vcOtherParam VARCHAR2(8000);
BEGIN  
/* Generate a pseudo-unique filename */
vcFile := get_application_property(USERNAME)||TO_CHAR(SYSDATE,'YYYYMMDDHHMISS');
/* We will be producing Postscript output in this case so add a .rrpp extension */
vcFile := vcFile||'.rrph';
 repid := find_report_object('QMSREP');
  
 SET_REPORT_OBJECT_PROPERTY(repid,REPORT_EXECUTION_MODE,BATCH);	
 SET_REPORT_OBJECT_PROPERTY(repid, REPORT_FILENAME ,p_report);
 SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESTYPE,CACHE); 
 SET_REPORT_OBJECT_PROPERTY(repid,REPORT_DESFORMAT,'PDF');

 SET_REPORT_OBJECT_PROPERTY(repid,REPORT_SERVER,'JABALI'); 
 
 vcOtherParam := 'paramform=no '||p_report_otherparam;
 SET_REPORT_OBJECT_PROPERTY(repid,REPORT_OTHER,vcOtherParam); 

 
 v_rep := RUN_REPORT_OBJECT(repid);	
 rep_status := REPORT_OBJECT_STATUS(v_rep);  
 
 WHILE rep_status in ('RUNNING','OPENING_REPORT','ENQUEUED') LOOP 
  rep_status := report_object_status(v_rep); 
 END LOOP;
 
 IF rep_status = 'FINISHED' THEN 
/*Display report in the browser*/  
WEB.SHOW_DOCUMENT('http://oracle_in:8889/reports/rwservlet/getjobid'||	
substr(v_rep,instr(v_rep,'_',-1)+1)||'?'||'server=JABALI','_blank');   

 ELSE  
message('Error when running report');
 
 END IF;  
END;




وبالنسبة للتقرير بكل بساطة هذا هو الكود

SELECT  SEQ							
		   ,INPUT_DATE					 
		   ,DESC_EN						
		   ,DESC_AR						
		  ,SERIAL_NO					  
		  ,PURCHASE_PRICE									
		  ,STATUS						 
		  ,DESC_OF_UPDATE				 
		  ,REASON_OF_DELETE			   
		  ,NOTES						  
		  ,SCM_ID						 
		  ,SLB_ID						 
		  ,SCD_ID						 
		  ,HMF_ID						 
		  ,SDV_ID								  
		  ,USR_ID						 
		  ,OWNER						  
		  ,TRANSFER_TYPE				  
		  ,TRANSFER_DATE				  
		  ,USR_ID2  
		  ,END_DATE_WARRANTY					   

FROM	FIX_MASTER_FILE FMF
WHERE SEQ IN (&P_SEQ)




طبعا بعد اختيار 2000 ريكورد وتنفيذ التقرير تفاجأت ان جملة IN لا تقبل اكثر من 1000 وبتالي عند اختياري ل 1000 ريكورد او اقل لا مشكلة


2- الطريقة الثانية هي باستخدام جملة OR وايضا وصلت الحد الاقصى المسموح به لل URL للاكسبلورر وبتالي لم استطع عرض جميع البيانات
التي تم اختيارها .


وهذا هو الكود للتنفيذ

WEB.SHOW_DOCUMENT('http://oracle_in:8889/reports/rwservlet?userid=scott/TIGER@orcl&report=C:\reports\reports\REP1.rdf&server=aljabali&destype=cache&desformat=PDF&P_SEQ='|| GET_SEQ_CHECK2,'_blank');



وهذا هو الفانكشن

FUNCTION GET_SEQ_CHECK2 RETURN VARCHAR2 
IS

count1 varchar2(30000) :='(1=2)';

BEGIN
:global.found :='N';
GO_BLOCK('FIX_MASTER_FILE');
FIRST_RECORD;

LOOP
IF :CHECK_SELECT=1 THEN :global.found :='Y';


	count1 := count1 || ' OR seq=' || :seq;
	
END IF;	
 EXIT when :system.last_record ='TRUE';
 NEXT_RECORD;
END LOOP;
:all_check :=1;
Return ('Where ' || count1);



EXCEPTION 

WHEN OTHERS THEN
MESSAGE(SQLERRM||:seq);
MESSAGE(SQLERRM||:seq);

END;




وبالنسبة للتقرير

SELECT  SEQ							
		   ,INPUT_DATE					 
		   ,DESC_EN						
		   ,DESC_AR						
		  ,SERIAL_NO					  
		  ,PURCHASE_PRICE									
		  ,STATUS						 
		  ,DESC_OF_UPDATE				 
		  ,REASON_OF_DELETE			   
		  ,NOTES						  
		  ,SCM_ID						 
		  ,SLB_ID						 
		  ,SCD_ID						 
		  ,HMF_ID						 
		  ,SDV_ID								  
		  ,USR_ID						 
		  ,OWNER						  
		  ,TRANSFER_TYPE				  
		  ,TRANSFER_DATE				  
		  ,USR_ID2  
		  ,END_DATE_WARRANTY					   

FROM	FIX_MASTER_FILE FMF
P_SEQ&


وايضا مشكلة وصول الحد القصى لل URL منعت ظهور باقي البيانات ....



ما الحل برأيكم ......

تعمدت وضع جميع الاكواد حتى تتم الاستفادة منها


اريد المشاركة من الجميع ....

post-6338-1241107473_thumb.jpg

بتاريخ:

السلام عليكم ياجبالي

أه رأيك تربط الشيك بوكس في الجدول وعند الضغط عليها تخزن مثلا قيمة 1 واكتب في شرط الجملة
where chk=1
وطبعا الذي لم يتم اختياره تكون قيمته =0

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

تم تعديل بواسطة mustafagamiel

بتاريخ:

السلام عليكم

اخي الكريم
ممكن تضيف حقل flag_on_off الي الجدول المذكور عندك
و تكون القيمة الافتراضية هي 0 اي عدم اظهار اي بيانات
هعند اختيار الشيك بوكس لاظهار المادة يتم عمل update لهذه المادة فيكون قيمة الحقل 1
و الحقل الذي سوف تتجاهل الضغط على الشيك بوك الخاص به سوف لا يتم عمل اي تأثير
و عند اظهار التقرير مثل سوف يكون هناك شرط اظهار البيانات
where flag_on_off=1
اي اظهار المواد التي قيمتها 1 اي اظهار
و العكس صحيح

و يكون التحديث pre update

ده فكرة مؤقتة لحل المشكلة

لا تقف عند مشكلة و لكن استخدم الحل المتاح حتي يتثني لك معرفة حل افضل

اظن قبل شرح هذه الطريق لم افهم فكرة الاخ مصطفي جميل

ولكن بعد ما شرحت قرأت فكرته و هي نفس الفكرة التي شرحتها و لكن انا فقط فصلت

بتاريخ:

اخى العزيز
السلام عليكم
دون الدخول فى تفاصيل وتعب قلب وبالبلدى



اصف حقل لجدول المواد وليكن
show_in_rep number(1)

قبل التقرير
حدث الحقل بالقيمة واحد للمواد التى تريد اظهارها ف التقرير والقيمة صفر لما عدا ذلك

وقم بتشغب التقرير باستخدام
where
معتمدا على هذا الفلاج
يكون التقرير اسرع ولا تتعب حالك

وممكن تعتمدةعلى جدول موقت تبنيه بنفس الاسلوب وتستخرج منه التقرير
اذا كان التقرير يطلب فى خلال نفس الدقائق من مستخدم آخر

تحياتى

بتاريخ:

الاخ العزيز wise
هي الفكرة فعلا كما قلت تعتبر حل مؤقت وفعلا كما قلت انا سابقا
لكن للاسف لها عدة مشاكل
1 - لو الجدول كبير كما في حالة أخينا الجبالي ألا تراها أنها من الصعب عمل update على الكم الهائل من السجلات
2- ماذا لو هناك العديد من المستخدمين سيقوموا بطباعة نفس التقرير في نفس الوقت أكيد سيحدث مشكلة

إذن عجبتني كلمتك عندما قلت إنها حل مؤقت
أنتظر منك حل أخر وننتظر من جميع الاخوة المشاركة في هذا الموضوع المهم

بتاريخ:

السلام عليكم
ارجو من الاخ الفاضل الجبالي باعطاء بعض البيانات عن الجدول

بالنسبة للحل المؤقت ربما اضافة جدول موقت للطباعة
يتم فيه اضافة نتيجة ال update مع اضافة حقل اضافي للمستخدم بحيث يتم عمل تحديث مبني على اساس استخدام المستخدم
و هكذا حلنا مشكلة اذا قام اكثر من مستخدم بالطباعة طبعا هذا حل موقت ايضا

اما فكرة البطئ فلست خبيرا في تقليص وقت الطباعة

و لكن .....

ربما حل الاخت اسماء هو حل مناسب ايضا
على اساس befor report trigger و انا لا اعرف استخدم هذا ال tirgger من داخل الريبورت بيلدر

ارجو المناقشة فالموضوع شيق حيث يعتمد على المنطق
و البرمجة هي منطق
و اذا كان هناك حل اخر ربما تشاركنا

بتاريخ:

السلام عليكم

محاولة للمساعدة


Ask your dba to increase the maximum open cursors on the database.

To check how many cursors are in use run this sql statement:

   SELECT v.value as numopencursors ,s.machine ,s.osuser,s.username
   FROM V$SESSTAT v, V$SESSION s
   WHERE v.statistic# = 3 and v.sid = s.sid

بتاريخ:
  • كاتب الموضوع

اخواني الاعزاء ( Wise , asmaa123 , mustafagamiel,Amgad ) اشكركم من كل قلبي على التواصل معي في هذا الموضوع وبالنسبة للجدول الذي لدي
اي جدول المواد يحتوي حوالي 8000 ريكورد وبتالي اعتقد ان :-

1- فكرة عمل عمود وتخزين البيانات بالتحديث على الجدول كلما اردت الطباعة ( طريقة جيدة ولكن تخيلوا معي 10 مستخدمين كل واحد يختار 4000 ريكور
شو بصير في السيرفر ..... )

2- ايضا فكرة عمل جدول مؤقت ( فكرة جيدة ولكن ايضا عملية الاضافة على هذا الجدول ولهذه الريكورد واكثر من مستخدم .... شو بصير بالسيرفر

البطء موووووجود 100%

حتى اخي امجد بعض النظر عن عدد الكيرسر المفتوحة في قاعدة البيانات ... اعتقد البطء سيكون كبير جدا


لنحاول التفكير بطريقة اخرى


شي والله بحير



اشكركم جميعا من كل قلبي


يلا يا شباب .... بدها تفكير ....

بتاريخ:

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

سؤال بطريقه اخرى

هل المطلوب من المستخدم ان يقوم باختيار اكثر من 2000 سجل بطريقة يدوية ؟

كيف يتم ذلك ؟

هل يمكن اعادة التفكير بان يكون الاختيار على مستوى مجموعات مثل ( ادارة - قسم - ... ) من البيانات وليس على المستوى التفصيلي ؟
او ان الاختيار يجمع بين الاثنين معا المستوى الرئيسي ( ادارة مثلا ) + المستوى التفصيلي (السجلات )

لو امكن عرض فكرة عن نوعية البيانات بالجدول

أويد فكرة الزملاء فى التعامل مع جدول جديد Temp مؤقت ( وليس التعديل فى الجدول الاساسى ) يحتوى ( اسم المستخدم - العمود المختار - التاريخ والوقت - او اى اعمدة اخرى )
على ان يتم الاضافة فيه قبل استدعاء التقرير وحذف السجلات ( المحدده ) بعد الانتهاء من الطباعة

والله الموفق

بتاريخ:
  • كاتب الموضوع

اخي الغالي امجد اشكرك على المتابعة و اعتقد انه كلامك منطقي .... هل مطلوب من المستخدم اختيار 2000 سجل بشكل يدوي ؟؟؟؟؟

اكيد لأ

لكن وين المشكلة اخي امجد ..... عندما يقوم باختيار جميع السجلات 8000 والضغط على زر الطبارعة ( هنا المشكلة )

ايضا

افرض انني قمت بالاستعلام عن مادة معين وكان عدد السجلات 3000 فكل ما على المستخدم ان يضغط على خيار check all ثم
الضغط على زر طباعة وهنا تحدث المشكلة وبتالي اخي امجد لا تتخيل ان يقوم المستخدم بالعمل اليدوي على سجلات تزيد عن 100
ولكن بهذه الطريقة وبضغطة زر واحدة يظلل 3000 ريكورد مرة واحدة .


الاختيار يجمع بين الاثنين معا المستوى الرئيسي ( ادارة مثلا ) + المستوى التفصيلي (السجلات )
والشاشة عبارة عن tabular يتم فيها عرض جميع البيانات بغض النظر عن المجموعات


فكرة الزملاء فى التعامل مع جدول جديد Temp مؤقت ( هي فكرة جيدة ولكن ليست المشكلة في عملية الاضافة قبل او بعد استدعاء التقرير
المشكلة اخي امجد في عملية الاضافة نفسها وما تأخذه من وقت وهذا الامر قد ينطبق على 10 مستخدمين طل واحد بعمل اضافة ل 5000
ريكورد في نفس الوقت مثلا .

ولا اعلم قد يكون هل الزملاء اكثر الحلول منطقية ........ ولكن ما زلت ابحث عن حل اخر ....

بتاريخ:

الأخ / الجبالى

يقوم باختيار جميع السجلات 8000 والضغط على زر الطباعة


عند اختيار جميع السجلات ... فى هذه الحالة لن تحتاج لتمرير كل السجلات التى تم اختيارها ... الى التقرير
وانما ستنقل فقط ( الشروط التى بناء عليها استرجاع البيانات بالشاشة) الى التقرير

الاستعلام عن مادة معين وكان عدد السجلات 3000 فكل ما على المستخدم ان يضغط على خيار check all ثم
الضغط على زر طباعة

ايضا سيتم نقل شرط المادة المختارة فقط الى التقرير

رجاء ان امكن عمل print screen للشاشة .... ان امكن
بتاريخ:

السلام عليكم

اظن رأي الاخ امجد اقرب الى الصواب

ما دام انت النية عندك تطبع كل السجلات ففي هذه الحالة لا حاجة الي جدول مؤقت او الي تحديث في نفس الجدول

فيكون العمل على الجدول الاساسي بدون اي مشاكل

اما اذا كانت هناك احتمال طبع حوالي 100 او 200 سجل فحل الجدول المؤقت مناسب

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

بتاريخ:
  • كاتب الموضوع

اخي العزيز امجد اكرر شكري الخاص لك على المتابعة ,

اريد توضيح بعض النقاط :-


بالنسبة لاختيار جميع السجلات 8000 والضغط على زر الطباعة ( في هذه الحالة في العادة لا ضرورة ابدا لاستخدام جملة IN لان المطلوب عرض
جميع البيانات ولكن المشكلة تكمن ان نفس التقرير يقوم باحضار جزء من البيانات حسب جمل الاستعلام المختلفة .


- الان بالنسبة لطباعة التقرير حسب شروط الاستعلام ( حسب اعتقادي انه من الافضل الطباعة حسب رقم المادة الذي تم اختياره لان عملية
الطباعة حسب الشروط لن تكون فعالة وذلك لانه يتم احيانا الاستعلام عن شروط مختلفة مع بعضها البعض وبتالي يصعب وضع ومراعاة جميع
الشروط في التقرير وبتالي عملية تنفيذ التقرير حسب ما تم اختياره ستكون افضل .


- لا اعلم قد يكون افضل حل ان اقوم بعمل تقرير جديد يقوم بعرض البيانات حسب التصنيف الرئيسي والفرعي للمواد وبتالي اجبار المستخدم
على طلب نوع معين من التقارير , مع العلم انني اريد معرفة حل لهذه المشكلة .

- واعتذر اخي امجد قد يصعب علي في الوقت الحالي عرض شاشة المواد .... ( اعتذر )

بتاريخ:

السلام عليكم
اخي الكريم الجبالي
هناك حل بسيط

تعمل عدد 2 تقرير
التقرير الاول هو يعرض التقرير حسب الشروط التالية
1-كل المواد لك التصنيفات
2- المواد التي تخص كل تصنيف رئيسي او فرعي

التقرير الثاني
يقوم بعرض البيانات حسب عدد المواد المختارة و انت كما قلت لن تزيد عن 100 و العدد المتاح 1000 في جملة in

التقرير الثالث
ممكن تدمج تقريرن مع بعض و لكن فيها شغل عالي و فكرتها انك تعمل جملة استعلام union all
الجملة الاولى في الاستعلام بها شروط خاصة اي مواد تخص قسم معين
الجملة الثانية تخص جملة in
في النهاية تستخدم خاصية distinct في حالة تكرار اختيار المواد في نفس التقرير

طبع الموضوع ده فيه شغل كتير و محتاج تجربة حتى تصل لهدفك

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.