ورود

View Full Version : سوال: ارور به هنگام استفاده از حلقه جهت درست کردن ردیف انبار



hasandrw
پنج شنبه 13 مرداد 1390, 18:06 عصر
با سلام:
از DB اکسس استفاده می کنم و فیلدها ی Radif و Name و غیره دارم.
من می خوام برای کالاهای انبار ردیف درست کنم.با کدهای زیر این کار رو انجام داده ام اما ولی خطا میده.
i:=1;
ADOQuery1.First;
for i := 1 to ADOQuery1.RecordCount do begin
ADOQuery1.Edit;
ADOQuery1.FieldValues['radif']:=i;
ADOQuery1.Post;
ADOQuery1.Next;
end;
البته زمانی خطا میده که در ردیف رکورد تکراری وجود داشته باشه.
این هم خطا ها شه.
به نظر شما راحل چیه.
73280

یوسف زالی
پنج شنبه 13 مرداد 1390, 18:47 عصر
سلام.

برای این کار راه خیلی ساده تری وجود داره:
یک فیلد عددی از نوع calculated به ADO خودتون add کنید.
در رویداد oncalcfiilds شی ADO بنویسید:

ADO.FieldValues['ROW'] := ADO.RecordSet.AbsolutePosition;

علت خطا دادن راه شما رو نمی دونم.
اما معمولا برای این جور کارا (منظورم از اول تا آخرین ردیف دیتاست هست) از while استفاده می کنند:

ADO.first;
while not ADO.eof do
begin
.
your code
.
ADO.next;
end

امیدوارم جواب سوالتون رو گرفته باشید.

hasandrw
جمعه 14 مرداد 1390, 14:35 عصر
ولی منظورتان از اینکه یک فیلد عددی calculated رو به ADO اضافه کنم نمی دونم.اگه میشه بشتر راهنمایی کنین.بعش هم تو حلقه While چجوری بهش بگم عدد رو از اولین رکوردبه ترتیب اضافه کن؟

یوسف زالی
جمعه 14 مرداد 1390, 18:21 عصر
لازم نیست که دیگه تو حلقه بهش چیزی بگید.
دو بار کلیک روی (ADODataSet (ADOTable, ADOStoredProc or ADOQuery کنید و از new field یک فیلد اضافه کنید.
در رویداد OnClacFields هم کد مربوطه رو بنویسید ردیف شما درست خواهد شد.

hasandrw
یک شنبه 16 مرداد 1390, 15:47 عصر
ممنونم مشکلم حل شد ولی وقتی می خوام اطلاعات رو به جدولم اضافه کنم خطای (Range chek error) میده!
به نظر شما راحل چیه؟

یوسف زالی
یک شنبه 16 مرداد 1390, 17:06 عصر
باید کد رو ببینم عزیز جان

hasandrw
یک شنبه 16 مرداد 1390, 17:36 عصر
frmTelBook.ADOQuery1.Insert;
frmTelBook.ADOQuery1.Edit;
frmTelBook.ADOQuery1.FieldValues['name']:=Edit1.Text;
frmTelBook.ADOQuery1.FieldValues['lastname']:=Edit2.Text;
frmTelBook.ADOQuery1.Post;
فیلدی که می خوام ردیف واسش درست بشه که فکر دیگه نیاز نباشه اینجا اضافه اش کن!

یوسف زالی
یک شنبه 16 مرداد 1390, 18:49 عصر
ممنونم مشکلم حل شد

عزیزم از دکمه استفاده کن.



اینجا اضافه اش کن!

الان این دستوره؟؟


دوست من از همون روش که گفتم استفاده کنید.
ارور شما ربطی به اون فیلد نداره.
اون فیلد خودش مقدار می گیره.
راستی insert چیه edit چیه؟
یکیش دیگه.

Delphi 2010
سه شنبه 18 مرداد 1390, 18:40 عصر
طبق گفته دوستمون yousijoon و منطقی ترین و ساده ترین روش استفاده از While هستش




I := 0;
frmTelBook.First;
While Not frmTelBool.AdoQuery1.Eof Then
Begin
frmTelBook.AdoQuery.Edit;
(frmTelBook.AdoQuery.FieldByName('Field').asstring := IntToStr(I;
frmAdoQuery.Post;
I := I + 1;
End;







تشکر یادتون نره

vcldeveloper
چهارشنبه 19 مرداد 1390, 01:06 صبح
البته زمانی خطا میده که در ردیف رکورد تکراری وجود داشته باشه.
فیلدی که فیلد کلید باشه، نمیتونه مقادیر تکراری داشته باشه، پس اگر در یک رکورد برای اون فیلد عددی ثبت شده باشه، رکورد دیگه نمیتونه از همون عدد برای اون فیلد استفاده کنه.


من می خوام برای کالاهای انبار ردیف درست کنم.با کدهای زیر این کار رو انجام داده ام
شماره ردیف ارزش ایجاد فیلد و نگهداری در بانک اطلاعاتی را نداره. این کاری هم که شما دارید انجام میدید فقط سربار اضافی برای بانک هست. در واقع دارید با هر تغییری در رکوردهای بانک، کل رکوردهای بانک را ویرایش می کنید که مثلا شماره ردیف شان درست باشه! شماره ردیف ارزش ثبت نداره، فقط ارزش نمایشی داره، به همین جهت، باید به جای تعیین یک فیلد ثابت در بانک اطلاعاتی تان، در داخل برنامه تان یک فیلد محاسباتی (Calculated) ایجاد کنید، و در رویداد OnCalculateField مربوط به آن دیتاست، به اون فیلد مقدار خصوصیت RecNo را اختصاص بدید. اینطوری برنامه شما یک فیلد ساده میسازه که در بانک هم ذخیره نمیشه، و فقط شماره ردیف رکوردهای برگشت داده شده از بانک را نمایش میده. اگر این شماره ردیف را صرفا برای گزارش گیری میخواید، حتی همون کار هم لازم نیست، اکثر ابزارهای گزارش گیری خودشان امکان اضافه کردن خودکار شماره ردیف را برای رکوردهای نمایش داده شده در گزارش دارند.

اون کد شما هم علاوه بر سرباری که در بالا بهش اشاره کردم، در محیط های چند کاربره ارزش نداره؛ چون در زمانی که یک کاربر داره با اون کد به رکوردهای شماره ردیف میده، یک کاربر دیگه ممکنه در حال ایجاد شماره ردیف یا به طور کلی، ویرایش رکوردها باشه؛ به این ترتیب بین عملیات چند کاربر تداخل بوجود میاد. پس اگر هم بر فرض قرار بود شماره ایی در بانک ثبت بشه (مثلا در مواقعی که نیاز به ایجاد ID برای هر رکورد هست)، این کار باید از طریق بانک یا یک سرور میانی (در معماری های چند لایه) صورت بگیره؛ مثلا از طریق اجرای یک Trigger در بانک، یا از طریق استفاده از فیلدهای Auto Incremental در بانک، و سایر روش های متناسب با معماری برنامه و بانک اطلاعاتی شما.

hasandrw
پنج شنبه 20 مرداد 1390, 16:39 عصر
آقای کشاورز وسایر دوستان متشکرم از همکاریتون
ولی این روش یک مشکل کوچیک هم داره.کنار شماره اولین رکورد یک علامت منفی هم قرار میده.
و زمانی که می خوام رکوردی رو حذف کنم این خطاها برام رخ میده .البته زمانی رخ میده که دوتا یا چند تا رکورد تکراری وجود داشته باشه و بخوام یکی از اون رکوردها رو حذف کنم.در صورتی که اون فیلد کلید هم نیست.
در ضمن از ADo Query استفاده می کنم.و تمام فیلدها رو به ADo اضافه کردم.
اول خطایی که در تاپیک شماره یک همن سوال برام ظاهر میشه بعدش هم اگه روی دکمه Continue کلیک کنم این خطا میده:
Key column information is insufficient or incorrect.Too many rows were affected by update.
به نظر شما مشکل از چیه.

یوسف زالی
جمعه 21 مرداد 1390, 00:19 صبح
1- در ردیف اول برای استفاده از recno هست.
جاش اگر کد بنده رو بگذارید مشکل مرتفع میشه.

hasandrw
جمعه 21 مرداد 1390, 03:08 صبح
روش شما که درست ولی مشکل خطاها از کجاست؟

یوسف زالی
جمعه 21 مرداد 1390, 04:17 صبح
این خطا آخریه به دلیل ران کردن یک کوئری update هست که بیش از یک ردیف داره update میکنه.
هربار فقط یک ردیف..

hasandrw
جمعه 21 مرداد 1390, 13:14 عصر
در ضمن اگه تمام فیلدهام رو به ADo Query اضافه(َAdd) نکنم هم این خطاها برام رخ نمیده.ولی به دلیل فیلدردیف(ROW) که باید Queryاضافه کنم مجبورم تمام فیلدها رو اضافه کنم.
به نظز شما بایدچکار کنم که مشکلم حل بشه؟

یوسف زالی
جمعه 21 مرداد 1390, 19:09 عصر
دوست من این بحثی نیست که این قدر سخت باشه.
اگر در ADOQuery فیلدها رو Add کرده باشید و یک فیلد ردیف هم اضافه کرده باشید نباید کار دیگه ای کنید.
ببینید فیلد های خودتون در ADOQuery اضافه شدند ؟
دوبار کلیک روی ADOQuery..

hasandrw
جمعه 21 مرداد 1390, 22:18 عصر
فیلدها اضافه شدن مهندس
ولی نمی دونم.اگه میشه شما خودتون واسه رکوردهای تکراری در صورتی که فیلد کلید هم نباشه یک تستی کنید شاید مشکل رو راحتتر بشه حل کرد.
چون خیلی ضروری هستش.
متشکرم

hasandrw
جمعه 21 مرداد 1390, 22:26 عصر
در ضمن کدی که برای حذف رکورد استفاده می کنم هم این هستش:
ADOQuery1.Delete;
فقط واسه رکورهایی که مقدار تکرار داره از خطا میگیره برای غیر تکراری هم خطا نمی گیره
اگه میشه مشکلم رو حل کن