PDA

View Full Version : بروز كردن dbgrid بدون اسكرول خوردن



noorieh
سه شنبه 12 مرداد 1389, 19:30 عصر
با سلام
من يه سوال دارم

من يك dbgrid دارم كه با يك datasource به يك adotable متصل است. من مي خواهم موقعي كه adotable را requery ميكنم، dbgrid به بالا اسكرول نخورد و تنها ديتا داخل آن update‌ شود.

ممنون ميشوم اگر راهنمايي كنيد

Felony
سه شنبه 12 مرداد 1389, 20:28 عصر
var
CurRecord: Integer;
begin
CurRecord:= ADOTable1.RecNo;
ADOTable1.Requery;
ADOTable1.RecNo:= CurRecord;
end;

pezhvakco
سه شنبه 12 مرداد 1389, 20:33 عصر
درود :
وقتی از requery استفاده می کنی ، چون اطلاعات درباره بارگذاری می شود جدول نیز به ابتدای می رود .
می تونی شماره مکان فعلی رو داشته و بعد دوباره به اون برگدی >

Locate('code',Code_Old,[]);

فکر خوش.

Felony
چهارشنبه 13 مرداد 1389, 05:27 صبح
درود :
وقتی از requery استفاده می کنی ، چون اطلاعات درباره بارگذاری می شود جدول نیز به ابتدای می رود .
می تونی شماره مکان فعلی رو داشته و بعد دوباره به اون برگدی >

Locate('code',Code_Old,[]);

فکر خوش.

متد Locate برای جست و جو در بانک به کار میره و اگر بخواین برای این کار ازش استفاده کنید باید یک کلید منحصر به فرد در بین فیلدهای جدولتون موجود باشه در غیر این صورت مشکل پیش میاد ، در کل راه فنی همون پست شماره 2 هست .

pezhvakco
چهارشنبه 13 مرداد 1389, 09:13 صبح
باید یک کلید منحصر به فرد در بین فیلدهای جدولتون موجود باشه

در کل راه فنی همون پست شماره 2 هست .

در غیر این صورت مشکل پیش میاد
درسته ...
یه سوال ؟
اگه جند ردیف بین ردیف های موجود اضافه کنی و بعد دستور requery رو اجرا کنی این RecNo می تونه جای قبلی رو بدست بیاره .

Felony
چهارشنبه 13 مرداد 1389, 10:02 صبح
درسته ...
یه سوال ؟
اگه جند ردیف بین ردیف های موجود اضافه کنی و بعد دستور requery رو اجرا کنی این RecNo می تونه جای قبلی رو بدست بیاره .

با چه دستوری میخواین چند ردیف بین ردیف های موجود درج کنید ؟
من تا به حال همچین چیزی ندیدم که بشه بین رکوردهای موجود رکورد جدید درج کرد ( از لحاظ تئوری و فنی هم نشدنی هست چون اگر کلید اصلی جدول از نوع AutoNumber باشه ترتیب فیلد کلید اصلی به هم میخوره مگر اینکه بانک به طور خودکار فیلد کلید اصلی رو شیفت بده که این هم غیر فنی هست و در بانک های بزرگ مشکل اساسی به وجود میاره ) .

pezhvakco
چهارشنبه 13 مرداد 1389, 10:28 صبح
اگر کلید اصلی جدول از نوع AutoNumber باشه
اگه این AutoNumber در کار باشه که اون دستور Locate کار میکنه .
اگه مرتب سازی ( Index ) بر اساس مورد دیگری غیر از کلید اصلی باشه نمیشه ردیف ها بین هم نمایش داده بشن .

میشه بگین این RecNo چه طوری کار میکنه (از لحاظ کارایی و روش کار) و چه تفاوتی با دستور Locate داره .

Felony
چهارشنبه 13 مرداد 1389, 11:15 صبح
میشه بگین این RecNo چه طوری کار میکنه (از لحاظ کارایی و روش کار) و چه تفاوتی با دستور Locate داره .
RecNO شماره رکورد جاری که Cursor دیتاست بر روی اون قرار داره رو بر میگردونه ولی دستور Locate به دنبال مقدار مورد نظر ما در فیلد موردنظر در بین رکورد ها میگرده ، حالا میتونه این مقدار از نوع عددی ، منطقی ، رشته ای یا ... باشه .

pezhvakco
چهارشنبه 13 مرداد 1389, 11:29 صبح
در هنگامی که دستور requery اجرا شده و Cursor دیتاست در ابتدای اون قرار داره، دستور Locate مناسب تر کار میکنه یا RecNO .

Felony
چهارشنبه 13 مرداد 1389, 13:09 عصر
در هنگامی که دستور requery اجرا شده و Cursor دیتاست در ابتدای اون قرار داره، دستور Locate مناسب تر کار میکنه یا RecNO .

من که گفتم ، زمانی میشه 2 تا چیز رو با هم مقایسه کرد که هم نوع باشند و برای یک هدف استفاده بشن ، مثلا بین هواپیما و ماشین ، هر دو برای رفتم از مبداء به مقصد هستن و بین این دو هواپیما انتخاب میشه چون سرعتش بیشتره و ... ، در مورد این دو هم همینطور ، RecNO برای گرفتن مکان جاری اشاره گر و Locate برای جست و جو پس نمیشه مقایسه ای انجام داد .

در کدی که من در پست اولم نوشته قبل از اینکه Requery صدا زده شه توسط RecNO مکان اشاره گر رو ذخیره کردیم ، پس ربطی به بعد از صدا زده شدن Requery و نحوه عملکرد و بازدهیشون نداره .

pezhvakco
چهارشنبه 13 مرداد 1389, 13:35 عصر
شرمنده ... ؟

منظورم اینه که شما ابتدا RecNO (مکان جاری اشاره گر که ممکنه یه "کلید منحصر به فرد" باشه ) رو میگیرین و بعد جدول رو به اون ارجا می دین (همین کار رو که خود برنامه با یه روشی انجام میده که ممکنه مانند Locate کار کنه ) .

حالا اگه بیای ابتدا شماره ردیف (مانند AutoNumber که تعریف شده ) رو بگیری و بعد با دستور Locate (مکان یابی مورد خاص) به اون ردیف برسی :> ماشین و هواپیما داریم یا در دو واگن مختلف از یک قطار .

روش کار درونی این ADOTable1.RecNo:= CurRecord چه طوریه ؟
(با فرض اینکه بعد از Requery همون RecNo مربوط به ردیف ثابت مونده باشه)

AbiriAmir
چهارشنبه 13 مرداد 1389, 15:43 عصر
با چه دستوری میخواین چند ردیف بین ردیف های موجود درج کنید ؟
من تا به حال همچین چیزی ندیدم که بشه بین رکوردهای موجود رکورد جدید درج کرد ( از لحاظ تئوری و فنی هم نشدنی هست چون اگر کلید اصلی جدول از نوع AutoNumber باشه ترتیب فیلد کلید اصلی به هم میخوره مگر اینکه بانک به طور خودکار فیلد کلید اصلی رو شیفت بده که این هم غیر فنی هست و در بانک های بزرگ مشکل اساسی به وجود میاره ) .

توسط insert اما اگه Auto Number باشه هم رکورد جدید بین رکردها میاد اما فیلد Auto Number اون آخرین مقدار رو میگیره و اگر sort کنیم میره آخر

Felony
چهارشنبه 13 مرداد 1389, 17:00 عصر
شرمنده ... ؟

منظورم اینه که شما ابتدا RecNO (مکان جاری اشاره گر که ممکنه یه "کلید منحصر به فرد" باشه ) رو میگیرین و بعد جدول رو به اون ارجا می دین (همین کار رو که خود برنامه با یه روشی انجام میده که ممکنه مانند Locate کار کنه ) .

حالا اگه بیای ابتدا شماره ردیف (مانند AutoNumber که تعریف شده ) رو بگیری و بعد با دستور Locate (مکان یابی مورد خاص) به اون ردیف برسی :> ماشین و هواپیما داریم یا در دو واگن مختلف از یک قطار .

روش کار درونی این ADOTable1.RecNo:= CurRecord چه طوریه ؟
(ممکنه بعد از Requery همون RecNo مربوط به ردیف ثابت مونده باشه)

ببینید RecoNO ایندکس رکورد جاری اشاره گر رو بر میگردونه ، یعنی تو یه DBGrid اگر شما روی یک خانه کلیک کنید آدرس اون خونه نگهداری نمیشه ( RecNO ازنوع TPoint یا اشاره گر و ... نیست ) بلکه ایندکس اون رکورد برگردونده میشه ، حالا شما ممکنه روی یک فیلدی از اون رکورد باشی که Text باشه یا اینکه AutoNumber باشه یا ...

در مورد دومی که گفتین شماره ردیف رو بگیرین هم فقط زمانی میشه بهش اعتماد کرد که یک فیلد AutoNumber یا یک فیلد کلید اصلی ( مثلا کد ملی ) درش موجود باشه در این صورت عملیات درسته ولی اگر در جدول همچین فیلدی موجود نباشه و مثلا شما مقدار فیلد name رو بگیری ، ممکنه 9 تا اسم Will اونجا باشه و شما اشاره گر الان روی نهمین اسم Will باشه ، ولی در زمان Locate با پیدا شدن اولین Will اشاره گر بهش منتقل میشه و کل عملیات مختل میشه .

روش کار درونی هم این هست که ایندکس رکورد جاری که اشاره گر DataSource بهش اشاره میکنه بر میگردونه ، اینکه بعد از Sort این ایندکس به روز میشه و قابل استفاده هست ( فکر نمیکنم اینطور باشه ) رو نیمدونم و بیشتر از این در این مورد اطلاع ندارم .



توسط insert اما اگه Auto Number باشه هم رکورد جدید بین رکردها میاد اما فیلد Auto Number اون آخرین مقدار رو میگیره و اگر sort کنیم میره آخر

توسط Insert چه طور میشه وسط یکسری رکورد ، رکورد جدید درج کرد ؟ با فراخوانی متد Insert اشاره گر DataSource به طور خودکار به آخرین رکورد جدول منتقل و بعد از اون عمل درج رو انجام میده نه هر جایی که شما دلت بخواد !
تنها راه این هست که رکورد درج بشه و بعد بر اساس فیلدی خاص رکوردها مرتب بشن .

pezhvakco
چهارشنبه 13 مرداد 1389, 19:07 عصر
با این توضیحات :
اگه یه ستون شاخص ( AutoNumber یا هر شماره یکتای دیگری ) داشته باشه استفاده از دستور Locate مشکلی نداره و راه غیر فنی نیست همین طور که استفاده از RecNo راه حل دیگری است (که این راه نیز به شرطی درست کار میکنه که تغییری در اون ایجاد نشه مانند تغییر مرتب سازی و یا ایجاد ردیف بین ردیف ها و شیفت دادن دیگر ردیف ها ) .

تا به بینیم دانستنی های شما چه جواب دیگری میده آقا مجتبی .

فکر خوش.

bmanfy
چهارشنبه 13 مرداد 1389, 23:39 عصر
اين كه شماره سطر رو بخواهيم بگيريم و بعد برگرديم به همون نقطه ممكنه دقيق سر جاي خودش نگيره .
من از روش ديگري استفاده ميكنم :


var
point : pointer;
begin
point := ado.getbookmark;
ado.requery();
ado.gotobokmark(point);
end;

Felony
پنج شنبه 14 مرداد 1389, 00:12 صبح
اين كه شماره سطر رو بخواهيم بگيريم و بعد برگرديم به همون نقطه ممكنه دقيق سر جاي خودش نگيره .
من از روش ديگري استفاده ميكنم :


var
point : pointer;
begin
point := ado.getbookmark;
ado.requery();
ado.gotobokmark(point);
end;


اینکه از روش دیگری استفاده میکنید و درست هم کار میکنه هیچ ، دلیل فنی که میگید ممکنه دقیق سر جای خودش قرار نگیره چیه ؟ استفاده از BookMark دقیقا همون مشکل RecNO رو داره ، یعنی مثلا اگر اون وسط یکی از رکوردها حذف بشه ترتیب به هم میخوره و اشاره گر در جای صحیح قرار نمیگیره .

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

bmanfy
پنج شنبه 14 مرداد 1389, 10:32 صبح
با سلام .
قبل از همه چيز عذر خواهي ميكنم كه ابتدا دليل نقض كردن روش شما رو نگفتم . چون كمي عجله داشتم .
اما با كمال ميل براتون الانو توضيح ميدم .

خب فرض كنيد جدول بر اساس يك ستون خاص مرتب شده باشه . مثلا بر اساس يك فيلد از نوع عددي . الان بر رو ي ركوردي كه مقدار اون فيلدش 10 هست قراد داريم شماه سطر اون هم مثلا 8 باشه .
حالا فرض كنيد يك كاربر ديگه مياد يك ركورد به جدول اضافه ميكنه (يا حتي خدمون) كه مقدار اين فيلد عددي اون 2 باشه .
بعد جدول رو Requery ميكنيم . اگر از اشاره گر استفاده بشه دقيقا برميگرده سر جاي قبليش روي فيل شماره 10 اما با شماره ركورد 9 ، اما اگر از شماره ركورد بخواهيم استفاده كنيم . ميره روي ركورد شماره 8 در حالي در حقيقت اطلاعات به اندازه يك ركورد با پايين حركت كرده .

به همين سادگي .
موفق باشيد .

hamidkarimy
پنج شنبه 14 مرداد 1389, 20:22 عصر
با سلام .
قبل از همه چيز عذر خواهي ميكنم كه ابتدا دليل نقض كردن روش شما رو نگفتم . چون كمي عجله داشتم .
اما با كمال ميل براتون الانو توضيح ميدم .

خب فرض كنيد جدول بر اساس يك ستون خاص مرتب شده باشه . مثلا بر اساس يك فيلد از نوع عددي . الان بر رو ي ركوردي كه مقدار اون فيلدش 10 هست قراد داريم شماه سطر اون هم مثلا 8 باشه .
حالا فرض كنيد يك كاربر ديگه مياد يك ركورد به جدول اضافه ميكنه (يا حتي خدمون) كه مقدار اين فيلد عددي اون 2 باشه .
بعد جدول رو Requery ميكنيم . اگر از اشاره گر استفاده بشه دقيقا برميگرده سر جاي قبليش روي فيل شماره 10 اما با شماره ركورد 9 ، اما اگر از شماره ركورد بخواهيم استفاده كنيم . ميره روي ركورد شماره 8 در حالي در حقيقت اطلاعات به اندازه يك ركورد با پايين حركت كرده .

به همين سادگي .
موفق باشيد .

bookmark آدرس رکوردهای دیتاست ها در دلفی هستند و selectedrows دبی گرید هم این آدرس ها رو برای برگرداندن رکوردهای انتخاب شده استفاده می کنه ولی تا وقتی معتبر هستند که دیتاست close نشه و requery در اصل دیتاست رو close open می کنه در نتیجه پس از بازخوانی اطلاعات این آدرس ها معتبر نیستند گرچه ممکن است تصادفا یکی باشند.
استفاده از recno نیز عملکردی مشابه دارد.
مخصوصا وقتی برنامه شما تحت شبکه کار می کند به راحتی اتفاق می افتد که در هین لود شدن اطلاعات به دیتاست و بازخوانی آن تعداد نا متنابهی رکورد به دیتاست شما اضافه شده باشد یا حذف شده باشد که شما از آنها اطلاع ندارید حتی ممکن است همین رکورد جاری که شما قصد برگشت به آن را دارید توسط کاربر دیگری در شبکه حذف شده باشد!
در کل از ابتدایی ترین اصول طراحی بانک های اطاعاتی استفاده از کلید در جداول است که برای Delete, Update, Join , ... از این کلید ها استفاده می شود.
چه این کلید identity یا autonumber باشد و چه بصورت دستی مدیریت شود
حال روش متداول در این گونه مواقع استفاده از همان locate بر روی این فیلد کلید می باشد
پس مراحل این کار به شرح زیر می باشد:
1-adodataset.disablecontrols برای جلوگیری از refresh کنترل های متصل به این دیتاست از قبیل dbgrid, dbedit, ...
2-CurRecord := adodataset.findfield('Code').asstring انتقال مقدار کلید سطر جاری به یک متغیر محلی
3-adodataset.requery باز خوانی اطلاعات از پایگاه داده
4-adodataset.locate('Code',currecord,[]); locating booked record
5-adodataset.enablecontrols;
اگر رکورد مذکور در هین بازخوانی حذف شده باشد کرسر به اولین رکورد می رود که اجتناب ناپذیر می باشد

bmanfy
پنج شنبه 14 مرداد 1389, 23:39 عصر
با تشكر از توضيحاتتون :


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

يعني شما داريد ميگيد اينكه بعد از Requery كردن اطلاعات اشاره گر دوباره به همون محل اشاره ميكنه كاملا تصادفيه ؟ ميشه يه مقداري در اين باره بيشتر بگيد .
اخه وقتي از اشاره گر استفاده ميكنيم حتي اگر چندين ركورد به جدول اضافه شده باشه دقيقا دوباره بر ميگيرده سر جاي خودش . البته اين رو كه من ميگم بر پايه تجربه ي عملي كه داشتم.



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

يعني چي به اولين ركورد ميره كه اجتناب ناپذير باشه !!!

Felony
جمعه 15 مرداد 1389, 06:05 صبح
یه نمونه براتون نوشتم ، از ضمیمه دریافت کنید ، مثلا تو DBGrid رو اسم شماره 7 کلیک کنید و بعد دکمه BookMark & Delete رو بزنید ، الان رکورد شماره 5 پاک شده ولی رکوردی که شما روش کلیک کرده بودی هنوز موجود هست اما اشاره گر به رکورد بعدی اون اشاره میکنه !

hamidkarimy
جمعه 15 مرداد 1389, 10:48 صبح
با تشكر از توضيحاتتون :

يعني شما داريد ميگيد اينكه بعد از Requery كردن اطلاعات اشاره گر دوباره به همون محل اشاره ميكنه كاملا تصادفيه ؟ ميشه يه مقداري در اين باره بيشتر بگيد .
اخه وقتي از اشاره گر استفاده ميكنيم حتي اگر چندين ركورد به جدول اضافه شده باشه دقيقا دوباره بر ميگيرده سر جاي خودش . البته اين رو كه من ميگم بر پايه تجربه ي عملي كه داشتم.
يعني چي به اولين ركورد ميره كه اجتناب ناپذير باشه !!!
دوست عزیز موضوع کاملا روشنه
دلفی معجزه نمی تونه بکنه اطلاعات اصلی در دیتابیس هستند و یک کپی از اونها در دیتاست دلفی برای شما دخیره شده در اصل دیتاست به شکل یک آرایه n در n از Variant می باشد
که bookmark آدرس سطرهای این آرایه می باشد
وقتی شما requery می کنید کل این آرایه پاک شده و بازخوانی میشود در نتیجه این آدرس ها نیز refresh میشوند
محیط دلفی یک آموزشگاه بی نظیره
از سورس باز بودن دلفی حداکثر استفاده رو بکنید
روی Tadodataset کنترل رو بگیرید و کلیک کنید
سورس اونرو نشون میده در کل همه انواع دیتاست در دلفی مثل tadodataset, tclientdataset و ... از Tdataset مشتق می شوند
اگر سورس TDataset رو هم ببینید متوجه گفتار من می شوید
ساختار bookmark و recno رو توجه کنید

bmanfy
جمعه 15 مرداد 1389, 13:06 عصر
یه نمونه براتون نوشتم ، از ضمیمه دریافت کنید ، مثلا تو DBGrid رو اسم شماره 7 کلیک کنید و بعد دکمه BookMark & Delete رو بزنید ، الان رکورد شماره 5 پاک شده ولی رکوردی که شما روش کلیک کرده بودی هنوز موجود هست اما اشاره گر به رکورد بعدی اون اشاره میکنه !


پاك شدن كه اره . در استفاده از شماره سطر هم همين مشكل هست . و اين رو قبول دارم.
اما اگر دقت كردن مثال نقضي كه من زدم در زمان اضافه شدن بود .
البته هيچ كدوم از اين دو روش دقيق نيست . و در واقع استفاده از فيلد كليدي براي برگشت به محل قبلي بهترين روش به نظر ميرسه .
و دوستون هم كاملا دارن ميگن شانسيه .

bmanfy
جمعه 15 مرداد 1389, 13:08 عصر
دوست عزیز موضوع کاملا روشنه
دلفی معجزه نمی تونه بکنه اطلاعات اصلی در دیتابیس هستند و یک کپی از اونها در دیتاست دلفی برای شما دخیره شده در اصل دیتاست به شکل یک آرایه n در n از Variant می باشد
که bookmark آدرس سطرهای این آرایه می باشد
وقتی شما requery می کنید کل این آرایه پاک شده و بازخوانی میشود در نتیجه این آدرس ها نیز refresh میشوند
محیط دلفی یک آموزشگاه بی نظیره
از سورس باز بودن دلفی حداکثر استفاده رو بکنید
روی Tadodataset کنترل رو بگیرید و کلیک کنید
سورس اونرو نشون میده در کل همه انواع دیتاست در دلفی مثل tadodataset, tclientdataset و ... از Tdataset مشتق می شوند
اگر سورس TDataset رو هم ببینید متوجه گفتار من می شوید
ساختار bookmark و recno رو توجه کنید

هنوز براي من چنتا سوال در اين باره هست . مطالعه ميكنم اگر رفع نشد مزاحم ميشم .
موفق باشيد

hamidkarimy
شنبه 16 مرداد 1389, 23:15 عصر
هنوز براي من چنتا سوال در اين باره هست . مطالعه ميكنم اگر رفع نشد مزاحم ميشم .
موفق باشيد
در خدمتتون هستم