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

كود تقرير يحتاج بعض التعديلات

مغلق
بدأه dr.h في 29 أغسطس 2001 · 0 رد · 571 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1

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

(( وفوق كل ذي علم عليم ))

سأشرح المشكلة بشئ من التفصيل :

لدي ملف يسمى ملف القطاعات وهو ماستر به حقلين الأول إسمه plus وهو من نوع أوتوإينكريمنت (+) والثاني إسمه sector وهومن نوع ألفا A.

هذا الملف ماستر على ملف آخر ديتيل يسمى DETILJEHALETR به الحقول التالية :-

حقل JEHANO نوع (+) ..مفهرس أولياً .

حقل SECNO نوع (I) إنتجر ،(مفهرس أولياً) مرتبط بالحقل PLUS من ملف القطاعات (الماستر).

وحقل ALJEHA من نوع ألفا A سترينغ ، تكتب به إسم جهة عمل تتبع القطاع الموجود بالماستر .

,,بحيث عندما يكون قطاع التعليم في الماستر ، تكون الجهات المعروضة في ملف DETILJEHALETR هي (مدرسة ، جامعة ، ثانوية ، معهد ، روضة ، كلية ، معهد عالي ، مركز بحوث ...إلخ)

** وهناك ملف ديتيل آخر يسمى MURAJA مربوط بملف DETILJEHALETR و به الحقول التالية :-

حقل SECNO نوع (I) إنتجر مفهرس أولياً مربوط بحقل SECNO من ملف DETILJEHALETR .

حقل JEHANO نوع (I) إنتجر مفهرس أولياً مربوط بحقل JEHANO من ملف DETILJEHALETR .

حقل PLUS من نوع (+) مفهرس أولياً لمنع حدوث KEY VIOLATION .

وبه الحقول التالية والتي تمثل الموظفين العاملين تبع الجهة المبين إسمها في ملف DETILJEHALETR التابعة للقطاع المبين إسمه في ملف SECTORS.

حقل NAME من نوع (a) به إسم الموظف .

وحقل INAT من نوع (I) وظيفته صنع لوكب لعرض جنسية معينة للموظف

وحقل يسمى I من نوع (I) إنتجر وظيفته صنع لوكب لعرض جهة عمل معينة للموظف المدون إسمه في حقل الإسم .

ويوجد لدي ملف إسمه X3 به الحقول التالية :-

حقل GROUPNO من نوع (i) غير مفهرس أولياً .

وعدد ستة حقول من نوع A سترينغ مسماه كالتالي (T1 .....T6) غير مفهرسة.

ويوجد ملف إسمه ALLJEHA به الحقول التالية :-

حقل GROOPNO من نوع (i) مفهرس أولياً .

حقل JEHANO من نوع (I) مفهرس أولياً .

وبه حقل لوكب للجنسيات هذه بياناته :-

object alljehanati: TStringField

Alignment = taCenter

FieldKind = fkLookup

FieldName = 'nati'

LookupDataSet = nations

LookupKeyFields = 'Plus'

LookupResultField = 'Nationality'

KeyFields = 'Jehano'

Lookup = True

end

ويوجد لدي كويري QUERY4

بها في الخاصية STRINGS ما يلي :-

SELECT DISTINCT Inat, COUNT(DISTINCT Name) AS ddd

FROM "MURAJA.db"

where

GROUP BY Inat

ORDER BY Inat

ويوجد لدي كويري QUERY10

بها في الخاصية STRINGS ما يلي :-

SELECT DISTINCT I, COUNT(DISTINCT Name) AS ddd

FROM "MURAJA.db"

WHERE

(I =:secno)

GROUP BY I

ORDER BY I

ويوجد بها لوكب للجنسية يعرض الجهات :- هذه بياناته :-

object Query10aljeha: TStringField

FieldKind = fkLookup

FieldName = 'aljeha'

LookupDataSet = DETAILletrJEHA

LookupKeyFields = 'Jehano'

LookupResultField = 'Aljeha'

KeyFields = 'I'

Size = 50

Lookup = True

end

البارمتر SECNO من نوع إنتجر .

الداتا مودل إسمها DAT ويوجد عليها كل التيبلز TABLES و الكويريز

ثم جهزت التقرير QUICK REPORT بهذا الشكل :

التقرير إسمه Q3 فوق الفورم .

مربوط بالداتا ست X3.

به الـ BANDS التالية :-

PAGE HEADER بها ديبي تكست مربوطة بملف القطاعات بها إسم القطاع .

GROUP HEADER

خواصه كالتالي :-

ALLIGN TO BOTTOM = FALSE

EXPRESSION = X3.GROUPNO

ثم

DETAIL BAND

بها عدد ستة ديبي تكست مربوطين بملف X3 كل من اليمين إلى اليسار بالحقول من T1 إلى الحقل T6

ثم

GROUP FOOTER

به خاصية

ALLIGN TO BOTTOM = TRUE

والكود الموجود في زر عرض التقرير هو كالتالي :-

var

i,j,k:integer;

begin

with dat.Query4 do

begin

close;

open;

first;

end;

i:=1;

dat.alljeha.CancelRange;

dat.alljeha.First;

while not dat.alljeha.Eof do

dat.alljeha.Delete;

dat.X3.First;

while not dat.X3.Eof do

dat.X3.Delete;

dat.Query4.First;

while not dat.Query4.Eof do

begin

dat.alljeha.Insert;

dat.alljehaGropno.Value :=i;

dat.alljehaJehano.Value := dat.Query4Inat.Value;

dat.alljeha.Post;

if dat.Query4.RecNo mod 3 = 0 then inc(i);

dat.Query4.Next;

end;

for j:=1 to i do

begin

dat.alljeha.IndexName :='';

dat.alljeha.CancelRange;

dat.alljeha.SetRange([j],[j]);

k:=2;

dat.X3.Append;

dat.alljeha.First;

dat.X3T1.Value := 'الجهة / الجنسية';

while not dat.alljeha.Eof do

begin

dat.X3GROUPNO.Value := dat.alljehaGropno.Value;

dat.X3.Fields[k].Value := dat.alljehanati.Value;

DAt.Query10.Close;

DAt.Query10.ParamByName('secno').AsInteger := dat.alljehajehano.Value;

DAt.Query10.Open;

DAt.Query10.First;

While not DAt.Query10.Eof do

begin

if not dat.X3.Locate('GroupNo;T1',vararrayof([dat.alljehaGropno.Value,DAt.Query10aljeha.Value]),[])then

dat.X3.Append

else

dat.X3.Edit;

dat.X3GroupNo.Value := dat.alljehaGropno.Value;

dat.X3T1.AsString := DAt.Query10aljeha.Value;

//IF dat.alljehanati.Value<>'' THEN

//begin

dat.X3.Fields[k].Value := DAt.Query10DDD.AsString;

// end;

DAt.Query10.Next;

end;

inc(k);

dat.X3.Locate('GroupNo;T1',vararrayof([dat.alljehaGropno.Value,'الجهة / الجنسية']),[]);

dat.X3.edit;

dat.alljeha.Next;

end;

end;

dat.X3.Close;

dat.X3.Open;

Form9.Q3.QRPrinter:=nil;

Form9.Q3.Preview;

end;

( المطلوب)

عمل إحصائية _ تقرير _ يعد الجنسيات الموجودة في جميع جهات قطاع معين

فيظهر في شكل عمودي الجنسيات التي عثر عليها (الموجودة ) وفي الصف الأفقي يظهر الجهات التابعة للقطاع المعروض حالياً في ملف SECTOR ( أو بالعكس) بحيث لا تظهر الجهة التي لا توجد بها جنسيات ( أي التي لا يوجد بها سجلات)

ولا يعرض الجنسية التي هي غير موجودة في السجلات التابعة للجهات التابعة لقطاع معين ..وكذلك عندما لا يتسع عرض صفحة التقرير عن عرض الجهات الموجــودة ( إفرض عندنا مائة جهة ) فالمفروض أن تضاف بقية الجهات (والتي زاد عددها عن الخمسة جهات ) وجنسياتها الموجودة

إلى الصفحة التالية تلقائياً .

المهم هو مراعاة ما يلي عند عرض التقرير:-

1. ألا يتم تكرار إسم أي جهة في نفس الصفحة.

2. ألا يتم تكرار ذكر أي جنسية في نفس الصفحة

** سأعطي مثالاً للتوضيح **

عندما يكون المؤشر في ملف القطاعات الماستر على قطاع التعليم

فأنا عندها أريد عرض إحصائية تعد جميع الجنسيات الموظفة في

هذا القطاع بجميع الجهات التابعة للتعليم، ( بحيث أن الجهة التابعة للتعليم والتي لا يوجد بها أي موظف ينبغي ألا تظهر في التقرير . وكذلك الجنسية الغير مذكورة في أي جهة من جهات التعليم ينبغي ألا تظهر ، ولكن ينبغي أن تظهر في حالة ذكرها في إحدى الجهات ولو مرة واحدة ).

و في حالة أن ملف DETILJEHALETR به الجهات التالية :-

مدرسة ، جامعة ، معهد ، ثانوية ، روضة ، كلية ، معهد عالي ، معهد ديني

( وبما أن هنالك سطر في الكود المدون في زر عرض التقرير يحدد إستعمال ثلاث جهات في الصفحة الواحدة من التقرير لذا في حال وجود سجلات تابعة لجميع الجهات الثمانية المذكورة أعلاه فإن الكود سيقسم تلك الجهات إلى ثلاث مجموعات كل واحدة بها ثلاث جهات والأخيرة بها جهتان أي ثلاث صفحات من التقرير وهذا ينفذ تحديداً من السطر التالي في الكود:-

if dat.Query4.RecNo mod 3 = 0 then inc(i);

فهذا يعني بأن الكويري 4 عندما تجد أكثر من ثلاث جهات في ملف MURAJA فسوف يتم فتح صفحة تقرير جديدة لعرض تلك الجهات والجنسيات المقابلة لها )

والجدول التالي يوضح ما أقصده ..

الصفحة الأولى من التقرير

أكاديمية ثانوية معهد جامعة مدرسة الجهة

الجنسية

1 3 0 سعودي

1 0 0 2 مصري

1 0 0 0 5 سوري

0 2 5 1 0 ليبي

0 0 0 0 1 سوداني

الصفحة التالية تعرض ما تبقى من التقرير إن تبقى جهات وجنسيات

روضة معهد ديني الجهة

الجنسية

3 0 سعودي

0 2 مصري

0 5 سوري

1 0 ليبي

0 1 سوداني

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

المشكلة كما ستلاحظون أنه عند عرض التقرير

سيظهر فراغ في السجلات فوق أو تحت

كما سيظهر فراغات في مكانات آخرى من التقرير بشكل غير مناسب

والتقرير لا يعمل بشكل جيد ، فما هو الحل برأيكم أم أن لغة الدلفي عاجزة عن أداء مثل هذه الإحصائيات ؟

· أنصح من سيحاول إيجاد حل للمشكلة ببناء الملفات الموضحة أعلاه.

· مراعاة أن يكون الشكل النهائي للتقرير كما هو موضح أعلاه.

· في حالة تعذر الحل ، فهل يمكن رسم هذا التقرير بواسطة برنامج CANVAS وكيف ذلك في مثل مشكلتي هذه .

مقدراً لكم مجهودكم

HALZUWAWI@YAHOO.COM

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

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