PDA

View Full Version : سوال: ابدیت کردن جدولی با دو کلید اصلی



saeeedft
سه شنبه 10 آذر 1388, 00:32 صبح
با سلام، گاهی اوقات بعضی از چیزا در ظاهر خیلی ساده به نظر میاد، اما وقتی در عمل به کار گرفته میبشن میبینیم همچین ساده هم نیست، من یه جدول دارم که دو فیلد اصلی داره، حالا برا ابدیت کردن اون توی شرط where موندم چی بذارم، دو تا کلید رو هم and کردم و هم or اما رکوردها که 2 تا میشه برنامه error میده، ممنون میشم اساتید راهنمایی کنند

محمد سلیم آبادی
سه شنبه 10 آذر 1388, 00:53 صبح
سلام دوست عزیز،
امکان داره کدی که استفاده می کنین را ارسال کرده و کمی بیشتر توضیح بدین. در ضمن

n, tdgn ;gdnd v, هم مفهوم نیست

saeeedft
سه شنبه 10 آذر 1388, 09:08 صبح
اینم کدم هست :

ALTER PROCEDURE Updatehoghogh
@xcodekaregar int,
@xtarikhdaryaft datetime,
@xrozkarkard smallint,
@xdaryaftmoney int
AS

UPDATE [thoghogh] SET [xcodekaregar]=@xcodekaregar, [xtarikhdaryaft]=@xtarikhdaryaft, [xrozkarkard]=@xrozkarkard, [xdaryaftmoney]=@xdaryaftmoney where thoghogh.xcodekaregar=@xcodekaregar or thoghogh.xtarikhdaryaft=@xtarikhdaryaft

دو فیلد xcodekaregar و .xtarikhdaryaft فیلدهایی هستند که کلید اصلی اند

حسین شهریاری
سه شنبه 10 آذر 1388, 09:33 صبح
با سلام کسب اجازه از کلیه اساتید

دوست گرامی اگه دو فیلد فوق کلید ترکیبی باشند دیگه نباید مشکلی باشه.چون به ازای ترکیبی از این دو شما مکان یک رکورد را بدست میارین.پیشنهاد میکنم قبل از انجام این کار با روال یکبار همین کار را به صورت ثابت در کوئری انالایزر بنویسید و ببینید که آیا انجام میشه یا نه؟

saeeedft
سه شنبه 10 آذر 1388, 09:49 صبح
ممنون، ببینید من یه فرم دارم که داخل اون یکی از دو کلید اصلی رو نشون میده(تاریخ رو) و یکی دیگه رو از یه صفحه دیگه میگیره(از صفحه اطلاعات کارگران)، در دستور بالا ایا ایرادی هستش(چیزی زیادی نوشتم و یا کمک نوشتم؟)، حرف شما فکر کنم بهترین راه برا تست باشه، اما اگه طبق حرف شما اینجا با مقادیر ثابت درست جواب بده و در فرم هام که مقادیر متغییرن اگه اشتباه جواب بده یکم عجیبه، چون من مقادیر رو درست بهش نسبت میدم

حسین شهریاری
سه شنبه 10 آذر 1388, 10:10 صبح
نه مشکلی نیست فقط باید در انتساب مقادیر و ارسال آنها به روال دقت کنید.هر چند اگه مقادیر ارسالی شما متناسب و سازگار با ترکیب کلیدها نباشه نهایتش اینه که عمل Update انجام نمیشه چون هیچ رکوردی را مطابق شرط شما برای ویرایش پیدا نمیکنه و این یه امر طبیعی است.

موفق باشید

saeeedft
سه شنبه 10 آذر 1388, 10:13 صبح
اقا تو query analayzer هم تست کردم، این error رو میده

Must declare the variable '@xcodekaregar'

حسین شهریاری
سه شنبه 10 آذر 1388, 11:29 صبح
خوب مشخصه!!
داره میگه من متغیر یا پارامتر @xcodekaregar' را نمیشناسم،وباید تعریف بشه.
چک کنید ببینید کجا باید تعریفش میکردید که نکردین.

ضمنا دوست عزیز میشه بفرمایید که آیا از زبان برنامه نویسی خاصی استفاده میکنید یانه؟اسمش چیه؟
بفرمایید تا این مشکلا ببریم توی فاز برنامه نویسی کاربردی و توی اون لایه حلش کنیم.

محمد سلیم آبادی
سه شنبه 10 آذر 1388, 13:20 عصر
UPDATE [thoghogh] SET [xrozkarkard]=@xrozkarkard, [xdaryaftmoney]=@xdaryaftmoney where thoghogh.xcodekaregar=@xcodekaregar AND thoghogh.xtarikhdaryaft=@xtarikhdaryaft

در قسمت set نیازی نیست که مقادیر کلید را دوباره update کنید. و وقتی کلید ترکیبی است از عملگر AND استفاده می شه.

اگر از عملگر or استفاده کنید و کلید ها را نیز set کنید با این کار اگر عبارت update چند سطر را بروز کند با خطا مواجه خواهد شد. چرا؟ چون چند سطر نمی توانند دارای یک کلید تکراری باشند.

از طرفی اگر ستون های کلید از نوع Identity باشند اصلا قابلیت Update شدن را ندارن.

saeeedft
سه شنبه 10 آذر 1388, 22:47 عصر
دوستان فکر کنم کاری که من میخوام کنم از بیخ ایراد داره، ببینید من 4 تا فیلد دارم ، که 2 تاش کلید هستند، این فیلدها عبارتند از : کد کارگر وتاریخ دریافت حقوق(2 کلید) و روزهای کاری و دریافت حقوق، حالا من میخوام تغییرات رو رو 3 سه فیلد تاریخ دریافت حقوق و روزهای کاری و دریافت حقوق انجام بگیره،یعنی ( این سه فیلد تو قسمت set دستور ابدیت بیاد) و طبعا دو فیلد کد کارگر وتاریخ دریافت حقوق هم توی شرط باید باشه، اما در این صورت کل رکوردها ابدیت میشن که نادرسته، حالا طبق چیزایی که گفتم میشه دستور ابدیت برا این جدول نوشت، چه پیشنهادی دارید؟

saeeedft
چهارشنبه 11 آذر 1388, 22:48 عصر
دوستان کسی نبود جواب پست بالایی منو بده؟؟؟؟؟؟؟؟؟؟

محمد سلیم آبادی
پنج شنبه 12 آذر 1388, 02:21 صبح
ببینید چون می خواهین یکی از ستون های کلید را update کنید نیاز به یک پارامتر دیگری برای ارسال به procedure دارین. یک پارامتر برای مقدار فعلی یک پارامتر برای مقدار جدید.
اینو امتحان کنین:


ALTER PROCEDURE Updatehoghogh
@xtarikhdaryaft_New datetime,
@xcodekaregar int,
@xtarikhdaryaft datetime,
@xrozkarkard smallint,
@xdaryaftmoney int
AS

UPDATE [thoghogh]
SET [xtarikhdaryaft]=@xtarikhdaryaft_New,
[xrozkarkard]=@xrozkarkard,
[xdaryaftmoney]=@xdaryaftmoney
where xcodekaregar=@xcodekaregar
AND xtarikhdaryaft=@xtarikhdaryaft