PDA

View Full Version : گزارش نقل وانتقال سهام



karimh
سه شنبه 17 خرداد 1384, 17:53 عصر
سلام دوستان
من می خواه یه گزارش بسازم که حسابی توش موندم ...میشه کمکم کنین..... :گیج:


من دو تا جدول دارم یکی جدول سهامدارانStocker دومی جدول نقل و انتقال Trans
در جدول نقل و وانتقال سه فیلد دارم: 1-کدخریدار 0000 2-کدفروشنده ...3-مقدار سهم منتقل شده
که این جدول از طریق کد خریدار و فروشنده با جدول سهامدار ارتباط دارد ....
حال من میخواهم گزارشی بسازم که لیست خرید ها و فروش های هر سهامدار را به تفکیک افراد بدهد.یعنی برای هر سهامدار کلیه خرید ها و فروش هایش را پشت سر هم لیست کند.من میتونم این اطلاعات را تحت دو تا گزارش بدهم منتها تحت یک گزارش نتونستم
ضمنا من برای ساخت گزارش از ابزار Crystal Report استفاده میکنم....
مرسی :sunglass:

vadood
سه شنبه 17 خرداد 1384, 21:03 عصر
I am very interested in your project, cuz it's kinda sotck related. Please PM me your phone number if you are interested in a talk.

karimh
چهارشنبه 18 خرداد 1384, 09:50 صبح
اون که حتما ..منتها اول باید گزارشو بسازم
اگه کمکم کنین خیلی ممنون میشم

majid_afra222
چهارشنبه 18 خرداد 1384, 13:02 عصر
سلام
برای اینکه یه همچینی گزارشی رو بسازی٬‌میتونی افزونگی داده رو در بانک اطلاعاتی نادیده بگیری (این کار در بعضی از سیستمها اعمال میشه) و جدول رو جوری طراحی کنی تا بتونی به نیازهای کاربران با سرعت بیشتری پاسخ بدی.
ببین افزونگی داده نداشتن در بانک برات مهم تره یا سرعت پاسخ دادن به مشتریها در حجمهای بالای داده هات.

خوب اگه بی خیال افزونگی شده بگو تا برای این مورد کمکت کنم.
البته راههای دیگه ای هم مثل انباره داده ها٬‌ olap و ...هم برای انجام کارات هستش که بعید می دونم بتونی پیاده سازی و استفاده کنی.

این کد رو هم یه نگاهی بنداز و اجراش کن


CREATE TABLE [dbo].[Table1] (
[id] [numeric](18, 0) NOT NULL ,
[name] [char] (10) COLLATE Arabic_CI_AS NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Table2] (
[id] [numeric](18, 0) NOT NULL,
[id_b] [numeric](18, 0) NULL ,
[id_s] [numeric](18, 0) NULL ,
[sahm_b] [numeric](18, 0) NULL ,
[sahm_s] [numeric](18, 0) NULL ,
[id_to_from] [numeric](18, 0) NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Table1] WITH NOCHECK ADD
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Table2] WITH NOCHECK ADD
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Table2] ADD
CONSTRAINT [FK_Table2_Table1] FOREIGN KEY
(
[id_b]
) REFERENCES [dbo].[Table1] (
[id]
),
CONSTRAINT [FK_Table2_Table11] FOREIGN KEY
(
[id_s]
) REFERENCES [dbo].[Table1] (
[id]
),
CONSTRAINT [FK_Table2_Table12] FOREIGN KEY
(
[id_to_from]
) REFERENCES [dbo].[Table1] (
[id]
)
GO
INSERT INTO TABLE1 VALUES(1,'ALI')
INSERT INTO TABLE1 VALUES(2,'REZA')
INSERT INTO TABLE1 VALUES(3,'YASER')
INSERT INTO TABLE1 VALUES(4,'HADI')
GO
INSERT INTO TABLE2 VALUES(1, NULL, 1, NULL, 100, 2)
INSERT INTO TABLE2 VALUES(2, 2, NULL, 100, NULL, 1)
INSERT INTO TABLE2 VALUES(3, NULL, 2, NULL, 50, 1)
INSERT INTO TABLE2 VALUES(4, 1, NULL, 50, NULL, 2)
INSERT INTO TABLE2 VALUES(5, NULL, 3, NULL, 70, 1)
INSERT INTO TABLE2 VALUES(6, 1, NULL, 70, NULL, 3)
GO
SELECT
LTRIM(RTRIM(
CASE
WHEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_B) IS NOT NULL THEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_B)
ELSE ''
END
+ CASE
WHEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_S) IS NOT NULL THEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_S)
ELSE ''
END
)) AS 'معامله کننده'
, CASE
WHEN SAHM_B IS NOT NULL THEN SAHM_B
ELSE NULL
END AS 'تعداد سهم خریداری شده'
, CASE
WHEN SAHM_S IS NOT NULL THEN SAHM_S
ELSE NULL
END AS 'تعداد سهم فروخته شده'
, (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_TO_FROM) AS 'از/به چه کسی'
FROM TABLE2 T2
ORDER BY 'معامله کننده'



امیدورام بدردت بخوره.

majid_afra222
چهارشنبه 18 خرداد 1384, 13:11 عصر
سلام
البته کد پرس و جوی بالا رو میشه اینجوری هم نوشت :


SELECT
LTRIM(RTRIM(
CASE
WHEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_B) IS NOT NULL THEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_B)
ELSE ''
END
+ CASE
WHEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_S) IS NOT NULL THEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_S)
ELSE ''
END
)) AS 'معامله کننده'
, CASE
WHEN (CASE
WHEN SAHM_B IS NOT NULL THEN SAHM_B
ELSE NULL
END) IS NOT NULL THEN 'خریداری شده'
ELSE 'فروخته شده'
END AS 'وضعیت انتقال سهام'
, CASE
WHEN (CASE
WHEN SAHM_B IS NOT NULL THEN SAHM_B
ELSE NULL
END) IS NOT NULL THEN (CASE
WHEN SAHM_B IS NOT NULL THEN SAHM_B
ELSE NULL
END)
ELSE (CASE
WHEN SAHM_S IS NOT NULL THEN SAHM_S
ELSE NULL
END)
END AS 'تعداد سهم معامله شده'
, (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_TO_FROM) AS 'از/به چه کسی'
FROM TABLE2 T2
ORDER BY 'معامله کننده', 'وضعیت انتقال سهام'

امیدوارم بدردت بخوره

karimh
چهارشنبه 18 خرداد 1384, 17:03 عصر
مجید جان سلام :تشویق:
بابت وقتی که گذاشتی ممنون
:kaf: اما من امکان تغییر صراحی بانکو ندارم ..بانک طراحی قبلا طراحی شده و من فقط می تونم اطلاعاتو واکشی کنم.

بازم از لطفت ممنون :sunglass:

majid_afra222
چهارشنبه 18 خرداد 1384, 18:31 عصر
سلام
پس بهتره وقتت رو برای انجام این کار با tsql تلف نکنی٬‌ اگه با اوراکل کار می کردی براحتی این کد رو برات با pl/sql می نوشتم.
یه راه برات میمونه٬‌یه جدول temp بساز و یه تابع که اونرو پر کنه بعد اونرو بخون و تو گزارشت بکار ببر.
و یا اینکه امکانات olap خود sql server رو نگاه کن.

RezaJP
چهارشنبه 18 خرداد 1384, 23:56 عصر
یه راه برات میمونه٬‌یه جدول temp بساز و یه تابع که اونرو پر کنه بعد اونرو بخون و تو گزارشت بکار ببر.

نظر من هم همینه ... من در این موارد همین کار رو می کنم

karimh
جمعه 20 خرداد 1384, 02:11 صبح
سلام
راه خوبی بود
من هم یه جدول موقت ساختم و گزارشم ساخته شد .

ممنون دوستان
:موفق:

MM_Mofidi
جمعه 20 خرداد 1384, 09:42 صبح
یا من سوال شما را درست نفهمیدم یا ...؟ :kaf:
یک گزارش ازsql بگیر هرجا که فیلد خریدار یا فروشنده برابر کد مورد گزارش باشه
خروجی را همه خرید ها و فروشهای شخص مورد نظر. برای همه تکرار گزارش فکر کنم مناسب باشه چون به نظر نمیرسه کاربر بخواهد از آن یک جا استفاده کند :موفق:

AminSobati
جمعه 20 خرداد 1384, 19:04 عصر
کریم جان نیازی به کار اضافی نیست. من دو جدول مطابق چیزی که در اختیار دارین ساختم:

CREATE TABLE Stocker(
STID INT NOT NULL PRIMARY KEY,
STName NVARCHAR(50))

INSERT Stocker VALUES(1,'Nima')
INSERT Stocker VALUES(2,'Ali')
INSERT Stocker VALUES(3,'Reza')
INSERT Stocker VALUES(4,'Farhad')

CREATE TABLE Trans(
S_ID INT,
B_ID INT,
Amount INT)

INSERT Trans VALUES(1,3,100)
INSERT Trans VALUES(4,3,50)
INSERT Trans VALUES(2,4,1000)
INSERT Trans VALUES(4,1,200)
INSERT Trans VALUES(1,2,600)
INSERT Trans VALUES(3,1,350)
حالا فقط کافیه یکبار بر اساس فروشنده ها و یکبار بر اساس خریدارها Join انجام بدین و نتیجه رو بوسیله UNION به هم پیوند بزنین:

SELECT * FROM
(
SELECT S1.STName, '1 (foroosh be:)' AS 'Tran Type', S2.STName AS 'Person', T.Amount
FROM Stocker S1
JOIN Trans T
ON S1.STID=T.S_ID
JOIN Stocker S2
ON S2.STID=T.B_ID

UNION ALL

SELECT S1.STName, '2 (kharid az:)' AS 'Tran Type', S2.STName AS 'Person', T.Amount
FROM Stocker S1
JOIN Trans T
ON S1.STID=T.B_ID
JOIN Stocker S2
ON S2.STID=T.S_ID

) tmp
ORDER BY STName, [Tran Type]
اگر هم خواستین اول خریدهای یکنفر رو نشون بدین، میتونین به این صورت Sort کنین:

ORDER BY STName, [Tran Type] DESC
موفق باشید..

majid_afra222
شنبه 21 خرداد 1384, 08:13 صبح
سلام
درسته٬‌ منم با این یکی موافقترم.
ممنون

karimh
جمعه 27 خرداد 1384, 06:43 صبح
سلام
عالی بود امین خان :تشویق:
خسته نباشی

از بقیه هم خیلی ممنون
:sunglass: