PDA

View Full Version : ایجاد ستون با trigger و عدم نمایش آن در زمان اجرا توسط entity



wolf_majid
پنج شنبه 05 تیر 1393, 10:31 صبح
سلام دوستان
به کد زیر نگاه کنید :
CREATE TRIGGER [tr_InsertColumnIntoCustomerAndServeAfterInsertRowI ntoServe]
ON [dbo].[Serve]
FOR INSERT
AS
BEGIN
declare @id int
set @id=(select Id from inserted)
declare @q varchar(50)
set @q='Serve'+CONVERT(varchar, @id)
exec('alter table CustomerAndServe add '+ @q +' bit default(0)')
exec('update CustomerAndServe set '+@q+'=0 where '+@q+' is null')
END
این کد هر گاه یک سطر به خدمات اضافه میشه یک ستون به جدول مشتری و خدمت اضافه می کنه
با entity ستون ها به نمایش در نمی یاند ولی با کد زیر چرا
var cn = SqlDal.GetSqlConnection();
SqlCommand cmd = new SqlCommand("select * from CustomerAndServe", cn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvCustomerAndServe.DataSource = dt;

میشه بگید چکار کنم که entity اطلاعات ستون ها را در زمان اجرا بروز کنه و نمایش بده ؟

Mahmoud.Afrad
پنج شنبه 05 تیر 1393, 11:00 صبح
به نظر میرسه جداول نرمال نیستند. ساختار جدول مشتری، خدمات، مشتری و خدمات رو بزارید تا بررسی کنیم.

gerdioz
پنج شنبه 05 تیر 1393, 14:11 عصر
set @id=(select Id from inserted)
به این تصحیح کن
declare @id int;
select @Id=i Id from inserted i;

موفق باشی

wolf_majid
یک شنبه 08 تیر 1393, 08:30 صبح
سلام
نماز روزه هاتون قبول حق
ببخشید دیر پاسخ دادم
توی ado.net مشکلی ندارم ستون های پویای جدول به راحتی نمایش داده میشه ولی انتیتی مدل رو در زمان اجرا بروز نمی کنه
در اصل میخوام به ازای هر کاری که مشتری موقعی که در صف قرار میگیره درخواست می کنه یک جدول اطلاعات درخواستی مشتری را ذخیره کنه و پردازش کنه که کدام کاربر میتونه این خدمات را کامل انجام بده و مشتری را مشتری اون کاربر قرار بده

این هم کدهای جداول (البته اسم جدول مشتری و خدمت را به صف وخدمت تغییر دادم)

جدول نوبت دهی :

CREATE TABLE [dbo].[Turn] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[TaxPayerType] INT NOT NULL,
[Person_Id] CHAR (10) NULL,
[HoghooghiCompany_Id] INT NULL,
[EnterDate] CHAR (10) NOT NULL,
[EnterTime] CHAR (8) NOT NULL,
[AccepterUser_Id] NVARCHAR (50) NULL,
[IsDeaccepted] BIT DEFAULT ((0)) NOT NULL,
[Priority] SMALLINT DEFAULT ((0)) NULL,
[TurnAndServes_Id] int foreign key references TurnAndServes,
PRIMARY KEY CLUSTERED ([Id] ASC),
FOREIGN KEY ([Person_Id]) REFERENCES [dbo].[Person] ([NationalCode]),
FOREIGN KEY ([HoghooghiCompany_Id]) REFERENCES [dbo].[HoghooghiCompany] ([Id]),
FOREIGN KEY ([AccepterUser_Id]) REFERENCES [dbo].[Login] ([Username])
);




جدول شخص:
CREATE TABLE [dbo].[Person] (
[NationalCode] CHAR (10) NOT NULL,
[Name] NVARCHAR (100) NULL,
[FatherName] NVARCHAR (50) NULL,
[ShenasnamehCode] CHAR (10) NULL,
[ShenasnamehSerial] NVARCHAR (15) NULL,
[Birthday] CHAR (10) NULL,
[Cellphone] CHAR (11) NULL,
[Gender] BIT NULL,
[Email] NVARCHAR (100) NULL,
PRIMARY KEY CLUSTERED ([NationalCode] ASC)
);



جدول شرکت حقوقی را نگذاشتم اگر لازمه بگید بگذارم.

جدول خدمت :
CREATE TABLE [dbo].[Serve] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Description] NTEXT NOT NULL,
[Amount] DECIMAL (18) DEFAULT ((0)) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

جدول نوبت و خدمت :

CREATE TABLE [dbo].[TurnAndServes] (
[Id] INT IDENTITY (1, 1) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
);



این هم تریگر :
CREATE TRIGGER [tr_InsertColumnIntoTurnAndServesAfterInsertRowInto Serve]
ON [dbo].[Serve]
FOR INSERT
AS
BEGIN
declare @id int
select @id=Id from inserted
declare @q varchar(50)
set @q='Serve'+CONVERT(varchar, @id)
exec('alter table TurnAndServes add '+ @q +' bit default(0)')
exec('update TurnAndServes set '+@q+'=0 where '+@q+' is null')
END

wolf_majid
یک شنبه 08 تیر 1393, 11:36 صبح
بگذارید سناریو رو براتون بگم
هر مشتری که وارد صف میشه یک سری کار درخواست میکنه و هر کاربر هم یک سری کار را می تونه انجام بده
هر کاربری که مشتری از صف را صدا میزنه , اولین مشتری که تمام کارهاش رو اون کاربر بتونه انجام بده , برای کاربر انتخاب میشه


به نظرتون مثل بالا از جدول با کمک تریگر استفاده کنم یا یک فیلد رشته ای در نظر بگیرم و خدمات مورد نظر را با یک جداکننده درونش بریزم

سوال :
اگر فیلد استفاده کنم که احتمالا" مشکلی نخواهم داشت
اما اگر جدول استفاده کنم که یک کاربر می تونه چندین کار را انجام بده (جدولی مثل UserAndServe شامل کلید و کد کاربر و خدمات موجود در جدول خدمات)
مشتری موجود در صف هم چندین خدمت درخواست میکنه . نمیدونم باید یک جدول هم برای خدمات درخواست شده مشتری موجود در صف ایجاد کنم یا میشه کار دیگه ای کرد
به عبارتی چطور مشخص کنم مشتری چه کارهایی داره بدون اینکه براش جدول مجزا ایجاد کنم و کدام کاربر میتونه انجام بده

و همچنان سوال اول تاپیک :
اگر از روش جدول استفاده کردم چطور انتیتی ستون هاش رو در زمان اجرا بروز کنه

wolf_majid
سه شنبه 10 تیر 1393, 13:12 عصر
سلام دوستان
پست بالا اشتباه نوشتاری زیاد داشت
گفتم شاید متوجه منظورم نشده باشید
ممنون میشم اگر کسی میدونه راهنماییم کنه

hamid_hr
سه شنبه 10 تیر 1393, 13:28 عصر
به نظر من اضافه کردن ستون با تریگر کاملا اشتباه هستش
شما به ازای هر insert داری یه ستون میسازی
خب اینطوری مثلا 1000 تا insert داشته باشین 1000 تا ستون میشه که همشون هم null هستن
این فک کنم اشکال داره
به نظر من یه جدول جدید بزنید و کد مشتری و کد کاربر و درخواست رو داخلش قرار بده
اگه مشتری دو درخواست داشته باشه دو سطر براش ایجاد میشه یکی برا درخواست اول دومی برا درخواست دوم

wolf_majid
سه شنبه 10 تیر 1393, 17:43 عصر
خوب مطمئنا" خدمات به 1000 مورد نمیرسه

اگه مشتری دو درخواست داشته باشه دو سطر براش ایجاد میشه یکی برا درخواست اول دومی برا درخواست دوم
ایده بدی به نظر نمیاد
از اونجا که مشتری ممکنه بیش از یک درخواست داشته باشه پس باید تمامی درخواست های امروزش (deaccept نشده ها یا تمام نشده ها) را واکشی کنم و ببینم کدوم کاربر میتونه انجام بده که طبق گفته شما برای هر کاری که کاربر میتونه انجام بده باید یک سطر ایجاد بشه و این سطرها (سطرهای درخواست مشتری و سطرهای توانایی کاربران) تک تک باهم چک بشن , درسته ؟

بگذارید ببینیم کسی نظر دیگه ای نداره
و همچنان من منتظر پاسخ سوال اول تاپیک هم هستم

یک فیلد با جداکننده خدمات فعلا" به نظر ساده ترین راهه ولی امکان ورود مقادیر نامعتبر رو داره (بدون در نظرگرفتن جلوگیری توسط کدنویسی)