PDA

View Full Version : طریقه حذف کردن



RZ_HAFEZ
یک شنبه 02 دی 1386, 14:36 عصر
با سلام
چطور میتونم رکوردهای بانک اطلاعاتی را در foxpro تحت dos حذف کنم
با تشکر

rezaTavak
یک شنبه 02 دی 1386, 16:43 عصر
دستور delete برای حذف رکورد است.
مثلا برای حذف رکوردی که الان باهاش کار میکنید (رکورد جاری)‌همین دستور کافی است.

یا مثلا برای حذف رکوردهایی با شرایط خاص از delete for age=12 برای حذف کسانی که مثلا سن ۱۲ سال دارند.

mehran_337
یک شنبه 02 دی 1386, 17:08 عصر
دستور فوق حذف منطقی می کنه یعنی اگر set deleted on باشد رکوردهای حذف شده دیده نمی شوند و اگر off باشد بازهم مشاهده می شوند و باید از دستور pack برای حذف فیزیکی رکورد delet شده استفاده کرد البته این دستور فقط زمانی کار می کند که جدول بصورت انحصاری باز شده باشد.

هادی-محمد
سه شنبه 04 دی 1386, 09:08 صبح
اگه بانک را باز کنی ( brows ) می توانی با کلید های ctrl+t آنها را بصورت دستی برای حذف شدن علامت بزنی ( حذف منطقی) سپس با تایپ pack در پنجره دستورات آنهار بطور واقعی از بانک خود حذف نمائی (حذف فیزیکی)

blacky
سه شنبه 04 دی 1386, 10:12 صبح
من خودم از روشی که هادی گفت استفاده میکنم

mehran_337
سه شنبه 04 دی 1386, 11:40 صبح
بله درسته اما روش فوق در کامند قابل اجراست درون برنامه که به کاربر brow نشون نمی دیم . به هر حال روشها متعدده و بسته به نوع کاربرد فرق می کنه ...

هادی-محمد
چهارشنبه 05 دی 1386, 10:33 صبح
برای حذف اطلاعات از داخل برنامه یک prg کوچک مثل نمونه زیر مشکل شما را حل می کند:
1- بانک مورد نظر را use نمائید
2- با یک فیلتر (... set filter to ) رکورد های مورد نظر را مشخص نمائید.
3- یک حلقه تکرار جهت جستجو تا انتهای بانک
4- delete
5- pack

....................



use mytab.dbf
"هادی"=set filter to famiy
go top
()do while.not.eof
delete all
enddo
pack

در مثال بالا family یکی از فیلدهای بانکmytab میباشد

rezaTavak
چهارشنبه 05 دی 1386, 12:21 عصر
البته کار شما یک اشکال دارد: حلقه بینهایت! (دستور delete all خودش کافیست.) یعنی اینکه اگر اون دستور نبود حلقه شما بینهایت تکرار می شد اما در اینجا فقط یکبار تکرار میشه می تونید امتحان کنید.

دستورات شما یکم زیادی است و خب غیر منطقی.



use mytab exclusive
delete for family='هادی'
pack

shamim_41
چهارشنبه 05 دی 1386, 13:39 عصر
البته اگر خواسته باشی تعداد خاصی از رکوردها رو پاک کنی از مثلا از اول بانک به تعداد 500 عدد اول :
use excl mytab
dele next 500
و برای همه رکوردها
dele all
برای رکوردهای خاص
ار فرمان set fiter که دوستان توضیح داده اند

blacky
چهارشنبه 05 دی 1386, 16:15 عصر
خب حالا اگه بخوایم یه فرم درست کنیم که مثلا شماره سرویس فلان که توی فرم وارد کرد رو حذف کنه دستورش چی میشه

rezaTavak
پنج شنبه 06 دی 1386, 07:40 صبح
یعنی چی ؛شماره سرویس؛؟؟؟

blacky
پنج شنبه 06 دی 1386, 17:34 عصر
شرمنده من توی پروژه خودم مثال میزنم که مال تاکسی تلفنی هست

rezaTavak
جمعه 07 دی 1386, 11:41 صبح
کسی از پروژه شما خبر داره؟

همین دستور به این صورت:

اگر رکورد جاری بود فقط فرمان delete به تنهایی

اگر شماره سرویس مثلا در فیلد nServiceNo ذخیره شده بود و خواستیم شماره سرویس ۱۲ حذف شود:


delete for nServiceNo =12

blacky
جمعه 07 دی 1386, 14:52 عصر
ممنون

یک سوال دیگه

اگه مثلا زدیم کد فلان رو حذف کن اگه 2 تا رکورد با این کد باشه هر دو رو حذف میکنه؟>

mehran_337
یک شنبه 09 دی 1386, 09:29 صبح
وقتی می گید کد یعنی انحصاری یعنی برای هر رکورد یک شماره کد مگر الگوریتم برنامه طوری باشد که کدها گروه بندی شود درآنصورت می شود کد گروه .
به هر حال وقتی می گویید کد 12 پس تمام رکوردهایی که مقدار فیلد کد آنها 12 باشد را شامل می شود

هادی-محمد
یک شنبه 09 دی 1386, 09:44 صبح
خب حالا اگه بخوایم یه فرم درست کنیم که مثلا شماره سرویس فلان که توی فرم وارد کرد رو حذف کنه دستورش چی میشه



داخل فرمتان می بایست یک get قرار بدهید تا شماره مورد نظر را از کار بر دریافت کند و یک کلید که دستورات . . . set filter را داخل آن نوشته تا بازدن آن کلید توسط کار بر رکورد مورد نظر در بانک جستجو و سپس حذف شود. توجه داشته باشید موارد ذکر شده در جوابهای دوستان منجر به حذف کل رکورد (یا رکوردها ) می شود نه حذف اطلاعات یک فیلد .

shamim_41
چهارشنبه 12 دی 1386, 14:01 عصر
البته باید در نظر داشت که معمولا در برنامه های پیشترفته از فرمان set filter استفاده نمی کنند
زیرا در فایلهایی که رکوردهای آنها بسیار زیاد است این فرمان باعث کندی سرعت و پردازش داده ها می شود بهتر است چند خط برنامه کوچک نوشته و از آن استفاده کنید. مثال :
sele taxi
set orde to taxi
go top
=seek(nline)
do whil m_code=nline.and.!eof()
dele
skip
endd
use
*nline شماره اشتراکهایی که باید حذف شوند
* m_code فیلدی که شماره اشتراکها در آن ذخیره شده

blacky
جمعه 21 دی 1386, 23:20 عصر
حاجی سلام

من این کدها رو تست کردم هیچکدومشون به درستی اجرا نشد


sele test
set orde to test
go top
seek=(1000)
do whil m_code=1000.and.!eof()
dele
skip
endd
use



الان اینی که شما گفتین همینه؟

rezaTavak
شنبه 22 دی 1386, 10:03 صبح
البته باید در نظر داشت که معمولا در برنامه های پیشترفته از فرمان set filter استفاده نمی کنند
زیرا در فایلهایی که رکوردهای آنها بسیار زیاد است این فرمان باعث کندی سرعت و پردازش داده ها می شود بهتر است چند خط برنامه کوچک نوشته و از آن استفاده کنید. مثال :
sele taxi
set orde to taxi
go top
=seek(nline)
do whil m_code=nline.and.!eof()
dele
skip
endd
use
*nline شماره اشتراکهایی که باید حذف شوند
* m_code فیلدی که شماره اشتراکها در آن ذخیره شده

کندی در فاکس پرو یا بهتر بگویم دیتابیسها بدلیل عدم مدیریت درست است. مثلا اگر شما از یک فیلد به عنوان کلید استفاده می کنید حتما باید Index آنرا بسازید و کمک Rush more کنید.

در کل دیتابیسها چنین است. یعنی ایندکس باید کمک کند که فرمانها کار درست انجام دهند.


کمی به RushMore فکر کنید و آنرا تقویت کنید

rezaTavak
شنبه 22 دی 1386, 10:08 صبح
پست شماره ۱۸ :

مگر دستور


DELETE FOR nServiceNo = 12


مشکل دارد؟ فرض کنید نام فیلد شماره سرویس nServiceNo و شماره ۱۲ باید حذف شود؟

kia1349
یک شنبه 23 دی 1386, 19:47 عصر
میتونی از دستورات sql استفاده کنی
اینها دیگه توی help فاکس کاملا توضیح داده شده

blacky
پنج شنبه 27 دی 1386, 14:42 عصر
پست شماره ۱۸ :

مگر دستور


DELETE FOR nServiceNo = 12


مشکل دارد؟ فرض کنید نام فیلد شماره سرویس nServiceNo و شماره ۱۲ باید حذف شود؟

اینو با دستور get مخلوط کرد؟

rezaTavak
پنج شنبه 27 دی 1386, 18:23 عصر
اینو با دستور get مخلوط کرد؟

این یعنی چی؟

kia1349
دوشنبه 01 بهمن 1386, 20:30 عصر
رضا جان منم نفهمیدم چی شد

rezaTavak
سه شنبه 02 بهمن 1386, 07:29 صبح
این دستور را؟


DELETE FOR nServiceNo = 12

یا منظورتان چیز دیگری است؟

shamim_41
سه شنبه 02 بهمن 1386, 14:07 عصر
کندی در فاکس پرو یا بهتر بگویم دیتابیسها بدلیل عدم مدیریت درست است. مثلا اگر شما از یک فیلد به عنوان کلید استفاده می کنید حتما باید Index آنرا بسازید و کمک Rush more کنید.

در کل دیتابیسها چنین است. یعنی ایندکس باید کمک کند که فرمانها کار درست انجام دهند.


کمی به RushMore فکر کنید و آنرا تقویت کنید
یعنی شما می فرمایید که در یک بانک اطلاعاتی با رکوردهای بسیار بالا فرمان set filter باعث کندی در کار نمی شود؟

rezaTavak
چهارشنبه 03 بهمن 1386, 07:35 صبح
نه اگر در کل دیتابیس درست استفاده شود و ایندکسها بر اساس نیاز باشد نه.

مثال بزنم:

شما می خواهید یک برنامه پرسنلی داشته باشید و می دانید نام و نام خانوادگی اهمیت بالایی دارد. حتما یک ایندکس در این خصوص داشته باشد.

ببینید کجاها set filter یا where یا for و... استفاده کرده اید برای آنها هم ایندکس مرتبط بسازید.

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