View Full Version : مبتدی: مشکل در نمایش خروجی یک کوئری در DBGrid
farabad
شنبه 31 اردیبهشت 1390, 13:52 عصر
در فرمم یک dblistBOX یک dbgrid و اجزای اتصال به بانک از طریق ado قرار داده ام.هدفم این است که با انتخاب آیتم (که محتویات یکی از فیلد های جدول است)مورد نظر در dblistbox اطلاعات آن فیلد در dbgrid نمایش داده شود.
کد نمایش محتویات فیلد را به صورت :
DBListBox1.Items.Clear;
ADOTable1.First;
while not ADOTable1.Eof do begin
DBListBox1.Items.Add(ADOTable1.Fieldbyname('name') .asstring);
adoTable1.Next;
نوشته ام که صحیح می باشد.
و کد نمایش اطلاعات در dbgrid رو به صورت:
b:=DBListBox1.ItemIndex;
b:=b+1;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select name as aa,price as aaa from menue where no=:a');
adoquery1.Parameters.ParamValues['a']:=b;
adoquery1.ExecSQL;
adoquery1.Active :=false;
adoquery1.Active:=true;
نوشته ام.اما متاسفانه هیچ اطلاعاتی در DBGrid نمایش داده نمی شود.
اطلاعات مورد نیاز:
یک adoquery در فرم قرار داده ام که به dbgrid متصل است .همچنین فیلد no شامل شماره جنس مورد نظر است که با شماره آیتم +1 در dblistbox مطابقت می کند.
اینم عکس برنامه بعد از اجرا:
http://www.farabad.com/FARABAD.png
لطفا کمک کنید.این پروژه را باید زودتر تحویل دهم و این مشکل شاید کوچک دو روز مرا به خود مشغول ساخته است.
mohsen24000
شنبه 31 اردیبهشت 1390, 15:52 عصر
این کد رو
adoquery1.ExecSQL;
adoquery1.Active :=false;
adoquery1.Active:=true;
تبدیل کن به
adoquery1.Active :=false;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select name as aa,price as aaa from menue where no=:a');
adoquery1.Parameters.ParamValues['a']:=b;
adoquery1.Active:=true
farabad
شنبه 31 اردیبهشت 1390, 16:26 عصر
این کد رو
adoquery1.ExecSQL;
adoquery1.Active :=false;
adoquery1.Active:=true;
تبدیل کن به
adoquery1.Active :=false;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select name as aa,price as aaa from menue where no=:a');
adoquery1.Parameters.ParamValues['a']:=b;
adoquery1.Active:=true
با تشکر از لطفتون
اما باز نتیجه همان است.واقعا دارم از دلفی نوشتن نا امید میشم
vcldeveloper
شنبه 31 اردیبهشت 1390, 16:43 عصر
اما متاسفانه هیچ اطلاعاتی در DBGrid نمایش داده نمی شود.1- متد ExecSQL برای اجرای دستورات SQL ایی که مجموعه رکورد برگشت میدن (مثل SELECT) طراحی نشده، برای اجرای SELECT باید متد Open رو فراخوانی کنید یا خصوصیت Active رو True کنید.
2- پیش فرض شما برای مطابقت ItemIndex در ListBox با مقدار فیلد در یک جدول بانک اطلاعاتی، پیش فرض درستی نیست؛ چون ItemIndex همیشه به صورت ترتیبی و بدون هر گونه فاصله گزاری تعیین میشه، ولی برای فیلدهای شما همچین حکمی صادق نیست. برای مثال، اگر شما رکورد مربوط به "هات داگ معمولی" را از جدول حذف کنید، و سپس یک رکورد جدید به جدول وارد کنید، مقدار فیلد کلید رکورد جدید عدد 4 نخواهد بود، بلکه عدد 5 هست. اگر هم فرض بگیریم که خودتون به این فیلد کلید دستی مقدار میدید، با حذف هر رکورد میانی باید فیلد کلید همه رکوردهای بعد از آن را خودتان دستی تغییر بدید که کار غیر منطقی ایی هست.
3- وقتی دستور SQL شما ثابت هست و فقط مقدار یک پارامتر آن تغییر میکنه، به جای نسبت داد مقدار جدید به خصوصیت SQL کوئری، فقط یک بار به اون مقدار بدید، و در دفعات بعدی فقط مقدار پارامتر را تغییر بدید، تا سرعت اجرای کوئری شما افزایش پیدا کنه.
4- در زمان پیمایش روی رکوردهای یک دیتاست (مثل همون ADOTable1 شما)، قبل از شروع پیمایش از متد DisableControls و بعد از اتمام پیمایش از EnableControls استفاده کنید تا سرعت پیمایش رکوردها به خاطر رسم کنترل های Data-aware متصل به دیتاست پایین نیاد.
با توجه به نکاتی که گفته شد، بهتر هست که شما به جای کار فعلی که انجام میدید، بین دو جدول مورد نظرتون رابطه Master\Detail تعریف کنید، تا با پیماش روی هر یک از رکوردهای جدول اول، داده های جدول دوم به طور خودکار متناسب با رکورد انتخاب شده در جدول اول، فیلتر بشند.
در ضمن، لطفا وقتی تاپیکی ایجاد می کنید، مطابق قوانین سایت، برای آن عنوانی متناسب با موضوع تاپیک انتخاب کنید. "مشکل عجیب" و "یک مشکل" و "کمک کنید" و امثالهم عناوینی نیستند که بیان کننده موضوع تاپیک شما باشند. اینگونه تاپیک ها در سایت حذف میشند. این بار من عنوان تاپیک تان را اصلاح کردم.
farabad
شنبه 31 اردیبهشت 1390, 17:37 عصر
1- متد ExecSQL برای اجرای دستورات SQL ایی که مجموعه رکورد برگشت میدن (مثل SELECT) طراحی نشده، برای اجرای SELECT باید متد Open رو فراخوانی کنید یا خصوصیت Active رو True کنید.
2- پیش فرض شما برای مطابقت ItemIndex در ListBox با مقدار فیلد در یک جدول بانک اطلاعاتی، پیش فرض درستی نیست؛ چون ItemIndex همیشه به صورت ترتیبی و بدون هر گونه فاصله گزاری تعیین میشه، ولی برای فیلدهای شما همچین حکمی صادق نیست. برای مثال، اگر شما رکورد مربوط به "هات داگ معمولی" را از جدول حذف کنید، و سپس یک رکورد جدید به جدول وارد کنید، مقدار فیلد کلید رکورد جدید عدد 4 نخواهد بود، بلکه عدد 5 هست. اگر هم فرض بگیریم که خودتون به این فیلد کلید دستی مقدار میدید، با حذف هر رکورد میانی باید فیلد کلید همه رکوردهای بعد از آن را خودتان دستی تغییر بدید که کار غیر منطقی ایی هست.
3- وقتی دستور SQL شما ثابت هست و فقط مقدار یک پارامتر آن تغییر میکنه، به جای نسبت داد مقدار جدید به خصوصیت SQL کوئری، فقط یک بار به اون مقدار بدید، و در دفعات بعدی فقط مقدار پارامتر را تغییر بدید، تا سرعت اجرای کوئری شما افزایش پیدا کنه.
4- در زمان پیمایش روی رکوردهای یک دیتاست (مثل همون ADOTable1 شما)، قبل از شروع پیمایش از متد DisableControls و بعد از اتمام پیمایش از EnableControls استفاده کنید تا سرعت پیمایش رکوردها به خاطر رسم کنترل های Data-aware متصل به دیتاست پایین نیاد.
با توجه به نکاتی که گفته شد، بهتر هست که شما به جای کار فعلی که انجام میدید، بین دو جدول مورد نظرتون رابطه Master\Detail تعریف کنید، تا با پیماش روی هر یک از رکوردهای جدول اول، داده های جدول دوم به طور خودکار متناسب با رکورد انتخاب شده در جدول اول، فیلتر بشند.
در ضمن، لطفا وقتی تاپیکی ایجاد می کنید، مطابق قوانین سایت، برای آن عنوانی متناسب با موضوع تاپیک انتخاب کنید. "مشکل عجیب" و "یک مشکل" و "کمک کنید" و امثالهم عناوینی نیستند که بیان کننده موضوع تاپیک شما باشند. اینگونه تاپیک ها در سایت حذف میشند. این بار من عنوان تاپیک تان را اصلاح کردم.
ممنون از لطفتان
مواردی را که عنوان نمودید را حتما اعمال می کنم و نتیجه را می نویسم.
من نهایتا از یک dbcomboBox برای بازیابی داده های جدول استفاده کردم.حال خواهش می کنم راهنمایی کنید که چطور می تونم با انتخاب یک آیتم داده های مربوط به آن را در یک dbgrid نشان دهم.آیتم ها داده های وارد شده یکی از فیلد های جدول است که با انتخابشان می خواهم بقیه فیلد های آن را بازیابی کنم.
روز سوم هم گذشت و هنوز جوابم را پیدا نکردم!!!!:ناراحت:
vcldeveloper
دوشنبه 02 خرداد 1390, 20:12 عصر
چطور می تونم با انتخاب یک آیتم داده های مربوط به آن را در یک dbgrid نشان دهم.آیتم ها داده های وارد شده یکی از فیلد های جدول است که با انتخابشان می خواهم بقیه فیلد های آن را بازیابی کنم.
اگر همگی فیلدهای یک رکورد خاص از یک جدول هستند، می تونید با نوشتن همون کوئری، رکورد مربوطه رو از جدول پیدا کنید و در DBGrid نمایش بدید. البته نکاتی که در بالا گفتم رو برای افزایش کارایی کدتون اعمال کنید. اون دستور SQL ایی که نوشتید، از نظر اجرا مشکلی نداره، اگر مقداری برگشت داده نمیشه، علتش میتونه به بانک اطلاعاتی یا نحوه ذخیره شدن داده ها در اون برگرده، مثلا ممکنه مقدار فیلد مورد نظر شما در جدول یک کارکتر خاص مثل ی یا ک داشته باشه که در بانک به صورت کارکتر فارسی ذخیره شدند و در برنامه به صورت کارکتر عربی درج میشند، و بالعکس. می تونید با داده انگلیسی امتحان کنید. در هر حال، از روی این کد، و بدون داشتن بانک اطلاعاتی، نمیشه گفت که چه مشکل فنی ایی میتونسته باعث پیدا نکردن رکورد مربوطه در بانک بشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.