# Native Code > برنامه نویسی در Delphi >  یک query با چند دستور select

## delphiman00

سلام
آیا می توان چند دستور select  را در  یک Adoquery پشت سر هم داد و سپس adoquery را اجرا کرد

علت این کار این است من می خواهم یک فیلد را در چند حالت مختلف از یک جدول بخوانم
به صورت زیر :

select No as Number1 from table1 where nod=1
select No as Number2 from table1 where nod=2
select No as Number3 from table1 where nod=3

یعنی سه دفعه فیلد No خوانده می شود با سه شرط مختلف ( فیلد nod سه مرتبه با مقادیر 1 و 2و 3 فیلتر میشود ) 

آیا می شود از یک دستور select استفاده کرد اما این سه شرط را در آن جای داد

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

----------


## s_q

فکر می کنم با این دستور بشه 
<span dir=ltl>

select  ( select No  from table1 where nod=1) as Number1 , (select No  from table1 where nod=2 )  as Number2,(select No  from table1 where nod=3 ) as Number3 from  Table1
</span>
شما می توانید برای هر فیلد یک query بنویسید و عنوان آنرا مشخص کنید.

----------


## delphiman00

امتحان کردم اما متاسفانه error می دهد

کممممممممممممممممممممممک ! :|

----------


## سار

منظور از چنین کدی چیه؟
احتمالا باید راه حل های بهتری هم باشه

----------


## delphiman00

منظور اینه که می خواهم داده های درون یک فیلد از جدولم را بر اساس فیلد nod همان جدول تقسیم بندی کرده و در adoquery هر تقسیم بندی را در یک فیلد جداگانه نمایش دهم 
مثال :

اطلاعات درون جدول :

NO-------nod
1-----------12
1-----------15
1-----------24
2-----------13
2-----------27
2-----------35

حال می خواهم جدول فوق را به صورت زیر نمایش دهم در adoquery :

Number1---------Number2
13---------------------12
27---------------------15
35---------------------24

هر یک از ستون های Number1 یا Number2 به راحتی با یک دستور select قابل دریافت هستند اما دو تا ستون را چه جوری در یک adoquery قرار دهم :

Select No as Number1 from table1 where nod=1    این دستورات ستون اول را در adoquery فراهم می کند

Select No as Number2 from table1 where nod=2   این دستورات ستون دوم را در adoquery فراهم می کند

اما نمی توانم هر دو دست دستور select  را با هم به کار ببرم 

در اصل می خواهم برای انتخاب هر فیلد جدول اصلی یک دستور WHERE جداگانه به کار ببرم

و فقط می دانم در اوراکل چنین دستور وجود دارد : DECODE


ایها الناس کمک کنید خدا عوضشو بهتون بده ( الهی آمین )   :?

----------


## سار

همون Select ها تو در تو که براتون نوشتن باید جواب بده
DBMS چی هست؟
یه چیزی شبیه این باید جواب بده.
من ساختار جداول رو درست نمیدونم برای همین خودت شرطهات رو درست کن توش

Select No as Number1 from table1 where &#40;nod in &#40;select * from table where=Expr&#41;&#41; and 
          &#40;nod in &#40;select * from table where =Expr&#41;&#41;

----------


## hmm

اقا شما باید از union استفاده کنی

----------


## s_q

چه errori میده؟ از چه بانک اطلاعاتی استفاده میکنید؟

----------


## delphiman00

نمی توانم از عدهخد استفاده کنم چون تمام مقادیر در یک ستون (فیلد) نمایش داده می شوند


از بانک ACCESS استفاده می کنم


این هم پیغام خطا :

*At most one record can be returned by this subquery*


 :cry:  :cry:  :cry:

----------


## delphiman00

اصلاح می کنم 
نمی توانم از union استفاده کنم چون تمام مقادیر در یک ستون (فیلد) نمایش داده می شوند


در ضمن جناب سار عزیز :

فرض کنیم با این شرط و شروطها NO as Number1 شد ... بقیه No ها را چه کنم که شروط دیگری دارند ؟!!

 :skull:  :skull:  :skull:

----------


## phantasm

جناب delphiman00.

من روی این موضوعی که شما فرمودید خیلی فکر کردم.چون برای خودم هم سوال بود !!!
ولی متوجه شدم از sql (استاندارد ANSI) که access و چندتا DBMS دیگه به عنوان DML ساپورت میکنن نمیشه مثله PL/SQL که اوراکل ازش حمایت میکنه و به برنامه نویس اجازه میده تا پرس و جو های روالمند بنویسه استفاده کرد!!!
حتی نمیشه برای column های مختلف یه dbgrid هم پرس و جو های متفاوتی تعریف کرد...
از طریق پارامتر ها هم به نتیجه مثبتی نرسیدم البته به صورت تئوری باید با این روش حل بشه ولی متاسفانه در عمل نمیشه.
به هر حال "به نظر من" برای جواب گرفتن به فکر راه دیگه ای باش (تغیر بانک به اوراکل یا تغیر ساختار جداول یا ...)

----------


## baabi

سلام 
به نظر من یه راه حل دیگه هم وجود داره و اون هم جدا کردن و ریختن اطلاعات روی دو تا Table به صورت موقت هست. به این صورت که :

insert into temp2&#40; no , r&#41;
select  no , runsum&#40;1&#41;
from source 
where nod=1

 و 


insert into temp2&#40; no , r&#41;
select  no , runsum&#40;1&#41;
from source 
where nod=2


بعد از اون هم از این دستور


select temp1.no , temp2.no 
from temp1,temp2
where
temp1.r1=temp1.r2

----------


## سار

> در ضمن جناب سار عزیز :
> 
> فرض کنیم با این شرط و شروطها NO as Number1 شد ... بقیه No ها را چه کنم که شروط دیگری دارند ؟!!
> 
>  :skull:  :skull:  :skull:


ادامه همون باقی شرطهات رو هم بنویس.
من دارم یواش یواش فکر میکنم طراحیت مشکل داره.
چرا یک مسئله اینقدر باید اذیت کنه آخه؟!
اصلا چه دلیلی برای این کار هست.
مشیه مسئله رو کامل شرح بدی؟

----------


## delphiman00

از کمک تمام دوستان متشکرم




> به هر حال "به نظر من" برای جواب گرفتن به فکر راه دیگه ای باش (تغیر بانک به اوراکل یا تغیر ساختار جداول یا ...)


1- تغییر بانک الان کمی برایم مشکل است و فکر نمی کنم برای برنامه من آنقدر ضرورت داشته باشد اما با تغییر ساختار جداول مشکلی ندارم فقط نمی توانم چه کار کنم ؟!





> به نظر من یه راه حل دیگه هم وجود داره و اون هم جدا کردن و ریختن اطلاعات روی دو تا Table به صورت موقت هست.


2- قابل ذکر است که در این صورت من باید 25 جدول مختلف داشته باشم چون 25 ستون مجزا می خواهم




> من دارم یواش یواش فکر میکنم طراحیت مشکل داره. 
> چرا یک مسئله اینقدر باید اذیت کنه آخه؟! 
> اصلا چه دلیلی برای این کار هست. 
> مشیه مسئله رو کامل شرح بدی؟


3- من اصلا آدم مغروری نیستم لذا قبلا هم در این سایت تحت تاپیک "انتخاب بانک مناسب" در مورد نحوه طراحی جداولم کسب نظر کردم اما کسی جواب نداد ولی من می خواهم مشکلم حل بشود و حالا که دوستان خوبی چون شما زحمت می کشند و وقت می گذارند من هم کل قضیه را توضیح می دهم

*برنامه من :* برنامه کارنامه مخصوص مدارس راهنمایی است.
*زبان برنامه نویسی :* حتما خودتون می تونید حدس بزنید! :lol: 
*موتور بانک اطلاعاتی :* ADO
*بانک اطلاعاتی :* ACCESS

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

2- جدول نمرات : در این جدول نمرات دروس مختلف دانش آموزان نگهداری می شود ( که کاملا در مورد آن توضیح خواهم داد )
3- جدول نتایج : در این جدول نتایج حاصل از تمامی محاسبات لازم از قبیل معدل ها رتبه ها و آمارهای مختلف نگهداری می شود

*جدول نمرات :*

من ابتدا جدول نمرات را ثابت طراحی کرده بودم یعنی یک فیلد شماره دانش آموزی و 25 فیلد مربوط به 25 درس موجود به صورت زیر :
شماره دانش آموزی - فیلد1-فیلد2-فیلد3-فیلد4-...-فیلد25
75142307-19.5-20-17-14.75-...-18

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

لذا جدولم را عوض کردم و به صورت زیر در آوردم ( همانی که من با آن مشکل دارم )
به جای 26 فیلد بالا : فقط از سه فیلد استفاده کردم : 1- فیلد شماره دانش آموزی 2- فیلد شماره درس 3- فیلد نمره
شماره دانش آموزی - شماره درس - نمره
75142307-1-20
75142307-2-19
75142307-3-18.5
75142308-1-17
75142308-2-15
75142308-3-19
...
در این جدول اولا مشکل تعداد درس ثابت ندارم هر تعداد که بخواهم به انتهای جدولم اضافه می کنم
ثانیا در هنگاه چاپ چون طبق کارنامه نمرات زیر هم هستند مسئله پیچیدگی کارنامه ام تا حد زیادی کاهش پیدا می کند

اما مشکل این است : که در مدارس یک لیست به نام "لیست مادر " تهیه می کنند که ساختار آن به صورت جدول اولی من است یعنی اسم دانش آموز و تمامی نمرات دروس مختلف جلوی آن :
1- امین معدندار  20-19.5-18-14-....-18
2- ...
برای همین است که من می خواهم نمرات برا حسب شماره درس آن ها تفکیک کنم و در جدول جدیدم هر یک را در یک ستون مجزا بریزم

 :evil:  :evil:  :evil: 
حالا یا یک راه درست و حسابی به من نشان بدهید یا یک ساختار درست جدول ( ببخشید دیگه خسته شدم شاید باورتون نشه 4 ماه دنبال جواب میگردم چیزی دستگیرم نمیشه و در ضمن ظاهرا اصل پروژه را هم از دست دادم یعنی پول و ... اما من می خواهم این کار را به سرانجام برسانم پس *کمکم کنید* :flower:

----------


## delphiman00

من نمی دونم این رئیس رؤسا کجا هستند چرا جواب ما را نمی دهند . :-x 
یک شاخه  :flower: برای تمامی رئیس و رؤسا؟!

یادی هم کنیم از پیر غلام مکتب دلفی که مدت هاست ازشون خبری نداریم : _جناب اینپرایز_  :( 

ظاهرا تا حل مشکل مجبورم از این حرف ها بزنم !!! :P

----------


## سار

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

----------


## سار

خوب ببین اون اول باید هم تغییر میدادی چون اصلا نرمال نبوده.
طراحی دومت بهتره.
باید برای اینکار از فرمهای Master & Details استفاده کنی.
من یه سمپل برات میفرستم اگر باز هم مشکلی بود بگو تا تکمیلش کنم.
البته در مورد Queryیش سمپل میفرستم.

به عکس هم دقت کن یه نمومنه از Master & Detail هست.
دوتا Query مسازی بعد از طریق کد دانشآموز این دو رو به هم مربوط میکنی.
query اولی مشخصات دانش آموز و دومی دروسش.
تو چاپ هم عین همینه.

----------


## JavanSoft

طراحی شما تا حدود زیادی درست بوده است 
اما مشکلی که دارید اینست که می خواهید 90درجه پایگاه را بچرخانید 
از انجایی که پایگاه شما دارای ساختار متغیر نیست براحتی اینکار امکانپذیر نمی باشد اما از طریق ساخت یک پایگاه موقت می توانید ساختار پایگاه "لیست مادر " را طراحی و سپس با کمک دستورات Sqlو یا  با حلقه های While و Filterکردن نتایج را در پایگاه لیست مادر ثبت کنید و سپس با ارائه یک گزارش ثابت قضیه را خاتمه بدهید 

اگر در توضیحاتم مشکلی هست بفرمایید تا توضیح دهم .

پانوشت : مدیران این سایت نه پولی بابت فعالیت دریافت می کنند نه اینکار استفاده ای برای انها دارد (و نه شما برای پاسخگویی چیزی پرداخت میکنید ). آنها هم مثل خو د شما  افراد عادی هستند که در این سایت به منظور کمک به دیگران جمع شده اند . پس خواهش می کنم نه از کسی انتظاری داشته باشید نه  فکر کنید با زدن این حرفها کسی مشکل شما را حل می کند

----------


## delphiman00

سار عزیز امیدوارم شما هم آنقدر مشغول بشوید که وقت پاسخوگویی به مشکلات مرا نداشته باشی ( الهی آمین )

از لطف شما ممنون برنامه تان را اجرا کرده و بعد نتیجه را خواهم گفت


آقای وکیلی دیشب دقیقا همان کاری را که شما گفتید انجام دادم و نتیجه گرفتم از لطف شما ممنون.




> مدیران این سایت نه پولی بابت فعالیت دریافت می کنند نه اینکار استفاده ای برای انها دارد (و نه شما برای پاسخگویی چیزی پرداخت میکنید ). آنها هم مثل خو د شما افراد عادی هستند که در این سایت به منظور کمک به دیگران جمع شده اند . پس خواهش می کنم نه از کسی انتظاری داشته باشید نه فکر کنید با زدن این حرفها کسی مشکل شما را حل می کند


جناب وکیلی :
اولا :  بله من پولی بابت پاسخگویی ها به کسی نمی دهم اما سعی می کنم حداقل با سواد اندکم پاسخ بعضی از سؤالات را بدهم تا تا حدی دینم را ادا کرده باشم

ثانیا : شما نه جواب بده نه منت بگذار من همیشه از پاسخگویی و توجه همه دوستان ممنون بودم و از کسی توقع نداشتم در جملاتم هم فقط شوخی کردم اما ظاهرا شما درک نکردید و به شما برخورده

ثالثا :اگر من اسم کسی را آوردم نه اینکه از ایشان وتقع بیجا دارم نه. بلکه با اینکه من ایشان را نمی شناسم و فقط اسم مستعار ایشان می دانم اما یکی از افتخارات خود آشنایی با چنین فرد فرهیخته ای می دانم من بسیاری از مطالب دلفی را از همین جناب اینپرایز یاد گرفتم در ( barnamenevis.com) و اگر هم اسم ایشان را آوردم چون واقعا حضور ایشان در فروم دلگرمی خاصی به خود بنده می دهد من ایشان را دوست دارم به ایشان احترام می گذارم و امیدوارم هر کجا هستند موفق باشند اگر هم وقت ندارند سری به ما بزنند دلیل نمی شود که من یادی از ایشان نکنم اگر خیلی ناراحت می شوید توی هر تاپیکی که اسم ایشان را آوردم آن تاپیک را حذف کنید 


خلاصه اگر کمی با دقت جملات قبلی مرا مرور کنید متوجه منظور من خواهید شد

در ضمن من جناب اینپرایز را یک فرد عادی مثل خودم نمی دانم ایشان حداقل در زمینه کامپیوتر استاد من هستند

باز هم شاخه  :flower: ی تقدیم به تمام رؤسا ( منظورم به شما هم هست جناب آقای محمد وکیلی )

----------


## Mohammad S

> خوب ببین اون اول باید هم تغییر میدادی چون اصلا نرمال نبوده.
> طراحی دومت بهتره.


دوست عزیز می توانید بفرمایید که چرا طراحی اول ایشان خوب نبوده؟  با توجه به اینکه تمام دانش آموزان برای تمام دروس نمره دارند اگر از طرح اولی استفاده شود، هر رکورد حداقل 26 ستون دارد که همه آنها هم پر خواهد شد. در طرح دوم برای 25 درس یک دانش آموز 25 مرتبه شماره دانش آموزی او و همچنین کد درس آمده که مجموعا 75 فیلد خواهد گرفت. از نظر فضای ذخیره سازی  که مشخص است بیشتر جا می گیرد. پس چرا طرح دوم بهتر یا به قول شما نرمال است. اصولا کمی در مورد نرمال توضیح دهید و اینکه به چه طراحی نرمال می گوییم؟ اگر ممکن است کمی هم در رابطه با Master/Detail توضیح دهید و اینکه چه کاربردی دارد و چگونه ساخته می شود؟

با تشکر :?:

----------


## سار

> من ابتدا جدول نمرات را ثابت طراحی کرده بودم یعنی یک فیلد شماره دانش آموزی و 25 فیلد مربوط به 25 درس موجود به صورت زیر : 
> شماره دانش آموزی - فیلد1-فیلد2-فیلد3-فیلد4-...-فیلد25 
> 75142307-19.5-20-17-14.75-...-18


این خود نشانه نرمان نبودن هست.
این جدول دارای افزونگی میباشد که هیچ دلیلی برای این کار نیست.
اگر DB من رو دانلود کنید میبید که ساختار به شکل زیر میباشد :

1) جدول اطلاعات پایه دانش آموز(کد و غیره)
2) جدول اطلاعات دروس(کد و نام و واحد و ....)
3) جدول نمرات(کد دانش آموز،کد درس، نمره)
که البته در جدول سوم هر سه فیلد کلید است.
این جدول افزونگی بسیار کمتری نسبت به حالت قبل داره.
درنظر بگیرید که عدد فضای کمتری از رشته میگیرد.
مثلا تکرار 2 بار کد درس به مراتب فضای کمتری از تکرار دو بار نام درس خواهد گرفت.
برای اطلاعات بیتر رجوع کنید به کتاب مفاهیم بنیادی پایگاه داده ها - اثر روحانی رانکوهی - بخش فرمهای نرمان

درمورد Master & Details عرض شود که :
در جاهایی مانند این یا همون نمونه ای که من عکسش رو گذاشتم نمیشه مثلا شما تو یک سطر همه اطلاعات پایه فاکتور و هم اقلام کالای درون فاکتور رو داشته باشی.
به همین جهت از فرمهای Master & Details  استفاده میشه.
که نحوه ساختش رو هم قبلا گفتم.

----------


## Mohammad S

> مثلا تکرار 2 بار کد درس به مراتب فضای کمتری از تکرار دو بار نام درس خواهد گرفت.


قرار نیست که نام درس ذخیره شود. ما می دانیم که فیلد 5 درس ریاضی است و نمره ای که به آن وارد یا از آن خوانده می شود هم نمره درس ریاضی است. البته قبول دارم که این ساختار ثابت است یعنی اگر درس جدیدی اضافه شد،‌ ساختار بانک هم عوض خواهد شد (هر چند که تغییر چندانی ندارد فقط یک یا چند فیلد دیگر اضافه می شود) البته این ساختار مشکلاتی دارد نظیر اینکه اگر مشخصاتی از یک درس لازم بود جایی برای ذخیره سازی آن ندارد. ولی به هر حال گاهی اوقات مثل اینجا که به ندرت ساختار عوض خواهد شد به نظر شما همان طرح اولی افزونگی کمتری نداشت؟  :idea:

----------


## سار

> مثلا تکرار 2 بار کد درس به مراتب فضای کمتری از تکرار دو بار نام درس خواهد گرفت.
> 			
> 		
> 
> البته قبول دارم که این ساختار ثابت است یعنی اگر درس جدیدی اضافه شد،‌ ساختار بانک هم عوض خواهد شد (هر چند که تغییر چندانی ندارد فقط یک یا چند فیلد دیگر اضافه می شود) البته این ساختار مشکلاتی دارد نظیر اینکه اگر مشخصاتی از یک درس لازم بود جایی برای ذخیره سازی آن ندارد.:idea:


این خودش دلیل نرمال نبودن.
باید آینده نگر بود.
نه؟

----------


## delphiman00

من با ACCESS 97 نتوانستم بانمک شما را باز کنم 2000 هم ندارم ؟!!!

----------


## سار

من با آفیس XP کار کردم.
باید همون ورژن رو داشته باشید.

----------


## F_Javadik

من چنین کاری را در Sql Server  انجام داده ام . اگر نیاز دارید برایتان بفرستم

----------


## delphiman00

اگر لطف کنید ممنون می شوم

Delphiman00@yahoo.com

----------


## idic1

به قدرت دلفی ایمان بیاورید و جواب هر سوالی را از کامپوننتهای آن بخواهید
خود دلفی جوابی درخور برای شما تدارک دیده و آن مجموعه کامپوننتهای Decision Cube میباشد که تنها کار آن همان پاسخ شماست و اصولا جهت تبدیل جداول دو بعدی به n بعدی به کارمیرود
از ضعفهای آن عدم پشتیبانی از Right to left میباشد و همچنین چاپ Grid  نهائی نیز به سادگی میسر نیست ( البته تا جائی که من اطلاع دارم )

----------


## delphiman00

حتما سری هم به این کامپوننت می زنم

متشکرم

----------

