ورود

View Full Version : مشکل در ویرایش با TDataSet



mortezakiaee
پنج شنبه 20 تیر 1387, 11:52 صبح
من از sql 2000 برای بانک استفاده می کنم. با یه adoconnection به برنامه وصلش می کنم. برای هرکدوم از جدول ها یه adotable تعریف می کنم. برای ویرایش هم از edit --> setfields --> post استفاده میکنم
تا اینجا مشکلی نیست. ولی وقتی دارم یه کلید اصلی رو ویرایش می کنم یه ردیف تازه ایجاد می کنه. با sql profiler تست کردم. گاهی دستور insert into میده گاهی update در هر حالت بازم رکورد جدید تولید می شه. در صورتی که اگه دستور sql برای update با یه adoquery بدم درست عمل میکنه.
یه مورد دیگه اینه که trigger هام اجرا نمیشن

SYNDROME
پنج شنبه 20 تیر 1387, 20:34 عصر
من از sql 2000 برای بانک استفاده می کنم. با یه adoconnection به برنامه وصلش می کنم. برای هرکدوم از جدول ها یه adotable تعریف می کنم. برای ویرایش هم از edit --> setfields --> post استفاده میکنم
تا اینجا مشکلی نیست. ولی وقتی دارم یه کلید اصلی رو ویرایش می کنم یه ردیف تازه ایجاد می کنه. با sql profiler تست کردم. گاهی دستور insert into میده گاهی update در هر حالت بازم رکورد جدید تولید می شه. در صورتی که اگه دستور sql برای update با یه adoquery بدم درست عمل میکنه.
یه مورد دیگه اینه که trigger هام اجرا نمیشن
در خود جدول SQL به صورت دستی این عمل را انجام دهید و ببنید درست کار می کند؟
اگر مشکلی داشت اول Trigger ها را پاک کنید و سپس دوباره عمل فوق را انجام دهید.
دستوراتی را هم که استفاده می کنید را در اینجا قرار دهید.
موفق باشید

mortezakiaee
شنبه 22 تیر 1387, 11:58 صبح
در خود جدول SQL به صورت دستی این عمل را انجام دهید و ببنید درست کار می کند؟
اگر مشکلی داشت اول Trigger ها را پاک کنید و سپس دوباره عمل فوق را انجام دهید.
دستوراتی را هم که استفاده می کنید را در اینجا قرار دهید.
موفق باشید
هم در enterprise manager و هم در query analyzer و حتی در خود برنامه( اگه از ADOQuery) استفاده کنم درست کار می کنه. ممکنه به جداول detail یا این که روی این رکورد فیلتر شده ربط داشه باشه؟
دستورات هم دقیقا اینه


function UpdateTable(Ado:TDataSet;NewValues:array of TVarRec):Boolean;
begin
try
ado.Edit;
Ado.SetFields(NewValues);
Ado.Post;
Result:=True;
Except
Ado.Cancel;
Result:=False; end;
end;

mortezakiaee
یک شنبه 23 تیر 1387, 10:45 صبح
اساتید محترم نظری ندارن؟؟

Hsimple11
یک شنبه 23 تیر 1387, 12:01 عصر
دستور دیگری را برای مقدار دادن به فیلدهایتان بجز SetFields امتحان کنید ببینید مشکل حل میشود؟

mortezakiaee
یک شنبه 23 تیر 1387, 17:38 عصر
یعنی می فرمایید از filedbyname.value و دستورات مشابه استفاده کنم؟ من جداولی با بیش از 20 ستون دارم. کد یکم طولانی میشه.
مشکل دیگه این که query که دلفی execute می کنه توی where clause به جای کلید از تمام اطلاعات جدول استفاده می کنه. روش همینه یا تعاریف من ایراد داره؟

vcldeveloper
یک شنبه 23 تیر 1387, 18:16 عصر
query که دلفی execute می کنه توی where clause به جای کلید از تمام اطلاعات جدول استفاده می کنه. روش همینه یا تعاریف من ایراد داره؟
برای رویداد OnBeforePost اون Dataset همچین کدی بنویسید:

TCustomAdoDataSet(DataSet).Properties['Update Criteria'].value := adCriteriaKey; // = 0

mortezakiaee
یک شنبه 23 تیر 1387, 19:25 عصر
برادر کشاورز کد شما رو مجبور شدم به صورت زیر استفاده کنم


var v:OleVariant;
begin
v:= 'adCriteriaKey';
TCustomAdoDataSet(DataSet).Properties['Update Criteria'].value := v;
end;


که نتیجش این بود:

EOleException: Application uses a value of wrong type of for the current operation

یه توضیح من فقط تونستم از locktype:ltOptimistic و cursortype:ctStatic استفاده کنم. بقیه رو میگه provider ساپورت نمیکنه.
provider:SQLOLEDB

vcldeveloper
دوشنبه 24 تیر 1387, 04:04 صبح
برادر کشاورز کد شما رو مجبور شدم به صورت زیر استفاده کنم
لزومی نداشت اون کار را بکنید؛ adCriteriaKey یک ثابت عددی با مقدار صفر هست (اگر دقت می کردید، جلوی آن عدد صفر را بصورت کامنت نوشته بودم)، نه یک ثابت رشته ایی!
در هر حال، این ثابت در یونیت ADOInt تعریف شده.


من فقط تونستم از locktype:ltOptimistic و cursortype:ctStatic استفاده کنم. بقیه رو میگه provider ساپورت نمیکنه.
provider:SQLOLEDB

MS SQL Server از هر سه نوع LockType پشتیبانی میکنه، برای CursorType هم در صورتی که CursorLocation برابر UseServer باشه، حداقل از Keyset پشتیبانی میکنه.
بررسی کنید که در ترکیب CursorLocation و CursorType اشتباه نکرده باشید (مثلا KeySet فقط با UseServer کار میکنه)، و همچنین بررسی کنید که از Provider درستی استفاده می کنید. Providerایی که تمام امکانات MS SQL Server را ارائه میکنه، Microsoft OLE DB Provider for SQL Server هست، مثلا SQL Server Native Client همه امکانات MS SQL Server 2005 را ارائه نمیکنه.

mortezakiaee
دوشنبه 24 تیر 1387, 12:34 عصر
با تشکر از راهنمایی شما. اما هنوزم بجای update برای ستون کلید insert into رو post می کنه در مورد ترکیب CursorType و CursorLocation و تنظیمات دیگر چیز زیادی نمی دونم. از جستجو در سایت و راهنمای دلفی هم نتیجه درستی نگرفتم. Provider هم برای SQL Server 2000 از Microsoft OLE DB Provider for SQL Server استفاده می کنم. اگه ممکنه بیشتر راهنمایی کنین

sql_qassem
دوشنبه 24 تیر 1387, 18:02 عصر
برای بقیه جداولت که مشکلی نداری؟

sql_qassem
دوشنبه 24 تیر 1387, 18:03 عصر
اگه کلیدت اتوماتیک نباشه و در جداول دیگه مشکلی نداشته باشی . امکان داره با حذف dataset و دوباره ایجاد کردن اون مشکل حل بشه.

mortezakiaee
دوشنبه 24 تیر 1387, 18:10 عصر
اگه کلیدت اتوماتیک نباشه و در جداول دیگه مشکلی نداشته باشی
منظورتون از اتوماتیک رو متوجه نمی شم.
در جداول دیگه هم ایراد دارم فقط موقع ویرایش کلید اصلی

vcldeveloper
سه شنبه 25 تیر 1387, 01:22 صبح
اما هنوزم بجای update برای ستون کلید insert into رو post می کنه
مطلب فوق در جواب این بخش از صحبت های شما بود:

query که دلفی execute می کنه توی where clause به جای کلید از تمام اطلاعات جدول استفاده می کنه.


در مورد ترکیب CursorType و CursorLocation و تنظیمات دیگر چیز زیادی نمی دونم. از جستجو در سایت و راهنمای دلفی هم نتیجه درستی نگرفتم.
تا جایی که یادم هست، در همین سایت درباره اش بحث کردیم. در هر حال، شما می تونید در Help مربوط به SQL Server درباره انواع Cursorها تحقیق کنید. این باعث میشه که با کارکرد انواع Cursorهایی که برای CursorType وجود دارند و در سمت Server در دسترس هستند آشنا بشید. در سمت کلاینت فقط یک Cursor قابل دسترس هست، آن هم Static هست؛ نتیجه آن هم لود شدن تمام رکوردهای Dataset درخواست در حافظه کلاینت است.

mortezakiaee
سه شنبه 25 تیر 1387, 12:05 عصر
شما می تونید در Help مربوط به SQL Server درباره انواع Cursorها تحقیق کنید. این باعث میشه که با کارکرد انواع Cursorهایی که برای CursorType وجود دارند و در سمت Server در دسترس هستند آشنا بشید.
ممنون حتما می خونم. برای این مشکل نظری ندارین؟

sql_qassem
سه شنبه 01 مرداد 1387, 10:02 صبح
منظورتون از اتوماتیک رو متوجه نمی شم.
در جداول دیگه هم ایراد دارم فقط موقع ویرایش کلید اصلی
اگر كه فيلد شما auto increamnet باشه = يعني فيلد عددي كه به صورت خودكار مقدار دهي مي شه و معمولا يكي يكي مقدارش اضافه مي شه.