PDA

View Full Version : مانده در خط دفاتر ( کل/معین/تفصیلی )



gilsoft
یک شنبه 07 اردیبهشت 1393, 23:13 عصر
سلام دوستان

ابتدا به تصویر و قطعه کد زیر نگاه کنید :


118420​
توجه : فیلدهای Deptor و Creditor در جدول موجود می‌باشند و بقیه‌ی فیلدها توسط قطعه کد زیر پُر می‌شوند !

Use TestDb

UPDATE tblsample SET Remaining = t1.Deptor - t1.Creditor
+ (Select TOP 1 SUM(t2.Deptor) - SUM(t2.Creditor)
FROM tblSample t2
WHERE t2.ID<=(t1.ID-1))
FROM tblSample As t1
WHERE t1.ID > 0
GO


UPDATE tblsample SET
RemainingD = CASE SIGN([Remaining]) WHEN 1 THEN [Remaining] ELSE 0 END ,
RemainingC = CASE SIGN([Remaining]) WHEN -1 THEN ABS([Remaining]) ELSE 0 END
FROM tblSample AS t1
WHERE t1.ID > 0
GO


SELECT [Deptor] As 'بدهکار'
,[Creditor] As 'بستانکار'
,[RemainingD] As 'مانده بدهکار'
,[RemainingC] As 'مانده بستانکار'
,ABS([Remaining]) As 'مانده'
,CASE SIGN([Remaining])
WHEN 1 THEN 'بد'
WHEN -1 THEN 'بس'
ELSE ' ' END As 'تشخیص'
FROM tblSample

در صورت وجود اولین رکورد (فلش آبی) مانده‌گیری بدرستی عمل مي‌کند و در غیر اینصورت نه ! :متعجب:

چه راهی وجود داره که اولین رکورد رو بصورت موقت به جدول اضافه کنم و پس از مانده‌گیری اونو حذف کنم .. ( رکورد مورد نظر حتما باید اولین رکورد در جدول باشد )

خواهشا کمکم کنید .... :بوس:

meisam12
دوشنبه 08 اردیبهشت 1393, 23:42 عصر
رکورد اول را حذف کنید و کوئری های زیر را بنویسید:

UPDATE tblsample SET Remaining =
(Select SUM(t2.Deptor) - SUM(t2.Creditor)
FROM tblSample t2
WHERE t2.ID<=t1.ID)
FROM tblSample As t1
WHERE t1.ID > 0
GO


UPDATE tblsample SET
RemainingD = CASE SIGN([Remaining]) WHEN 1 THEN [Remaining] ELSE 0 END ,
RemainingC = CASE SIGN([Remaining]) WHEN -1 THEN ABS([Remaining]) ELSE 0 END
FROM tblSample AS t1
WHERE t1.ID > 0
GO


SELECT [Deptor] As 'بدهکار'
,[Creditor] As 'بستانکار'
,[RemainingD] As 'مانده بدهکار'
,[RemainingC] As 'مانده بستانکار'
,ABS([Remaining]) As 'مانده'
,CASE SIGN([Remaining])
WHEN 1 THEN N'بد'
WHEN -1 THEN N'بس'
ELSE ' ' END As N'تشخیص'
FROM tblSample

علی فتحی
جمعه 16 خرداد 1393, 14:42 عصر
اینو با کوری نوشتی یا پروسیجر

amir20611
شنبه 17 خرداد 1393, 15:39 عصر
سلام ، از isnull استفاده کنی فکر کنم مشکل حل بشه

SUM(isnull(t2.Deptor,0)) - SUM(isnull(t2.Creditor,0))

gilsoft
دوشنبه 19 خرداد 1393, 06:42 صبح
اینو با کوری نوشتی یا پروسیجر

سلام دوست عزیز

فعلا با Query نوشتم

niknam_mh
جمعه 25 اردیبهشت 1394, 11:13 صبح
سلام
این مشکل راه حل خیلی راحتی داره که نیاز به نوشتن کوئری و پروسیجر نداره و با یک تابع حل می شه.

tooraj_azizi_1035
یک شنبه 27 اردیبهشت 1394, 08:52 صبح
سلام
از نسخه 2012 به بعد می تونید برای دستیابی به اولین رکورد تا یکی مانده به رکود فعلی به این صورت عمل کنید:

UPDATE tblsample
SET Remaining = Deptor - Creditor + ISNULL(SUM(Deptor) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) -
ISNULL(SUM(Creditor) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0 )
FROM tblSample


عبارت OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) یک Frame در داخل پنجره ای است که Over آن را ساخته که اولین رکورد تا یکی قبل از رکورد فعلی را به حساب می آورد، بدیهی است که مقدار دو تابع SUM برای رکورد اول NULL خواهد بود چون رکورد قبلی وجود ندارد و مشکل وابستگی به وجود رکورد اول نیز مرتفع می شود و از نظر Performance هم برد می کنید.

mehdi.fni
سه شنبه 29 اردیبهشت 1394, 14:09 عصر
سلام به همه
عزیزان یک فیلد تاریخ دارم day و یک فیلد مبلغ vajh که با منفی مثبت بدهکار بودن و بستانکار بودن آنرا مشخص میکنم تا از sum نتیجه کلی را در هر زمان بگیرم
حالا میشه براساس تاریخ و شرط منفی بودن ومثبت بودن گزارش گرفت سوالم اینه چطور گزارش بگیرم که تاریخ و مبلغ و ستون مانده را بنویسم که ستون مانده نتیجه جمع جبری سطرهای قبلی با سطر جاری را داشته باشیم ؟

tooraj_azizi_1035
سه شنبه 29 اردیبهشت 1394, 14:14 عصر
--2012 or later:
select day, vajh, sum(vajh) over(order by day) from yourtable

mehdi.fni
سه شنبه 29 اردیبهشت 1394, 14:24 عصر
--2012 or later:
select day, vajh, sum(vajh) over(order by day) from yourtable
زنده باشی من sql server 2008 دارم و دیگر اینکه پس از order by day باید ترتیب بدهکارها + بالاتر باشند و بستانکارها _ پایین تر
حالا چکار باید بکنم:گریه:

tooraj_azizi_1035
سه شنبه 29 اردیبهشت 1394, 14:29 عصر
لطفاً چند رکورد نمونه و خروجی مورد نظر رو قرار بدین.

mehdi.fni
سه شنبه 29 اردیبهشت 1394, 14:41 عصر
day
javh
Mvajh


94/01/01
10
10


94/01/12
-22
-12


94/01/15
2
-10


94/01/15
25
15


94/01/15
-35
-20



day,javh قبلا ثبت شده و نتیجه باید جدول فوق باشد

tooraj_azizi_1035
سه شنبه 29 اردیبهشت 1394, 15:04 عصر
Try this:

with cte (rownum, day, javh)
as
(
select ROW_NUMBER() over(order by day asc, sign(javh) desc) ,day, javh from yourtable
)
select day, javh, (select sum(
javh
) from cte where rownum<=t1.rownum) from cte t1

mehdi.fni
چهارشنبه 30 اردیبهشت 1394, 07:42 صبح
زنده باد یک دنیا ممنون
خود خودشه