باید در نظر داشته باشیم که وقتی جدولی در قالب دیتابیس طراحی شود از قابلتهای بسیاری برخوردار خواهد بود یکی از این قابلیتها این است که بسیاری از کدها را می توان در خود جدول بررسی کرد و کدنویسی در برنامه کاهش می یابد.
در تصویر فوق فیلدی از نوع تاریخ تعریف کردیم.
بجای تنظیم در properties فرم همینجا Inputmask را تغییر دادیم . پیش فرض را تابع تاریخ شمسی دادیم . یعنی اگر در پنجره فرمان brow ببینیم و رکورد خالی ایجاد کنیم می بینیم پیش فرض تاریخ روز درج شده و فرمت هم محفوظ می ماند . حال اگر در بخش rules تابعی داشته باشیم که صحت ورود اطلاعات را چک کند همینجا حتی در brow هم کاربر چنانچه اطلاعات را درست وارد نکند می شود کنترل نمود.
در سایت برنامه نویس کلاسی از نوع تاریخ شمسی ایجاد شده که بجای اعمال فوق کافی است در بخش display class آن را انتخاب نموده و آبجکت تاریخ موجود در آن را در بخش display library انتخاب نمود.این از طراحی دیتابیس مورد نظر (بخش تاریخ).
خیلی ها برای عملیاتی نظیر سورت و سرچ ترجیح می دهند تاریخ کارکتری را به عدد تبدیل کنند( 15/02/86 به 860215) و بعد عملیات جستجو در فیلد عددی انجام پذیرد . فیلد cDate و nDate را در نظر بگیرید.
اگر تابع rplDate با محتوای زیر داشته باشیم :
Parameter cVarDate
(Replace ndate with val(chrtran(cdate,'/','')
حال فقط کافیست هر زمانی رکورد آپدیت شد تاریه کارکتری به تاریخ عددی تبدیل شود . اما شاید این مسئله در فرمهای مختلف فراموش شود . اما اگر در به روز رسانی رکورد این تابع را فراخوانی کنیم دیگر نیازی نیست در فرمها کدی در این زمینه وارد کنیم بلکه در هر فرمی حتی در پنجره کامند هم رکوردی به روز رسانی شود تاریخ عددی در فیلد ndate جایگزین خواهد شد.
برای انجام این کار در تصویر فوق به برگه table می رویم.
: زمانیکه رکورد جدیدی ایجاد می شود.
Update trigger : زمانیکه رکوردی به روز رسانی می شود.
Delete trigger : زمانیکه رکوردی حذف می شود.
این 3 گزینه به نظر من مهمترین بخش پیکر بندی جداول می باشد . شما در نظر بگیرید هدف از طراحی فرم چیست ؟ بخش اعظمی از فرم برای ورود اطلاعات است . حال بجای کد نویسی مشابه در فرمهای متفاوت می شود در همین بخش کدها را وارد نمود . یعنی کدهای مورد نطر را در یک فایلی prg قرار داد و در گزینه های فوق آن را فراخوانی کرد. در مثال فوق در Update Trigger تابع rplDate(cDate) را وارد کنید . حال هر باری که رکورد به روز رسانی شود تاریخ کارکتری به عدد تبدیل می شود.
یا مثلا در به روز رسانی رکورد بعضی فیلدها باید تکمیل شوند در همین بخش هم می توانیم فیلدهارا چک کنیم و پیغام ها را وارد کنیم . یعنی بجای تابع فوق یک تابعی برای همه بررسی ها و کارهای هنگام ثبت بنویسیم و در آپدیت تریگر قرار دهیم.
کاربرد های دیگر :
در برنامه حسابداری بخش فاکتور را در نظر بگیرید . دوجدول باید وجود داشته باشد سر فاکتور و جزئیات فروش .
در جدول اول شماره – تاریخ – نام و جمع کل و در جدول دوم کالاهای فاکتور باید درج شود. این دو جدول هم توسط یک آیدی به هم متصل شده اند .
مشکلات :
در جدول اول اگر رکوردی حذف شود بعضا فراموش می شود که در جدول دوم هم جزئیاتش باید حذف شود (درغیراینصورت باعث حجیم شدن بانک می شود.)
اگر اطلاعات به روز رسانی شود جدول دوم نیز باید به روز رسانی شود .
کافیست تابعی برای همگن کردن جدول 1 با 2 درست کنیم و در تریگر ها وارد کنیم . حال چه دراول برنامه و چه در هر فرمی جدول 1 تغییر کند دومی هم به دلخواه ما تغییرات لازم را خواهد دید.
مثالی دیگر : می خواهیم هر رکورد آیدی مسلسلی داشته باشد . تابعی با محتوای
Calculate max(nid) to tmpID
Return tmpId+1
می سازیم و با نام maxid.prg ذخیره می کنیم . حال کافیست فیلد nid را ایجاد کنیم و در بخش default value عبارت maxid() را تایپ کنیم . حال اگر در پنجره فرمان هم appe blank کنیم می بینیم کد به ترتیب در فیلد جایگزین می شود.
این موارد مثالی بود برای درک بهتر پیکر بندی فیلدها در بانک اطلاعاتی .
فیلد های دیگر را نیز همین بخش پیکر بندی می کنیم.
بخش طراحی فرم
فرم جدیدی می سازیم . ابتدا باید بدانیم در این فرم و فرمهای دیگری که توسط این فرم فر اخوانی می شوند چه جداولی مورد نیاز است . table1 و table2 و table3 جداولی هستند که باید در طور فرم باز و بسته شوند . ( همان مشکل اساسی بیشتر کاربران )
روی فرم راست کلیک کرده و گزینه data Environment را انتخاب می کنیم . جداول مورد نیاز را add می کنیم. دیگر نیازی نیست در فرم جدولی را توسط use باز یا بسته کنیم .
بافرینگ : به زبان ساده وقتی رکوردی در mode بافرینگ می شود یعنی اطلاعات آن رکورد در حافظه موقت ثبت می شود و در جدول قرار نمی گیرید مگر آنکه جدول بسته شود .
به طور معمول از 2 نوع بافرینگ استفاده می شود بافرینگ رکورد و بافرینگ کل جدول که اگر حجم جدول زیاد باشد بافرینگ کل جدول صلاح نیست. بهتر است بافرینگ رکورد فعال شود در این حالت اطلاعات همان رکورد در بافر قرار می گیرد و بدون بستن جدول چنانچه کرسر از رکوردی به رکورد دیگر رود اطلاعات از بافر به جدول ثبت می گردد .
حال باید جداول را در data Environment در حالت بافرینگ قرار دهیم . کافیست روی جدول مورد نظر در data Environment راست کلیک و سپس properties را انتخاب کنیم و BufferModeOverride را عدد 3 (رکورد بافرینگ) یا 5 (بافرینگ کل جدول) قرار دهیم.
حالا در طول اجرای برنامه اصلاعات در بافر ثبت می شود و اگر بر ق برود ...!!؟؟
قرار دادن فیلد ها روی فرم :
از پنجره data Environment فیلدهای مورد نیاز جداول را دراگ کنید روی فرم .
مثلا فیلد cdate
می بینید که lable با همان caption (تاریخ)که در پیکربندی جدول نوشته بودیم ایجاد می شود به همراه textbox تاریخ با فرمت 9999/99/99 و دیگر هیچ نیازی به تنظیمات در پروپرتیز نمی باشد. همچنین کنترل سورس فیلد هم مستقیما با فیلد cdate در ارتباط است.
در کل برای طراحی اشیای موجود در فرم کافیست از درون جدول در پنجره data Environment دراگ کنیم روی فرم و هر تنظیمی که در ایجاد بانک اطلاعاتی در ابتدا شرح داده شد اعمال می شود . مضاف بر اینکه اگر برای فیلدی کلاسی (مثلا combo ) تعریف کنیم با دراگ آن برروی فرم همان کلاس اضافه می شود.
فرم آماده است . حال کد نویسی این فرم :
در متد Init فرم : append blank
در دکمه ثبت : tableUpdate(.t.) . ثبت اطلاعات از بافر درون جدول.
در متد unload فرم : tablerevert() چون اگر انصراف داده شد رکورد خالی تثبیت نشود و جدول به حالت اولیه برگردد
به همین سادگی . البته با فرض اینکه بررسی های لازم در تریگر ها تعبیه شده باشد.
توجه کنید این فقط یک الگوریتم ساده هست . مسلما هر برنامه ای پیچیدگیهای خاص خودش را دارد اما اینکه هر متغیر را جایگزین کنیم بعد replace و خیلی از دستورات اضافی دیگر اینجا بر طرف می شود.
امید وارم مفید بوده باشد.
دانسته هایم را همه مدیون سایت برنامه نویس هستم. محسن کارگاه