بسم الله الرحمن الرحيم
(( وفوق كل ذي علم عليم ))
سأشرح المشكلة بشئ من التفصيل :
لدي ملف يسمى ملف القطاعات وهو ماستر به حقلين الأول إسمه 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