المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : Text File in Dexterity


humam
15-Jan-2012, 01:22 PM
في هذا الموضوع سوف نتطرق الى كيفية التعامل مع Text File ضمن الدكسترتي واخترت هذا الموضوع من ضمن مشروع اعمل عليه حاليا ومن الجيد في البداية ان نتطرق الى الفائدة العملية من التعامل مع Text File ؟
ومثل ما يقال ان الحاجة ام الاختراع ولكن بالنسبة للمطورين ان متطلبات العميل هي التي تدفع الى استخدام طريقة معينه بذاتها . مثلا يمكن استخدام Text File للقيام بعملية Integration بين الجريت بلينز وتطبيقات اخرى حيث يمكن تكوين ملف نصي يحتوي المعلومات المطلوبة من الجريت بلينز ويتم ارسال هذا الملف الى التطبيق الثاني والذي بدوره سوف يعيد المعلومات على شكل ملف نصي وهذه المرة على الجريت بلينز ان يسترجع المعلومات من الملف النصي ثم يقوم بتحديث النوافذ او الجداول تبعا للسيناريو المطلوب من قبل العميل.
وقد يقول قائل ان هذه ليست الطريقة المثلى لعمل Integration بين الجريت بلينز والتطبيقات الاخرى حيث من الافضل استخدام XML Files و eConnect بدل من استخدام Text File وهذا صحيح ولكن Requirement قد تدفعك الى خيارات غير متوقعة كما نوهت في البداية.
هناك استخدام اخر لدوال الملفات النصية حيث يمكنك استخدامها لبناء Macro من الصفر او لتعديل ماكرو موجود حيث ان ملف الماكرو يمتلك صيغة نصية يمكن التعامل معها على انها نص عادي.

humam
15-Jan-2012, 01:24 PM
Text File Libraries In Dexterity

توجد هناك مكتبتين في الدكسترتي للتعامل مع الملفات النصية من النوع tab- or comma-delimited text file :

Import function library
Text file function library

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

humam
15-Jan-2012, 01:26 PM
Import function library

وهي تحتوي على الايعازات التالية :

Import_CloseFile ()
Import_GetNextField ()
Import_GetNextRecord ()
Import_OpenFile () الايعاز Import_OpenFile يستخدم لفتح الملف النصي والصيغة النحوية له هي :

Import_OpenFile (product_ID, pathname, delimiter type, num_fields)

البارمتر الاول ويمثل معرف المنتج Product ID والذي قد يكون عبارة عن ثابت Constant تقوم بتعريفه ضمن المشروع الجديد وهذه هي الطريقة الاحترافية او يمكن امراره مباشرة كعدد صحيح.

البارامتر الثاني وهو عبارة نصية تشير الى مسار الملف الكامل مع اسم الملف ويجب ان يكون المسار بصيغة Generic Path وسوف نوضح هذه النقطة لاحقا.

البارمتر الثالث وهو عبارة عن قيمة صحيحة يستعاض عنها بثوابت لتحديد نوع delimiter المستخدم من قبل الملف النصي:

COMMAFILE: Comma delimiter
TABFILE : Tab delimiter

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


Po Number, Item Number, Item Description, QTY
PO900, ITEM1, Item1 Test, 10
PO900, ITEM2, Item2 Test, 20
PO900, ITEM3, Item3 Test, 12

Monzer Osama
15-Jan-2012, 01:27 PM
ممتاز أخي همام ... متابعون معك

humam
15-Jan-2012, 01:29 PM
ممتاز أخي همام ... متابعون معك

الله يخليك اخي منذر

humam
15-Jan-2012, 01:30 PM
هذا ما سوف يكون عليه الملف النصي المفترض قراءة البيانات منه الى برنامج الجريت بلينز طبعا السطر الاول فقط لتوضيح تركيب البيانات Data Format في التطبيق الفعلي سوف يكون غير موجود. المهم الان اذا فتحنا هذا الملف الافتراضي بشكل صحيح بواسطة الدالة السابقة فمن المفترض ان تكون القيمة المعادة من البارمتر الرابع هي 4 لانه لدينا اربع حقول تميز بينها الفاصلة Comma .

اخيرا القيمة المعادة بواسطة هذه الدالة هي unique file ID وهو معرف فريد يشير الى الملف النصي المفتوح وتحتاج اليه باقي الدوال في هذه المكتبة . اذا حصل خلل اثناء فتح الملف سوف تعاد القيمة Zero .

ملاحظة اخيرة عند قيامك بفتح ملف نصي بواسطة الدالة Import_OpenFile يجب عليك اغلاق هذا الملف بواسطة الدالة Import_CloseFile سواء تم فتح الملف بشكل صحيح او حصل خلل في عملية فتح الملف لتجنب ظهور Bugs في مشروعك.

اخيرا نختم بمثال عن الشفرة البرمجة :

local integer l_num_fields,l_file_ID,l_result,l_index,l_delimite r;
l_delimiter = COMMAFILE; {Comma delimited.}

if getfile ("Choose an import file:", TEXTFILE, l_pathname) then
l_file_ID = Import_OpenFile (BCI_PROD_ID, l_pathname, l_delimiter,
l_num_fields);
{Check for errors opening the file}
if (l_file_ID = 0) or (l_num_fields = 0) then
{The file couldn’t be opened}
warning "There was an error opening the text file";
{Release the file ID}
l_result = Import_CloseFile (l_file_ID);
abort script;
end if;

humam
16-Jan-2012, 02:51 PM
بالنسبة الى الدالة getfile فهي تستخدم لاظهار صندوق حوار تطلب من المستخدم ان يحدد الملف المراد فتحه وتمتلك هذه الدالة ثلاث برامترات الاول هو محتوى الرسالة التي سوف تظهر ضمن صندوق الحوار والثاني هونوع الملف المراد التعامل معه والبارامتر الثالث هو المسار والذي سوف تقوم الدالة بتحديده تبعا لمسار الملف الذي اختاره المستخدم وهذا المسار سوف يكون بصيغة Generic Path والذي تحتاج اليه ضمن الدالة Impor_OpenFile واخيرا تعيد الدالة قيمة منطقية للدلالة على نجاح العملية من عدمها

كان المفروض ان اكمل شرح باقي الدوال اليوم ولكن نسيت ان احمل الملف معي انشاء الله غدا سوف اكمل شرح باقي الدوال.

أحمد الغامدي
17-Jan-2012, 08:03 AM
جهد رائع وطيب اخوي همام الله يديك العافية والصحة
بس الله يحفظك إيش الشئ اللي أجبرك في مشروعك استخدام ملفات التيكست بدلا من الإي كوننيكت ؟ وانت ما شاء الله عليك محترف E-Connect?

على العموم جهود مباركة والله يقويك

humam
17-Jan-2012, 09:05 PM
جهد رائع وطيب اخوي همام الله يديك العافية والصحة
بس الله يحفظك إيش الشئ اللي أجبرك في مشروعك استخدام ملفات التيكست بدلا من الإي كوننيكت ؟ وانت ما شاء الله عليك محترف E-Connect?

على العموم جهود مباركة والله يقويك

مشكور اخي احمد والله السؤال في محله بس كما نوهت في بداية الموضوع سبب استخدام الملف النصي يعود الى العميل الذي اصمم المشروع له حيث ان هذه الشركة تمتلك نظام تستخدمه للباركود ويريدون عمل Integration له مع الجريت بلينز وطلبوا ان تكون عملية تبادل البيانات بواسطة الملفات النصية لذا علينا ان نصمم المشروع وفقا لمتطلبات العميل مع العلم ان استخدام eConnect كان سيوفر على جانب من الجهد البرمجي خصوصا فيما يتعلق بعملية Validation للبيانات حيث مع الملف النصي سوف اضطر للتحقق من البيانات برمجيا للتاكد من انها تصلح لتكوين Transactions في برنامج الجريت بلينز بينما في eConnect تتم عملية التحقق بشكل شبه ذاتي.

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

humam
19-Jan-2012, 06:42 PM
الايعاز Import_CloseFile ويستخدم لأغلا ق الملفات النصية التي تم فتحها بواسطة العبارة Import_OpenFile والصيغة العامة لهذه الدالة هي :

Import_CloseFile (file_ID)

تمتلك هذه الدالة بارامتر واحد هو File ID والذي يمثل معرف الملف الذي تعيده الدالة Import_OpenFile() وتعيد هذه الدالة قيمة صحيحة صفر في حالة اغلاق الملف بصورة صحيحية وتعيد File ID في حالة عدم تمكنها من اغلاق الملف بشكل صحيح.

الدالة Import_GetNextField() وتستخدم لاسترجاع قيمة الحقل الحالي ثم الانتقل وبشكل ذاتي الى الحقل التالي والصيغة العامة لهذه الدالة هي :

Import_GetNextField (file_ID)

وهي تمتلك ايضا برامتر واحد يمثل معرف الملف الذي تعود به الدالة Import_OpenFile الاستخدام الامثل لهذه الدالة هو ضمن حلقة تكرار للمرور على كل حقول السجل Record الحالي وقراءة قيمها وكل ما نحتاج اليه هو معرفة عدد الحقول وهذا توفره الدالة Import_OpenFile ايضا وبتالي يمكن استخدام For do للقيام بهذه المهمة لان القيمة القصوى للتكرار معروفة.

اخيرا الدالة Import_GetNextRecord وهي تستخدم للتنقل بين السجلات Records ضمن الملف النصي وكل سجل سوف يكون ممثل بسطر نصي لذا سوف يتم التعرف على نهاية السجل بواسطة حرف الحاملة Carriage الصيغة العامة لهذه الدالة هي :

Import_GetNextRecord (file_ID)

وهي تمتلك ايضا برامتر واحد يمثل معرف الملف الذي تعود به الدالة Import_OpenFile ولكن القيمة المعادة من هذه الدالة هي قيمة منطقية تكون false لكي تشير الى وجود سجلات اخرى ضمن الملف واننا لم نصل الى نهاية الملف وتعيد القيمة true لتشير الى نهاية الملف او ما يعرف EOF Error .

humam
19-Jan-2012, 06:45 PM
الان بعد التعرف على هذه الدوال اود ان اوضح كيف يمكن استخدامها مجتمعة اولا نستخدم الدالة Import_OpenFile لفتح الملف المطلوب وسوف تعيد عدد من القيم اهمها هي معرف الملف File ID والذي تحتاج اليه باقي الدوال والقيمة المهمة الاخرى هي عدد الحقول Fields التي يحتويها الملف النصي وبعد تفحص حالة الملف المفتوح بواسطة عبارة if then كما في المثال الاول الان ننتقل الى الخطوة الثانية وهي سوف نستخدم حلقتي تكرار الخارجية تستخدم للتنقل بين سجلات الملف بواسطة الدلالة Import_GetNextRecord مع حلقة While end وذلك لاننا لا نعرف القيمة العظمى لعدد السجلات والحلقة الداخلية للتنقل بين حقول السجل الحالي بواسطة الدالة Import_GetNextField وحلقة For do استخدمنا For do لان القيمة العظمى لعدد الحقول معلومة لدينا واخيرا بعد الانهاء من قراءة الملف نغلقه بواسطة الدالة Import_CloseFile وبهذا تكون الصورة قد اتضحت حول كيفية استخدام الدوال السابقة بصورة مجتمعة.

local integer l_num_fields,l_file_ID,l_result,l_index,l_delimite r;
local string l_pathname, l_text;
local boolean l_EOF;

l_delimiter = COMMAFILE; {Comma delimited.}

if getfile("Choose an import file:", TEXTFILE, l_pathname) then
l_file_ID = Import_OpenFile(BCI_PROD_ID, l_pathname, l_delimiter, l_num_fields);
{Display the pathname in the window.}
'(L) TextFile_Pathname' = l_pathname;
{Check for errors opening the file.}
if (l_file_ID = 0) or (l_num_fields = 0) then
{The file couldn’t be opened.}
warning "There was an error opening the text file.";
{Release the file ID.}
l_result = Import_CloseFile(l_file_ID);
abort script;
end if;
{Loop through the file to examine each record.}
l_EOF = Import_GetNextRecord(l_file_ID);
while not l_EOF do
{Loop through each record to get field values.}
for l_index = 1 to l_num_fields do
l_text = Import_GetNextField(l_file_ID);
warning l_text;
end for;
l_EOF = Import_GetNextRecord(l_file_ID);
end while;
l_result = Import_CloseFile(l_file_ID);
end if;

humam
19-Jan-2012, 06:47 PM
Generic Path & Native Path

في العديد من دوال الدكسترتي سوف ترى مصطلحpath Generic و مصطلح Native Path لذا وجدت انه من الجيد توضيح الفرق بينهما ضمن هذا الموضوع سوف نأخذ مثال لكي تكون الفكرة واضحة :

Native Path: - C:\DEX\Tools\
وسوف يكون Generic Path المقابل له هو:
Generic Path: - :C:/DEX/Tools/

من المثال ان الفرق واضح حيث في Generic Path سوف نسبق اسم القرص الصلب بحرف colon: ونستخدم Forward slash للفصل بين اسماء المجلدات اما سبب استخدام هذا النوع لتعريف المسار الكامل فأن وثائق الدكسترتي تشير الى انه تمثيل المسارات بهذه الطريقة سوف يعطي مرونه اكبر لانظمة التشغيل المختلفة للتعامل مع التطبيقات المصممة بواسطة الدكسترتي.
الشيء المهم هو ان الدكسترتي توفر دالتين تسهل على المبرمج التحويل بين انواع المسارت بدون الحاجة لكتابة شفرة برمجية الدالة الاولى وهي Path_MakeGeneric(pathname) ونمرر المسار بهئية Native Path لكي تعيده الدالة بهيئة Generic Path وهناك الدالة Path_MakeNative(pathname) والتي نمرر لها المسار بهيئة Generic Path لتعيده بهيئة Native Path وبهذا التوضيح اعتقد ان الصورة اصبحت واضحة لذا في المستقبل عند التعامل مع دوال الدكسترتي سوف لن نواجه اي مشكلة مع نوع المسارت المطلوب حيث يمكن التحويل بين النوعين بكل سهولة.