نمایش نتایج 1 تا 5 از 5

نام تاپیک: آموزش پیکربندی جداول و ایجاد فرم ساده

  1. #1
    کاربر دائمی آواتار mehran_337
    تاریخ عضویت
    مهر 1384
    محل زندگی
    رشت
    پست
    1,305

    آموزش پیکربندی جداول و ایجاد فرم ساده

    باید در نظر داشته باشیم که وقتی جدولی در قالب دیتابیس طراحی شود از قابلتهای بسیاری برخوردار خواهد بود یکی از این قابلیتها این است که بسیاری از کدها را می توان در خود جدول بررسی کرد و کدنویسی در برنامه کاهش می یابد.




    در تصویر فوق فیلدی از نوع تاریخ تعریف کردیم.
    بجای تنظیم در 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 و خیلی از دستورات اضافی دیگر اینجا بر طرف می شود.
    امید وارم مفید بوده باشد.
    دانسته هایم را همه مدیون سایت برنامه نویس هستم. محسن کارگاه


  2. #2
    کاربر دائمی
    تاریخ عضویت
    دی 1382
    محل زندگی
    mashhad
    پست
    336
    آقا دستت درد نکند آرزوی توفیق بیش از پیش را برایتان دارم
    اگر در جداول از Trigger استفاده کنیم سرعت ذخیره شدن بیشتر از replac است یا فرقی ندارد

  3. #3
    سلام
    مهران جان :
    ضمن تشکر مجدد
    من کلا" از این نوع برنامه نویسی ای که همزمان تکست باکسها با فیلدها متصل باشد فراریم و علاقه نشان نمیدهم و همیشه در یک مرحله از زمان به هنگام ثبت و تثبیت دادها مقداری که در متغیرها یا تکست باسکها و یا اشیاء ثبت شده را به جداول منتقل میکنم . حال سوال اینه که چگونه میشه در این خصوص از tableUpdate و tablerevert استفاده کرد. آیا واقعا نوع نگرش من به این سبک از برنامه نویسی اشتباه است و باید به سویی که شما فرمودید کوچ کنم ؟!
    خاطر نشان کنم من هم دقیقا از دیتابیس و از محیط data Environment استفاده میکنم ولی در قفل کردن رکوردها و جداول مشکل دارم .

  4. #4
    کاربر دائمی آواتار mehran_337
    تاریخ عضویت
    مهر 1384
    محل زندگی
    رشت
    پست
    1,305
    نقل قول نوشته شده توسط naderigh مشاهده تاپیک
    آقا دستت درد نکند آرزوی توفیق بیش از پیش را برایتان دارم
    اگر در جداول از Trigger استفاده کنیم سرعت ذخیره شدن بیشتر از replac است یا فرقی ندارد
    اشتباه نکنید تریگر جایگزین replace نیست استفاده از تریگرها یعنی کاری که قرار است در فرمها انجام شود در تریگر خود جدول انجام می شود . مسلما این نحوه عملیات سریعتر خواهد بود چون کد ها در بطن جدول قرار دارند. این نوع روش را بعنوان نحوه دیگر برنامه نویسی در فاکس مطرح کردم.
    در مورد مسئله ای که علی رهرو مطرح کردند :
    دقیقا درک می کنم چون خودم هم همیشه فراری بودم اما وقتی فرمهایم را طراحی کردم و دیدم فلان تغییر باید روی فلان فیلد انجام شود می بایست همه فرمهایم را جستجو می کردم و تغییرات را می دادم اما به راحتی از تریگر استفاده کردم و از همان دفعه برنامه های بعدی را از ابتدا با استفاد ه از تریگر شروع می کردم.
    tableupdate مخصوص جدولی است که بافرینگ شده باشد در غیراینصورت پیغام خطا می دهد.
    اگر فیلد ها متصل نباشند وقتی قرار است دوباره replace کنی می شه بگی پس اینجا tableupdate به چه درد می خوره؟؟

  5. #5
    با تشکر از مهران عزیز
    تریگرها وقایعی هستند که در زمان آپدیت و دیلیت و اینزرت فعال میشن و کدهائی که شما داخل آنها نوشته اید را اجرا میکنن
    بسیاری از قوانین مربوط به حذف و اضافه و بروزرسانی فیلدها رو میتونید در این تریگرها تعریف کنید
    ضمنا اگر سورس برنامه شما دست کسی برسه و این دیتابیسها رو نداشته باشه و شما هم بسیاری از موضوعات رو در دیتابیسها تعریف کرده باشید پس نمیتونه استفاده زیادی از سورس برنامتون ببره
    اگر از اتصال مستقیم فیلد با آبجکت در فرمهاتون استفاده کنید اونوقت مفهوم واقعی بافرینگ و مزایای اونو میفهمید و استفاده از تریگرها از خوردن دیزی توی دربند تهران هم براتون لذت بخش تر خواهد بود
    با عرض پوزش از دخالت بیجا
    در تندیس های تخت جمشید هیچ کس در حال تعظیم نیست ، هیچ کس عصبانی نیست ، هیچ کس سرافکنده و شکست خورده نیست ، هیچ کس سوار بر اسب نیست ، هیچ قومی بر قوم دیگر برتر نیست ، هیچ کس برده نیست و هیچ تصویر خشنی دیده نمیشود.
    ************************************************** ******************************************
    اندیشه کن , آنگاه سخن گو تا از لغزش بر کنار باشی

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •