نمایش نتایج 1 تا 9 از 9

نام تاپیک: مشکل با ساختار جدول

  1. #1

    مشکل با ساختار جدول

    سلام خدمت اساتید.من یک جدول سند دارم . در این جدول ما اطلاعات سند را ذخیره میکنیم.
    در این جدول ما 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



    با تشکر

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

  3. #3
    برای محاسبه مانده نیازی به فیلد های شماره سند و ردیف نداری و این دستور هم مشکلت رو حل می کنه :
    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 برای زدن کلیه گزارشهای دیگه است .

  4. #4
    ممنون از پاسختون.ولی دوست عزیز من میخوام مانده را برای هر ردیف محاسبه کنم.

  5. #5
    کاربر دائمی آواتار SYNDROME
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    تهران
    پست
    2,814

    با سلام

    به نظر بنده برای مقدار بدهکار و بستانکار هر کدام یک فیلد مجزا تعریف کنید خیلی به شما در گزارش گیری ها(مرور حسابها ، تراز مقایسه ای ، گزارشات جامع و . . .) کمک می کند.
    موفق باشید

  6. #6
    ممنون.البته من این کارو روی یک دیتابیس تستی انجام دادم.ولی همچنان در نوشتن گزارشی که عرض کردم مشکل دارم.
    با تشکر

  7. #7
    با سلام خدمت دوست عزیز
    من فکر میکنم که برای شما بهتره که از 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


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

  8. #8
    کاربر دائمی آواتار SYNDROME
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    تهران
    پست
    2,814

    با سلام

    کاربر گرامی Amir_Safideh
    به تاریخ آخرین پست نگاه کنید.
    موفق باشید

  9. #9
    با سلام به دوست عزیزم که به من تذکر دادن که به تاریخ آخرین پست نگاه کنم . من درست منظور شما رو نفهمیدم اگر منظورتون اینه که دیگه برای جواب دادن دیره باید خدمتون عرض کنم که به دو دلیل این جواب رو دادم یکی این که من دیدم دوستی که این سوال رو مطرح کرده بود طبق چیزی که خود ایشون نوشتن هنوز این مشکل رو دارن و دوم این که حتما در اینده دوستانی با این مشکل برخورد خواهند کرد و به دنبال راه حل این مشکل به اینجا سری خواهند زد گفتم شاید این ایده من یه کمکی بهشون بکنه .
    ---------------------------
    قربون همه بچه های با صفای ایران .

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •