بخشی از مقاله
پیش گفتار
گاهی با توجه به پیشرفت علم و تکنولوژی در زمینه کامپیوتر و به بازار آمدن انواع نرمافزارهای جدید که سازگاری شدیدی با محیط ویندوز و تقریبا به هیچ کدام از آنها محیط و برنامههای تحت سیستم عامل را پشتیبانی نمیکنند ضرورت پیدا میکند که برای کنار گذاشتن برنامههاایتحت Dos خود بتوانیم آنها را به طریقی تبدیل به انواع مختلف قابل شناسایی تحت ویندوز تبدیل کنیم.
یکی از موارد کاربرد آن در مواقعی است که به بانکهاب مختلف موجود در محیط بانک اطلاعاتی تحت Dos از حمله foxpro را بتوان به یک بانک تحت سیستم عامل win تبدیل کرد. خصوصا این که در کشورمان دادههای این بانکها تقریبا تماما فارسی بوده و مار را برای ما مشکل میکند.
به همین جهت تصمیم گرفته شد که با تکیه به تجربه چندین ساله در زمینه برنامهنویسیهای تحت Dos و Windows نرمافزاری فراهم آورده شود که نیازهای این گونه افراد را برآورده سازد.
در این جزوه سعی شده است که ضمن نشان دادن و توضیح کامل این نرمافزار تمام مطالب به صورت واضح و شفاف به همراه لیست و توضیح تمام دستورات به کار گرفته شده آورده شود تا استفاده کنندگان بتوانند درک بهتری از رابطهی این دو سیستم عامل با هم داشته باشند. در عین حال به جنبههایی از تئوری و مقدمات برنامهنویسی نیز توجه شده است.
در این جا لازم میدانم که از همکاری همه کسانی که تولید و آمادهسازی این پروژه با کمک آنان میسر گشت تشکر کنم. در این میان از آقای نیکفرجام و آقای اخلاقی که در تمام مراحل انجام این پروژه نهایت همکاری را داشتهاند سپسگذارم.
مهدی حسین زاده پاییز 85
نحوه پیادهسازی
به طور کلی این پروژه از دو نرمافزار جداگانه تشکیل شده که شامل یک بنامه تولید شده به زبان foxpro است که به طور خلاصه میتوان گفت حمل تبدیل تمام حروف و اعداد به کار گرفته شده در بانکها را شامل حروف و اعداد فارسی و انگلیسی بهکدهای اسکی آنان که قابل فهم برای محیط ویندوز باشد، فراهم میآورد.
همچنین شامل یک برنامه آسان شده به زبان Delphi است که در آن بانکهای تحت Dos که اطلاعات رکوردهای آن فقط شامل کد اسکی آن علائم و حروف است را تبدیل به کدهای معادل آن در محیط ویندوز و ایجاد یک بانک جدید تحت ویندوز مینماید.
در ذیل به جزئیات هر دو برنامه و تشریح عملکرد آنها میپردازیم:
تشریح برنامه تحت Dos
در ابتدا توسط تابع feount تعداد فیلدهای بانک را در متغیر c- field ریختهایم و یک آرایه به طول تعداد فیلدهای بانک و به اندازه 4 برای نگهداری لیست فیلدها به همراه نوع و اندازه آنها تعریف کرده و آن را با مقادیر بانک پر میکننیم.
c-field = fcount()
Dimension array 1 (o- field,4)
? afield (array 1)
سپس برای این که اطلاعات موجود در بانک پاک نشود یکبانک جدید درست کرده و تمام رکوردها را در آن اضافه میکنیم، توجه داشته باشید که طول فیلدهای از نوع رشتهای در بانک دوم ضرب در 3 شده (علت آن این است که چون حروف در مبنای اسکی بین Q تا 255 است و ما نیاز داریم در بانک دوم به جای حروف کدهای 3 حرفی آنها را قرار دهیم.
For I -=1To c-field
If array 1 (I,2) ="c"
Array 1 (I,3) = array1(I,3)* 3
Endif
Endfor
Create DBF c: 1bank 2 from Array Array1
Use bank 2
Append from bank
سپس در یک حلقه do- while و توسط یک تابع به نام conv 2 bin تمام بانک اول را پیمایش کرده و معادل اسکی آن را در بانک دوم میریزیم.
برای مشاهده کدهای اسکی حروف و علائم مورد استفاده در محیط Dos میتوانید فایل ppz.pro را اجرا نموده و نتیجه کار را در فایل p2.pro درون درایو c خود مشاهده کنید. اگر نرمافزای فارسیسازی مانند sepand را در سیستم خود اجرا کرده باشید خواهید دید که حروف فارسی کدهای 141 تا 175 و 224 را شامل شدهاند و کد حروف انگلیسی از 65 تا 122 میباشد.
تشریح برنامه تحت ویندوز
در این برنامه بانکهایی که توسط foxpro با کدهای اسکی پر شدهاند را تفسیر نموده و یک بانک جدید تحت paradox (*.DB) ایجاد و آنها را مقداردهی میکند، توجه داشته باشید که روش کار بدین صورت است که کدهای اسکی ؟ تا 255 در یک تابع به نام vagaf2win تشیخیص داده شده است و معادل آنها برگردانده میشود.
روش اجرا و به کارگیری برنامه
1- قبل از هر کار بانک تحت foxpro خود را با نام Bank. Dbf در داخل درایو c کپی کنید.
2- از طریق فرمان زیر در منوی Rum وارد محیط Dos شوید run = Cmd
3- توسط فرمان زیر به شاخه foxpro رفته و فایل foxpro.exe را اجرا نمایید.
CD
CD foxpro
4- از منوی file گزینه open را انتخاب و فایل ppl.PRG را از شاخه DBF موجود در این نرمافزار باز کنید.
5- کلیدهای ctrl+o را برای اجرای بنرامه بزنید (ممکن است عملیات اجرا برای چند دقیقه نیز طول بکشد بنابراین صبر کنید.)
تذکر: اگر در زمان اجرا با پیغامی مواجه شدید لطفا دکمه Ignore را بزنید) بعد از پایان اجرا میتوانید بانک دوم را توسط دستورات زیر مشاهده کنید:
Close Database
Use C:1bank2 . dbf
List
حالا میتوانید از محیط foxproخارج شوید، برای این کار از منوی file گزینه Quit را انتخاب کنید.
در این مرحله یک بانک به نام Bank 2.dbf برایتان درون درایو C ایجاد شده که شامل کدهای اسکی ازلاعات موجود در رکوردهای بانک شماست.
این بانک را باید برای وارد کردن به برنامه دوم درون فایل Impont Convert or. Mdb کنید، برای این کار فایل Convert or. Mdb را اجرا کنید، درون بانک راست کلیک کرده و گزینه Impont را بزندی، در این مرحله باید فایل Bank 2.dbf را از درایو C انتخاب و Impont کنید.
بعد از این کار فایل اصلی برنامه به نام Convertoic exe را اجرا کنید.
صفحهای ظاهر میشود که باید مراحل زیر را برای تبدیل بانک طی کنید.:
1- روی open کلیک کنید و فایل converton.mdb را از شاخه برنامه باز کنید.
2- در این مرحله باید نام بانک خود را (bank2) از لیست انتخاب کرده و ok را بزنید.
3- برای ایجاد یک بانک تحت paradox بر روی create table کلیک کنید.
4- در پایان روی convert کلیک کنید.
مشاهده می کنید که جدول سمت چپ شامل کدهای اسکی و جدول سمت راست همان کدها را تبدیل به معادل کاراکتری شان کرده است. این بانک درون شاخه برنامه بنام bank.db قابل دسترس است.
مرجع دستورات
APPEND FROM
این دستور رکوردها را از فایل filename خوانده و یک نسخه از آنها را به بانک فعال اضافه میکند. گزینه FOR/WHILE شرطی را مشخص میکند که رکوردها برای کپی شدن باید آن را دارا باشند. اگر فایل حاوی دادهها یکی از بانکهای فاکسپرو نباشد؟، در آن صورت نوعی را که مشخص میکنید باید یکی از انواع فایلهای قابل قبول فاکسپرو باشد. گزینههای قابل قبول فاکسپرو عبارتند از:
DELEIMITED, DELEIMITEDWITH delimiter, DELEIMITEDWITH TAB, DELEIMITEDWITHBLANK.XKS , WRK, WRL, WKS, WK3, WKI , SYLK, RPO, PDOX, MOD, FW2, DIF, SDF,
میدهند که چگونه میتوان به کمک این دستور رکوردهایی را از یک فایل (بانک) کوچک به داخل بانک فعال جاری کپی نمود.
CLEAR
این دستور صفحه نمایش را پاک میکند. این دستور را همچنین میتوان به عنوان گزینهای از دستور@ به کار برد؛ در آن صورت قسمت پایین و سمت راست موقعیت جاری مکاننما پاک میشود.
CREATE
این دستور یک بانک جدید ایجاد و ساختار آن را تعریف میکند. اگر نام فایل را مشخص نکنید، فاکسپرو هنگام ذخیره ساختار آن، برای دریافت آن اعلام آمادگی میکند. اگر نام فایل را مشخص کنید، فاکسپرو بانک را تحت حمایت همان نام ایجاد میکند. DBF به طور خودکار به عنوان انشعاب فایل در نظر گرفته میشود، مگر این که انشعاب دیگری را خود مشخص کنید.
وتی این دستور را برای ایجاد یک بانک اطلاعاتی وارد میکنید، صفحه مربوط تعریف ساختار بانک ظاهر میشود. این صفحه چهار ستون دارد که برای تعریف نام، نوع و اندازه و تعداد نقاط اعشاری فیلدها به کار میرود.
DIMENSION
این دستور یک آرایه ایجاد میکند (توجه داشته باشید که این دستور با FoxBASE+ و Clippcr سازگار است. برای سازگاری با Dbase IV از دستور DECLARE استفاده کنید) نام و ابعاد آرایه را باید در لیست تعریف آرایه مشخص کنید. نام آرایه باید حداکثر ده کاراکتر باشد. سطرها و ستونهای یک آرایه یک بعدی ایجاد میکند. وقتی سطرها و ستونهای یک آرایه را مشخص میکنید، آنها را به وسیله کاما از هم جدا کنید تا فاکسپرو یک آرایه دو بعدی ایجاد کند.
DO WHILE
دستور DO WHILE، دستورات بین DO WHILE و ENDDO را تا وقتی که شرط مورد نظر برقرار باشد، اجرا میکند. وقتی فاکسپرو با دستور DO WHILE مواجه میشود، ابتدا شرط پس از دستور را بررسی میکند. اگر شرط نادرست باشد، اجرای برنامه را از دستور پس از ENDDO اجرا میکند. وقتی فاکسپرو به دستور ENDDO میرسد، مجدداً شرط حلقه را بررسی میکند. اگر شرط هنوز برقرار باشد، دستورات داخل حلقه مجدداً اجرا میشوند. اگر شرط دیگر برقرار نباشد، فاکسپرو اجرای برنامه را از دستور بعد از ENDDO ادامه میدهد.
GOTO یا GO
این دستورات نشانگر فایل را به یک رکورد خاص انتقال میدهند. GO TO نشانگر فایل را به ابتدا و GO BOTTOM نیز آن را به انتهای فایل انتقال میدهد. اگر عددی را به همراه دستور به کار برید، آن عدد به عنوان شماره یک رکورد تلقی شدهو نشانگر فایل به همان رکورد انتقال داده میشود. با استفاده از گزینه IN نیز میتوانید نشانگر فایل ناحیههای کاری دیگر را به رکورد مورد نظر انتقال دهید. Alias ممکن است نام فایل و یا شماره ناحیه کاری مورد نظر باشد.
SET PATH
این دستور برای مشخص کردن مسیر جستجوی فایلها به کار میرود. در صورتی که فایل مورد نظر در دایرکتوری جاری یافت نشود، این مسیر نیز جستجو میشود. توجه داشته باشید که این دستور تاثیری بر روی مسیر جستجوی DOS ندارد؛ بلکه تنها یک مسیر جستجویی که به وسیله این دستور مشخص میکنید، مسیر جستجوی DOS نیز جستجو میشود.
REPLACE
این دستور مقادیر جدیدی را جایگزین محتوای قبل فیلدهای مشخص شده میکند. برای این که همزمان محتوای بیش از یک فیلد را تغییر دهید، کافی است آنها را با WITH expression مشخص کنید؛ توجه داشته باشید هر یک از آنها را به وسیله کاما از یکدیگر جدا کنید. با استفاده از گزینه FOR میتوانید شرط بخصوصی رامشخص کنید که در این صورت جایگزینی مقادیر تنها زمانی صورت میگیرد که شرط برقرار باشد. اگر از گزینه WHEN استفاده کنید، عمل جایگزینی تا وقتی ادامه مییابد که شرط برقرار باشد. اگر از هیچ یک از سه گزینه scope، FOR و یا WHLE استفاده نکیند، تنها محتوای رکورد جاری (رکوردی که نشانگر فایل نشان میدهد) تغییر داده میشود. اگر میخواهید متنی را به محتوای جاری یک فیلد memo اضافه کنید، از گزینه ADDTTIVE استفاده کنید. فاکسپرو بهطور خودکار کاراکتر اسکی شماره 13 (carriagc return) را بین مقدار قبل و جدید اضافه میکند. در نگارشهای 2و بالاتر، گزینه NOOPTIMIZE سبب میشود که فاکسپرو از تکنیکهای بهینهسازی داخلی خود (تکنولوژی Rushmore استفاده نکند.
وقتی محتوای رکوردهای را به طور عمودی از طریق ویندوی دستورات تغییر میدهید، بسیار وقت کنید؛ کاربرد نادرست این دستور ممکن است خسارت جبرانناپذیری به همراه داشته باشد. اگر مطمئن نیستند که این دستور چه تاثیری بر روی بانک اطلاعاتی خواهد داشت، در آن صورت یک کپی با استفاده از دستور COPY TO ایجاد کرده و آزمایشات لازم را به جای نسخه اصلی بر روی نسخه دوم فایل به عمل آورید.
USE
این دستور یک بانک اطلاعاتی را همراه با فایلهای شاخص آن در یک ناحیه کاری باز میکند. اگر به جای نام فایل از ؟ استفاده کنید، فهرست فایلهای موجود ظاهرمیشود. با استفاده از گزینههای INDEX و ORDER مشخص کنید که کدام فایلهای شاخص باز یا فعال خواهند بود. با استفاده از گزینه ALLAS نیز میتوانید یک فایل را در ناحیه کاری دیگر ؟
AFIELDS
قالب تابع
این تابع مشخصات فیلدهای بانک موجود در ناحیه کاری جاری را در عناصر یک آرایه ذخیره میکند. نام، نوع، طور و تعداد ارقام اعشاری فیلدها در عناصر آرایه ذخیره میشوند.
این آرایه که نام با expC مشخص میشود، با محتوای چهارستونی که عموماً به عنوان نتیجه دستور LIST STRUCTURE ظاهر میشوند، پر می شود. نام فیلدها در ستون اول ذخیره شده و محتوای ستون نیز عناصر کاراکتری خواهد بود. نوع فیلدها در ستون دوم ذخیره شده و محتوای ستون یک رشته یک کاراکتری خواهد بود؛ "C" برای فیلدهای کاراکتری، "D" برای فیلدهای نوع تاریخ، "L" برای فیلدهای منطقی،M برای فیلدهای memo،N برای فیلدهای عددی، و F برای فیلدهای اعشاری با نقطه ممیز شناور. طول فیلدها در ستون سوم ذخیره شده و محتوای آن عناصر عددی خواهد بود. تعداد ارقام اعشاری فیلدها در ستون چهارم و عناصر آن عددی خواهد بود.
ALLTRIM
قالب تابع
این تابع blankهای ابتدا و انتهایی رشته کاراکتری expC را حذف میکند. این تابع از نظر عملکرد با LTRIM (RTRIM (expC)) معادل است.
FCOUNT
قالب تابع
این تابع تعداد فیلدهای یک بانک اطلاعاتی را برمیگرداند. برای برگرداندن تعداد فیلدهای بانکهای اطلاعاتی موجود در ناحیههای کاری دیگر نیز از alias استفاده کنید.
LEN
قالب تابع
این تابع طول رشته کاراکتری expC را برمیگرداند. ExpC ممکن است یک فیلد memo باشد که در آن صورت طول متن ذخیره شده در آن برگردانده میشود. توجه داشته باشید که اگر expC نشاندهنده یک فیلد کاراکتری باشد، این تابع به جای این که طول متن موجود در آن را برگرداند، طول فیلد را برمیگرداند. برای به دست آوردن طول متن ذخیره شده در فیلدهای کاراکتری باید از تابع TRIM () استفاده کنید.
PROCEDRE
این دستور ابتدای هر پروسیجر مجزا رادر فایل پروسیجرها نشان میدهد. این فایل برای نگهداری پروسیجرهایی مورد استفاده قرار میگیرد به صورت روتینهای مجزا در برنامهها فراخوانده میشوند. برای ساختن یک پروسیجر، تمام دستورات مورد نیاز را بین PROCEDURE و RETURN قرار دهید (دستور RETURN در فاکسپرو اختیاری است؛ اما توصیه میشود که آن را برای مشخص شدن آنتهای یک پروسیجر به کاربرید) وقتی پروسیجرها در یکک فایل مجزا نگهداری میشوند، آن فایل را باید (قبل از فراخوانی یک پروسیجر)با استفاده از SET PROCEDURE معرف نمود. توجه داشته باشید که میتوانید پروسیجرها را در یک فایل برنامه اصلی نگه داشته ودیگر از دستور SET PROCEDURE استفاده نکنید. قرار دادن پروسیجرها در یک فایل سبب افزایش سرعت اجرای برنامه میشود؛ چرا که هر بار که یک پروسیجر از برنامه اصلی فراخوانده میشود، دیگر نیازی نیست که آن پروسیجر از روی دیسک که داخل حافظه لود شود.
نام پروسیجرها باید حداکثر هشت کاراکتر باشد. نام یک پروسیجر میتواند شامل "-" ارقام و یا حروف باشد، ولیکن باید حتما با یک حرف آغاز شود. دقت داشته باشید که نام فایل برنامه را به پروسیجری که در آن وجود دارد اختصاص ندهید.
تعداد پروسیجرها را به ترتیب زیر انجام میدهد.
1- برنامه کامپایل شده جاری جستجو میشود.
2- فایل یاد شده در دستور SET PROCEDURE جستجو میشود.
3- فایل برنامهها جستجو میشود؛ این جستجو از آخرین برنامه آغاز و تا اولین برنامه ادامه مییابد.
4- فایل اجرایی همنام با فایل پروسیجرها جستجو میشود.
اگر میخواهید پروسیجرها را در برنامه اصلی نگه دارید، صورت آنها را در انتهای برنامه قرار دهید. دلیل این کار این است که دستورات پس از PROCEDURE تا وقتی که مستقیما توسط دستور DO فراخوانده نشده باشند، اجرا نمیشوند؛ به عبارت دیگر اگر بخواهید دستور PROCEDURE، چند دستور دیگر، و دستور RETURN را در میانه یک برنامه موجود قرار دهید، در آن صورت دستورات پس از RETURN هیچگاه اجرا نخواهد شد.
PUBLIC
این دستور متغیر یا آرایههای مورد نظر به صورت عمومی تعریف میکند تا مقادیر آنها برای تمام سطوح بالاتر یک برنامه قابل دستیابی باشد. بر خلاف دستور RETURN، این دستور متغیرها را ایجاد و در همان لحظه به عنوان متغیرهای عمومی معرفی میکند. اما توجه داشته باشید که متغیرهای ایجاد شده تماماً از نوع منطقی خواهند بود؛ مقدار اوله نادرست به آنها اختصاص مییابد. پس از ایجاد یک متغیر میتوانید مقدار دیگری (نوع دیگر) به آن اختصاص دهید. به عنوان مثال اگر بخواهید یک متغیر منطقی به نام PRINTIT ایجاد کنید و مقدار اولیه نادرست را به آن اختصاص دهید، در آن صورت میتوانید از دستور زیر استفاده کنید:
PUBLICPRINTIT
اما اگر بخواهید یک متغیر عددی به نام AGE ایجاد کنید و عدد 18 را در آن ذخیره کنید، در آن صورت لازم است که پس از تعریف متغییر، مقدار مورد نظر را با استفاده از دستور دیگری در آن ذخیره کنید: