مقدمة

السلام عليكم

قد نحتاج أحياناً عند الطباعة، لإظهار معلومات غيرَ متوفرة في الحقول الافتراضية التي يوفرها مصمم الطباعة، وهذا ممكنٌ في برنامج اكسترا بفضل قابليته العالية للتخصيص، عن طريق دعمه لجلب بيانات حقول الطباعة من خلال استعلامات SQL مخصصة.

سنستعرض ثلاثة أمثلةٍ حول هذا الموضوع:

المثال الأول

أمامي ملف بيانات شركةٍ يحوي عدة زبائن، وتم استخدام حقل “مخصص عميل 1” لإضافة ملاحظات تخص تسليم البضاعة المباعةِ للعميل، ونريد أن نُظهر هذه الملاحظات ضمن فاتورة المبيعات المطبوعة، فإذا فتحنا واحدةً من فواتير المبيعات ، وانتقلنا لمصمم الطباعة عن طريق فتح معاينة الطباعة، والضغط على زر التصميم في الأعلى، وبحثنا ضمن عناصر البطاقة المتاحة للإدراج في التصميم، فنلاحظ عدم وجود حقل “مخصص عميل 1″، أو غيره من حقول “مخصص عميل”..

الحل لهذه الحالة أن نجلُب الحقل المطلوب، عن طريق معادلة SQL بسيطة..

 حيث يمكن أن نوفر حلولاً لحالات كثيرة مثل هذه الحالة، عن طريق استعلامات SQL المخصصة..

أولاً، سأجهز عنصر الطباعة الذي سنظهر فيه معلومات حقل “مخصص عميل 1”: وأستطيع استخدام أي حقلٍ من قائمة عناصر البطاقة تقريباً لهذا الغرض، و أغيّر تسميته، لأنني سأغير “مصدر بيانات” هذا الحقل.

على سبيل المثال سأختار حقل “ملاحظات فاتورة 5” في الأعلى، فأنقر عليه نقراً مزدوجاً بالماوس، فيتِم إدراجُه مع تسميته ضمن تصميم الفاتورة التي أمامي.

 

سأنقلهم إلى المكان المناسب في التصميم، وأُغير “نص العرض” لعنصر التسمية إلى “ملاحظات خاصة بالعميل:” ، أما عنصر القيمة سأغير مصدر بياناته بحيث يعرِض محتويات حقل “مخصص عميل 1”.

سأكتب في حقل “مصدر البيانات” استعلام SQL يحضِر محتويات حقل “مخصص عميل 1” ، التي تخص “العميل” الموجود في هذه الفاتورة التي ستطبع بالذات..

لكي نفهم كيف يجب أن نكتب هذا الاستعلام، يفضّل أن نستعين ببرنامجٍ مساعد للاتصال بقاعدة بيانات SQL مباشرة، وإجراء بعض التجارب عليها.. الخيارُ الشائع لهذه المهمة هو برنامج اس كيو إل سيرفر مانيجمينت ستوديو SQL Server Management Studio والذي يمكن تحميله مجاناً من موقع شركة مايكروسوفت، لكن سأستخدم في هذا المثال برنامجاً آخرَ صغير الحجم جداً، لا يتجاوز حجمه أربعين كيلوبايت كملفٍ مضغوط، وهو QueryExpress كويري إكسبرس، يمكنكم تحميله بسهولة من هذا الرابط..

سأفتح Query Express وأتصل بمخدم SQL الخاص بي، ثم أختار قاعدة بيانات اكسترا التي سأنفّذُ هذا المثال عليها..

الآن، لكي نعرِض الحقل المطلوب “مخصص عميل 1” بالفاتورة المطبوعة: يجب أن أَعرِف اسمه البرمجي أولاً، وبما أن هذا الحقل مخزّنٌ في بطاقة العميل، فهو مخزّنٌ ضمناً، في الجدول الخاص بالعملاء، في قاعدة بيانات SQL، والذي يحمل الرقم 16..

لذلك سأكتب استعلاماً يعرض كافة حقولِ وسجلاتِ الجدول TBL016 الخاص بالعملاء، فأكتب:

				
					Select * From tbl016
				
			

إذا أردت قراءة هذا الاستعلام باللغة العربية، فيصبح: اعرض كافة الحقول لكافة السجلات في الجدول رقم ستة عشر tbl016 الخاص بالعملاء.

سأنفذ الاستعلام، بالضغط على مفتاح f5 أو زر Execute Query بالأعلى..

فيعرض فعلاً كافة محتويات الجدول ستة عشر 16، ونلاحظ مباشرة ظهور أسماء العملاء باللغة العربية وهم موجودون في الحقل الذي يحمل الاسم البرمجي AgentName، وألاحظ أيضاً أن الجدول مليءٌ بالحقول، والسبب في ذلك أن بطاقة العميل مليئةٌ بالخيارات أساساً، فلكي أَعرِف الاسم البرمجي لحقل “مخصص عميل 1واحد”، سأبحث في الحقول عن المحتوى المكتوب فيه فعلياً، فمثلاً، مكتوبٌ في هذا الحقل ببطاقة الزبون سليم: “يرجى تسليم البضاعة لأمين المستودع حصراً”، فسأعود لQuery Express، وأسحب شريط التمرير حتى أصل لهذه المعلومة، فألاحظ أنها مخزنة في الحقل ذو الاسم البرمجي: TextValue1، فإذاً هذا هو الحقل المطلوب، فلنعدل الاستعلام السابق الذي يحضر كافة الحقول، بحيث يحضر فقط حقل TextValue1 عن طريق حذف النجمة وكتابة TextValue1 بدلاً منها.. وأعيد تنفيذ الاستعلام عن طريق الضغط على زر ExecuteQuery.

فيعرض الاستعلام الحقل المطلوب لكافة العملاء، وهذا الحقل يمثل محتويات خانة “مخصص عميل 1” في بطاقة العميل.. لكن أنا أريد أن أعرِض فقط حقل TextValue1 للزبون الذي ستُطبع فاتورته، وليس لكافة الزبائن أو العملاء.. لذلك أنا بحاجةٍ لإضافةِ عبارةٍ تقيّدُ الاستعلام بشرط معين، والعبارة المطلوبة هي عبارة Where 

فسأضيف إلى كود الاستعلام عبارة: 

				
					Where AgentName = ‘الزبون سليم’
				
			

وأُعيد تنفيذ الاستعلام عن طريق الضغط على زر Execute Query، ففعلاً يعرض محتويات حقل “مخصص عميل 1” للزبون سليم فقط.. 

هذا يعني أننا جاهزون! وهذه هي المعادلةُ المطلوبُ وضعها، بمصدر بيانات الحقل في مصمم الطباعة..

الجواب للأسف: كلا لسنا جاهزين.. الأمور لا تسير بهذا الشكل في البرمجة…، أولاً لأن هذا الكود خاصٌ بالزبون سليم، أي أنه، سيعرض فقط حقل “مخصص عميل 1” الخاصِّ بالزبون سليم، أياً كان العميل المحدد بالفاتورة..

ثانياً، في البرمجة عادةً، وقواعد بيانات SQL ، لا نربط الحقول بنصوصٍ أو أسماءَ مثل ما فعلنا في هذا الاستعلام، وإنما نستخدمُ مُعرَّفاً فريداً خاصاً بكل سجلٍ في الجدول، هذا المعرف الفريد يُعرَفُ باسم: GUID أو ما اصطُلح على تسميته في برنامج اكسترا “بدليل السجل”، واسم الحقل الذي يمثله في قاعدة البيانات هوعادةً  CardGuide ، هذا المعرّف هو عبارة عن خليطٍ فريدٍ من حروفٍ وأرقام، يولّده مخدمُ SQL تلقائياً عند إنشاء السجل.. إذا أردت رؤية محتوياته في جدول العملاء رقم 16، أُعيد كتابة الاستعلام الأول:

				
					Select * From tbl016

				
			

لكن أحدده أولاً ثم أضغط إكسيكيوت كويري execute query لتنفيذه، لأنه أصبح لدي أكثرَ من استعلامٍ واحدٍ في نفس النافذة..

فنلاحظ شكل محتويات حقلِ كارد غايد CardGuide في كافة السجلات: خليطٌ من حروفٍ وأرقامٍ فريدةْ..

الآن، لتعديل الاستعلام السابق، سأغير حقل الشرط من AgentName إلى CardGuide ، وسأنسخ على سبيل التجربة، دليل سجل الزبون سليم، وألصقه بين علامتي تنصيص بعد اليساوي (ملاحظة: يختلف دليل السجل لديك عن دليل السجل الموجود هنا):

				
					select textvalue1 from tbl016 where cardguide ='5a30af16-3a2b-46f6-80d5-fd50f63234f3'

				
			

ثم أعيد تنفيذ الاستعلام بتحديده والضغط على Execute Query، فنلاحظ أنه عرض أيضاً قيمة حقل “مخصص عميل 1” للزبون سليم.. لكن هذه المرة بالطريقة الصحيحة..

حسناً، بقي علينا أمرٌ واحد قبل أن ننسخ الاستعلام، ونَلصُقْه في مصدر بيانات العنصر الذي أدرجناه في مصمم الطباعة، وهو استبدال دليل السجل الخاص بالزبون سليم، بمتغيرٍ يُمثّل دليل سجل العميل الذي ستُطبع فاتورته!..

 يوفر لنا برنامج اكسترا هذا المتغير ضمن مصمم الطباعة، بالإضافة لغيره من المتغيرات.. 

لكي أعرف ما هو المتغيرُ المطلوب: يمكن أن أُدرجَ بشكلٍ مؤقت “حقل العميل”، من قائمة عناصر البطاقة في مصمم الطباعة، ثم ألاحظُ الاسم البرمجي لحقل القيمة الخاص بالعميل، والذي يبدأُ بعد اليساوي، فالمتغير المطلوب هو SrhAgent ، حيث يمكنني استخدامه مباشرةً ضمن الاستعلام، بعد وضعه ضمن قوسين مربعين [ ] ، وسيتم استبداله تلقائياً عند تنفيذ معادلة الاستعلام، بدليل سجل العميل الذي ستطبع فاتورته!..

سأحذف هذا الحقل الذي أدرجتُه مع تسميته، وأعود إلى كويري اكسبرس query express ، وأعدل الاستعلام ليصبح جاهزاً لنسخه إلى برنامج اكسترا، فأكتب بعد آخر يساوي: [SrhAgent] بين قوسين مربعين، مع الانتباه بشكل عام لحالة الأحرف بالنسبة لمتغيرات اكسترا، هل هي صغيرةً أم كبيرةً..

طبعاً بما أنّ هذا المتغير خاصٌ ببرنامج اكسترا، فلن يفهمه query express ، أي لن أستطيع تجريب المتغير هنا، لكن سأنسخ الاستعلام، وألصقه بخانةِ مصدر بيانات الحقل المناسب، في برنامج اكسترا، لكن هناك أمرٌ أخيرٌ قبل النسخ! يجب أن أجعل الاستعلام كلَّه على سطرٍ واحد…

الآن أحدده وأنسخه، ثم أعود لمصمم الطباعة، وأضغط على العنصر TxNote5 ، الذي جهزته لهذه المهمة، وأنتقلُ لحقل “مصدر البيانات” في ناحية الخصائص، وأحذف القيمة الموجودة، وألصق الاستعلام الذي نسخته، وأضغط مفتاح الإدخال إنتر…

أحفظُ التصميم، بالضغط على زر الحفظ في الأعلى، وأغلق نافذة المصمم، لتظهر المعاينة..

ففعلاً، يُظهر البرنامج المعلومة المطلوبة، في معاينة الطباعة…

إذاً المعادلة البرمجية تعمل كما هو مطلوب..

 

المثال الثاني

تستخدم بعض الشركات، حقل مركز الكُلفة في الفواتير، لتحديد مندوب المبيعات الذي نظم الفاتورة، فأمامي نموذج طباعةٍ لفاتورةِ مبيعات، مضافٌ إليه عنصرُ مركزِ الكُلفة، الموجود افتراضياً ضمن العناصر المتاحة للإدراج في التصميم، لكن، هناك مشكلة صغيرة..

هي أن هذا العنصر، يعرُض رقم بطاقة مركز الكلفة، بالإضافة لاسم مركز الكلفة.. والشركة تريد أن يظهر اسم مندوب المبيعات المُخزّن في حقل مركز الكُلفة فقط، بدون رقم البطاقة..

 

الحلّ بسيط.. ُنغير مصدر بيانات هذا الحقل، ونضعُ استعلام SQL يحضر اسم مركز الكلفة فقط، بدون الرقم.. وهذه المعلومةُ موجودةٌ في حقلٍ في الجدول رقم خمسة 5، في قاعدة بيانات SQL الخاصة ببرنامج اكسترا.. لكن كما رأينا في مثالنا السابق، نحن بحاجة لدليل سجل مركز الكُلفة المرتبط بهذه الفاتورة، أي لمعرّفِهِ الفريد.. والحل هنا أبسطُ في الحقيقة، لأن دليل السجل المطلوب، يمثله المتغير الموجود في مصدر بيانات حقل مركز الكلفة الافتراضي، فأفتح مصمم الطباعة بالضغط على هذا الزر، ثم أضغط على الحقل الذي يمثل مركز الكُلفة الخاصِّ بالفاتورة، وألاحظ أن مصدر بياناته مرتبطٌ بالمتغير [SrhCostCenter] ، وهذا هو المتغير الذي سيعيد دليل السجل الخاص بمركز الكُلفة المرتبط بهذه الفاتورة، لذا سأنسخه، وأفتح برنامج المفكرة في ويندوز، وألصقه ضمنه لأجهّز الاستعلام.

 فإذا علِمتَ أنّ الاسم البرمجي لحقل اسم مركز الكلفة في جدول مراكز الكلفة في قاعدة البيانات، هو CostCenter ، وأنّ اسم جدول مراكز الكلفة في قاعدة بيانات SQL هو TBL005، فتصبح المعادلة أو الاستعلام المطلوب:

				
					Select CostCenter From tbl005 Where cardguide = [SrhCostCenter]

				
			

يعني بالعربي: أحضر لي اسم مركز الكلفة، من جدول مراكز الكلفة، بشرط أن يكون دليلُ سجله، مرتبطاً بهذه الفاتورة التي ستطبع..

نتأكد من أن الاستعلام على سطر واحد، وننسخه ونلصقه في مصدر بيانات حقل مركز الكُلفة، والذي يمثل مندوبَ المبيعات.. 

ثم نحفظ التصميم، ونعود للمعاينة..

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

المثال الثالث

في هذا المثال سنرفع المستوى قليلاً..

في نفس الشركة السابقة، تم اعتماد حقل “تصنيف عميل 1” لتصنيف الزبائن بناءاً على شريحتهم السعرية، لأربع تصنيفات.

 يمكن مشاهدة تعريف هذه التصنيفات، في دليل التصنيفات: 

وهي: تجزئة، ونصفُ جملة، وجُملة، وجُملةُ جُملة..

فإذا طُلب مني أن أضيف إلى الفاتورة المطبوعة، عنصراً جديداً يعرض هذا التصنيف، فألاحظ إذا بحثت في العناصر المتاحة افتراضياً ضمن مصمم الطباعة، أن حقل تصنيف العميل 1 غيرُ موجود.

لذا نحن مضطرين لجلب هذا الحقل عن طريق معادلة SQL. 

مثلما فعلنا في المثال الأول، سأجهز أولاً الحقل الذي سنظهر فيه تصنيف الزبون: ويمكنني استخدام أي حقلٍ تقريباً لهذا الغرض، ثم أعيد تسميته، بما أنني سأغير مصدر بيانات هذا الحقل.

فسأختار حقل “ملاحظات فاتورة 5” في الأعلى. 

ثم أنقله مع تسميته للمكان المناسب في الفاتورة، وأغيّر “نص العرض” لعنصر التسمية إلى “صفة البيع:” ، أما عنصرُ القيمة، فسأغيّر مصدر بياناته بحيث يعرض التصنيف المطلوب.

سأكتب في خانة مصدر البيانات: استعلام sql ، يحضِر “تصنيف العميل 01” الذي يخص “العميل” الموجود بهذه الفاتورة، التي ستطبع..

حسناً، حقلُ “تصنيف العميل 01” مخزّنٌ في جدول “دليل التصنيفات”، والذي يمثله الجدول رقم 81 في قاعدة بيانات اكسترا.. فإذا أردت استعراض حقول وسجلات هذا الجدول، أعود إلى QueryExpress وأكتب الاستعلام البسيط التالي:

				
					Select * From TBL081
				
			

أي: اعرض كافة الحقول، لكافة السجلات الموجودة في الجدول 81.

أضغط F5 أو Execute Query في الأعلى لتنفيذ الاستعلام، فيَعرُض كافة التصنيفات الموجودة في قاعدة بيانات Xtra، لكن يعرضهم كما رأينا سابقاً بطريقةٍ خام، بدون أي تجميل أو تحسين للعرض.. لكن يمكن أن أميّز بالنظر مباشرةً، معلومةً مفيدةً وواضحة، وهي أن حقل CardName ، يحوي تسميات التصنيفات بالعربية..

بالحقيقة، هذا هو الحقل الذي أريد عرضَه في الفاتورة المطبوعة،  لكنّ البنية التحتية للبرنامج، لا تتعامل بالتسميات كما ذكرنا سابقاً، لأنّ التسميات وغيرُها من الحقول الموجودة، عُرضةٌ للتغيير، البنيةُ التحتية لبرنامج اكسترا، تتعامل مع معرّفاتٍ فريدة، يمثلها عادة حقل “CardGuide” ، الموجودُ ضمن جداول قاعدة بيانات SQL،  مثلما هو ملاحظ في الجدول 81، الظاهر أمامي..

 

حسناً، إذا عدنا للاستعلام المطلوب: كنت أريد استعلاماً يعرض “تصنيف العميل 01” الذي يخص “العميل”، الموجود بهذه الفاتورة التي ستطبع.. فنلاحظ نريد بياناتٍ من جدول التصنيفات رقم 81، وبياناتٍ من جدول العملاء ذو الرقم 16، 

سألقي نظرة سريعة على محتويات جدول العملاء رقم 16، عن طريق كتابة الاستعلام:

				
					Select * From tbl016
				
			

والذي يعني: اعرض كافة الحقول لكافة السجلات، من الجدول 16، فأنفذه بتحديده أولاً، ثم ضغطِ f5 

فيعرض حقول وسجلات جدول العملاء رقم 16..

حسناً، طلبي هو محتويات حقل “تصنيف عميل 1″، أي يجب أن أبحث عن حقل يشبهُ اسمهُ كلمةَ “تصنيف أو فئة” بالإنكليزية.. والتي يمكن أن تكون Classification أو Category مثلاً.. فنلاحظ وجود عدة حقول تبدأ بـCategory ، من 1 إلى 15 ، ولا يوجد بيانات إلا في الحقل Category01 ، والباقي كلهم NULL أي بلا قيمة، فأفهم مباشرة أن حقل Category01 هو الحقل المطلوب..

 لكن هناك مشكلةً صغيرة.. محتويات هذا الحقل: هي “دليل سجل” التصنيف، بدلَ أن تكون، تسميات التصنيفات الفعلية باللغة العربية! مثلما ذكرنا سابقاً، البرنامج يتعامل وراء الكواليس، بالمعرفات الفريدة أو “أدلة السجلات” وليس بالتسميات..

إذاً ما هو الحل؟ كيف أعرض تسمية التصنيف الذي يخص العميل الموجود بالفاتورة، بدلالة “دليل سجل التصنيف”؟

 

الجواب: يمكن أن أنفذ استعلاماً مُرَكّباً من استعلامين، أحدهما يحضر دليل سجل التصنيف، المرتبط بالعميل الذي ستطبع فاتورته، ويمرر النتيجة لاستعلام آخر، يحضر اسم هذا التصنيف بدلالة مُعرّفه أو دليل سجله..

فالشكل شبه النهائي للاستعلام المطلوب هو التالي:

				
					Select CardName from TBL081 Where CardGuide=
(Select Category01 from TBL016 where CardGuide = دليل سجل العميل الذي ستطبع فاتورته)
				
			

إذا أردت قراءة هذا الاستعلام بالعربية، فيصبح: اعرُض تسمية التصنيف، من جدول التصنيفات، والتي دليل سجلها أو مُعرفها الفريد، يساوي المُعرف الفريد الموجود في  حقل التصنيف الأول، المخزن في جدول العملاء، والذي يخص العميل الذي ستُطبع فاتورته..

بالطبع أنا بحاجة هنا أيضاً لمتغير يمثّل دليل سجل العميل الذي ستطبع فاتورته!..

وهذا المتغير كما رأينا في المثال الأول هو SrhAgent ، يمكنني استخدامه مباشرة ضمن الاستعلام بعد وضعه ضمن قوسين مربعين [ ] ، وسيتم استبداله تلقائيا عند تنفيذ الاستعلام، بدليل سجل العميل اللي ستطبع فاتورته!..

فسأرجع إلى query express وأعدل الاستعلام، ليصير جاهزاً لنسخه إلى برنامج اكسترا، فأكتب بعد آخر يساوي [SrhAgent] ، ويجب الانتباه إلى أن الاستعلام الثاني، هو بين قوسين..

طبعاً لن أستطيع تجريب المتغيرِ هنا، لذا سأنسخ الاستعلام وألصقه بخانة مصدر بيانات الحقل، الذي جهزته لهذا الموضوع، في برنامج اكسترا، لكن هناك أمرٌ أخير قبل النسخ! يجب أن تكون المعادلة البرمجية بأكملها على سطر واحد…

الآن أحددها وأنسخها ، وأنتقل إلى مصمم الطباعة، وأضغط على العنصر TxNote5 ، الذي جهزته لهذه المهمة، وأذهب إلى حقل “مصدر البيانات” في ناحية الخصائص، وأحذف الموجود، وألصق الاستعلام اللي نسخته، وأضغط مفتاح انتر…

ثم أحفظ التصميم، بالضغط على زر الحفظ في الأعلى، وأعود للمعاينة..

ففعلاً ، يُظهر البرنامجُ المعلومة المطلوبة، في معاينة الطباعة: “صفة البيع : تجزئة” ..

إذا الكود يعمل تماماً كما هو مطلوب..

هذه كانت ثلاثة أمثلة، عن حالات من مئات الحالات، التي يمكن أن نخصص فيها الطباعة في برنامج اكسترا..

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

اترك تعليقًا

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Shopping Cart
انتقل إلى أعلى