PDA

View Full Version : استخراج ساختار بانک اطلاعاتی از روی دیاگرام



sm
پنج شنبه 15 تیر 1385, 05:04 صبح
باسلام
من میخوام گزارش ساز درست کنم نیاز دارم تا رابطه بین جدولها رو بدونم...آیا دستوری وجود داره که بشه بوسیله اون روابط بین جداول رو از روی دیاگرام استخراج نمود؟
یه سوال دیگه هم داشتم و اونم اینکه کاربر باید با نام فارسی جداول و ویووها و Stored Procedurها روبرو باشه(توی گزارش ساز)... بنظر شما چطور میتونم این قسمت رو پیاده سازی کنم؟ آیا امکان داره که نام فارسی هر جدول و ویوو و Stored Prosedure رو توی بانک اطلاعاتی مشخص و نگهداری نمود؟ و آیا اینکه اصولا کار درستی هست یا نه؟
ممنون

majid_afra222
پنج شنبه 15 تیر 1385, 07:21 صبح
سلام
برای اولی (اطلاعات و ساختار بانک اطلاعاتی) من یه برنامه تو بخش VB.NET قرار داده بودم، اگه پاک نشده باشه.
برای نگهذلری اطلاعات فارسی هم extendproperty توضیحات مربوط به فیلدها و جداول رو نگهداری می کنه.
برای View و Stored Procedure هم باید یک ساختار در پیاده سازی در نظر بگیری (مثلا خط اول هر SP توضیح یا اطلاعات فارسی اون باشه) بعد ازش استفاده کنی.
خوب از نظر درست بودن هم بستگی به کارت و خودت داره.

sm
پنج شنبه 15 تیر 1385, 16:38 عصر
میشه بیشتر در مورد extendproperty توضیح بدین...درصورت امکان یه مثال بزنین
راهنمایی در مورد ساخت گزارش ساز ندارین؟
ممنون

majid_afra222
پنج شنبه 15 تیر 1385, 16:58 عصر
سلام
بهتره اول برای تمام جدولها و ستونها یه توضیح مختصر ایجاد کنی، مثلا :



CREATE table T1 (id int , name char (20))

EXEC sp_addextendedproperty 'caption', 'Employee ID', 'user', dbo, 'table', 'T1', 'column', id

EXEC sp_addextendedproperty 'caption', 'Employee Name', 'user', dbo, 'table', 'T1', 'column', name


بعد بجای نمایش نام اصلی اونها، توضیحات رو به کاربر نشون بدی، مثلا :



SELECT *
FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', 'T1', 'column', default)

بعد query رو ایجاد کنی.
در ضمن اگه کاربر می تونه از بیش از یه جدول جستجو رو انجام بده باید ارتباطات رو استخراج کنی
با استفاده از sysreferences و sysobjects در ضمن به کاربر اجازه بدی شرطهایی رو هم اضافه کنه، با توجه به نوع داده ای که انتخاب می کنه، sysobjects و systypes.
بعد هم هزار تا کار دیگه.
هر چقدر که دلت میخواد می تونی ادامه بدی (مثلا constraint ها رو استخراج کنی).
در اصل کار بدی نیست، ولی اگه میخوای تر و تمیز باشه باید همه چیز رو بسنجی و از قبل فکرش رو کرده باشی.

sm
پنج شنبه 15 تیر 1385, 18:06 عصر
ممنون
من رفتم هلپ اس کیو ال رو دیدم...یه چیزایی دستگیرم شد...چند تا راهنمایی

1- حتما باید برای تک تک جداول و ستونها و ... جدا جدا توضیحات فارسی رو اضافه کنیم؟

2- وقتی داخل برنامه اسامی فارسی جداول و ستونها رو نمایش بدیم، وقتی کاربر یه جدول و سپس برخی از فیلدهای اون انتخاب کرد چطوری باید کوئری اون رو بسازیم؟
منظورم اینه که حالا چطوری از روی اسامی فارسی، انگلیسی ها رو بدست بیاریم!؟

3- شما گفته بودین باید روابط رو برای چند جدولیها استخراج کنم...چطوری میشه اینکار رو کرد ؟
ممنون میشم با مثال توضیح بدین

majid_afra222
پنج شنبه 15 تیر 1385, 18:45 عصر
سلام
جواب 1 - بله.
جواب 2- خوب تو نام objectها و توضیح اونها رو با هم استخراج می کنی، به کاربر توضیح رو نشون میدی و برای خودت نام object رو نگهداری می کنی.
جواب 3- امشب اگه تونستم یه برنامه برات می نویسم، البته کوچولو.
با دلفی باشه که اشکالی نداره، البته فقط اسکریپتش مهمه که خودت زحمت تبدیلش رو بکش.
(از .Net برای Application نویسی زیاد خوشم نمیاد.)

sm
جمعه 16 تیر 1385, 11:28 صبح
ممنون مجید جان
اون برنامه ای رو که قبلا گذاشته بودین و با دلفی بود رو دیدم
من اصلا تا بحال محیط دلفی رو هم ندیدم...اگه براتون زحمت نیست و دارین دات نت رو بزارین وگرنه توضیح هم بدین چیکار باید بکنم ممنون میشم

majid_afra222
جمعه 16 تیر 1385, 14:11 عصر
سلام
با این query اطلاعات جداول و ستونها رو با هم استخراج کن و به کاربر اجازه انتخاب ستونها رو برای نمایش بده.


select object_name(sc.id), sc.name,
type_name(sc.xusertype),
case sc.typestat
when 2 then sc.Length
when 3 then sc.Length
else ''
end as Length,
case sc.isNullable
when 0 then 'Not Null'
when 1 then ''
end
from syscolumns sc inner join sysobjects so
on so.id = sc.id and so.xtype = 'U'

بعد از انتخاب لیست جداول و ستونها دونه به دونه بین هر 2 جدول انتخاب شده (جداولی که حداقل یکی از ستونهاشون تو لیست select هستش) با کمک query زیر شرطهای relation رو عمال کن.


select object_name(sf.constid), object_name(sf.rkeyid),
sc1.name, object_name(sf.fkeyid),
sc2.name,
CascUpdate = case when (objectproperty(constid, 'CnstIsUpdateCascade')=1) Then
convert(varchar (3),'Yes') else convert(varchar (3),'') end,
CascDelete = CASE when (objectproperty(constid, 'CnstIsDeleteCascade')=1) then
convert(varchar (3),'Yes') else convert(varchar (3),'') end
from sysforeignkeys sf, syscolumns sc1, syscolumns sc2
where (sc1.colID=sf.rkey and sf.rkeyid=sc1.ID) and
(sc2.colID=sf.fkey and sf.fkeyid=sc2.ID)

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

بعد تو آخر کار هم یه صفحه بذار که کاربر بتونه شرطهای اضافی رو وارد کنه (به ازای هر ستون انتخاب شده یه مقدار وارد کنه).
در نهایت یه select بزرگ داری که لیست ستونها رو از query اول گرفتی و شرطهای اولیه مورد نیاز رو از دومی (ارتباطا بین جدوال انتخاب شده) و شرطهای اضافی رو هم از کاربر.
به نظر من توابع تجمعی رو فقط برای جداول دارای relation مجاز کن تا احتمال خطای کاربر کم بشه. یا اصلا نذار روی چند جدول توابع تجمعی رو اعمال کنه.

sm
جمعه 16 تیر 1385, 20:06 عصر
ممنون مجید خان
امتحان میکنم اگه به مشکلی برخوردم مزاحمت میشم
خیلی ممنون