PDA

View Full Version : سوال: برنامه یادآوری لیست کارها



amirkazem
دوشنبه 29 دی 1393, 23:19 عصر
باسلام ووقت بخیر
دوستان خیلی جستجوکردم مطلب مفیدی دررابطه سوالم پیدانکردم.لطفاًراهنمایی بفرمایید.
می خواهم دربرنامه ای دارم ودرفرم اصلی برنامه یک امکانی برای کاربریامدیرسیستم ایجادکنم که لیست کارهاویادآوری های روزانه اش رادرگوشه ای ازفرم وهرکدام درتاریخ خاص خودش نشان داده شود.
دقیقتربگم برنامه ای برای لیست کارهایی که قراراست انجام شودوازچندین وقت قبل تر برنامه ریزی شده.
مثلاً:یادداشت برای شرکت درجلسه ......درتاریخ .....، یا مثلاً پیگیری اموردریافت وام، وازاین قبیل برنامه هاویادداشتهاکه درتاریخ موردنظربه صورت هشداریایادآوری به کاربرنمایش داده شود.
ازمحبت شماسپاسگزارم.(مدیرمحترم بخش اگرمطلب دراینجامناسب نیست محبت بفرماییدلینکهای مفیددراین زمینه رامعرفی فرمایید.)

idehrayan
سه شنبه 30 دی 1393, 07:34 صبح
سلام
من همچین برنامه ای نوشتم
یادداشتهای شما باید در یه جدولی که حداقل دو فیلد تاریخ یاداوری و متن یادداشت داشته باشه ذخیره بشه.
در ابتدای اجرای برنامه،برنامه تاریخ امروز سیستم رو در جدول جستجو و اگر رکوردی تاریخ یاداوریش برابر تاریخ جاری سیستم بود اون رکورد رونمایش میده. با کد sql راحت میتونی این برنامه رو بنویسی
نکته :
میتونید یک فیلد منطقی ایجاد و درصورتی که کاربر پیام رو تایید کرد مقدار فیلد true بشه و در غیر این صورت نمایش پیام در یک بازه زمانی تکرار بشه

hp1361
سه شنبه 30 دی 1393, 08:42 صبح
سلام

برای پیاده سازی پروسه یادآوری، یقینا نیاز است که مشخص کنید عملیات مقایسه در چه زمانی اتفاق بیافتند(یعنی چه زمانی چک بشود که آیا مطلبی برای یادآوری وجود دارد یا خیر).

یکی از این زمان ها می تواتند زمان شروع بکار برنامه باشد. در شروع برنامه شما کدهای مقایسه را می نویسید(منطق مقایسه به خودتان و برنامه تان بستگی دارد. اینکه از دیتابیس مطالب را بخواند یا جای دیگه ووو)
درصورت پیاده سازی سناریوی بالا، شما صرفا یکبار عملیات مقایسه رو انجام داده اید! و آن هم صرفاً در زمان شروع برنامه. پس دیگه امکان تعیین زمان برای یادآوری رو ندارید(البته تاریخی هم که کاربر تعیین میکند ممکن است یادآوری آن بخاطر عدم اجرای برنامه صورت نپذیرد!)

سناریوی دیگه استفاده از یک Timer است که در بازه های مشخصی عملیات مقایسه رو انجام بده و در صورت وجود یادآوری(چه در تاریخ و چه در زمان تعیین شده) پیغام مناسب نمایش داده بشه. برای این سناریو چون Timer ممکنه پردازش زیادی رو مشغول کنه بهتره که در Thread دیگری اجرا بشه و یا حتی یه سرویس بنویسی که صرفاً کارش همین باشه.

موفق باشیم

یوسف زالی
سه شنبه 30 دی 1393, 09:30 صبح
برای این سناریو چون Timer ممکنه پردازش زیادی رو مشغول کنه بهتره که در Thread دیگری اجرا بشه و یا حتی یه سرویس بنویسی که صرفاً کارش همین باشه.

البته می تونید با سرویس Schedule خود ویندوز هم کار کنید.
این سرویس سر تایمی که بهش بدید برنامتون رو باز می کنه.

amirkazem
سه شنبه 30 دی 1393, 19:51 عصر
ضمن تشکرازتوجه دوستان گرامی، همانطورکه فرمودیدبنده یک جدول بانامه(Note)ساخته ام که فیلدهای آن عبارتنداز:
1.id
2.date(درفرم بااستفاده ازsolarcalander)
3.time(بااستفاده ازmaskedit)
4.title
5.matn(عنوان یادداشت توضیح مختصر)
6.natijeh
یادداشتهای فوق ازطریق فرم واردمی شوند.محبت بفرماییدراهنمایی کنیدتادستورچک کردن تاریخ سیستم ووجودیادداشت درتاریخ خاص رابه کمک شمابنویسم.تشکر

idehrayan
سه شنبه 30 دی 1393, 20:57 عصر
date1.Caption لیبلی که تاریخ جاری رو نشون میده
dbtxt1 پیام



qry1.SQL.Clear;
qry1.SQL.Add('Select * from Table1 where tarikh like "%'+date1.Caption+'%"');
qry1.Active:=true;
if dbtxt1.text<>'' then dbtxt1.Visible:=True;

hadisalahi2
چهارشنبه 01 بهمن 1393, 09:32 صبح
یک تایمر بزار توی فرمت و هر یک دقیقه چک کن ببین کدوم رکوردها موعد یاد آورشون سر رسیده

بهترین راه اینه که همون موقعی که اطلاعات رکورد رو ثبت میکنی ، تاریخ یاد آورش رو هم توی یک فیلد دیگه ثبت کنی
اینطوری احتیاجی به هیچ کار محاسباتی تاریخ یا ساعت نداری

بعد توی تایمر فقط یک Select ساده باید بزاری
اونایی رو جستجو کنه که برابر تاریخ فیلد یاد آور هستن

یا حق

hp1361
چهارشنبه 01 بهمن 1393, 10:21 صبح
سلام

اینکه کی چک بشه آیا یادآوری وجود دارد یا خیر در بالا توضیح دادم.

برای انجام مقایسه میتونی از کد زیر استفاده کنی


with FDQuery_Temp do
begin
Close;
SQL.Clear;
SQL.Add('SELECT Field1,Field2,Field3,Field_Date FROM TABLE_NAME WHERE Field_Date= :ParamDate');
Params.ParamByName('ParamDate').AsDate := Edit_Date.Text;
Open();
if not IsEmpty then
begin
//Your code
end;
end;


حالا برای نمایش نتیجه هم چند راه پیش رو داری
1- نمایش بصورت یک فرم که در ابتدای برنامه نمایش داده بشه و در یک لیست نتیجه رو نمایش بده و کاربر امکان انتخاب بین اونها رو داشته باشه
2- نمایش بصورت یک پنجره پیام یادآوری. بدین صورت که پنجره ای بالای ساعت سیستم بصورت Popup نمایش داده بشه که میتونی خودت پیاده سازیش کنی با اینکه از کامپوننت های آماده استفاده کنی.

موفق باشیم

amirkazem
دوشنبه 06 بهمن 1393, 22:27 عصر
دوستان ضمن تشکرمجددازهمه ی بزرگواران!
اگرممکن است یک نمونه کوچک زحمت بکشیدتامشکل بنده هم حل شود.باکدهایی که فرموده بودیدهرقدرسعی کردم نتونستم موفق بشم.ممنون میشم اگرزحمت بکشید.

جدول بانام(Note)ساخته ام که فیلدهای آن عبارتنداز:
1.id
2.date(درفرم بااستفاده ازsolarcalander)
3.time(بااستفاده ازmaskedit)
4.title
5.matn(عنوان یادداشت توضیح مختصر)
6.natijeh

amirkazem
پنج شنبه 09 بهمن 1393, 14:19 عصر
باسلام، ضمن تشکرمجددازراهنمایی دوستان بزرگوار
بااستفاده ازکدزیرتونستم برنامه یادآوری راانجام بدم



Date1.Caption:=datetostr(now);ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * from Notes where tarikh like "%'+date1.Caption+'%"');
Adoquery1.Active:=true;
DBText1.Visible :=true;


ولی این کدفقط تاریخی که به صورت میلادی(مثلاً 1/29/2015)باشدرانمایش می دهد.ازآنجائیکه توی فرم ایجادیادداشت فیلدتاریخ رااز(SolarDatePicker)همان تاریخ شمسی استفاده کرده ام ودرجدول (note) ازنوع (text)هستش، دراین صورت یادداشت موردنظردرموقع لودشدن فرم نمایش داده نمی شود.
ممنون میشم اگرراهنمایی بفرمایید.

hadisalahi2
پنج شنبه 09 بهمن 1393, 19:10 عصر
نوع فیلد رو String تعریف کن
میتونی Integer هم تعریف کنی اما باید Display Format رو در Grid برای نمایش رو تنظیم کنی

amirkazem
پنج شنبه 09 بهمن 1393, 19:21 عصر
دوست عزیزhadisalahiضمن تشکر، تست میکنم امیدوارم درست بشه.
ضمناً نوع فیلدتاریخ که فرمودید(string)باشه، مگه درجدول نوع فیلدازنوع(text)هستش کفایت نمیکنه؟

hp1361
پنج شنبه 09 بهمن 1393, 20:39 عصر
سلام

اولاً که چرا از % در SQL استفاده کردی؟تاریخ یک عدد یا یک رشته مشخصه و نیازی نیست که درونش دنبال چیزی بگردی. مقایسه کل تاریخ یا یک رشته کافیه.

دومااگر توی سایت جستجو کنی روش های مختلف ذخیره و نمایش تاریخ توضیح داده شده.

موفق باشیم

amirkazem
پنج شنبه 09 بهمن 1393, 22:10 عصر
دوستان ضمن تشکرمجددازهمه شما!
باورکنیدمن که گیج شدم.:گیج::گیج::گریه::گریه::اشت باه::اشتباه:
اگه سخت نیست یه نمونه کوچک محبت کنیدبنویسیدتایه نفرتازه کارمثل منهم سردربیاره.:تشویق::تشویق:
ممنون ازهمه

hp1361
پنج شنبه 09 بهمن 1393, 22:16 عصر
مشکل شما دقیقاً چیه؟ چیو متوجه نشدین که باعث گیج شدن شده؟

amirkazem
پنج شنبه 09 بهمن 1393, 22:45 عصر
عرض کردم مشکل این هستش که وقتی درفیلدتاریخ (تاریخ یاداوری وتاریخ انجام یادداشت) که ازطریق فرم از(solarcalander datepicker)استفاده می کنیم درجدول مربوطه ودرفیلدمربوطه تاریخ به صورت شمسی (مثلاً1393/11/10)ذخیره میشه.آنوقت هنگام بررسی وباکدهایی که فرمودیدچرااز(%)استفاده کرده ام ، یادداشتهایی که فیلدتاریخ آنها ازنوع شمسی هست درهنگام لودشدن فرم نمایش داده نمیشه درحالی که اگرتاریخ ازنوع میلادی(مثال:01/29/2015) درجدول ثبت بشه درهنگام لودشدن فرم، یادداشت مربوطه نمایش داده میشه.
برروی فرم یک لیبل هستش که درcreateهمان فرم این کدنوشته شده:
Date1.Caption:=datetostr(date);
date1 نام همان لیبل هست.

hp1361
جمعه 10 بهمن 1393, 14:18 عصر
سلام

زحمت بکش کدهای ذخیره سازی ورودی کاربر و نیز کدهای مقایسه رو اینجا بزار تا ببینیم مشکل کجاست و راهنمایی کنن دوستان

amirkazem
جمعه 10 بهمن 1393, 15:22 عصر
سلام
ابتداکدهای فرمی که یادداشت مربوطه توسط کاربرذخیره میشه:


procedure TForm2.Button1Click(Sender: TObject);
begin
ADOTable1.Post;
end;


procedure TForm2.Button2Click(Sender: TObject);
begin
ADOTable1.Cancel;
end;


procedure TForm2.Button3Click(Sender: TObject);
begin
ADOTable1.Close;
ADOConnection1.Connected:=false;
form2.Close ;
form1.visible:=true;
form1.Enabled:=true;
end;


procedure TForm2.Button4Click(Sender: TObject);
begin
ADOTable1.Insert;
DBEdit1.Clear ;
DBEdit2.Clear ;
SolarDatePicker1.Clear ;
SolarDatePicker2.Clear;
end;


procedure TForm2.FormCreate(Sender: TObject);
begin
ADOTable1.Open;
ADOTable1.Insert;
end;


procedure TForm2.FormShow(Sender: TObject);
begin
ADOTable1.Open;
ADOTable1.Insert;
form1.Hide;
form1.Enabled:=false;
form2.Enabled :=true;
end;


procedure TForm2.SolarDatePicker1Change(Sender: TObject);
begin
DBEdit3.Text :=SolarDatePicker1.Text ;
end;


end.


واین هم کدهای فرم اصلی که درابتدای برنامه لودمیشه:



begin
form2.show;
form1.Hide;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery1.Close ;
Application.Terminate ;
end;


procedure TForm1.CheckBox1Click(Sender: TObject);
begin
ADOQuery1.SQL.Clear;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Date1.Caption:=datetostr(date);
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * from Notes where tarikh like"%'+date1.Caption+'%"');
begin
if DBText1.DataField <>'' then
ADOQuery1.Active :=true;
DBText1.Visible :=true;
DBText2.Visible :=true;
DBText3.Visible :=true;
DBText4.Visible :=true;
end;
end;


procedure TForm1.FormShow(Sender: TObject);
begin
form1.Enabled:=true;
form2.Enabled:=false;
form2.Hide;
end;



تصاویرفرمها:

amirkazem
شنبه 11 بهمن 1393, 23:58 عصر
باسلام دوست گرامی جناب:hp1361
امیدوارم تونسته باشم اوامرتان رادرست انجام بدم.لطفاًتصاویرضمیمه راملاحظه بفرمایید.

hp1361
یک شنبه 12 بهمن 1393, 07:02 صبح
سلام

توی این فرمی که شما گذاشتی اینطور که مشخصه هم عملیات تولید یک «یادآوری» باید انجام بشه و هم عملیات بروزرسانی اون(ورود تاریخ انجام و نتیجه انجام)! قاعدتا شما باید قبلش چک کنید که قراره کدوم عملیات انجام بشه!

اگر فرض کنیم تمام فیلد های شما پرشده و قراره در دیتابیس ذخیره بشه، کدش بصورت زیر میتونه باشه:


procedure TForm1.Button_SaveClick(Sender: TObject);
begin
with FDQuery_Temp do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO TBL_Notes(Context,RemindDate,DoDate,Result) VALUES(' +
':Context,:RemindDate,:DoDate,:Result');
Params.ParamByName('Context').AsString := Memo_RemindContext.Text;
Params.ParamByName('RemindDate').AsString :=
SolarDatePicker_RemindDate.Text;
Params.ParamByName('DoDate').AsString := SolarDatePicker_DoDate.Text;
Params.ParamByName('Result').AsString := Edit_Result.Text;
ExecSQL;
end;
end;


صرفاً جهت یادآوری میگم. ما از علامت : در SQL استفاده کردیم که بگیم مقدار این متغیرها بصورت پارامتر ارسال خواهد شد(Context: یعنی پارامتری بنام Context). در خطوط بعدی مقدار اون پارامتر ها رو ارسال کردیم. و در نهایت اجرای کد.(برای خوانایی کد اسم پارامتر ها هم نام فیلدهای جدول انتخاب شده وگرنه هر اسمی مانند Param1 و .... میتوان انتخاب کرد)

برای مقایسه هم چون تاریخ ها بصورت String ذخیره شده اند به راحتی مقادیر String ها رو مقایسه می کنیم:


procedure TForm2.Button_FindClick(Sender: TObject);
begin
with FDQuery_Temp do
begin
Close;
SQL.Clear;

//یکی از دو بخش زیر را استفاده خواهید کرد

// جستجو با یک تاریخ مشخص
SQL.Add('SELECT Context,RemindDate,DoDate,Result FROM TBL_Notes WHERE ' +
'RemindDate= :StartDate');
Params.ParamByName('StartDate').AsString := SolarDatePicker_StartDate.Text;
Open();

// جستجو در یک محدوده تاریخ
SQL.Add('SELECT Context,RemindDate,DoDate,Result FROM TBL_Notes WHERE ' +
'RemindDate>= :StartDate AND RemindDate<= :EndDate');
Params.ParamByName('StartDate').AsString := SolarDatePicker_StartDate.Text;
Params.ParamByName('EndDate').AsString := SolarDatePicker_EndDate.Text;
Open();

//کدهای منطق برنامه شما
end;
end;


کدهای برنامه رو هم پیوست میکنم که اگر خواستی نگاهی بهش بندازی.

amirkazem
یک شنبه 12 بهمن 1393, 17:50 عصر
باسلام وتشکرویژه ازشمادوست عزیزhp1361
خیلی زحمت کشیدید، فقط عرض کنم که شمااز(TFdQuery)استفاده کرده اید که متأسفانه سیستم بنده با (TFDQuery) مشکل دارد.کلی هم جستجوکردم متأسفانه جواب درستی پیدانکردم(هیچ سایت فارسی زبان موضوع مرتبطی نداشت)اگرمحبت بفرماییداین مشکل راهم برطرف کنیم بسیارممنون خواهم شد.
موفق باشیم:تشویق:

hp1361
یک شنبه 12 بهمن 1393, 21:11 عصر
سلام

شما خود TFDQuery رو سرچ کنی به چواب میرسی. FireDAC هستش که فکر کنم از XE3 به بعد بطور پیش در دلفی هست. میتونید بجاش از ADO هم استفاده کنید(DbGo).

موفق باشیم