PDA

View Full Version : پیغام key violation در ClientDataSet



az-navaei
شنبه 04 خرداد 1387, 12:12 عصر
سلام
من یک AdoTable را به ClientDataSet وصل کردم. بانکم یک فیلد از نوع Identity (AutoNumber) داره اگر این فیلد را به فیلدهای AdoTable و ClientDataSet اضافه کنم موقع اجرا بعد از درج 2 یا 3 رکورد پیغام key violation میده. اگر توضیح بیشتری هم لازمه بگین.
ممنون

az-navaei
شنبه 04 خرداد 1387, 17:27 عصر
نه انگار خبری از جواب نیست.
باز توضیح می دم.
من برای بانک های Master و Details از ClientDataSet استفاده کرده ام وقتی برای Details از AdoQuery استفاده می کنم و از طریق DataSetProvider آنرا به ClientDataSet وصل میکنم مشکلی پیش نمیاد اما وقتی به جای AdoQuery از AdoTable استفاده می کنم به دلیل داشتن فیلد عددی خودکار (autoNumber) بعد از وارد کردن 2 رکورد پیغام Key Violation می ده اگر کسی می تونه جوابمو بده ممنون می شم برنامه ام دست مشتریه و .....

delphiprog3000
یک شنبه 05 خرداد 1387, 09:27 صبح
با سلام.

البته شنیده بودم که با Adodataset نمیشه.
شما در قسمت providers در خاصیت updatemode پرووایدرتان به Wherekeyonly تبدیل کنید.

اگر جداولتان primary key داشته باشند.

امیدوارم مشکلتان حل شود...................

az-navaei
دوشنبه 06 خرداد 1387, 10:20 صبح
ممنونم ولی متاسفانه مشکل حل نشد.

vcldeveloper
دوشنبه 06 خرداد 1387, 19:47 عصر
می تونید یک Sample از کد مشکل دار و یک نمونه از فایل بانک را اینجا بزارید؟

az-navaei
سه شنبه 07 خرداد 1387, 13:59 عصر
آقای کشاورز ضمن تشکراز شما، 2 نمونه مثال را در زیر قراردادم و توضیحات داخل هردو وجود دارد.مثال دوم را هم حتما ببینید.

az-navaei
یک شنبه 12 خرداد 1387, 09:00 صبح
كسي مثال من را نديده كه بتونه جوابمو بده؟؟؟؟
من خيلي با ClientDataSet آشنايي ندارم اگر جايي را اشتباه نوشتم يا اصلا ننوشتم ممنون ميشم بهم بگين.

vcldeveloper
یک شنبه 12 خرداد 1387, 19:55 عصر
ببخشید، هفته پیش زمانی که می خواستم فایل را دانلود کنم کاری پیش آمد و بعد از آن هم یادم رفت که فایل را دانلود کنم.

مثال را دیدم، ولی متوجه نشدم که چرا از ClientDatset به این شکل استفاده کردید. اصلا نقش ClientDataset این وسط چی هست؟ چه نیازی به ClientDataset بود؟ الان شما ترکیبی از ClientDataset و AdoTable را استفاده کردید که من متوجه نمیشم چرا همچین کاری کردید.
علت خطایی که دریافت می کنید مشخص هست، شما از طرفی فیلد Id را بصورت AutoNumber تعریف کردید و به همین دلیل در ClientDataset بهش مقدار نمیدید، این باعث میشه که در هنگام Post چون هنوز داده ها به سرور ارسال نشدند و مقداری برای ID تعیین نشده، مقدار Null برای ID در نظر گرفته بشه. وقتی رکورد دوم را ایجاد می کنید، همین وضعیت تکرار میشه، یعنی باز هم برای ID مقدار Null در نظر گرفته میشه. از آنجایی که فیلد ID شما نمی تونه دو مقدار مشابه هم داشته باشه، پیغام خطایی Key Violation دریافت می کنید.

برای کار شما اصلا نیازی به ClientDataset نبود، کافی بود رابطه Master\Details را بین AdoQuery (که به Daneshamoozan وصل هست) و AdoTable (که به جدول Duroos وصل هست) برقرار کنید و می بینید که مقدار فیلد ID بطور خودکار برای شما پر میشه.
باید مشخص کنید که چه ویژگی ای از ClientDataset را نیاز داشتید که خواستید از آن برای این کار استفاده کنید. داده های شما نیاز دارند که بعد از هر رکورد جدید، مقدار فیلد ID را از سرور دریافت کنند، ولی ClientDataset عملا تا زمانی که ApplyUpdate فراخوانی نشه هیچ ارتباطی با سرور برقرار نمیکنه!

az-navaei
دوشنبه 20 خرداد 1387, 18:56 عصر
آقاي كشاورز از توجهتون خيلي ممنونم.
من از ‍ClientDatset زماني كه بانك Master و Details با هم اضافه و اصلاح مي شوند استفاده مي كنم مثل فاكتور فروش كه فرضا نام مشتري و قيمت كل در بانك Masterاضافه مي شود و بدون اينكه post شود رديف هاي كالاهاي فروش رفته در بانك Details اضافه مي شوند و در آخر بانك Master post مي شود. در اين موارد اگر موقع اصلاح، كاربر تغييراتي در هر دو بانك ايجاد كند ولي در آخر عمليات را لغو كند ركورد هاي details ذخيره شده است كه لغو برايش بي تاثير است ولي ركورد Master لغو مي شود و اين مغايرت به وجود مي آورد به همين دليل من از ‍ClientDatset استفاده كردم تا در مواقعي كه كاربر لغو مي كند به طور كل ‍ClientDatset را ApplyUpdate نكنم.
و در مورد حل اين مشكل كه بعداز بسته و باز شدن ClienDataSet اطلاعات قبلي نمايش داده مي شود بايد قبلش adoTable را هم Reguery كنم.
شما راه ديگه اي براي حل اين مشكل ميدونين؟