View Full Version : سوال: جدول اکسس و listbox
disiba
پنج شنبه 20 تیر 1392, 00:42 صبح
سلام دوستان
من یک جدول اکسس دارم که از طریق ado به اون وصل میشم . این جدول حدود 250،000 رکورد داره . هر رکورد شامل 77 فیلد است . توی برنامه از 4 listbox استفاده می کنم که محتوای هر کدام که شامل چندین ایتم است ، به یک فیلد جدولم مربوط میشه ( فیلدهای اول تا چهارم ) .می خوام رکورد هایی رو که محتوای فیلدهای اول تا چهارم در لیست باکس ها است رو انتخاب کنم ( فیلد اول مربوط به لیست باکس اول ، فیلد دوم مربوط به لیست باکس دوم و همینطور تا فیلد چهارم ) و در یک فایل excel بریزم . سوالم اینه که با توجه به تعداد بالای رکورد جدول از چه روشی برای فیلتر کردن جدول استفاده کنم . توی سایت جستجو کردم ولی به نتیجه ای نرسیدم . ممنون میشم راهنمایی کنید .
disiba
جمعه 21 تیر 1392, 00:52 صبح
کسی از دوستان ایده ای نداره ؟
alaveh
جمعه 21 تیر 1392, 03:34 صبح
سوالتون رو چند بار خوندم
یکم نامفهوم هست کارتون . یعنی یا خیلی ساده هست یا من درست متوجه نشدم .
تا جایی که من متوجه شدم شما به 4 فیلد از 77 فیلد بعضی از ( یا همه ) رکوردهاتون نیاز دارید . خوب اگر اینجوریه خیلی خیلی ساده با یک کویری و یک Select ساده میتونید 4 فیلد مورد نیازتون رو جدا کنید که حتما کدش رو هم بلد هستید ( اگر بلد نیستید بفرمایید ) .
حالا اگر درست متوجه نشدم پرسشتون رو بیشتر توضیح بدید .
disiba
جمعه 21 تیر 1392, 13:12 عصر
سوالتون رو چند بار خوندم
یکم نامفهوم هست کارتون . یعنی یا خیلی ساده هست یا من درست متوجه نشدم .
تا جایی که من متوجه شدم شما به 4 فیلد از 77 فیلد بعضی از ( یا همه ) رکوردهاتون نیاز دارید . خوب اگر اینجوریه خیلی خیلی ساده با یک کویری و یک Select ساده میتونید 4 فیلد مورد نیازتون رو جدا کنید که حتما کدش رو هم بلد هستید ( اگر بلد نیستید بفرمایید ) .
حالا اگر درست متوجه نشدم پرسشتون رو بیشتر توضیح بدید .
سلام
ممنون که جواب دادید . من مبتدی هستم و این کار سختی نیست . نکته اینجاست که لیست باکس ها فقط شامل 1 ایتم نیستند و می تونند چند ایتم داشته باشند . می خوام از جدول رکوردهایی رو انتخاب کنم که اگه فیلد شماره 1 یکی از ایتم های لیست باکس 1 ، فیلد شماره 2 یکی از ایتم های لیست باکس 2 ، فیلد شماره 3 یکی از ایتم های لیست باکس 3 و فیلد شماره 4 یکی از ایتم های لیست باکس شمار ه 4 باشد رو انتخاب کنم و این رکوردهای انتخاب شده رو در یک فایل excel ذخیره کنم . تعداد فیلدها رو به این علت ذکر کردم که حجم جدول رو نشون داده باشم ( تعداد رکوردها 250000) . چون تا حالا با ado کار نکردم دستورات لازم رو بلد نیستم . توی سایت هم خیلی گشتم مشابه کارم پیدا نکردم . ممنون میشم دستورات لازم رو برام بگید .
disiba
جمعه 21 تیر 1392, 19:01 عصر
کسی نیست کمک کنه ؟
alaveh
شنبه 22 تیر 1392, 01:12 صبح
اگر درست متوجه شده باشم :
شما میخواید توی کل محتویات 4 لیست باکستون بگردید و مثل پازل اینا رو کنار هم قرار بدید و ببینید در نهایت یک رکوردتون میشه یا نه درسته ؟
مثلا شما 3 رکورد دارید :
11 12 13 14
21 22 23 24
31 32 33 34
و محتویات لیست باکساتون هم معلوم نیست به چه ترتیبی هستند و مثلا اینجورین :
1 : 21 11 31
2 : 12 32 22
3 : 33 23 13
4 : 14 24 34
و حالا باید ترتیبهای خاص رو بسنجید . مثلا اول از لیست باکس 1 آیتم 21 رو بگیرید و با تمام آیتمهای لیست باکس 2 کنار هم قرار بدید ببینید کدومش توی جدول درست در میاد .
همینو میخواین ؟؟؟؟؟؟
disiba
شنبه 22 تیر 1392, 01:22 صبح
اگر درست متوجه شده باشم :
شما میخواید توی کل محتویات 4 لیست باکستون بگردید و مثل پازل اینا رو کنار هم قرار بدید و ببینید در نهایت یک رکوردتون میشه یا نه درسته ؟
مثلا شما 3 رکورد دارید :
11 12 13 14
21 22 23 24
31 32 33 34
و محتویات لیست باکساتون هم معلوم نیست به چه ترتیبی هستند و مثلا اینجورین :
1 : 21 11 31
2 : 12 32 22
3 : 33 23 13
4 : 14 24 34
و حالا باید ترتیبهای خاص رو بسنجید . مثلا اول از لیست باکس 1 آیتم 21 رو بگیرید و با تمام آیتمهای لیست باکس 2 کنار هم قرار بدید ببینید کدومش توی جدول درست در میاد .
همینو میخواین ؟؟؟؟؟؟
سلام . بله درسته . ممنون
alaveh
شنبه 22 تیر 1392, 02:21 صبح
ولی این وحشتناکه ......
میدونید چند واکشی نیاز داره ؟؟ به نظرم تجدید نظر کن دوست عزیز توی این روش . یک روش دیگه انتخاب کن . این روش اصلا فکر نکنم با این تعداد رکورد قابل پیاده سازی باشه . خیلی زمان بر میشه . اگرر شما توی لیست باکسهاتون فقط 500 رکورد از این 250 هزار رکوردتون رو بریزید به طور متوسط 8 میلیون واکشی نیاز دارید تا رکورداتون رو پیدا کنید . حالا فرض کن این 500 تا بشه 1000 تا :D از 100 میلیون واکشی هم بیشتر میشه .
حالا اگر ترکیب تکراری گرفتید کدوم رو باید واکشی کنه ؟ شما داری 4 فیلد از 77 فیلد رو مقایسه میکنید . خوب شاید 10 رکورد باشه که این 4 فیلدش مشترک باشه ( مگر اینکه یلدی مثل کلید اصلی توشون باشه )
شما بیا یکم تغییر بده توی برنامت . برای مثال اگر بتونی لیست باکسهاتو مرتب کنی ( یعنی آیتم اول تمام لیست باکسها مربوط به یک رکورد باشن ) اینجوری واکشی ها خیلی خیلی کم و پیاده سازی بسیار ساده میشه .
disiba
شنبه 22 تیر 1392, 12:46 عصر
ولی این وحشتناکه ......
میدونید چند واکشی نیاز داره ؟؟ به نظرم تجدید نظر کن دوست عزیز توی این روش . یک روش دیگه انتخاب کن . این روش اصلا فکر نکنم با این تعداد رکورد قابل پیاده سازی باشه . خیلی زمان بر میشه . اگرر شما توی لیست باکسهاتون فقط 500 رکورد از این 250 هزار رکوردتون رو بریزید به طور متوسط 8 میلیون واکشی نیاز دارید تا رکورداتون رو پیدا کنید . حالا فرض کن این 500 تا بشه 1000 تا :D از 100 میلیون واکشی هم بیشتر میشه .
حالا اگر ترکیب تکراری گرفتید کدوم رو باید واکشی کنه ؟ شما داری 4 فیلد از 77 فیلد رو مقایسه میکنید . خوب شاید 10 رکورد باشه که این 4 فیلدش مشترک باشه ( مگر اینکه یلدی مثل کلید اصلی توشون باشه )
شما بیا یکم تغییر بده توی برنامت . برای مثال اگر بتونی لیست باکسهاتو مرتب کنی ( یعنی آیتم اول تمام لیست باکسها مربوط به یک رکورد باشن ) اینجوری واکشی ها خیلی خیلی کم و پیاده سازی بسیار ساده میشه .
سلام
یکی از لیست باکس ها رو میشه بصورت دیگه اعمال کرد . بزارید مسئله رو ساده تر کنم و با 3 لیست باکس عمل فیلتر رو انجام بدم . لیست باکس اول شامل نام شهر است که میتونه بین 1 تا حدود 300 نام شهر باشه . لیست باکس دوم مربوط به سال میشه که بین 1 تا 60 ایتم رو شامل میشه . لیست باکس سوم هم مربوط به ماه میشه که بین 1 تا 12 ایتم داره . فیلد اول جدول شامل نام شهر است . فیلد دوم شامل سال است و فیلد سوم شامل ماه است . تعداد رکوردهای جدول هم حداکثر 250000 است . روشهای مختلفی برای انتخاب رکوردهای جدول است که چون من تازه کار هستم نمیدونم که از چه راهی استفاده کنم . توی سایت زیاد جستجو کردم . ظاهرا ado query روش مناسبی است اگه ممکنه کامندهای مربوط به این روش رو بگید . ممنون
یوسف زالی
شنبه 22 تیر 1392, 13:00 عصر
سلام دوباره.
فرصت نداشتم سورستون رو دقیق ببینم، ولی همون روشی که گفتم رو تست کردید؟
یک کوئری بود که کافی بود ران شه.
procedure TForm1.Button1Click(Sender: TObject);
var
y, m: string;
begin
ADOCommand1.CommandText := 'insert into TBL4 select * from TBL3 where Year in (%s) and Month in (%s)';
y := '''' + StringReplace(ListBox1.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
m := '''' + StringReplace(ListBox2.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
ADOCommand1.CommandText := Format(ADOCommand1.CommandText, [y, m]);
ADOCommand1.Execute;
end;
disiba
شنبه 22 تیر 1392, 13:42 عصر
سلام دوباره.
فرصت نداشتم سورستون رو دقیق ببینم، ولی همون روشی که گفتم رو تست کردید؟
یک کوئری بود که کافی بود ران شه.
procedure TForm1.Button1Click(Sender: TObject);
var
y, m: string;
begin
ADOCommand1.CommandText := 'insert into TBL4 select * from TBL3 where Year in (%s) and Month in (%s)';
y := '''' + StringReplace(ListBox1.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
m := '''' + StringReplace(ListBox2.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
ADOCommand1.CommandText := Format(ADOCommand1.CommandText, [y, m]);
ADOCommand1.Execute;
end;
سلام
روشتون رو تست کردم . همونطور که قبلا گفتم اجرا میشه ولی هیچ داده ای بر نمی گرده انگار که داده های جدول توی شرط ها صدق نمی کنه . ممنون
یوسف زالی
شنبه 22 تیر 1392, 15:10 عصر
قرار نیست داده ای بر گردونه.
این تابع جدولتون رو آپدیت می کنه.
برای دیدن نتیجه باید بعد از این کار، جدول رو بسته و باز کنید.
disiba
شنبه 22 تیر 1392, 17:12 عصر
قرار نیست داده ای بر گردونه.
این تابع جدولتون رو آپدیت می کنه.
برای دیدن نتیجه باید بعد از این کار، جدول رو بسته و باز کنید.
منظور منم همین بود . توی جدول چیزی ثبت نمیشه . حتی بعد از باز و بسته کردن . ماه و سال از 2 جدول هستند ، در حالیکه در این دستور از 1 جدول استفاده شده . به نظر شما این دستور رو تغییر بدیم درست می شه ؟
ADOCommand1.CommandText := 'insert into TBL4 select * from TBL3 where Year in (%s) and Month in (%s)';
alaveh
شنبه 22 تیر 1392, 19:12 عصر
سلام
یکی از لیست باکس ها رو میشه بصورت دیگه اعمال کرد . بزارید مسئله رو ساده تر کنم و با 3 لیست باکس عمل فیلتر رو انجام بدم . لیست باکس اول شامل نام شهر است که میتونه بین 1 تا حدود 300 نام شهر باشه . لیست باکس دوم مربوط به سال میشه که بین 1 تا 60 ایتم رو شامل میشه . لیست باکس سوم هم مربوط به ماه میشه که بین 1 تا 12 ایتم داره . فیلد اول جدول شامل نام شهر است . فیلد دوم شامل سال است و فیلد سوم شامل ماه است . تعداد رکوردهای جدول هم حداکثر 250000 است . روشهای مختلفی برای انتخاب رکوردهای جدول است که چون من تازه کار هستم نمیدونم که از چه راهی استفاده کنم . توی سایت زیاد جستجو کردم . ظاهرا ado query روش مناسبی است اگه ممکنه کامندهای مربوط به این روش رو بگید . ممنون
حالا بهتر شد . پس نتیجه شما یتونه چندین رکورد باشه نه یک رکورد . اگر پرسش رو درست مطرح میکردین همون روز اول یکی پیدا میشد کمکتون کنه :)
Q1.Active:=False;
Q1.SQL.Text:=SELECT * FROM TBL1 WHERE Shahr='''+S1+''' AND Saal='+S2+' AND Maah='+S3;
Q1.Active:=True;
اینجا S1 حاوی نام یک شهر و S2 حاوی یک سال و S3 حاوی یک ماه میشه . Q1 نام یک ADOQuery هست که روی فرم باید قرار بدی و به یک DataSource وصلش میکنی و یک DBGrid هم روی فرم قرار میدی و به همون DataSource وصل میکنی .
این برای وقتی هست که شما توی هر لیست باکس یک آیتم رو انتخاب می کنید و طبق همون انتخابها رکوردها رو پیدا میکنه . حالا اگر هم میخواید تمام آیتمهای توی لیست باکسها انتخاب بشن باید از مجموعه ها استفاده کنید :
Q1.Active:=False;
Q1.SQL.Text:=SELECT * FROM TBL1 WHERE Shahr in ('+S1+') AND Saal in ('+S2+') AND Maah in ('+S3+')';
Q1.Active:=True;
اینجا S1 حاوی مجموعه نامهای موجود در لیست باکس شهرها و S2 حاوی مجموعه سالهای موجود در لیست باکس سالها و S3 حاوی مجموعه ماههای موجود در لیست باکس ماهها میشه . Q1 نام یک ADOQuery هست که روی فرم باید قرار بدی و به یک DataSource وصلش میکنی و یک DBGrid هم روی فرم قرار میدی و به همون DataSource وصل میکنی .
حتما به این موضوع هم توجه می کنید که آیتمهای مجموعه ها با کاما از هم جدا میشن و آیتمهای رشته ای هم باید بین '' قرار بگیرن .
disiba
یک شنبه 23 تیر 1392, 09:05 صبح
حالا بهتر شد . پس نتیجه شما یتونه چندین رکورد باشه نه یک رکورد . اگر پرسش رو درست مطرح میکردین همون روز اول یکی پیدا میشد کمکتون کنه :)
Q1.Active:=False;
Q1.SQL.Text:=SELECT * FROM TBL1 WHERE Shahr='''+S1+''' AND Saal='+S2+' AND Maah='+S3;
Q1.Active:=True;
اینجا S1 حاوی نام یک شهر و S2 حاوی یک سال و S3 حاوی یک ماه میشه . Q1 نام یک ADOQuery هست که روی فرم باید قرار بدی و به یک DataSource وصلش میکنی و یک DBGrid هم روی فرم قرار میدی و به همون DataSource وصل میکنی .
این برای وقتی هست که شما توی هر لیست باکس یک آیتم رو انتخاب می کنید و طبق همون انتخابها رکوردها رو پیدا میکنه . حالا اگر هم میخواید تمام آیتمهای توی لیست باکسها انتخاب بشن باید از مجموعه ها استفاده کنید :
Q1.Active:=False;
Q1.SQL.Text:=SELECT * FROM TBL1 WHERE Shahr in ('+S1+') AND Saal in ('+S2+') AND Maah in ('+S3+')';
Q1.Active:=True;
اینجا S1 حاوی مجموعه نامهای موجود در لیست باکس شهرها و S2 حاوی مجموعه سالهای موجود در لیست باکس سالها و S3 حاوی مجموعه ماههای موجود در لیست باکس ماهها میشه . Q1 نام یک ADOQuery هست که روی فرم باید قرار بدی و به یک DataSource وصلش میکنی و یک DBGrid هم روی فرم قرار میدی و به همون DataSource وصل میکنی .
حتما به این موضوع هم توجه می کنید که آیتمهای مجموعه ها با کاما از هم جدا میشن و آیتمهای رشته ای هم باید بین '' قرار بگیرن .
سلام
ممنون از اینکه وقت گذاشتید . من این تغییرات رو اعمال کردم . برنامه اجرا میشه ولی توی خروجی چیزی ندارم . ایتم ها ی لیست باکس توی متغیر به این صورت قرار میدهم ایا فرمت اونا درسته ؟
SELECT * FROM table1 WHERE stn in ('+s11+') AND yr in ('+y11+') AND mn in ('+m11+')
S11=” ‘abadan’,’ahwaz’,’shiraz’ ”
Y11=” ‘2012’,’2013’ “
M11=” ‘1’,’2’,’3’ “
alaveh
یک شنبه 23 تیر 1392, 15:26 عصر
سلام
ممنون از اینکه وقت گذاشتید . من این تغییرات رو اعمال کردم . برنامه اجرا میشه ولی توی خروجی چیزی ندارم . ایتم ها ی لیست باکس توی متغیر به این صورت قرار میدهم ایا فرمت اونا درسته ؟
SELECT * FROM table1 WHERE stn in ('+s11+') AND yr in ('+y11+') AND mn in ('+m11+')
S11=” ‘abadan’,’ahwaz’,’shiraz’ ”
Y11=” ‘2012’,’2013’ “
M11=” ‘1’,’2’,’3’ “
ببین دوست عزیز اول اینی که نوشتی من اینطور برداشت کردم که شما فیلدهای ماه و سال رو هم توی DB از نوع متنی گرفتید . اگر متنی هست که هیچ در غیر این صورت نباید از '' استفاده کنید .
در ضمن بعد از پرانتز بسته m11 هم کتیشن رو نبستید که دلفی ایراد میگیره .
در ضمن توی دلفی هم باید اینطور متغیرهای متنی رو مقداردهی کنید :
S11:='''abadan'',''ahwaz''';
و عددی رو اینطور :
Y11='2012,2013'
و یک مورد دیگه . اینایی که نوشتید هم خطای سینتکس داشتند و هم خطای ران تایم ( برای کویری ) . شما با تریس کردن کدتون میتونید ایرادهاتون رو خودتون متوجه بشید و خیلی از اونا رو خودتون حل کنید تا کارتون سریعتر انجام بشه .
باز هم مشکلی بود مطرح کنید .
alaveh
یک شنبه 23 تیر 1392, 15:31 عصر
Q1.Active:=False;
S11='''abadan'',''ahwaz'',''shiraz''';
Y11='2012,2013';
M11='1,2,3';
Q1.SQL.Text:=SELECT * FROM table1 WHERE stn in ('+S11+') AND yr in ('+y11+') AND mn in ('+m11+')';
Q1.Active:=True;
disiba
یک شنبه 23 تیر 1392, 16:43 عصر
Q1.Active:=False;
S11='''abadan'',''ahwaz'',''shiraz''';
Y11='2012,2013';
M11='1,2,3';
Q1.SQL.Text:=SELECT * FROM table1 WHERE stn in ('+S11+') AND yr in ('+y11+') AND mn in ('+m11+')';
Q1.Active:=True;
سلام
تمام فیلد های من string هستند . مشکل حل شد . ممنونم که با حوصله منو راهنمایی کردید
alaveh
یک شنبه 23 تیر 1392, 23:28 عصر
سلام
تمام فیلد های من string هستند . مشکل حل شد . ممنونم که با حوصله منو راهنمایی کردید
خوب خدا رو شکر . موفق باشید .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.