PDA

View Full Version : مشکل بخاطر ضرب دکارتی



Nick2k
دوشنبه 28 خرداد 1386, 15:51 عصر
با سلام اول بگم من خیلی جستجو کردم ولی راه حلهایی که بود مشکلم را حل نکرد. من می خوام داده های دو جدول به نام پرداخت و دریافت را به صورت ستونی کنار هم چاپ کنم و رکوردهای با تاریخ یکسان در یک ردیف کنار هم قرار بگیرند. ستونهای این دو جدول مشابه است و قابل union کردن می باشد فقط مشکل اینجا است که داده ها باید ستونی کنار هم باشند به همین جهت دو جدول را روی ستون تاریخ full outer join کردم و مشکل بخاطر ضرب دکارتی رکوردهای با تاریخ یکسان پیش آمده است یعنی اگر در تاریخ 10/2/86 دو رکورد در جدول دریافت و سه رکورد در جدول پرداخت وجود داشته باشند ، در خروجی شش ردیف دیده میشود بجای سه ردیف. اگر دوستان راه دیگری به نظرشان میرسد لطفا دریغ نکنند چون من بخاطر این مشکل نتوانستم از crystal report استفاده کنم و سرعت گزارشگیری خیلی پایین آمده است.

whitehat
دوشنبه 28 خرداد 1386, 19:01 عصر
وقتی که دو پرداخت و سه دریافت داشته باشید چگونه می خواهید آنها را نمایش دهید؟ (نمی توانید از جمع در یافت و پرداخت ها را در یک روز داشته باشید؟ یعنی Group By بر اساس روز)

اگر راه حل بالا را نمی توانید استفاده کنید یک بار Left join استفاده کنید و آنرا با Right Joinی که دارای شرط عدم تکرار در Left Join است Union کنید.اگر مشکلی در این مورد دارید ساختار جداول را بنویسید تا Query را بنویسم

Nick2k
دوشنبه 28 خرداد 1386, 20:26 عصر
با تشکر از توجه شما. حرف شما صحیح است من برای گروه بندی در گزارش ناچار شدم یک گروه روی تاریخ جدول اول و یک گروه روی تاریخ جدول دوم ایجاد کنم که مشکلات خودش را دارد. ولی در left join هم باز رکوردهای مربوط به یک تاریخ از دو جدول ، در هم ضرب میشوند. نمی دونم خوب منظورم را گفتم یا نه به هر حال ساختار جدول ها به این صورت است: دریافت (mydate,mablaq,sharh) و پرداخت هم همین فیلدها را دارد . خروجی گزارش باید مثل تصویر زیر باشد.

whitehat
دوشنبه 28 خرداد 1386, 22:12 عصر
من متوجه منظور شما در مورد گزارش نشدم( آیا می توانید خروجی تولید شده را بنویسید؟)
اما آیا دریافت پرداختی که در گزارش وجود داره از لحاظ منطقی ارتباطی با هم دارند؟یا صرفا فقط باید کنار هم نمایش داده شوند.
سوال دوم اینکه آیا قسمتهای آبی رنگ باید در Query آورده شود؟

Nick2k
سه شنبه 29 خرداد 1386, 01:51 صبح
ببخشید من خوب توضیح ندادم. تصویر گزارشی که در پست قبلی ارسال کردم مربوط به نتیجه نهایی مورد نظر بود که من با استفاده از ارتباط اکسل و سی شارپ (ماکروهای اکسل)ایجاد می کنم ولی وقتی گزارش سالانه میگیرند حدود پانزده دقیقه گزارشگیری طول میکشد. به همین جهت خواستم با استفاده از یک کوئری داده ها را به کریستال ریپورت ارسال کنم که سرعت بیشتر شود.
متاسفانه دو جدول دریافت و پرداخت از لحاظ منطقی ارتباطی ندارند و فقط باید رکوردهای با تاریخ یکسان از دو جدول کنار هم باشند.
قسمتهای آبی که مربوط به جمع روزانه است نیازی نیست در کوئری بیاید. در کریستال ریپورت با استفاده از گروه تقریبا داره درست میشه. یک تصویر از خروجی کریستال ریپورت و مشکل تکرار به صورت زیر است. درتاریخ 28/01/86 دو رکورد دریافت و سه رکورد پرداخت وجود داشته که ضرب آنها شش ردیف شده است. البته قسمتهای Bold و مجموعها در کوئری نیستند و هنوز کامل درست نشده اند. در این تصویر در قسمت شرح، جزئیات دریافت و پرداخت نشان داده شده است.

whitehat
سه شنبه 29 خرداد 1386, 17:41 عصر
با توجه به اینکه دو سطر هیچ ارتباط منطقی بین آنها وجود ندارد شما نمی توانید از Join استفاده کنید ،شما باید برای این کار کمی برنامه نویسی کنید. مثلا یک جدول را در جدول موقتی که خروجی گزارش شما از آن بدست می آید بریزید سپس به ترتیب رکورد های جدول دوم را خوانده و در جلوی سطرهای جدول اول قرار دهید و در هر جا لازم است رکورد درج کنید.
یک روش نصفه نیمه استفاده از Query زیر است


Select mydate
,mablagh As MablaghDaryafti
,Sharh As SharhDaryaft
,Null As MablaghPardakhti
,Null As SharhPardakhti
From Daryaft
union
Select mydate
,Null As MablaghDaryafti
,Null As SharhDaryaft
,Mablagh As MablaghPardakhti
,Sharh As SharhPardakhti
From Pardakht