PDA

View Full Version : مشکل با ساختار جدول



حمیدرضاصادقیان
سه شنبه 01 آبان 1386, 09:34 صبح
سلام خدمت اساتید.من یک جدول سند دارم . در این جدول ما اطلاعات سند را ذخیره میکنیم.
در این جدول ما 4 فیلد داریم که در اکثر گزارشات از این فیلدها استفاده میکنیم. sanad,rdf,bd_bs,price. کلید این جدول ترکیب دو فیلد sanad,rdf هست.زیرا امکان داره یک سند چندین ردیف داشته باشه.فیلد bd_bs اگر 1 باشد مقدار فیلد price برابر بدهکار و اگر برابر 0 باشد برابر بستانکار خواهد بود. حالا در گزارشات من با راهنمایی استاد ثباتی Query زیر رو نوشتم ولی وقتی که شماره سند تغییر میکند باز مقدار مانده رو درست محاسبه نمیکنه.
سوال اول: اگر میشه در رابطه با این query بنده رو راهنمایی بفرمایید.
سوال دوم: در مورد ساختار جدول اگر نظری دارید که performance بالاتر بره و سرعت گزارشات بیشتر بشه ممنون میشم راهنمایی بفرمائید.



select sanad,rdf,kol_n,moen_n,tafzil_n,disk1,date1,price, bd_bs,remainder= (select sum
(case when x.bd_bs = 0 then price else -price end)
from f_sanad x where x.sanad = t.sanad and x.rdf <= t.rdf)from f_sanad t
where kol_N=1
order by sanad, rdf



با تشکر

h_baqery
چهارشنبه 02 آبان 1386, 16:16 عصر
جدول اسناد مالی رو معملا به صورت (header Detail) یا (child parent) طراحی می کنند .
ساده تر اینجوریه که فیلدهایی که برای هر سند فقط یک هست رو در جدول header می زاری و بقیه مثل ردیفها یا همون به قول حسابدارها آرتیکل اسناد و ستونهای کد حساب و بدهکار و بستانکار رو در جدول Detail و این دو تا جدول رو با یک فیلد به هم JOIN می کنی .
برای Query بالا هم پیشنهاد می دم که برای ستونهای بدهکار یه view بسازی و برای بستانکارها هم یک view دیگر از روی این دو تا راحت تر می تونی دستورت رو اجرا کنی .
ولی بهتر که ستون بدهکار و بستانکار رو جدا کنی تا راحت با کم کردن جمع بدهکار از جمع بستانکار مانده رو بدست بیاری .

h_baqery
چهارشنبه 02 آبان 1386, 17:05 عصر
برای محاسبه مانده نیازی به فیلد های شماره سند و ردیف نداری و این دستور هم مشکلت رو حل می کنه :

select kol_n,moen_n,tafzil_n,sum(case when bd_bs=0 then price else -prise end)
from sanad
group by kol_n,moen_n,tafzil_n


البته اون query آقای ثباتی استفاده های بیشتری داره و میتونه یه view برای زدن کلیه گزارشهای دیگه است .

حمیدرضاصادقیان
چهارشنبه 02 آبان 1386, 20:33 عصر
ممنون از پاسختون.ولی دوست عزیز من میخوام مانده را برای هر ردیف محاسبه کنم.

SYNDROME
چهارشنبه 02 آبان 1386, 21:27 عصر
به نظر بنده برای مقدار بدهکار و بستانکار هر کدام یک فیلد مجزا تعریف کنید خیلی به شما در گزارش گیری ها(مرور حسابها ، تراز مقایسه ای ، گزارشات جامع و . . .) کمک می کند.
موفق باشید

حمیدرضاصادقیان
چهارشنبه 02 آبان 1386, 22:30 عصر
ممنون.البته من این کارو روی یک دیتابیس تستی انجام دادم.ولی همچنان در نوشتن گزارشی که عرض کردم مشکل دارم.
با تشکر

Amir_Safideh
جمعه 16 آذر 1386, 14:18 عصر
با سلام خدمت دوست عزیز
من فکر میکنم که برای شما بهتره که از Function استفاده کنید یعنی در قسمت User Defined Functions یه Function جدید با کد زیر بساز :


CREATE FUNCTION dbo.Remain (@Sanad Smallint,@Rdf Smallint,@Result Money)
RETURNS Money AS
BEGIN
Select @Result = (Sum(Case When bd_bs = 0 Then Price Else 0 End)) - (Sum(Case When bd_bs = 0 Then 0 Else Price End))
From f_sanad
Where sanad = @Sanad And rdf <= @Rdf
Return @Result

END


بعد توی کدی که خودت قبلا نوشتی منظورم همون کوئری که در بالا ذکر کرده بودی این تغییر رو بده :


select sanad,rdf,kol_n,moen_n,tafzil_n,disk1,date1,price, bd_bs,(dbo.Remain(sanad,Rdf,0))Remainder
where kol_N=1
order by sanad, rdf


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

SYNDROME
جمعه 16 آذر 1386, 16:54 عصر
کاربر گرامی Amir_Safideh
به تاریخ آخرین پست نگاه کنید.
موفق باشید

Amir_Safideh
دوشنبه 19 آذر 1386, 11:12 صبح
با سلام به دوست عزیزم که به من تذکر دادن که به تاریخ آخرین پست نگاه کنم . من درست منظور شما رو نفهمیدم اگر منظورتون اینه که دیگه برای جواب دادن دیره باید خدمتون عرض کنم که به دو دلیل این جواب رو دادم یکی این که من دیدم دوستی که این سوال رو مطرح کرده بود طبق چیزی که خود ایشون نوشتن هنوز این مشکل رو دارن و دوم این که حتما در اینده دوستانی با این مشکل برخورد خواهند کرد و به دنبال راه حل این مشکل به اینجا سری خواهند زد گفتم شاید این ایده من یه کمکی بهشون بکنه .
---------------------------
قربون همه بچه های با صفای ایران .