PDA

View Full Version : نمایش ندادن رکورد خاص در DBGrid



rezatati
دوشنبه 05 مرداد 1388, 20:35 عصر
با سلام خدمت دوستان

من یک برنامه تحت دلفی نوشتم که به یک مشکلی برخوردم
من می خوام از یک پایگاه داده تحت SQL یک سری اطلاعات رو به کاربر بر حسب بازه زمانی تاریخ نشون بدم و تاریخ تو پایگاه داده به صورت شمسی ذخیره شده و برای اینکار ابتدا کل رکوردها رو لود می کنم با ADOQUERY و بعد باید رکوردهایی که تاریخشون مابین دوتا تاریخی که کاربر تعیین می کنه هستش رو به کاربر نشون بدم و با یک تابعی تعیین میکنم که تاریخ رکورد مابین دوتا تاریخ هست یا نه حالا اگه رکورد مورد نظر رو نخواستم چطوری از ADOQUERY حذف کنم که تو DBGrid نمایش داده نشه. به شرطی که از پایگاه داده حذف نشه به طور کلی چطوری تو برنامه بعضی از رکوردها رو مخفی کنم که به کاربر نشون داده نشه.
با تشکر از دوستان فقط خیلی فوری هستش .

shervin farzin
دوشنبه 05 مرداد 1388, 20:54 عصر
سلام
شما دو راه داريد :
1- اطلاعاتي رو قصد نمايش به كاربر داريد از طريق دستورات SQL از Database بخونيد.
2- اگر لازمه كه اول تمام اطلاعات رو بخونيد و بعدا اطلاعات رو حذف كنيد ، در مورد حذف كردن
ركورد از Dataset تحقيق كنيد.
موفق باشيد.

rezatati
دوشنبه 05 مرداد 1388, 21:57 عصر
با تشکر ولی با راه اول که نمی شه چون اطلاعات باید با توجه به تاریخ شمسی به کاربر نمایش داده بشه که با دستورات SQL نمیشه راه دوم هم خیلی تو اینترنت گشتم ولی پیدا نکردم

مهدی کرامتی
سه شنبه 06 مرداد 1388, 00:16 صبح
جدولی مثل این رو فرض کنید:


http://barnamenevis.org/forum/attachment.php?attachmentid=34072&d=1248725752


میتوانید این جوری Query بنویسید:


http://www.barnamenevis.org/forum/attachment.php?attachmentid=34073&stc=1&d=1248725752

vcldeveloper
سه شنبه 06 مرداد 1388, 01:27 صبح
اگر نمیخواید دستور SQL را تغییر بدید، یا این کار به هر دلیلی ممکن نیست، دو راه به ذهن من میرسه:
1- استفاده از خصوصیت Filter مربوط به دیتاست مربوطه؛ به این صورت، می تونید هر رکوردی که مایل به نمایش آن نیستید را فیلتر کنید، مثلا اگر رکورد با ID = 3 را می خواهید مخفی کنید:

AdoQuery1.Filtered := False;
AdoQuery1.Filter := 'ID <> 3';
AdoQuery1.Filtered := True;

و اگر قرار هست بیش از یک رکورد فیلتر بشند، می تونید آنها را به انتهای فیلتر فعلی با استفاده از OR متصل کنید:

AdoFilter1.Filter := ' (ID <> 3) OR (ID <> 5)';


2- خصوصیت LockType مربوط به دیتاست را بر روی lbBatchUptimistic تنظیم کنید. در این صورت می تونید با استفاده از متد Delete هر رکوردی را که مایل بودید حذف کنید. البته تا زمانی که متد UpdateBatch فراخوانی نشود، تغییراتی که بر روی داده ها اعمال کردید در دیتابیس ثبت نمی شود.

rezatati
سه شنبه 06 مرداد 1388, 10:33 صبح
با تشکر از همه دوستان
راه حل هایی که دادین خوبه ولی من خودم یک راه حل دیگه ای رو به سختی پیداد کردم

اون هم اینه که یک ClientDataSet ایجاد می کنم و بعد رکوردهایی که لازم دارم رو تو اون می ریزم و لی ClientDataSet رو به پایگاه داده وصل نمی کنم و بعد اونو به DBGrid وصل می کنم با تشکر از همه دوستان
این هم کدش :


table.FieldDefs.Clear();
for I := 0 to TotalForm.ADOQuery1.FieldDefList.Count - 1 do
table.FieldDefs.Add(TotalForm.ADOQuery1.FieldDefLi st[i].Name,TotalForm.ADOQuery1.FieldDefList[i].DataType,TotalForm.ADOQuery1.FieldDefList[i].Size,TotalForm.ADOQuery1.FieldDefList[i].Required) ;
table.CreateDataSet();
table.Open();
//*****************
while not TotalForm.ADOQuery1.Eof do
begin
if(MyCompareDate(TotalForm.ADOQuery1.FieldByName(' ENTERDATE').Value)=1)then
begin
table.Append();
table.FieldByName('JID').Value:= TotalForm.ADOQuery1.FieldByName('JID').Value;
table.FieldByName('JNAME').Value:= TotalForm.ADOQuery1.FieldByName('JNAME').Value;
table.FieldByName('COUNT').Value:= TotalForm.ADOQuery1.FieldByName('COUNT').Value;
table.FieldByName('ENTERDATE').Value:= TotalForm.ADOQuery1.FieldByName('ENTERDATE').Value ;
table.FieldByName('tahvilgirande').Value:= TotalForm.ADOQuery1.FieldByName('tahvilgirande').V alue;
table.FieldByName('tahvildahande').Value:= TotalForm.ADOQuery1.FieldByName('tahvildahande').V alue;
table.Post();
end;
TotalForm.ADOQuery1.Next();
end;//end of whiel
البته table همو ن ClientDataSet هستش که من اسمشو اینجوری گذاشتم

hp1361
چهارشنبه 07 مرداد 1388, 14:27 عصر
سلام

متوجه نمی شم چرا با یه adoquery اطلاعات مورد نظرتون رو در بازه تاریخ مورد نیاز فراخوانی نمی کنید و بعدش هم اون رو به dbgrid وصل کنید!!!

اینطوری کد کمتری مینویسید که ! حالا تفاوت عملکردش رو نمی دونم !

موفق باشین