ورود

View Full Version : سوال: محدود كردن اعدادي كه ثبت ميكنيم!



hobab1987
دوشنبه 09 فروردین 1389, 15:33 عصر
با سلام
دو فيلد شماره شناسايي و شماره پرونده داريم كه اولي كليد و دومي ايندكس يكتا است.
حالا ميخوام شماره شناسايي‌‌اي كه ميخواهيم ثبت كنيم حتما 12 رقمي باشد و رقم اول ان هم حتما 1 يا 2 يا 3 باشد و شماره پرونده هم حتما 4 رقمي باشد وگرنه پيغام خطا دهد.
براي اين كار بايد چه كار كنم؟بايد در پايگاه SQL تنظيماتي انجام بدهم يا در فرم C#‎ اي كه دارم بايد دستور بنويسم؟و در كدام قسمت بايد اين تنظيمات رو اعمال كنم؟
لطفا راهنماييم كنيد!

s.Jabbari
دوشنبه 09 فروردین 1389, 17:52 عصر
اگه تو sql میخوای فکر میکنم ایطوری بشه



create table table_20
(code bigint not null constraint con10 check(code like '[1-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
code_parvande int not null constraint con8 check (code_parvande like '[0-9][0-9][0-9][0-9]')
)
)

primery key رو هم خودت زحمت بکش

saeedr22
دوشنبه 09 فروردین 1389, 19:00 عصر
تو سطح فرم هم می تونین چک کنی.با trigger هم میشه

hobab1987
سه شنبه 10 فروردین 1389, 13:26 عصر
تو سطح فرم هم می تونین چک کنی.با trigger هم میشه
ميشه بيشتر توضيح بدي؟

hobab1987
سه شنبه 10 فروردین 1389, 13:35 عصر
خيلي ممنون از توضيحتون

راستي از قيد Check و Rules هم در اينجا ميشه استفاده كرد؟

Iran58
سه شنبه 10 فروردین 1389, 14:39 عصر
سلام
درفرم براي اولي طول راماكزييم 12بگيرودركدهم يكifبزاروچك كنه اولي عدداگر1يا2يا3بودادامه عمليات راانجام بده وگرنه خطابدهد
براي دومي همطول را4بگذار

ASKaffash
چهارشنبه 11 فروردین 1389, 07:54 صبح
با سلام
دو فيلد شماره شناسايي و شماره پرونده داريم كه اولي كليد و دومي ايندكس يكتا است.
حالا ميخوام شماره شناسايي‌‌اي كه ميخواهيم ثبت كنيم حتما 12 رقمي باشد و رقم اول ان هم حتما 1 يا 2 يا 3 باشد و شماره پرونده هم حتما 4 رقمي باشد وگرنه پيغام خطا دهد.
براي اين كار بايد چه كار كنم؟بايد در پايگاه SQL تنظيماتي انجام بدهم يا در فرم C#‎‎ اي كه دارم بايد دستور بنويسم؟و در كدام قسمت بايد اين تنظيمات رو اعمال كنم؟
لطفا راهنماييم كنيد!

سلام
به چهار روش :
- با Trigger
- با قید چک روی فیلد و یک تابع SQL
- با مدیریت در لایه زبان برنامه نویسی
- با یک تابع اعتبار سنجی در SQL و ممانعت در لایه برنامه کاربردی
پیشنهاد من : راه حل آخر

Iran58
چهارشنبه 11 فروردین 1389, 08:54 صبح
سلام
به چهار روش :
- با Trigger
- با قید چک روی فیلد و یک تابع SQL
- با مدیریت در لایه زبان برنامه نویسی
- با یک تابع اعتبار سنجی در SQL و ممانعت در لایه برنامه کاربردی
پیشنهاد من : راه حل آخر
باسلام
مهندس جان ميشه بيشترتوضيح دهيددرموردراه حل پيشنهادي

ASKaffash
چهارشنبه 11 فروردین 1389, 11:07 صبح
سلام
روش پیاده سازی روش چهارم :
یک تابع به SQL نوشته می شود که عدد مورد نظر بعنوان ورودی وارد و الگوریتم اعتبار سنجی را به زبان SQL پیاده سازی می کنیم و درصورت صحیح بودن مقدار 1 و در غیر اینصورت 0 باز میگردد
چرا روش چهارم :
- چون منطق اعتبار سنجی در سمت بانک است و همیشه مستقل از برنامه کاربردی قابل تغییر است
- در لایه برنامه کاربردی در مواردی میتوان اعتبار سنجی را فعال / غیر فعال کرد
- در لایه برنامه کاربردی در بسیاری از موارد لازم است براساس اعتبار سنجی پیام یا عملی متناسب انجام شود

محمد سلیم آبادی
چهارشنبه 11 فروردین 1389, 20:13 عصر
اگه تو sql میخوای فکر میکنم ایطوری بشه



create table table_20
(code bigint not null constraint con10 check(code like '[1-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
code_parvande int not null constraint con8 check (code_parvande like '[0-9][0-9][0-9][0-9]')
)
)

primery key رو هم خودت زحمت بکش

سلام،
از مفهوم دوبار نقیض گیری (Double Negation) می توانید برای ساده سازی قید مورد نظر استفاده کنید که در نهایت کد به شکل زیر در خواهد آمد:



create table table_20
(code bigint not null
constraint con10
check (code LIKE '[1-3]%'
AND LEN(code) = 12
AND code NOT LIKE '%[^0-9]%'),
code_parvande int not null
constraint con8
check (LEN(code_parvande) = 4
AND code_parvande NOT LIKE '%[^0-9]%'));

محمد سلیم آبادی
چهارشنبه 11 فروردین 1389, 20:16 عصر
خيلي ممنون از توضيحتون

راستي از قيد Check و Rules هم در اينجا ميشه استفاده كرد؟

در پست دوم از قید Check استفاده شده است. در پست قبلی هم قید Check مورد نظرتان را بهینه تر و ساده تر کرده ام.

هیچ ممانعتی برای عدم استفاده از قیود در SQL Server وجود ندارد ولی در بسیاری از موارد برنامه نویسان سعی می کنند که این بررسی ها در سطح Application اعمال شود.

محمد سلیم آبادی
چهارشنبه 11 فروردین 1389, 20:34 عصر
سلام
به چهار روش :
- با Trigger
- با قید چک روی فیلد و یک تابع SQL
- با مدیریت در لایه زبان برنامه نویسی
- با یک تابع اعتبار سنجی در SQL و ممانعت در لایه برنامه کاربردی
پیشنهاد من : راه حل آخر

سلام آقای کفاش،
آیا دلیل خاصی وجود دارد که از یک UDF داخل Check Constraint استفاده می کنید؟ این را از این جهت می پرسم که هیچ ضروریتی در استفاده از UDF در این مورد نمی بینم. و همانطور که در پست دوم و دو پست قبلی به آن اشاره شده است بسادگی می توان جامعیت داده ی مورد نظر اعمال شود.

در داخل Check Constraint قابلیت استفاده از Subquery وجود ندارد و به همین دلیل استفاده از تابع در قید چک می تواند جایگذینی برای Trigger ها باشد.

s.Jabbari
چهارشنبه 11 فروردین 1389, 20:48 عصر
سلام،
از مفهوم دوبار نقیض گیری (Double Negation) می توانید برای ساده سازی قید مورد نظر استفاده کنید که در نهایت کد به شکل زیر در خواهد آمد:



create table table_20
(code bigint not null
constraint con10
check (code LIKE '[1-3]%'
AND LEN(code) = 12
AND code NOT LIKE '%[^0-9]%'),
code_parvande int not null
constraint con8
check (LEN(code_parvande) = 4
AND code_parvande NOT LIKE '%[^0-9]%'));




با تشکر از mSalim
شما همیشه راهنمای ما بودید
این چند روزی که نبودید ما واقا دلتنگتون بودیم

محمد سلیم آبادی
چهارشنبه 11 فروردین 1389, 20:54 عصر
با تشکر از mSalim
شما همیشه راهنمای ما بودید
این چند روزی که نبودید ما واقا دلتنگتون بودیم

ممنون از تشویق شما،
از این پس قصد دارم اگر خداوند کمک کند به عنوان یک Adviser عمل کنم و اگر ایرادی یا امکان راهنمایی در پست های دیگران ببینم به آنها گوش زد خواهم کرد.

s.Jabbari
پنج شنبه 12 فروردین 1389, 20:17 عصر
در سطح app میتونی از masked textBox استفاده کنی
و یا
تو محیط rule,sql server تعریف کنی که موقع insert اعمال بشه

اینم یک نمونهrule
'


create rule rule1 as @col like

'[0-3][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9]'

exec sp_bindrule 'rule1','table_5.code

ASKaffash
شنبه 14 فروردین 1389, 07:33 صبح
سلام آقای کفاش،
آیا دلیل خاصی وجود دارد که از یک UDF داخل Check Constraint استفاده می کنید؟ این را از این جهت می پرسم که هیچ ضروریتی در استفاده از UDF در این مورد نمی بینم. و همانطور که در پست دوم و دو پست قبلی به آن اشاره شده است بسادگی می توان جامعیت داده ی مورد نظر اعمال شود.

در داخل Check Constraint قابلیت استفاده از Subquery وجود ندارد و به همین دلیل استفاده از تابع در قید چک می تواند جایگذینی برای Trigger ها باشد.
سلام
در بسیاری از موارد با گذشت زمان نیاز و الگوریتم پیشنهادی کارفرما پیچیده تر می گردد و پیاد سازی در یک یا چند خط SQL فراتر می رود و لزوم UDF افزایش می یابد ویا اعتبار سنجی مشروط می گردد(در این مثال فعلا مسئله ساده است و با قید چک آسانتر است)