PDA

View Full Version : سوال: ویرایش فرمهای دارای title و detail



az.heidarzadeh
سه شنبه 22 آذر 1390, 14:40 عصر
سلام
من یه فرم دارم که داره از دوتا جدول title و detail پر میشه برای اضافه کردن مشکلی ندارم کدشو درآوردم اما برای ویرایش کردنش باید چیکار کنم به نظر شما باید با هربار ویرایش detail رو کلا حذف کنم و دوباره insert کنم یا روش بهتری هم هست، اصلا قانون این فرمها چطوریه؟
ممنون...

az.heidarzadeh
چهارشنبه 23 آذر 1390, 11:41 صبح
ای خدا این سوالم هم که بیجواب مونده، ببینید من با یکی از دوستانم که ایشون هم برنامه نویس خیلی خوبی هستند صحبت کردم نظرشون این بود که نباید detail حذف بشه و دوباره insert بشه میگه update انجام بشه و اگه سطری اضافه شده insert شه و اگه کم شده delete شه کار پردردسریه حالا به نظر شما چطوری پیاده سازیش کنم ایشون میگفتند از switch استفاده کن کسی نظر بهتری داره؟...
ممنون

zarrinnegar
چهارشنبه 23 آذر 1390, 12:07 عصر
یعنی چی همه detail ها رو حذف کنم
بستگی داره کدومو دارید تغییر میدید
اگه title رو تغییر میدید همونو update کنید
معمولا جداولی که به هم مرتبط هستند یک کد دارند که با اون به هم متصل میشن
این کد رو نمیزارن که کاربر اصلاح کنه
ولی اگه خواستی بزاری اونواصلاح کنه باز مشکلی نیست فقط باید توی sql قسمت relation رو که 2 تا جدول رو به هم ارتباط دادید رو باز کنید و قسمت update اون رو ازنوع cascade شنتخاب کنید
اون وقت اگه کد اصلی تغییر کنه تمام زیر مجموعش هم تغییر میکنن
در ضمن اونجا برای delete هم همین گزینه رو تنظیم کنید موقعی که بخواهید tilte رو حذف کنید دیگه نمیخواد دستوری برای حذف detail بنویسید خود به خود همشون که مربوط به اون title باشن حذف میشن

az.heidarzadeh
چهارشنبه 23 آذر 1390, 13:09 عصر
نه اونا رو میدونم مشکل من توی ویرایش فاکتورمه اینجارو ببینید:

79193

الان من فرمم رو به حالت ویرایش باز کردم، میام مثلا اون یک سطر و ویرایش میکنم و دوتا سطر دیگه اضافه میکنم تغییرات باید توی جدول detail انجام بشن یعنی اون یک مورد ویرایش بشه درتا مورد دیگه اضافه بشه و شاید موردی هم برای حذف شدن وجود داشته باشه، خب چطور همه اینکار هارو انجام بدم؟ spبنویسم یکی یکی با تغییر هر سطر تغییرات و اعمال کنم چیکار کنم؟ :ناراحت:

zarrinnegar
چهارشنبه 23 آذر 1390, 13:34 عصر
ببین شما دکمه ذخیره رو میزنی
حالا اگه رکورد جدید باشه اضافه میشه و اگه ویرایش اطلاعات باشه Update میکنی
پس هر بار که دکمه ذخیره زده میشه روی یک رکورد تاثیر میزاره
حالا میای چک میکنی رکورد جدید داره وارد میشه که sp_insert رو اجرا کنی و یا ویرایش میشه که sp_update رو اجرا میکنی

اگه فقط داری روی گرید این کار رو میکنی به نظر من اشتباهه و مستقیماً روی دیتابیس بفرست بعد گرید رو رفرش کن اطلاعاتش درست میشن

ma.rad
چهارشنبه 23 آذر 1390, 13:45 عصر
یه سوال داشتم برا استایل فرمتون از چه کامپوننتی استفاده کردید؟
بخصوص دیتاگریدتون
میشه آپلودش کنید همین جا
ممنون

az.heidarzadeh
چهارشنبه 23 آذر 1390, 14:03 عصر
ببین شما دکمه ذخیره رو میزنی
حالا اگه رکورد جدید باشه اضافه میشه و اگه ویرایش اطلاعات باشه Update میکنی
پس هر بار که دکمه ذخیره زده میشه روی یک رکورد تاثیر میزاره
حالا میای چک میکنی رکورد جدید داره وارد میشه که sp_insert رو اجرا کنی و یا ویرایش میشه که sp_update رو اجرا میکنی

اگه فقط داری روی گرید این کار رو میکنی به نظر من اشتباهه و مستقیماً روی دیتابیس بفرست بعد گرید رو رفرش کن اطلاعاتش درست میشن
نه من باید یهویی اطلاعات دیتابیسمو کامل کنم آخه برنامه قراره تو شبکه کار کنه که اگه همزمان دو نفر تو یه لحظه فاکتور زدن خطا پیش نیاد sp اضافه کردنم اینطوریه


IF not exists(SELECT * FROM tb_BuyFactor WHERE vcID = @vcID)
INSERT INTO [dbo].[tb_BuyFactor]
([vcID],[vcPersonID],[vcPersonnelID],[vcDate],[vcDescription],[dcDiscount],[dcTrasport])
VALUES
(@vcID,@vcPersonID,@vcPersonnelID,@vcDate,@vcDescr iption,@dcDiscount,@dcTrasport)
ELSE
UPDATE [dbo].[tb_BuyFactor]
SET [vcPersonID] = @vcPersonID
,[vcPersonnelID] = @vcPersonnelID
,[vcDate] = @vcDate
,[vcDescription] = @vcDescription
,[dcDiscount] = @dcDiscount
,[dcTrasport] = @dcTrasport
WHERE [vcID] = @vcID

INSERT INTO [dbo].[tb_BuyFactorDetail]
([vcBuyFactorID],[dcStoreID],[vcObjectID],[vcSerialNo],[dcCount],[dcUnitPrice],[vcDescription])
VALUES
(@vcID,@dcStoreID,@vcObjectID,@vcSerialNo,@dcCount ,@dcUnitPrice,@vcDescDetail)

وقتی دکمه تایید و میزنم for به تعداد سطرهای گرید این sp اجرا میشه اما برای ویرایش نمیدونم چیکار کنم...

az.heidarzadeh
چهارشنبه 23 آذر 1390, 14:06 عصر
یه سوال داشتم برا استایل فرمتون از چه کامپوننتی استفاده کردید؟
بخصوص دیتاگریدتون
میشه آپلودش کنید همین جا
ممنون
من با DevComponent کار میکنم اگه یه سرچ کنید خیلی راحت پیداش میکنید اما بهرحال اگه میخواید ایمیلتون و تو پست خصوصی بدید تا لینک دانلودشو واستون بزارم چون حجمش بالاست اینجا جا نمیشه...

zarrinnegar
چهارشنبه 23 آذر 1390, 14:07 عصر
وقتی 10 نفر همزمان توی شبکه فاکتور میزنن چه مشکلی پیش میاد؟

لابد کد نویسیت اشکال داره که مشکل پیش میاد

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

ممکنه که توی شماره فاکتور تکراری پیش بیاد که هم زمان آخرین فاکتور رو میزنن که اون هم یه راه ساده داره

az.heidarzadeh
چهارشنبه 23 آذر 1390, 14:12 عصر
خب آره دیگه دقیقا همین مشکل شماره فاکتور پیش میاد تازه از شبکه که بگذریم اومدیم شماره فاکتور رو بالا داده 105 اومد سطر اول و اضافه کرد رفت تو دیتابیس حالا دید نه اشتباه کرده رفت شماره فاکتورو کرد 106 میاد بقیه سطرها رو اضافه میکنه به نظر شما کدنویسی من مشکل داره یا واقعا این مشکل پیش میاد؟...

zarrinnegar
چهارشنبه 23 آذر 1390, 14:19 عصر
خوب اگه شماره فاکتور رو کاربر وارد میکنه از کجا تشخیص میدی که کاربر 1 ثانیه قبل از شما 105 یا 106 رو وارد نکرده
توی این جور برنانمه ها اولین شماره رو از کاربر میگیرن و بعدی رو از روی دیتابیس میگیرن یکی بهش اضافه میکنن بعد از ذخیره شده شماره فاکتور رو نمایش میدن
اگر فاکتور ها رو هر کاربری جدا برا خودش میزنه که دسته بندی کد میکنن که تکراری نباشه بعدش

شماره فاکتور از 105 به 106 یا هر شماره ای تغییر کنه چرا detail رو به شماره فاکتور ربط دادی یه فیلد از نوع identity توی دیتابیس بگیر و اونو کلید کن و توی detail هم از اون کد استفاده کن
شماره فاکتور رو از نوع char ,nvarchar در نظر بگیر و کاربر هر وقت خواست شماره رو ویرایش کنه و مشکلی نباشه فقط میمونه چک کردن اینکه شماره ویزارش شده قبلا در دیتابیس نباشه

اینطوری بقیه کارها راحت تر انجام میشه

az.heidarzadeh
چهارشنبه 23 آذر 1390, 14:24 عصر
شماره فاکتور رو که باید کاربر وارد کنه اونی که میگید درست نیست بهردلیلی امکان داره بخوان ترتیب شماره رو تغییر بدن اما درمورد اینکه identity باشه شاید حق با شما باشه اما واقعا تو گزارشام مشکل میخورم هردفعه اول کلید identity رو پیدا کنم بعد از اون شماره فاکتور... بهرحال ممنون روش فکر میکنم

zarrinnegar
چهارشنبه 23 آذر 1390, 14:35 عصر
چرا اول identity رو پیدا کنید همون شماره فاکتور رو بفرست و فیلتر کن مگه بدون تکرار نیست؟

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

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

توی sp_insert باید این کد رو آخر پروسیجرت اضافه کنی
return scopeidentity()

این آخرین کدی رو که Identity تولید کرده به برنامت برمیگردونه اون وقت میزاری توی تمام رکورد های detail

az.heidarzadeh
چهارشنبه 23 آذر 1390, 16:35 عصر
یه مشکل دیگه ای پیش اومده، من یه جدول گردش انبار دارم که اونم title و detail داره و وقتی فاکتور خریدم رو ثبت میکنم انتهای sp خریدم sp گردش انبارم رو هم صدا میزنم که کالا هارو همونطور که تو فاکتورم ثبت میکنه تو انبارم هم ثبت کنه تا اینجا مشکلی نیست، الان میخوام فاکتور رو ویرایش کنم یه گفته شما کد detail رو هم اینطرف دارم و با دکمه ذخیره insert یا update میکنم اینم میشه اما انبارم چی؟ اونو که جایی نگه نمیدارم کداشو از کجا بیارم که برم update کنم؟... :ناراحت:

zarrinnegar
چهارشنبه 23 آذر 1390, 22:54 عصر
این هم آسونه ولی یکم فنی تر میشه
این جور کارها رو خودت نباید انجام بدی باید بزاری به عهده SQL
درباره TRIGGER چیزی شنیدی؟

باید روی table detail یه تریگر بنویسی و توی اون میتونی بگی که بعد از عمل insert,update,delete چکارکنه که اونجا باید بگی که برو جدول انبار رو بروز کن

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

linux
پنج شنبه 24 آذر 1390, 00:04 صبح
سلام
من یه فرم دارم که داره از دوتا جدول title و detail پر میشه برای اضافه کردن مشکلی ندارم کدشو درآوردم اما برای ویرایش کردنش باید چیکار کنم به نظر شما باید با هربار ویرایش detail رو کلا حذف کنم و دوباره insert کنم یا روش بهتری هم هست، اصلا قانون این فرمها چطوریه؟
ممنون...

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

az.heidarzadeh
پنج شنبه 24 آذر 1390, 08:48 صبح
این هم آسونه ولی یکم فنی تر میشه
این جور کارها رو خودت نباید انجام بدی باید بزاری به عهده SQL
درباره TRIGGER چیزی شنیدی؟

باید روی table detail یه تریگر بنویسی و توی اون میتونی بگی که بعد از عمل insert,update,delete چکارکنه که اونجا باید بگی که برو جدول انبار رو بروز کن

یکمی اطلاعات درباره اون بدست بیار بعد اگه اطلاعاتت کمی کامل شد بگو نمونه بزارم
آخه نمیخوام وابسته به کسی باشی تا هی برات کد بزاره
یکمی خودت تلاش کن بعد نتیجه رو نشون بده مثلا کدهایی رو که بدست آوردی رو بزار بعد کمکت میکنم حلش کنی
بلدم تریگر بنویسم بابا، اما مشکل جای دیگه است آخه همونطور که گفتم جدولام title و detail هست دوتا detail من هیچ ربطی بهم ندارن که بخوام بگم اگه این insert شد اونم insert بشه اتفاقا خودم هم بفکر تریگر افتاده بودم اما بازم این مشکل هست ولی بازم مینویسم واستون میزارم شما کمکم کنید کاملش کنم اینم تصویر جدولام...
79221

az.heidarzadeh
پنج شنبه 24 آذر 1390, 08:51 صبح
فیلد کلید بهتر هست مقداری باشد تا توسط سیستم تخصیص داده شود، فیلدی که توسط کاربر وارد می شود به همین راحتی نمی توان برای کلید در نظر گرفت.
مهم هست که نحوه کد نوشتن شما چطوری هست و از چی استفاده کردید، در حالت کلی شما یک شی دارید که یکی از پروپرتی های آن شی یک لیست از شی دیگر هست. شما شی مورد نظر خودتان را اصلاح می کنید و در پایان این اصلاحات را به دیتا بیس منتقل می کنید.
والا اصلا نفهمیدم چی گفتید میشه لطفا ساده تر توضیح بدید، من دوستان برنامه نویس زیادی دارم که نرم افزار نوشتن و همه شونم از خود شماره فاکتور برای کلید استفاده کردن من با راهنمایی اساتید دیتابیسم و تحلیل کردم هرچند فکر نمیکنم مشکل با عوض کردن کلیدم حل بشه اما واقعا اگه این راه حل باشه خب انجامش میدم...

az.heidarzadeh
پنج شنبه 24 آذر 1390, 09:41 صبح
خب من تریگرشو نوشتم اما همونطور که گفتم این بدرد نمیخوره چون فقط تعداد و شماره انبار رو ویرایش میکنه تنها چیز مشترکی که من بین detail هام دارم کد کالامه که خب اون خودش امکان ویرایش داره لطفا کمکم کنید 1 هفته است موندم رو این قضیه حتی حاضرم کلا ساختار دیتابیسم و عوض کنم میرم دوباره مینویسمش فقط اگه بهم بگید کجاش اشتباهه و باید چطور باشه...


ALTER TRIGGER [dbo].[tr_UPD_BuyFactorDetail]
ON [dbo].[tb_BuyFactorDetail]
AFTER UPDATE
AS

UPDATE [db_AMW].[dbo].[tb_StoreFlowDetail]
SET [dcStoreID] = inserted.dcStoreID
,[dcEnterCount] = inserted.dcCount
FROM dbo.tb_StoreFlow INNER JOIN
dbo.tb_StoreFlowDetail ON dbo.tb_StoreFlow.vcID = dbo.tb_StoreFlowDetail.vcStoreFlowID INNER JOIN
inserted ON dbo.tb_StoreFlow.vcFactorID = inserted.vcBuyFactorID
WHERE (dbo.tb_StoreFlow.vcFactorID = inserted.vcBuyFactorID) AND (dbo.tb_StoreFlow.vcFlag = 1) AND (dbo.tb_StoreFlowDetail.vcObjectID = inserted.vcObjectID)

linux
پنج شنبه 24 آذر 1390, 10:25 صبح
والا اصلا نفهمیدم چی گفتید میشه لطفا ساده تر توضیح بدید، من دوستان برنامه نویس زیادی دارم که نرم افزار نوشتن و همه شونم از خود شماره فاکتور برای کلید استفاده کردن من با راهنمایی اساتید دیتابیسم و تحلیل کردم هرچند فکر نمیکنم مشکل با عوض کردن کلیدم حل بشه اما واقعا اگه این راه حل باشه خب انجامش میدم...

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

az.heidarzadeh
پنج شنبه 24 آذر 1390, 10:47 صبح
نام گذاری شما بر روی جداول و فیلدها کمی عجیب هست.
فکر می کنم یک مشکلی هم در طراحی جداولتان دارید.
هرچند مشکلم با همون تریگر حل شد یادم رفته بود update یه جدول deletd هم داره :لبخند: دست گلش درد نکنه، اما دوست دارم اگه تحلیلم اشکال داره برطرفش کنم چه چیز عجیبی تو نامگذاری من وجود داره جدولام همون ها هستند فکر میکنید چه مشکلی در طراحی شون هست؟...

ma.rad
پنج شنبه 24 آذر 1390, 11:49 صبح
سلام دوست عزیز من قبلا یه برنامه صدورفاکتور نوشتم وتحلیل من این شکلی بود میگم شاید بدردتون بخوره:
یه جدول برا محصولات داشتم شامل فیلد های : شماره محصول-قیمت-واحد اندازگیری-نام محصول-کارخانه تولید کننده
یه جدول برا خدمات داشتم شامل فیلد های : شماره خدمات -نوع خدمات- هزینه خدمات
به جدول برا ثبت مشتری ها شامل فیلد های: شماره مشتری-نام -نام خانوادگی-ومشخصات مورد نیاز مثل شماره تلفن آدرس-میزان اعتبار (مخصوص مشتری های دائمی)
یه جدول برا فروشنده ها شامل فیلدهای : شماره فروشنده-نام-نام خانوادگی -شماره صندوق-ومشخصات مورد نیاز مثل شماره تلفن آدرس
یه جدول برا ثبت فاکتور که شامل فیلدهای: شماره فاکتور-شماره کالا/شماره خدمات-تعداد-قیمت واحد-(قیمت کل)-کد شعبه-شماره مشتری-شماره فروشنده
ویه جدول برای شعبه: کد شعبه-نام شعبه--تعداد صندوق-آدرس شعبه-ومشخصات مورد نیاز مثل شماره تلفن آدرس

البته خیلی وقت پیش نوشتم میشه روش کار کرد.
اگر فرصت شد آپلودش می کنم
موفق باشید

linux
پنج شنبه 24 آذر 1390, 12:05 عصر
هرچند مشکلم با همون تریگر حل شد یادم رفته بود update یه جدول deletd هم داره :لبخند: دست گلش درد نکنه، اما دوست دارم اگه تحلیلم اشکال داره برطرفش کنم چه چیز عجیبی تو نامگذاری من وجود داره جدولام همون ها هستند فکر میکنید چه مشکلی در طراحی شون هست؟...
نام گذاری جداول هیچ احتیاجی نیست که قبلش کلمه tbl یا همچین چیزی به کار رفته باشد، اگر سیستم شما بزرگ باشد و شامل چند زیر مجموهمه باشد مثلا حسابداری و انبار و ... بهتر هست که مثلا جداول که مخصوص زیر سیستم حسابداری باشند مثلا با حرف a. یا acc. یا هر چیز دیگر . اسامی فیلدها هم همیطور با حرف بزرگ شروع بشوند بهتر هست و با مفهوم باشند و در ضمن احتیاجی به پیشوند که نشان دهنده نوع آن باشد نیست.
برای طراحی باید جزیئات بیشتر از طراحی شما داشته باشیم ولی تا همین جاش هم
شما یک اشیا زیر را دارید.
مشتری
کالا
انبار
حالا ارتباط و جزییات اینها نیاز هست

az.heidarzadeh
پنج شنبه 24 آذر 1390, 13:24 عصر
خب من واسه راحتی کار خودم اونجوری نامگذاری کردم سمت کد از پیشوند فیلدام میفهمم باید از چه نوعی تعریفشون کنم و یا موقع select گرفتن برام کاملا مفهومه که دارم از جدولم select میگیرم یا مثلا view ، اینم بقیه جدولام و ارتباطاتشون ممنون بابت راهنمایی هاتون...
79231