ورود

View Full Version : سوال: برنامه فروشگاه با بانک sql



10987654321
شنبه 10 دی 1390, 19:39 عصر
سلام من یه برنامه فروشکاه باید بنویسم ولی الان اشکال دارم خواهش میکنم اگر کمکم کنید
از Adoconection , adotable است مشکل اولم این هست که
1.برنامه دکمه save اینه که بعد از چک کردن dbedit ها datamadoule1.tacala.post; ولی وقتی 2 بار زده میشه error میده که data set not in edit or insert mode;
2.وقتی از dblockupcombobox استفاده میکنم Erroe میده که circular database arenot alowed.
3.یه برنامه سرچ بر حسب کلید نوشتم با locate اما erorr میده که array variant in to type string convert varient of typecould not
4 و یکی دیگه اینکه میخواهم قبل اینکه از صفحه خارج بشم بررسی کنه که اگر فیلدی عوض شده اول ان را save کنه بعد خارج بشه

tazarvmmr
یک شنبه 11 دی 1390, 07:57 صبح
یه راه ساده داره که از دو بار کلیک جلوگیری میکنه:


Procedure TmyForm.btnSaveClick(Sender: Tobject)
Begin
btnSave.Enabled := false;
...
...
save proccess commands
...
...
btnSave.Enabled := true;
End;


برای سوال دوم و سوم باید کدی که نوشتید رو بزارید
برای سوال چهارم بهتره از یک flag استفاده کنید و وقتی فیلدی تغییر کرد flag رو true کنین و قبل از بستن فرم چک کنین اگر flag = true بود تابع save رو فراخوانی کنین

10987654321
یک شنبه 11 دی 1390, 10:26 صبح
این کد سرچ هست. if dm1.TaCala.Locate('code_cala',vararrayof([strtoint(edit1.Text)]),[])=false
then showmessage('hgfd');
برای قسمت 2 اصلا تنظیمات رو وقتی میخواهم تنظیمات رو set کنم اون erorr میده.
راه چهارم یعنی اول یه Flag تعریف کنم بعد بیام dbedit ها رو چک کنم اما چجوری نمیدونم چه جوری چک کنم که یعنی برنامه ای که برای دوبار کلیک گفتین رو توی save بنویسم
یعنی قبل از این
f (DBEdit1.Text='')then ShowMessage('áØÝÇ ÊãÇã ÝíáÏåÇ ÑÇ Ñ ˜äíÏ')
else dm1.TaCala.Post;
تروخدا کمکم کنید برای فردا میخوام اما خیلی وارد نیستم راستش 2 یا 3 برنامه فقط با دلفی نوشتم تازه اینم پروژه دانشگاهه چون که من برنامم کامل از بین رفت و اینم مجبور شدم توی 1 هفته بنویسم

tazarvmmr
یک شنبه 11 دی 1390, 11:51 صبح
عزیز جان چرا پس گذاشتی دقیقه 90 تازه تاپیک زدی؟!
تنها کاری که از دستم بر میاد اینه:

اولا که متوجه شدم شما از dbEdit استفاده کردی، وقتی از dbEdit استفاده میکنی یعنی کاربر داره مستقیم روی دیتابیس تغییر میده، اولا بهتره شما از Edit استفاده کنی! وقتی کاربر میخواد مشاهده کنه یا ویرایش کنه EditBox ها رو از روی دیتابیس پر کنی. برای پر کردن EditBox ها هم میتونی بعد از locate به ردیف مورد نظر با دستور مثلا EditBoxName.Text := myAdoTable.FieldValues['myFieldName']; مقدار دهی کنید.
با این توضیح بریم سراغ سوالاتت:

سوال اول:
کاربر شما وقتی روی کلید Save کلیک میکنه اولا که شما حتما میدونید که الان داره اطلاعات موجود رو ویرایش میکنه یا داره ردیف جدید اضافه میکنه! پس حتما جدولت رو در حالت Edit یا Insert قرار میدی. البته با توجه یه مشکلی که مطرح کردید فرض بر اینه که شما عملیات Insert و Update رو با Stored Procedure انجام
ندادید. یعنی مثلا دستوراتی شبیه به این رو استفاده کردید:
برای درج:

myTable.Insert;
myTable.FieldValues['myField1'] := EditBoxName.text;
myTable.Post;

برای ویرایش:

myTable.Edit;
myTable.FieldValues['myField1'] := EditBoxName.text;
myTable.Post;

این دستورات رو زمانی اجرا میکنید که کلید Save کلیک شده، یعنی رویداد OnClick کلید Save اصطلاحا Fire شده، قبل از خط اول این دستور رو بزارید:

btnSave.Enabled := false

در این صورت قبل از اینکه کار ذخیره سازی شروع بشه کلید Save از دسترس کاربر خارج میشه و بعد از خط آخر هم با دستور

btnSave.Enabled := true;

دوباره کلید رو در اختیار کاربر بزارید

در مورد سوال دومتون تنظیمات DbLookupComboBox رو اشتباه انجام دادید! شما کافیه از Property های

ListSource
KeyField
ListField

استفاده کنید و DataSource و DataField رو خالی بزارید.

در مورد سوال سوم هم دستورتون رو به این شکل تغییر بدید:


var
CodeCala: integer;
begin
....
CodeCala := StrToInt(Edit1.Text);
if dm1.TaCala.Locate('code_cala',CodeCala,[]) = false then
ShowMessage('Not found!!!')
else
begin
....
end;
end;


در مورد سوال آخر هم شما توی هر کامپوننتی که کاربر میتونه تغییری در محتواش بده حتما یک رویدادی پیدا میکنید که با ایجاد تغییر Fire بشه مثلا در مورد EditBox رویداد OnChange زمانی فراخوانی میشه که متن TextBox تغییر میکنه، یک متغیر Global از نوع Boolean توی فرمتون بزارین و در رویداد OnShow فرمتون مقدارشو false تعیین کنین، حالا زمانی که کاربر یک متنی رو تغییر داد مثلا متن موجود در Edit1 رو تغییر داد شما توی OnChange مقدار این متغیر رو به true تغییر بده، زمانی که عمل Save انجام شد دوباره مقدار متغیر رو به false تبدیل کن به این صورت در همه حالات اکر مقدار متغیر false باشه یعنی اطلاعات تغییری نداشته و اگر true باشه یعنی اطلاعات تغییر پیدا کرده، کافیه زمانی که کاربر کلید Close رو کلیک میکنه شما یک شرط بزاری مشابه این:
فرض میکنیم اسم این متغیر رو گذاشتیم changeFlag

var
changeFlag: boolean;
begin
if changeFlag then
if MessageDlg('Do you want to save the changes?', [mbYes, mbNo], mtWarning, 0) = mrYes then
Save;

Close
end;




برای احتیاط عرض میکنم تابع MessageDlg رو خواستی استفاده کنی باید یونیت Dialogs رو Use کرده باشی

موفق باشی

10987654321
دوشنبه 12 دی 1390, 11:54 صبح
مرسی بخاطر کمکتون