PDA

View Full Version : مشکل در دستور sum



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

qry1.sql.Clear;
qry1.sql.add('select sum(rezerv) as sum1 from table1');
qry1.Open;
edt2.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);

Mahmood_M
چهارشنبه 10 تیر 1394, 22:20 عصر
احتمالا تغییرات Post نشده
چطور رکوردهاتون رو ثبت می کنید ؟

idehrayan
چهارشنبه 10 تیر 1394, 22:44 عصر
از توجه شما متشکرم

qry1.Post;

یوسف زالی
پنج شنبه 11 تیر 1394, 01:50 صبح
Qry رو کجا close کردید؟

idehrayan
پنج شنبه 11 تیر 1394, 11:13 صبح
بخاطر توجه شما متشکرم

فقط هنگام فرم لود بعد از انجام محاسبات sum کوری رو بستم (البته این قسمت به درستی کار میکنه)
جهت تست اون قطعه کد رو هم غیر فعال کردم هیچ تغییری نکرد

یوسف زالی
پنج شنبه 11 تیر 1394, 14:25 عصر
نمونه کد کامل رو بگذارید

idehrayan
پنج شنبه 11 تیر 1394, 18:10 عصر
این کد هنگام شروع برنامه مجموع 20 فیلد رو بصورت جداگانه بدست میاره

procedure TForm1.FormCreate(Sender: TObject);
begin
qry1.sql.Clear;
qry1.sql.add('select sum(rezerv_d) as sum1 from table1');
qry1.Open;
edt2.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);

qry1.sql.Clear;
qry1.sql.add('select sum(rezerv_p) as sum1 from table1');
qry1.Open;
edt3.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);

qry1.sql.Clear;
qry1.sql.add('select sum(tovzie_d) as sum1 from table1');
qry1.Open;
edt4.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);
.
.
.
qry1.sql.Clear;
qry1.sql.add('select sum(Forosh) as sum1 from table1');
qry1.Open;
edt21.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);
qry1.Close;

end;
تا اینجا مشکلی نیست ولی کد پائین که موقع ذخیره میخوام اجراء بشه همیشه رکورد اخر رو محاسبه نمیکنه

procedure TForm1.BitBtn2Click(Sender: TObject);
begin

try
qry1.Post;
except
end;

qry1.sql.Clear;
qry1.sql.add('select sum(rezerv_d) as sum1 from table1');
qry1.Open;
edt2.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);

qry1.sql.Clear;
qry1.sql.add('select sum(rezerv_p) as sum1 from table1');
qry1.Open;
edt3.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);

qry1.sql.Clear;
qry1.sql.add('select sum(tovzie_d) as sum1 from table1');
qry1.Open;
edt4.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);
.
.
.
qry1.sql.Clear;
qry1.sql.add('select sum(Forosh) as sum1 from table1');
qry1.Open;
edt21.Text :=IntToStr(qry1.fieldbyname('sum1').asinteger);
qry1.Close;

end;



من فکر میکنم باید قبل از انجام sum جدول یه جوری رفرش بشه

pezhvakco
پنج شنبه 11 تیر 1394, 18:32 عصر
یک پیشنهاد بی ربط به پرسش تون : اون قطعه کد اول رو از FormCreate برداشته و در FormShow بنویسید .

و حالا پرسش :
این qry1 که دستور qry1.post رو براش اجرا می کنید به کجا وصل است و چه دستورات SQL را داره .
شاید دستورات شما در حافظه موقت ذخیره میشه و به پایگاه داده فرستاده نمیشه.
اگه qry1 شما از ابزار ADO است با چه ساختاری تنظیم شده .
پیشنهاد من کار با ADODataSet است به جای qry .
بگارگیری یک شی qry برای همه کارها (ذخیره و خواندن داده ها) در پایگاه داده زیاد خوب نیست.

یه پیشنهاد دیگه : این روش کدنویسی شما برای ذخیره و دریافت داده از پایگاه داده درست نیست و بهتره بر اینه دستورات پایگاه داده به خودش سپرده شود
=> با SP ها کار کنید تا مدیریت درست تر و بهتری داشته باشید و از خطا های همیشگی که در این روش شما پیش میاد دوری کنید .

idehrayan
پنج شنبه 11 تیر 1394, 22:13 عصر
از شما متشکرم
من از یه دیتا سورس و ادوکوری استفاده کردم که به یه بانک اکسس متصله
متاسفانه در مورد اینکه دستورات در حافظه موقت ذخیره شده یا نه و اینکه از چه ساختاری استفاده شده اطلاع کافی ندارم
در مورد sp ها باید یکم جستجو کنم تابحال ازشون استفاده نکردم

*** چقدر خوب میشد یکی از اساتید نحوه درست ارتباط و استفاده از مجموعه اشیاء بانک اطلاعاتی رو با مثال توضیح بدن

pezhvakco
شنبه 13 تیر 1394, 10:17 صبح
من از یه دیتا سورس و ادوکوری استفاده کردم
با AdoDataSet و AdoCommand کار کنید بهتر است
برای خواندن و نوشتن با دو شی جداگانه کار کنید
تنظیماتی مانند LockType را بررسی کنید .

بانک اکسس متصله

در مورد sp ها باید یکم جستجو کنم
اگه پایگاه داده Access است که SP نداره و میشه با Query های اون کار کرد .

نحوه درست ارتباط و استفاده از مجموعه اشیاء بانک اطلاعاتی رو با مثال توضیح بدن
در همین سایت انجام دادند .

benyaminrahimi
شنبه 13 تیر 1394, 14:33 عصر
قبل از open گوئری یه با دی اکتیو کنید به جای متد open هم میتونید از active استفاده کنید
if (qry1.State in [dsedit, dsinsert]) then
qry1.post;

qry1.active:=false
qry1.sql.Clear;
qry1.sql.add('select sum(Forosh) as sum1 from table1');
qry1.active:=true;