PDA

View Full Version : فایل Index



داوود
پنج شنبه 31 شهریور 1384, 10:20 صبح
من یک Table دارم که ازش یک فایل Index بر اساس (به ترتیب :تاریخ و نوبت) درست کرده ام . فیلد کلید در Table اصلی شماره فرد است . حال در قسمتی از برنامه که می خواهم به افراد جدید نوبتی بر اساس تاریخ بدهم فایل ایندکس را باز می کنم نام فایل ایندکس من mo_index است.
form1.table1.active:=true
form1.table1.openIndexFile('mo_index')
form1.table1.last
و سپس با توجه به ترتیب تاریخ و نوبت. به فرد جدید نوبتی داده میشود. یعنی ابتدا به آخرین رکورد در تاریخ مورد نظر مراجعه و سپس به نوبت آخرین رکود یکی اضافه و به فرد جدید اختصاص می دهد.
گاهی اوقات لازم است تا پس از پذیرش افراد در روز جاری. فردی را در تاریخ روز قبل پذیرش و نوبتی به او داد. پس از پذیرش فرد در روز قبل و دادن نوبت به وی . برنامه در ادامه کار برای دادن نوبت به فردی که در امروز پذیرش می شود از نوبت یک شروع می کند .
بنا بر این می توان گفت که نوبت فرد در تاریخ روز قبل . در انتهای جدول و نه در انتهای نوبت های روز قبل گذاشته شده است و در اصل فایل Index به درستی عمل نکرده است.
حال به من بگویید چگونه این مشکل را حل کنم.

Naficy
پنج شنبه 31 شهریور 1384, 11:21 صبح
شما قاعدتا احتیاجی به openIndexFile ندارید، و می تونید از ایندکسهایی که با خود جدول ذخیره می شن (Secondary Indices) استفاده کنید. این روش بسیار ساده تر عمل می کنه.
اما در مورد مشکلتون، به نظر می یاد مساله در فعال نکردن ایندکسه. یعنی شما باید از طریق خصوصیاتی مثل IndexName یا IndexFieldName (من الان دلفی کنار دستم نیست، ممکنه اسمها رو دقیق ننوشته باشم) ایندکس را فعال کنید. (یعنی به جدول بگین که بر اساس کدوم ایندکس خودشو مرتب کنه). فکر می کنم صرف بازکردن فایل ایندکس، باعث نمی شه که ترتیب جدول عوض بشه.

داوود
شنبه 02 مهر 1384, 07:25 صبح
میشه بگین چطوری ایندکس رو فعال کنم؟

Naficy
شنبه 02 مهر 1384, 20:17 عصر
همونطور که گفتم با یکی از خصوصیات IndexName یا IndexFieldNames از شی جدولتون.

داوود
یک شنبه 03 مهر 1384, 10:00 صبح
با تشکر
بعد از تعیین نام Index با Index name . در هنگام اجرای برنامه با پیغام زیر مواجه شدم.

داوود
دوشنبه 04 مهر 1384, 07:19 صبح
خواهش می کنم یکی جوابم رو بده . خیلی واجب و فوریه.

Naficy
دوشنبه 04 مهر 1384, 19:59 عصر
این خطا رو کی گرفتین؟ (هنگام اضافه کردن یا تصحیح رکورد جدول یا...؟)

داوود
سه شنبه 05 مهر 1384, 08:46 صبح
با تشکر
1 پیغام بالا رو وقتی می خواستم اطلاعات رو درج کنم می داد. لازمه توضیح بدم که در فرمی که اطلاعات رو در اون درج می کنم بجای استفاده از DBEdit از Edit معمولی استفاده کرده ام و برای درج از دستور SetFields استفاده کرده ام .
2 امروز پس از اجرای برنامه بجای پیغام بالا با پیغام زیر مواجه شدم .
من که نمیدونم چکار کنم.......

Naficy
سه شنبه 05 مهر 1384, 18:37 عصر
فکر می کنم از Paradox استفاده می کنید.
خود من چند ساله از Paradox استفاده نکردم. امیدوارم دوستانی که حضور ذهن بیشتری دارند هم کمک کنند. خطایی که دریافت کرده اید بین دوستان یک خطای مشهور (!) هنگام کار با پارادوکس است.

ایندکس رو چجوری ساختید؟ هنوز هم از OpenFileIndex استفاده می کنید؟
ضمنا سعی کنید ایندکس رو حذف کنید و دوباره بسازید. ببینین مشکل برطرف نمی شه.

پی نوشت: برای همه (منجمله خودتون) آسونتره اگه به جای تصویر خطا، خود متن خطا رو قرار بدین. مثلا در مورد آخر، به جای تصویر ضمیمه می تونسین بنویسین: Index out of date. Index 'mo_index'
همین کافی بود.

داوود
چهارشنبه 06 مهر 1384, 08:29 صبح
با تشکر فراوان از دوست عزیزم
1 فایل ایندکس رو حذف و مجددا ساختم .فیلد هایی رو که برای فایل ایندکس انتخاب کردم شامل sdate,sdoctor,sstep بود . در موقع ساخت قسمت Maintained تیک خورده بود. پس از ساخت برنامه را اجرا کردم . برنامه تا زمانی که برای یک دکتر نوبت دهی (sstep) رو انجام می دادم خوب بود فرض کنید برای یک دکتر تا نوبت 5 رو داده ام و حالا می خوام برای دکتر دیگه ای نوبت بدم به محض اینکه اطلاعات رو برای دکتر دوم(با نوبت 1) می خوام درج کنم با پیغام Key Violation مواجه می شوم.
2 بامراجعه به ساختار جدول در پارادکس و برداشتن تیک Maintained مجددا برنامه رو اجرا کردم این بار با پیغام Index Is Read Only مواجه شدم .

Naficy
چهارشنبه 06 مهر 1384, 14:23 عصر
با تشکر از توضیح مفصلتان.
لطفا اگر بین جداول Relation تعریف کرده اید، اطلاعات مربوط به آنرا نیز بنویسید. اصلا آیا دکترها جدول جدایی دارند؟
ضمنا ایندکسهای یکتای جداول را نیز بنویسید تا بهتر بشود فهمید ایراد Key violation از کجاست.
فیلدهای موجود در ایندکس را هم که به ترتیب نوشتین مگه نه؟


--------------------
ایندکسها همواره باید Maintained باشند. (به نظر من پارادوکس بیخود اجازه حالتی غیر از این را می دهد!)
اما دلیل ایراد Key violation ممکن است کاملا متفاوت از مسایل جاری باشد. فرض کنید شما برای دکتر شماره 2 نوبتها را تا 5 وارد کرده اید. اکنون برای اضافه کردن نوبت برای دکتر شماره 1 - که همواره رکوردهایش قبل از رکورد های دکتر شماره 2 قرار می گیرد - چه می کنید؟
به نظر می آید با ایندکس گذاری نمی توان به نتیجه رسید. من پیشنهاد می کنم یک Query بنویسید که برای هر دکتر آخرین نوبت اختصاص داده شده را بیابد. (اگر با زبان SQL آشنایی دارید اینکار با تابع Max انجام می شود)
یک راه دیگر هم می تواند فیلترگذاری باشد، به نحوی که فقط رکوردهای مثلا دکتر شماره 1 نمایش داده شوند. سپس با ایندکس گذاری می توان به نتیجه رسید.

داوود
یک شنبه 10 مهر 1384, 10:18 صبح
دوست عزیز با تشکر
با دادن پیشنهادت در مورد استفاده از Query . یک Query در فرم ورود اطلاعات بیمار ساختم به این صورت
select max(sstep) as exp1,sdate,sdoctor
from table1name
group by sdate,sdoctor;
سپس در رویداد OnClick دکمه ی دادن نوبت . Query ساخته شده را با تاریخ(sdate)و نام دکتر(Sdoctor) که قبل از دادن نویت مقادیرش وارد شده بودفیلتر کردم . اما در DBEditی که DataFieldش مقدار Exp1 از Query بود هیچ مقداری نمایش داده نشد.
میگی چکار کنم؟

Naficy
دوشنبه 11 مهر 1384, 17:53 عصر
البته بهترین احتمالی که می شه داد، ایراد در مقادیر داخل فیلتره. (فیلتر درست وارد نشده)
اما پیشنهاد می کنم بجای فیلتر از متد Lookup کنید.
یا شاید در خود دستور SQL عمل فیلتر را انجام دهید.

mohsen_sad
دوشنبه 01 خرداد 1385, 06:40 صبح
من یک Table دارم که ازش یک فایل Index بر اساس (به ترتیب :تاریخ و نوبت) درست کرده ام . فیلد کلید در Table اصلی شماره فرد است . حال در قسمتی از برنامه که می خواهم به افراد جدید نوبتی بر اساس تاریخ بدهم فایل ایندکس را باز می کنم نام فایل ایندکس من mo_index است.
form1.table1.active:=true
form1.table1.openIndexFile('mo_index')
form1.table1.last
و سپس با توجه به ترتیب تاریخ و نوبت. به فرد جدید نوبتی داده میشود. یعنی ابتدا به آخرین رکورد در تاریخ مورد نظر مراجعه و سپس به نوبت آخرین رکود یکی اضافه و به فرد جدید اختصاص می دهد.
گاهی اوقات لازم است تا پس از پذیرش افراد در روز جاری. فردی را در تاریخ روز قبل پذیرش و نوبتی به او داد. پس از پذیرش فرد در روز قبل و دادن نوبت به وی . برنامه در ادامه کار برای دادن نوبت به فردی که در امروز پذیرش می شود از نوبت یک شروع می کند .
بنا بر این می توان گفت که نوبت فرد در تاریخ روز قبل . در انتهای جدول و نه در انتهای نوبت های روز قبل گذاشته شده است و در اصل فایل Index به درستی عمل نکرده است.
حال به من بگویید چگونه این مشکل را حل کنم.
سلام
من هم همین مشکل رو دارم لطفا اگر جواب گرفتی خواهشمن به ما هم کمک کن
m.sahandrayaneh@gmail.com

محسن صادقی