PDA

View Full Version : سوال: نمایش فیلد Identity



Hsimple11
پنج شنبه 28 شهریور 1387, 01:51 صبح
یک فیلد Identity دارم اما نمیشه به درستی نمایشش داد. میخوام قبل از پست رکورد، کاربر بتونه مقدار این فیلد رو فقط ببینه همین. با FiledByName.AsInteger مقدار صحیحی رو بر نگردوند.

ممنون....

vcldeveloper
پنج شنبه 28 شهریور 1387, 03:44 صبح
مقدار فیلد Identity بعد از Post توسط سرور تعیین میشه، یعنی تا وقتی Post نکردید، سرور متوجه ایجاد رکورد جدید نمیشه تا بخواد براتون فیلد Identity را مقداردهی کنه. بعد از Post میشه از طریق خوندن مقدار متغیر عمومی Identity@@ مقدار فیلد Identity را بدست آورد. البته در شرایط عادی، وقتی Post می کنید، ADO خودش مقدار این فیلد را می گیرد و بعد از Post نمایش میده.

SYNDROME
پنج شنبه 28 شهریور 1387, 06:58 صبح
به نظر من از فیلدهای Identity استفاده نکنید و خودتان یک فیلد بسازید و با Max مقدار دهی کنید.
در چنین شرایطی کاربر می تواند قبل از ذخیره مقدار فیلد را ببنید و در ضمن با حذف فیلد آخر و ایجاد دوباره آن Gap هم پیش نمی آید.
موفق باشید

delphiprog3000
پنج شنبه 28 شهریور 1387, 10:43 صبح
به نظر من از فیلدهای Identity استفاده نکنید و خودتان یک فیلد بسازید و با Max مقدار دهی کنید.
در چنین شرایطی کاربر می تواند قبل از ذخیره مقدار فیلد را ببنید و در ضمن با حذف فیلد آخر و ایجاد دوباره آن Gap هم پیش نمی آید.
موفق باشید


با سلام به دوستان گرامی و اساتید محترم.....

به مورد Gap یا همان فضای هرز بین فیلدها اشاره کردید.

شما برای حل این مشکل چه راهی رو پیشنهاد میکنید؟

با تشکر.................

Loveski
پنج شنبه 28 شهریور 1387, 11:20 صبح
بهتره از همان Identity@@ استفاده کنید. چون امنیت بیشتره.
برای Gap تا آنجایی که می دونم هیچ راهی وجود نداره.
ولی زمانی که بخواهی یک دیتا بیس را کلا پاک کنی به جای Delete از Truncate استفاده کنی
Identity درباره از پایه تعیین شده شروع می کنه.

delphiprog3000
پنج شنبه 28 شهریور 1387, 11:44 صبح
ولی زمانی که بخواهی یک دیتا بیس را کلا پاک کنی به جای Delete از Truncate استفاده کنی
Identity درباره از پایه تعیین شده شروع می کنه.

ممنون از پاسخت دوست عزیز.

در این مواردی هم که ذکر نمودید اطلاعات کافی دارم. تنها مشکل یکپارچه کردن فیلدهاست. ولی به نشر بنده این یک امر منطقی نیست چون فیلدهای دیگر نیز بر اساس این فیلد شماره گذاری شده .

حالا باز ببینیم نظر اساتید چیه.؟

با تشکر.........

Hsimple11
پنج شنبه 28 شهریور 1387, 13:22 عصر
به نظر من از فیلدهای Identity استفاده نکنید و خودتان یک فیلد بسازید و با Max مقدار دهی کنید.

ممنونم. ولی Gap ها برای من مهم نیستند چون این کد قراره به عنوان شماره پرونده افراد ثبت بشه و مهم نیست Gap داشته باشه. ولی باید حتما قبل از پست کاربر مقدار این فیلد رو ببینه. بنابراین با این اوصاف نمیتونم از Identity استفاده کنم.

بعلاوه استفاده از تابع Max مشکل Gap را حل نمیکنه همونطوری هم که خودتون فرمودید فقط در صورت پاک کردن رکورد آخر یکپارچگی رکوردها حفظ خواهد شد و اگه وسط داده ها رکوردی پاک بشه بازهم مقدار بعدی از Max حساب میشه.


شما می فرمایید به چه صورت از Max استفاده کنم؟ یعنی کاربر خودش دستی هم بتونه این فیلد رو مقدار دهی کنه یا نه؟ نمیخوام کاربر دخالتی داشته باشه چون ممکنه مثلا عدد خیلی بزرگی رو وارد کنه که اگه از max دفعه بعد استفاده بشه با DataType خود فیلد مشکل پیدا میکنیم چون ممکنه از محدوده حتی BigInt هم بیشتر شه! بنابراین بهتره کاربر نتونه مقدار این فیلد رو تغییر بده و فقط میخوام بتونه قبل از پست ببینه. یعنی مثلا هربار Max رو +1 کنه و در فیلد نمایش بده؟

Hsimple11
پنج شنبه 28 شهریور 1387, 16:53 عصر
مرسی دوستان.

فکر میکنم طبق راه پیشنهادی جناب SYNDROME، بهترین راه برای من همان استفاده از MAX است.


شاد باشید...

SYNDROME
پنج شنبه 28 شهریور 1387, 18:07 عصر
شما برای حل این مشکل چه راهی رو پیشنهاد میکنید؟
با تشکر.................
بهتر است از Max استفاده کنید.
اگر هم میخواهید خیلی بهینه کد کد گذاری عمل کنید می توانید روشی که در پایین اشاره می کنم رجوع کنید.


بعلاوه استفاده از تابع Max مشکل Gap را حل نمیکنه همونطوری هم که خودتون فرمودید فقط در صورت پاک کردن رکورد آخر یکپارچگی رکوردها حفظ خواهد شد و اگه وسط داده ها رکوردی پاک بشه بازهم مقدار بعدی از Max حساب میشه.

می توانید از 2 روش برای بهینه سازی بیشتر استفاده کنید.
1-استفاده از یک SP که کل جدول را جستجو کند و اولین فیلد خالی را نمایش دهد.در این ضمینه آقای ثباتی یک تاپیک ایجاد کرده است.
2-استفاده از یک جدول که فقط یک فیلد ID دارد و مقدار آن از 1 تا n پر می شود(n با توجه به نیاز شماست)
سپس با دستور زیز اولین مقدار خالی را پیدا کنید


Select ID
From Tbl_Range
Where ID Not In
(Select Code
From Tbl_Test
)

اولین رکوردی که از جدول Tbl_Range بر می گردد اولین مقدار خالی جدول شماست.
موفق باشید

WhiteWizard
یک شنبه 31 شهریور 1387, 19:03 عصر
با سلام
من هم با این مشکل برخوردم و به این جا رسیدم :



SQL Server help :
If an identifier column exists for a table with frequent deletions, gaps can occur between identity values; deleted identity values are not reused. To avoid such gaps, do not use the IDENTITY property. Instead, you can create a trigger that determines a new identifier value, based on existing values in the identifier column, as rows are inserted.


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

Hsimple11
یک شنبه 31 شهریور 1387, 19:41 عصر
با چه مشکلی؟!

مشکل Gap ها؟؟

خب راه حل ها که همه گفته شد! دیگه دنبال چی می گردید؟

ghabil
یک شنبه 31 شهریور 1387, 20:31 عصر
مرسی دوستان.

فکر میکنم طبق راه پیشنهادی جناب SYNDROME، بهترین راه برای من همان استفاده از MAX است.


شاد باشید...

دوست عزیز طراحان دیتابیس دو قدم جلوتر از آقای سیندروم رو هم دیدند که قیلد آیدنتیتی رو اینطوری طراحی کرده اند، اصلا اگر میخوای اونکار رو بکنی شما نیازی نداری یک فیلد جدید تعریف کنی همیشه MAX فیلد Identity رو بگیر بعلاوه 1 کن به کاربر نشون بده ProviderFlagsش رو هم خالی کن که ذخیره نشه.
مسئله اینه که تا وقتی که اطلاعات در یک ترانزاکشن در دیتابیس ذخیره نشوند نمیشه مقدار این فیلد رو تعیین کرد چون ممکنه در یک لحظه دو کاربر از دو ایستگاه مختلف مشغول وارد کردن اطلاعات باشند در این حالت هردوشون با گرفتن یک MAX از آخرین رکوردهای ثبت شده و بعلاوه یک کردنش به یک مقدار میرسند و اونوقت در زمان ذخیره شما مقدار تکراری خواهید داشت.

البته اصولا بحث بر سر اینکه کی میشه از فیلد آیدنتیتی استفاده کرد و کی باید یک فیلد AUX در کنارش گرفت بحث مفصلیه ، ولی یادتون باشه که این راه پیشنهادی این مشکل رو هم داره.

Hsimple11
دوشنبه 01 مهر 1387, 00:42 صبح
طراحان دیتابیس دو قدم جلوتر از آقای سیندروم رو هم دیدند که قیلد آیدنتیتی رو اینطوری طراحی کرده اند، اصلا اگر میخوای اونکار رو بکنی شما نیازی نداری یک فیلد جدید تعریف کنی همیشه MAX فیلد Identity رو بگیر بعلاوه 1 کن به کاربر نشون بده ProviderFlagsش رو هم خالی کن که ذخیره نشه.

بله. 100%.ولی من هم گفتم در مورد کار من راه قابل قبولی است چون اولا برنامه لوکال است و ثانیا باید قبل از ثبت فیلد نشون کاربر داده بشه.


ممکنه در یک لحظه دو کاربر از دو ایستگاه مختلف مشغول وارد کردن اطلاعات باشند در این حالت هردوشون با گرفتن یک MAX از آخرین رکوردهای ثبت شده و بعلاوه یک کردنش به یک مقدار میرسند و اونوقت در زمان ذخیره شما مقدار تکراری خواهید داشت.


بله. حق با شماست. ممنونم.


البته اصولا بحث بر سر اینکه کی میشه از فیلد آیدنتیتی استفاده کرد و کی باید یک فیلد AUX در کنارش گرفت بحث مفصلیه ، ولی یادتون باشه که این راه پیشنهادی این مشکل رو هم داره.

میشه بیشتر توضیح بدید؟ ممنونم. یا لینکی قرار دهید. مرسی.