PDA

View Full Version : ایجاد یک صورتحساب در sql2000



asadi.ir
یک شنبه 09 خرداد 1389, 15:46 عصر
سلام
من یک table دارم که در بین فیلدهاش فیلد بدهکاری و بستانکاری دارم. یک فیلد هم برای تاریخ گذاشتم که تاریخ بدهکاری یا بستانکاری رو نشون میده.
چه جوری میشه یک query نوشت که به ترتیب تاریخ بدهکاری ها و بستانکاری ها رو لیست کنه ولی یک ستونی هم برای مانده تولید کنه که مانده ی سطر قبل رو به بستانکاری سطر فعلی اضافه کنه و از بدهکاری سطر فعلی کم کنه و نتیجه رو در مانده سطر فعلی بذاره ؟
ممنون میشم جواب بدین

محمد سلیم آبادی
دوشنبه 10 خرداد 1389, 15:04 عصر
سلام،
برای اینکه بتوانم جواب دقیق بدهم لطفا یک نمونه از داده ها و یک نمونه از نتیجه ای که آرزویش را دارین را ارسال کنید (به شکل یک جدول - تصویر و...)

asadi.ir
سه شنبه 11 خرداد 1389, 08:31 صبح
یه نمونه از گزارش رو با table مربوطه گذاشتم

محمد سلیم آبادی
سه شنبه 11 خرداد 1389, 09:56 صبح
این را امتحان کنید:


SELECT transactionID,
date,
describtion,
CASE WHEN [pardakhti/daryafti] = 'Daryafti' THEN Mablagh ELSE 0 END AS [bestankar],
CASE WHEN [pardakhti/daryafti] = 'Pardakhti' THEN Mablagh ELSE 0 END AS [bedehkar],
(SELECT SUM(CASE [pardakhti/daryafti] WHEN 'Daryafti' THEN Mablagh ELSE Mablagh*-1 END)
FROM table_name t1
WHERE t1.date <= t2.date) AS Mandeh
FROM table_name t2
ORDER BY date;

asadi.ir
سه شنبه 11 خرداد 1389, 12:37 عصر
آقاممنون از کدتون و من عکس نتیجه اجرای کد رو براتون میفرستم. ستون بدهکاری و بستانکاری الان درسته و در نهایت مجموع مانده رو هم درست نشون میده ولی مقدار مانده توی هر سطر درست نیست.

محمد سلیم آبادی
سه شنبه 11 خرداد 1389, 14:45 عصر
این را امتحان کنید:

SELECT IDENTITY(INT, 1, 1) AS [Rank],
transactionID,
date,
describtion,
CASE WHEN [pardakhti/daryafti] = 'Daryafti' THEN Mablagh ELSE 0 END AS [bestankar],
CASE WHEN [pardakhti/daryafti] = 'Pardakhti' THEN Mablagh ELSE 0 END AS [bedehkar]
INTO #Temp
FROM table_name t2
ORDER BY date;

SELECT *,
(SELECT SUM(CASE [pardakhti/daryafti] WHEN 'Daryafti' THEN Mablagh ELSE Mablagh*-1 END)
FROM #temp t1
WHERE t1.[Rank] <= t2.[Rank) AS Mandeh
FROM #temp t2;

asadi.ir
جمعه 14 خرداد 1389, 11:31 صبح
ضمن تشکر مجدد از شما. یه سوال دیکه داشتم .
وقتی #temp ساخته میشه برای بار دوم دیگه نمیذاره کد اجرا بشه و میگه table وجود داره. وقتی هم از drop table #temp هم استفاده می کنم دفعه اول برای اجرا خطا میده میگه همچین table وجود نداره که پاک کنم.
این کد هم کار نمیکنه


IF object_id('dbname..#Temp') IS NOT NULL
BEGIN
DROP TABLE #Temp
END





لطفا راهنمایی کنید

محمد سلیم آبادی
جمعه 14 خرداد 1389, 11:37 صبح
میدونستم...

لیست تمام ستون هاتون همراه با data type اشون را ارسال کنید.

محمد سلیم آبادی
جمعه 14 خرداد 1389, 12:35 عصر
از اس پی زیر استفاده کنید فقط یک قسمت هست که باید Data type ها را طبق نوع داده های جدول اصلی تنظیم کنید اینرا به عهده خودتون گذاشتم.
اگر نیاز دارین این کوئری را با یک جدول دیگه جوین کنید ناچارین که یک TVF اونم از نوع multistatement ایجاد کنید. (در اینترنت جستجو کنید...)

CREATE PROC Querying AS
BEGIN
DECLARE @T TABLE
(
Ranking INT IDENTITY,
transactionID INT,
data VARCHAR(20),
describtion NVARCHAR(500),
bestankar REAL,
bedehkar REAL
);

INSERT INTO @T
SELECT transactionID,
date,
describtion,
CASE WHEN [pardakhti/daryafti] = 'Daryafti' THEN Mablagh ELSE 0 END AS [bestankar],
CASE WHEN [pardakhti/daryafti] = 'Pardakhti' THEN Mablagh ELSE 0 END AS [bedehkar]
FROM table_name t2
ORDER BY date;

SELECT *,
(SELECT SUM(CASE [pardakhti/daryafti] WHEN 'Daryafti' THEN Mablagh ELSE Mablagh*-1 END)
FROM @T t1
WHERE t1.[Rank] <= t2.[Rank) AS Mandeh
FROM @T t2;
END;

pezhvakco
دوشنبه 15 آذر 1389, 20:09 عصر
این روشی که جناب سلیم آبادی نوشتن در کار کردن مشکلی نداره ولی سرعت اجراش به نظر من خیلی پایین است .
برای مثال برای 6000 ردیف زمانی حدود 35 ثانیه نیاز داره .

از استادان و کاربران سایت کسی روشی بهینه تر داره ؟
برای ورژن های بالاتر Sql نیز اگر باشه مشکلی نیست .

گزارشی مانند شکل زیر :