PDA

View Full Version : جستجو در دیتا بیس با شرایط خاص



mehdi4467
جمعه 19 شهریور 1389, 14:14 عصر
سلام من در #C یک دیتا بیس access دارم که می خواهم به صورت زیر اطلاعات را بیرون بکشم: من در یک ستون تاریخ و ساعت را دارم مثلا به این شکل 13890601231021 یعنی شش رقم سمت راست ساعت و هشت رقم سمت چپ تاریخ است. یک ستون دیگر هم به نام مبلغ دارم که جلوی هر تاریخ مقدار مربوطه نوشته شده است. حالا فرض کنید من سه عدد در ستون تاریخ دارم که تاریخ هایشان یکی است ولی ساعتشان یکی نیست مثلا به صورت زیر:

13890601101020
13890601170010
13890601195510

حالا من می خواهم یکی یکی ردیف های بالا را بخوانم و عدد ستون مقابل هریک را ذخیره کنم. با چه شرطی می توانم سطر اول را بخوانم و عدد ستون مبلغ را دخیره کرده و سپس سطر دوم و بعد از آن سطر سوم را بخوانم؟

اَرژنگ
جمعه 19 شهریور 1389, 14:21 عصر
سلام من در C#‎ یک دیتا بیس access دارم که می خواهم به صورت زیر اطلاعات را بیرون بکشم: من در یک ستون تاریخ و ساعت را دارم مثلا به این شکل 13890601231021 یعنی شش رقم سمت راست ساعت و هشت رقم سمت چپ تاریخ است. یک ستون دیگر هم به نام مبلغ دارم که جلوی هر تاریخ مقدار مربوطه نوشته شده است. حالا فرض کنید من سه عدد در ستون تاریخ دارم که تاریخ هایشان یکی است ولی ساعتشان یکی نیست مثلا به صورت زیر:

13890601101020
13890601170010
13890601195510


حالا من می خواهم یکی یکی ردیف های بالا را بخوانم و عدد ستون مقابل هریک را ذخیره کنم. با چه شرطی می توانم سطر اول را بخوانم و عدد ستون مبلغ را دخیره کرده و سپس سطر دوم و بعد از آن سطر سوم را بخوانم؟



این مثال خوبی از استفاده از روشهایه اشتباه است، به جایه تبدیل تاریخ به رشته و نگهداریش به این شکل از فیلد نوع تاریخ باید استفاده میشد.
به استفاده از like در اکسس نگاه بندازید.

mehdi4467
جمعه 19 شهریور 1389, 14:34 عصر
سلام
ممنون از پاسختون.
من به صورت تاریخ هم در دیتا بیس دارم. مشکل اصلی من حرکت رو سه سطر بالاست. فرض کنید فیلد ورودی من برای شرط فقط تاریخ باشد. خالا چطور می تونم اول مقداری رو بخونم که زمانش هم کمتر است و همینطور به ترتیب برم جلو؟

اَرژنگ
جمعه 19 شهریور 1389, 15:11 عصر
سلام
ممنون از پاسختون.
من به صورت تاریخ هم در دیتا بیس دارم. مشکل اصلی من حرکت رو سه سطر بالاست. فرض کنید فیلد ورودی من برای شرط فقط تاریخ باشد. خالا چطور می تونم اول مقداری رو بخونم که زمانش هم کمتر است و همینطور به ترتیب برم جلو؟
به استفاده از Order By در اکسس نگاه بندازید.
من مشکلتان را درک نمیکنم، با DateTime ، Whereو Order By میتوانید یک تاریخ بخصوص را انتخاب کنید و مقادیر را به شکل سورت شده بگیرید، احتیاجی به استفاده از رشته نمیبینم، ولی شاید من مشکل شما را متوجه نشدم ، اگر حرفهایه که زدم برایتان مفهومی ندارد بگید بیشتر توضیح بدم.

mehdi4467
جمعه 19 شهریور 1389, 16:04 عصر
سلام
فرض کنید کاربر تاریخ 13890101 را وارد می کند . ما سه ردیف با تاریخ 13890101 و مقادیر مختلف برای این تاریخ خا داریم به شکل زیر:

200 13890101
250 13890101
100 3890101

حالا من تاریخی رو که از کاربر در متغیر date گرفتم در کوئری زیر میریزم:
string bedehkar = select meghdar from table where date = date
حالا با احرای کوئری فوق اولین عدد یعنی 200 بر گردانه میشه. خالا که می خواهم یروم و مقدار سطر بعدی را بدست می آورم، نمی توانم.

اَرژنگ
جمعه 19 شهریور 1389, 16:10 عصر
سلام
فرض کنید کاربر تاریخ 13890101 را وارد می کند . ما سه ردیف با تاریخ 13890101 و مقادیر مختلف برای این تاریخ خا داریم به شکل زیر:

200 13890101
250 13890101
100 3890101


حالا من تاریخی رو که از کاربر در متغیر date گرفتم در کوئری زیر میریزم:



string bedehkar = select meghdar from table where date = date


حالا با احرای کوئری فوق اولین عدد یعنی 200 بر گردانه میشه. خالا که می خواهم یروم و مقدار سطر بعدی را بدست می آورم، نمی توانم.






۱.گفتیم از order by استفاده کنید که رکوردها سورت باشد.
۲.اگر میتونید سورس پروژه را بفرستید درست کنیم

mehdi4467
جمعه 19 شهریور 1389, 23:02 عصر
سلام
من برنامه رو ضمیمه کرده ام.
من می خواهم وقتی کاربر تاریخ 13/2/89 رو وارد کرد چون در این تاریخ 5 تراکنش وجود دارد ابتدا مانده تا قبل از این تاریخ را محاسبه نماید ( که این کار را کرده ام) بعد بیاید ابتدا مانده روز قبل را + مبلغ بستانکار کند و بعد - مبلغ بدهکار و این مانده را در یک متغیر ذخیره کند. سپس این مبلغ را به عنوان مانده جدید بگبرد و با سطر بعدی هم همبن کار را بکند تا تراکنش های این روز تمام شود. امیدوارم توضیحاتم کامل بوده باشد.

اَرژنگ
شنبه 20 شهریور 1389, 10:13 صبح
سلام
ممنون از پاسختون.
من به صورت تاریخ هم در دیتا بیس دارم. مشکل اصلی من حرکت رو سه سطر بالاست. فرض کنید فیلد ورودی من برای شرط فقط تاریخ باشد. خالا چطور می تونم اول مقداری رو بخونم که زمانش هم کمتر است و همینطور به ترتیب برم جلو؟
ببخشید، شما گفتید که به شکل تاریخ هم در داتابیس دارید ولی تمام فیلدها تکست هستند از
DataType : Date/Time برایه فیلدهایه زمانی استفاده میشه.
مقادیر را به شکل درست به تاریخ میلادی در یک فیلد Date/Time ذخیره کنید و داتابیس درست را بفرستید.

mehdi4467
شنبه 20 شهریور 1389, 13:02 عصر
سلام
من دیتا بیس رو تغییر دادم و برنامه رو پیوست کردم. البته قسمت ایجاد رکورد جدید رو هم گذاشتم.

اَرژنگ
شنبه 20 شهریور 1389, 15:21 عصر
سلام
من دیتا بیس رو تغییر دادم و برنامه رو پیوست کردم. البته قسمت ایجاد رکورد جدید رو هم گذاشتم.
دلیلی برایه از فیلد تکست به جایه فیلد دیت تایم استفاده میکنید هست؟
روش درست استفاده از دیت تایم هست که من تغییرش دادم.
ضمیمه شد.

mehdi4467
شنبه 20 شهریور 1389, 15:45 عصر
سلام
ممنون از جوابتون ولی من مشکام این نبود. در پست قبل تر هم گفتم: شاید باید بهتر توضیح بدم. الان شما مانده یک روز را محاسیه کرده اید و درست هم هست. ولی موضوع اینه که برای روزی که مثلا 3 تراکنش وجود داره نباید فقط مانده نهایی بدست بیاید بلکه باید مانده پس از هر ترا کنش بدست بیاید. که مانده پس از هر تراکنش می شود مانده قبلی + مقدار بستانکار - مقدار بدهکار.
مثلا فرض کنید برای تاریخ 2010/09/11 تراکنش های زیر وجو دارد.


tr_date tr_bedehkar tr_bestankar
2010/09/11 0 200
2010/09/11 100 0
2010/09/11 0 50 حالا من مقادیر زیر را نیاز دارم:
برای ردیف اول می شود

200-0 =200برای ردیف دوم می شود

200+0-100=100برای ردیف سوم می شود:

100+50-0 =150درواقع من عدد های 200 و 100 و 150 را نیاز دارم که بعدا روی آنها مینیمم گیری کنم.

mehdi4467
شنبه 20 شهریور 1389, 15:55 عصر
البته این رو هم بگم که این مقادیر باید براساس ساعتشون مرتب بشن. به خاطر همین من در تاریخ ساعت رو هم گذاشته بودم. به عنوان مثال تراکنش سطر اول در ساعت 8:00 تراکنش سطر دوم در ساعت 9:30 و تراکنش سطر سون در ساعت 11:45 دقیقه ثبت شده است.

اَرژنگ
شنبه 20 شهریور 1389, 15:57 عصر
سلام
ممنون از جوابتون ولی من مشکام این نبود. در پست قبل تر هم گفتم: شاید باید بهتر توضیح بدم. الان شما مانده یک روز را محاسیه کرده اید و درست هم هست. ولی موضوع اینه که برای روزی که مثلا 3 تراکنش وجود داره نباید فقط مانده نهایی بدست بیاید بلکه باید مانده پس از هر ترا کنش بدست بیاید. که مانده پس از هر تراکنش می شود مانده قبلی + مقدار بستانکار - مقدار بدهکار.
مثلا فرض کنید برای تاریخ 2010/09/11 تراکنش های زیر وجو دارد.


tr_date tr_bedehkar tr_bestankar




2010/09/11 0 200

2010/09/11 100 0
2010/09/11 0 50


حالا من مقادیر زیر را نیاز دارم:

برای ردیف اول می شود

200-0 =200برای ردیف دوم می شود

200+0-100=100برای ردیف سوم می شود:

100+50-0 =150درواقع من عدد های 200 و 100 و 150 را نیاز دارم که بعدا روی آنها مینیمم گیری کنم.

پس شما جمع تفاوتهایه هر سطر را میخواهید یا تفاوتهایه هر سطر را جداگانه به تعداد سطرها؟
در حالت اول مینیمم گیری معنی نمیده، ولی در حالت دوم میشه مینیمم مقدار تفاوتهایه سطرها.

mehdi4467
شنبه 20 شهریور 1389, 16:01 عصر
من تفاوت ها را جداگانه می خواهم. ولی چطوری میشه روی دیتا بیس مانده هر سطر را جدا گانه داشت وقتی تاریخ هایشان یکی هست؟

اَرژنگ
شنبه 20 شهریور 1389, 16:08 عصر
من تفاوت ها را جداگانه می خواهم. ولی چطوری میشه روی دیتا بیس مانده هر سطر را جدا گانه داشت وقتی تاریخ هایشان یکی هست؟

Select Field1-Field2 From Table

mehdi4467
شنبه 20 شهریور 1389, 16:15 عصر
Select Field1-Field2 From Table

متوجه نشدم.

اَرژنگ
شنبه 20 شهریور 1389, 16:37 عصر
متوجه نشدم.





SELECT trakonesh.tr_id, trakonesh.tr_bedehkar, trakonesh.tr_bestankar, trakonesh.tr_date_miladi, trakonesh.tr_bestankar-trakonesh.tr_bedehkar AS Expr1
FROM trakonesh
ORDER BY trakonesh.tr_date_miladi;




-----------------------------------------------------------------------------------------------------
| tr_id | tr_bedehkar | tr_bestankar | tr_date_miladi | Expr1 |
-----------------------------------------------------------------------------------------------------
| 88 | 0 | 100 | 9/01/2010 | 100 |
-----------------------------------------------------------------------------------------------------
| 87 | 450 | 0 | 9/01/2010 | -450 |
-----------------------------------------------------------------------------------------------------
| 86 | 200 | 0 | 9/01/2010 | -200 |
-----------------------------------------------------------------------------------------------------
| 85 | 0 | 2000 | 9/01/2010 | 2000 |
-----------------------------------------------------------------------------------------------------