الانتقال إلى المحتوى
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.

أفضل طريقة لعمل التقارير

Featured Replies

بتاريخ:

السلام عليكم



لدي قاعدة بيانات كبيرة بالاوراكل واحتاج لعمل تقارير يومية وشهرية وسنوية ويتم في التقارير اليومية عرض عدد سطور Rows قد يصل إلى 50 الف سطر
واستخدم معادلات مختلفة للحصول على البيانات الختلفة .
ولاحظت وجود العديد من البرامج التي تقوم باصدار التقارير مثل Oracle Developer Report, Excel,Cristal Report,QLR Manager, DBxtra
وانا حالياً استخدم الاكسل لصناعة التقارير بربطة مع الاوراكل ولا اجده مناسب لذلك .
وسؤالي اي البرامج الافضل والاقوى والموثوق لعمل تقارير كبيره ؟؟
ارجو من كل من جرب هذه التقارير اوغيرها بادلاء رأية كي نستفيد !!

بتاريخ:

تقارير الديفيلوبار قوية جداً ، بس مش معني كدة أن الباقي مش قوي !!!

كل شيء له إستخداماتة ... وطالما أنت تعامل مع قاعدة ونماذج الأوراكل ، فشيء طبيعي أنك لازم تتعامل مع تقارير الديفيلوبار !!!

دة غير أن معظم الشركات بتطالب بية

بص يا أخي ،

الإكسيل والأكسيس أدوات قوية جداً بس في حدود الـ 2 جيجا الي بيشيلهم من البيانات ..... أما الكريستال آداة قوية جداً ،ونستخدمها منز فترات طويلة ، وتعرضت الي تحديثات كثيرة ، بس هي ممتازة مع لغات البرمجة ، اما لو كنت بتستخدم الديفيلوبار فهتكون مقرفة بعض الشيء .... الديفيلوبار كذلك آداة ممتازة ، بس هتكون أفضل لك من الكريستال ، لأن برمجتها متوافقة مع الأوراكل .... لذلك أفضل شيء هو إستخدام تقارير الديفيلوبار ، ما دامت متوافقة مع الأوراكل .

هناك شيء آخر أحب أن أذكرة لك :
السرعة الحقيقية لتقريرك هو زكائك الشخصي !!!
منها مثلاً أنك متحاولش تعرض البيانات مرة واحد كما كنا نفعل مسبقاً في الكريستال والفيجوال 6.0 ... حاول تستخدم إمكانيات التقارير وليس البرمجة الخارجية ... منها مثلاً هلك قوة التقرير بزيادة الـ Functions التي تستخدم العديد من الدوارة Loop




بالتوفيق



بالتوفيق

بتاريخ:

السلام عليكم
هل يمكن عمل تقارير مبني على cursor
مثلا ممكن اقوم بعمل عرض بيانات بطريقة ما على sql plus و لكن اريد بناء تقارير مبني على cursor

ارجو التوضيح

بتاريخ:

هو أفضل شيء أنك تحاول علي قدر المستطاع أنك متستخدمش جملة الـ Loop في بناء التقارير ، ولو إستخدمتها تبقي علي الأقل ضامن ضمان مؤكد أن جملة الـ Loop لا تؤثر علي سرعة عرض التقرير !!!

لو إستخدمت Cursor شيء طبيعي أنك هتستخدم جملة Loop علشان تمر علي جميع السجلات المرتجعة ومن ثم ترتجع البيانات للمستخدم ( في الآخر ) . لكن لو مثلاً قمت بالربط مع Tables أو Views دة هيكون أسرع . لأن الجدول أو العارض في حد ذاتة لا يقوم بإجراء Loop إلا علي أساس المرور علي صفحة صفحة ، وطبعاً لو كان المستخدم عايز يذهب الي آخر صفحة شيء طبيعي أنه سيتم عرض نافذة توضح عدد الصفحات وعدد السجلات التي تم المرور عليها حتي الآن ... لكن لو Loop هيؤدي الي حودث توقف للتقرير مؤقت لحين الإنتهاء من جملة الـ Loop ، وبعد كدة يرجع تاني يعرض صفحة صفحة .

لكن أسمح لي أن نتحدث عن شيء آخر ... مينفعش تستخدم الـ Cursor مهما كان نوعها ( Cursor, RefCursor ) مباشرتاً ، لكن يجب عليك إرتجاعة في صورة Table علشان تقدر تستخدمة كجدول أو عارض صالح الربط ... ولكي يتم هكذا يجب عليك إستخدمام Object Type ... أنظر :

CREATE OR REPLACE TYPE O_EMP IS OBJECT (EMPNO   NUMBER(4), ENAME VARCHAR(10), SAL NUMBER(7,2);
/
CREATE OR REPLACE TYPE T_EMP IS TABLE OF O_EMP;
/
CREATE OR REPLACE FUNCTION GET_EMP RETURN T_EMP
AS
  TYPE CUR_EMP IS REF CURSOR;
  ID_NO  NUMBER(5);
  ID_NAME VARCHAR2(15);
  ID_SAL   NUMBER(10,3);
  P_RETURN T_EMP := T_EMP();
BEGIN
  OPEN CUR_EMP FOR SELECT EMPNO, ENAME, SAL FROM EMP ORDER BY EMPNO;
  FETCH CUR_EMP INTO ID_NO, ID_NAME, ID_SAL;
  WHILE CUR_EMP%FOUND
  LOOP
  P_RETURN(P_RETURN.COUNT) := O_EMP(ID_NO,ID_NAME,ID_SAL);
  FETCH CUR_EMP INTO ID_NO, ID_NAME, ID_SAL;
  END LOOP;
  CLOSE CUR_EMP;
  RETURN P_RETURN;
END;
/



لاحظ في الكود السابق ، أنا إستخدمت Function لكي يرتجع كل سجلات الموظفين ... وبالطبع أستخدمت جملة Loop ... فلو أستدعيت هذا الغرض سيقوم بإنهاء جملة الـ Loop أولاً وبعد ذلك يقوم بعرضه بالتقرير ، رغم أنني جعلته يرتجع 5 موظفين فقط كما يلي :

Select * From Table(Get_Emp) Where EmpNo Between 10 And 15;



أمممممممممممم

ستقل أن أفضل شيء أنك تعمل باراميتر يحدد السجلات المطلوبة ... هقل لك أن هذا صحيح بس أنا بتحدث عن شيء آخر ... لو كان مثلاً شركة لديها جدول يمثل فاتورة المبيعات ... ويومياً بيسجل حوالي 50000 فاتورة ، عارف في آخر السنة سيكون عدد السجلات كام !!!

بلاش كدة ، عارف أن مثلاً لو حبيت أرتجع فواتير اليوم ماذا سيحدث ، سيؤدي الي توقف البرنامج فترة ( حتي ولو لثواني معدودة ) ، فكلما زادت البيانات كلما حدث بطأ لبرنامجك . دة غير طبعاً كمية الحسابات التي تحتوي عليها ( جمع - طرح - قسمة - مجاميع - بيانات تفاصيل الفاتورة - ............... الي آخرة ).






عموماً الـ Cursor مينفعش إلا بشروط خاصة ... وأفضل شيء هو جمل الإستعلام بالجداول المباشرة أو إنشاء عوارض Views داخل القاعدة .


بالتوفيق

بتاريخ:

الســـلام عليكم اخي الكريم مصطفى
شكرا على سرعة الرد

سبب سؤوالي على موضوع الcursor احيانات pl-sql اكثر قوم في حساب عملية داخل تقرير

اما بالنسبة للعوارض views قرأت في هذا المنتدى ان له عيوب فماذا الحل اذن
احد الاحوة قال ان التقارير المبنية على Views بطيئة
فكيف في هذه الحالة احل مشكلة التقارير المبنية على عوارض

كذلك هل ممكن في شاشة النموذج اقوم بعمل cursor يقوم بعمل delete ثم insert في جدول مؤقت temp table و بعد ذلك اقوم بعرض البيانات الموضوع في هذا الجدول المؤقت داخل التقرير ؟
ام هناك بطئ من استخدام هذه الطريقة؟

بتاريخ:
سبب سؤوالي على موضوع الcursor احيانات pl-sql اكثر قوم في حساب عملية داخل تقرير


أنا لم أتحدث عن PL لكنني أتحدث علي الـ Loop خصوصاً لو كانت البيانات كبيرة

اما بالنسبة للعوارض views قرأت في هذا المنتدى ان له عيوب فماذا الحل اذن
احد الاحوة قال ان التقارير المبنية على Views بطيئة
فكيف في هذه الحالة احل مشكلة التقارير المبنية على عوارض


هو صحيح الـ View ضعيف في بعض الشيء ، بس قوي في التقارير ، وأهم شيء فية أنه مبيعملش Loop علي كل السجلات قبل عملية العرض ، ولكنة يعرض أول مجموعة سجلات تمثل صفحة أول صفحة للتقرير ... وبعدين التقرير قادر علي العرض الفوري وعرض رسالة تحميلية !!!

لكن اخي ، أسوأ شيء هو أنك متحولش حقول الجدول الي صفحات بإستخدام الـ Indexs ... الفهرسة في حد ذاتها بتساعدك علي زيادة سرعة القراءة .

لكن عيب الـ View الحقيقي أنك مبتأدرش تعدل في بياناته إلا في حالات واحدة لو كان عرض السجلات مباشر ولا يحتوي علي حقول محسوبة أو مجاميع Group By .

كذلك هل ممكن في شاشة النموذج اقوم بعمل cursor يقوم بعمل delete ثم insert في جدول مؤقت temp table و بعد ذلك اقوم بعرض البيانات الموضوع في هذا الجدول المؤقت داخل التقرير ؟
ام هناك بطئ من استخدام هذه الطريقة؟


يا خبر !!!

يعني مثلاً تعمل جدول إسمة tmp_emp وتدرج له الحقول المناسبة ، ومن ثم تصنع Cursor ثم Loop علية ومن ثم تدرج كل السجلات المرتجعة فقط لا غير ...

بكدة متحلتش المشكلة !!!

جرب الكود التالي :

Create Table Employee
(
 Employee_ID			Number(10),
 Employee_Name   VarChar(30),
 Constraint PK_EmployeeID Primary Key(Employee_ID),
 Constraint UQ_Employee_Name Unique(Employee_Name)
)
/

Set ServerOutput On;
declare
x  number;
begin
dbms_output.put_line(to_char(sysdate,'hh24:mi:ss'));
for x in 1 .. 500000
loop
	insert into employee values(x,x);
end loop
commit;
dbms_output.put_line(to_char(sysdate,'hh24:mi:ss'));
end;
/



هتلاقي أن فترة الـ Loop طويلة ، هي أخذت لدي حوالي 5 دقائق !!!

بس أنا عايزك تجربها عندك وتخبرني بالنتيجة أوك !!!

وحاول كمان تنفذ الكود التالي وتخبرني بالنتيجة :

Set ServerOutput On;
Begin
dbms_output.put_line(to_char(sysdate,'hh24:mi:ss'));
Delete From Employee;
dbms_output.put_line(to_char(sysdate,'hh24:mi:ss'));
End;
/



عموماً لازم تعرف ان أفضل شيء لعملية الحذف والإدراج هو إما إستخدام الشرط بحيث أن يتم حذف مجموعة قليلة من السجلات ( علشان لا يأخذ وقت طويل أكثر من اللازم ) ... أو تحذف سجل سجل من خلال Timer ... صحيح سيأخذ وقت طويل جداً ، بس هيكون أفضل من متوقف برنامجك ... في هذا الوقت تعمل شاشة بها Bar يوضح بداية ونهاية البرنامج من عملية الحذف ( كلافتة ينظر فيها المستخدم Please Wait ) .

بس السؤال ، ما حل هذه المشكلة المقرفة !!!


أفضل شيء أنك تحول بياناتك من جدول الي جدول آخر أفضل شيء أنك تحول البيانات من الجدول أثناء إجراء Create Table ، أما لو كنت عايز تحذف السجلات فدي هتأخذ وقت طويل عند إستخدام Delete ، بس أمر Drop أسرع بكثير ، كما يلي :

Set ServerOutput On;
Declare
  ID_Count  Number;
Begin
dbms_output.put_line(to_char(sysdate,'hh24:mi:ss'));
Select Count(*) Into ID_Count From Tab Where TName = 'TMP_EMPLOYEE';
If(ID_Count > 0)Then
	Execute Immediate 'Drop Table tmp_employee';
End If;
Execute Immediate 'Create Table tmp_Employee As Select * From Employee';
dbms_output.put_line(to_char(sysdate,'hh24:mi:ss'));
End;
/



ودي أحلي ما فيها أنها لا تقوم بإجراء Loop ولا شيء ، لأن دة مجرد ملف هيتم نقلة بشرط معين ... زي تقريباً جملة الـ Select ، مجرد بيحدد الشرط وبس ... أما في حسالة Drop Table فهذا أيضاً لا يقم بإجراء Loop ، لأنه مجرد حذف ملف ... وعلي فكرة أخذت هذه الجملتين Drop Table و Create Table علي جدول يحتوي علي 500.000 سجل ، فإنتهي من عملية التنفيذ بعد حوالي 2.5 ثانية

بس ركز دي فيها أهم مشكلة ....................... السيرفر !!!!!!!!!!!!!!!!!!!!!!!!!!!!

يعني مثلاً مش هتقدر تحزف جدول مفتوح من قبل مستخدم آخر ( ركز ) !!!!!!



جرب وأخبرني ...... متنساش أخبرني


بالتوفيق

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

شكراً اخي MMA على ردك السريع


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

بتاريخ:

السلام عليكم اخي الكريم

شكرا على سرعة الرد

العملية اخذت اقل من دقيقة

14:44:57
14:45:50

PL/SQL procedure successfully completed.



اما كود الحذف فاكانت التيجة كالاتي:

14:49:14
14:50:45

PL/SQL procedure successfully completed.



اخي الكريم كان الغرض من السوؤال الاتي
انا هناك برنامج خاص بالمخازن و كنت عند حركة اضافة او صرف لصنف (كنت عامل جدول اخر سميته sanf_card اي كارت الصنف) و هو سجل كل حركة مع الرصيد التراكمي لنفس الحركة بحيث عند عمل تقرير يتم عمل حركة الاضافة و الصرف و الرصيد التراكمي

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

ارجو ان تكون وصلتلك المشكلة

ارجو ان تنظر الي مشروع المخازن و تقول رأيك و تنقض مع التوصيه و المساعدة

بتاريخ:

أنا بتعامل مع ديفيلوبار 6 وللأسف لا أعلم كيف يتم عرضها علي صفحة ويب !!!

أعتقد أن هذه الميزة موجودة ضمن Oracle 10g وليس Oracle 6i, 9i !!!

أنا آسف ، بجد معرفش !!!!


أم أنك ترغب في رفعها علي الويب ؟؟؟

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

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

بتاريخ:

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


أولاً ، أنا آسف جداً علي التأخير ،

ثانياً ، لو كنت عايز تصنع صفحات ويب وترفعها علي موقع معين ... فهنا أقل لك يجب عليك دراسة بعض المناهج الخاصة بالويب سايت مثل HTML لتصميم الصفحات و ASP أو ASP.Net و VB Or J Script !!!

الموضوع يحتاج منك الذهاب الي المنتديات المتخصصة في تصميم صفحات الويب مثل ( الفريق العربي للبرمجيات ) !!!

عموماً عناك في قسم الـ Application و المشروعات مجموعة من الأمثلة والتمارين والمشروعات المصنوعة بالويب سايت خصوصاً الـ ASP.Net




بالتوفيق

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

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

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

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

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

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.