PDA

View Full Version : کمک ...کمک... مانده در خط



karimh
سه شنبه 13 دی 1384, 07:49 صبح
سلام

من یه مشکلی دارم که نمیدونم چطوری باید حلش کنم ......
فرض کنید جدولی داریم که شامل فیلد های زیر است:
کد تفصیل....تاریخ....بدهکار....بست انکار
11120...05/10/84...10000....0
11120...06/10/84...500...0
11120...02/10/84...0.........50000
حالا می خوام به طریقیابتدا بر اساس تاریخ مرتبش کنم و اختلاف دوفیلد بدهکار و بستانکار رو برای هر کد تفصیل محاسبه کنم و در هر سطر با سطر قبلیش جمع کنم .یعنی همون مانده در خط...
جوابی که انتظار دارم باید به این صورت باشه:
11120...02/10/84.....50000-
11120...05/10/84.....40000-
11120...06/10/84.....39500-

امیر تورانی
سه شنبه 13 دی 1384, 08:17 صبح
سلام

من یه مشکلی دارم که نمیدونم چطوری باید حلش کنم ......
فرض کنید جدولی داریم که شامل فیلد های زیر است:
کد تفصیل....تاریخ....بدهکار....بست انکار
11120...05/10/84...10000....0
11120...06/10/84...500...0
11120...02/10/84...0.........50000
حالا می خوام به طریقیابتدا بر اساس تاریخ مرتبش کنم و اختلاف دوفیلد بدهکار و بستانکار رو برای هر کد تفصیل محاسبه کنم و در هر سطر با سطر قبلیش جمع کنم .یعنی همون مانده در خط...
جوابی که انتظار دارم باید به این صورت باشه:
11120...02/10/84.....50000-
11120...05/10/84.....40000-
11120...06/10/84.....39500-
بعد از اینکه بر اساس تاریخ sort کردی رکورد به رکود در جدول حرکت کن و مبلغ بدهکار و بستانکار را در یک متغیر ذخیره کن به رکورد بع که رسید کنترل کن اگر بدهکار یا بستانکار خالی نبود از متغیر ی که ذخیره کردی و کم یا اضافه کن و در همون متغیر ذخیره کن ، الی آخر

سید مسعود موحد
سه شنبه 13 دی 1384, 10:09 صبح
من اینکارو با StoreProcedure کردم اینم سورسش




ALTER PROC [dbo].[HSB_Daf_Kol]
@Is_Mande Bit,
@My_Kol1 Int,
@My_Kol2 Int,
@My_No1 Int,
@My_No2 Int,
@My_Noe1 Int,
@My_Noe2 Int,
@My_Noe3 Int,
@Field_Sort Bit,
@TypeSort VarChar(4),
@My_Sal Int

AS

Declare @My_SQL VARCHAR(3500)
Declare @My_Mande1 VARCHAR(3500)
Declare @My_Mande2 VARCHAR(3500)
Declare @NMy_SQL NVARCHAR(3500)
Declare @My_WHERE VARCHAR(500)
Declare @WHERE_Ma VARCHAR(500)
Declare @My_Order VARCHAR(500)
Declare @My_Order1 VARCHAR(500)


If @My_No1 > 0
Begin
Set @My_WHERE = ' WHERE (A.No_Sanad BETWEEN ' +
Ltrim(RTrim(@My_No1)) + ' AND ' + Ltrim(RTrim(@My_No2)) + ')'
Set @WHERE_Ma = ' WHERE (A.No_Sanad BETWEEN 1 ' + ' AND ' + Ltrim(RTrim(@My_No1 - 1)) + ')'
End
If @My_Kol1 > 0
Begin
Set @My_WHERE = @My_WHERE + ' AND (A.Code_Kol BETWEEN ' +
Ltrim(RTrim(@My_Kol1)) + ' AND ' + Ltrim(RTrim(@My_Kol2)) + ')'
Set @WHERE_Ma = @WHERE_Ma + ' AND (A.Code_Kol BETWEEN ' +
Ltrim(RTrim(@My_Kol1)) + ' AND ' + Ltrim(RTrim(@My_Kol2)) + ')'
End

Set @My_WHERE = @My_WHERE + ' AND (B.Noe_Sanad IN (' + Ltrim(RTrim(@My_Noe1)) +
' , ' + Ltrim(RTrim(@My_Noe2)) + ' , ' + Ltrim(RTrim(@My_Noe3)) +'))'
Set @WHERE_Ma = @WHERE_Ma + ' AND (B.Noe_Sanad IN (' + Ltrim(RTrim(@My_Noe1)) +
' , ' + Ltrim(RTrim(@My_Noe2)) + ' , ' + Ltrim(RTrim(@My_Noe3)) +'))'

Set @My_WHERE = @My_WHERE + ' AND (A.Sal = ' + Ltrim(RTrim(@My_Sal)) + ')'
Set @WHERE_Ma = @WHERE_Ma + ' AND (A.Sal = ' + Ltrim(RTrim(@My_Sal)) + ')'

If @Field_Sort = 0
Begin
Set @My_Order = ' ORDER BY Type , A.No_Sanad ' + @TypeSort + ' , A.Bed_Sanad , A.Bes_Sanad '
Set @My_Order1 = ' ORDER BY A.No_Sanad ' + @TypeSort + ' , A.Bed_Sanad , A.Bes_Sanad '
End
If @Field_Sort = 1
Begin
Set @My_Order = ' ORDER BY Type , A.Code_Kol ' + @TypeSort + ' , A.Bed_Sanad , A.Bes_Sanad '
Set @My_Order1 = ' ORDER BY A.Code_Kol ' + @TypeSort + ' , A.Bed_Sanad , A.Bes_Sanad '
End


If @Is_Mande = 1
Begin
Set @My_Mande1 = 'SELECT 0 AS Id, 0 AS No_Sanad, 0 AS Code_Kol, IsNull(SUM(A.Bed_Sanad),0) AS Bed_Sanad, ' +
'IsNull(SUM(A.Bes_Sanad),0) AS Bes_Sanad, IsNull(SUM(A.Bed_Sanad) - SUM(A.Bes_Sanad),0) AS Mande ' +
'FROM Hsb_De_Sanad A INNER JOIN ' +
'Hsb_Bod_Sanad B ON A.No_Sanad = B.No_Sanad AND A.Sal = B.Sal ' + LTrim(RTrim(@WHERE_Ma)) + ' UNION '

Set @My_Mande2 = 'SELECT 0 Type , 0 No_Sanad, 0 Date_Sanad, 0 Code_Kol, ' +
'''' + ' مانده نقل از قبل ' + '''' + ' AS Name , ' +
'IsNull(SUM(A.Bed_Sanad),0) AS Bed_Sanad, IsNull(SUM(A.Bes_Sanad),0) AS Bes_Sanad, ' +
'''' + ' مانده نقل از قبل ' + '''' + ' AS Shar_Sanad , ' +
'M_Bed = IsNull(CASE WHEN (SUM(A.Bed_Sanad) - SUM(A.Bes_Sanad)) > 0 THEN SUM(A.Bed_Sanad) - SUM(A.Bes_Sanad) End,0), ' +
'M_Bes = IsNull(CASE WHEN (SUM(A.Bed_Sanad) - SUM(A.Bes_Sanad)) < 0 THEN ABS(SUM(A.Bed_Sanad) - SUM(A.Bes_Sanad)) End,0) ' +
'FROM Hsb_De_Sanad A INNER JOIN ' +
'Hsb_Bod_Sanad B ON A.No_Sanad = B.No_Sanad AND A.Sal = B.Sal ' + LTrim(RTrim(@WHERE_Ma)) + ' UNION '
End

If @Is_Mande = 0
Begin
Set @My_Mande1 = ' '

Set @My_Mande2 = ' '
End

Set @My_Sql=
'DECLARE @RecCount Int ' +
'DECLARE @Rec Int ' +
'DECLARE @My_No Int ' +
'DECLARE @My_Id Int ' +
'DECLARE @My_Kol Int ' +
'DECLARE @My_Bed BigInt ' +
'DECLARE @My_Bes BigInt ' +
'DECLARE @Mande BigInt ' +
'DECLARE @Mande1 BigInt ' +
'DECLARE Mycur Cursor For ' + @My_Mande1 +
'SELECT A.Id,A.No_Sanad, A.Code_Kol, IsNull(A.Bed_Sanad,0), ISNull(A.Bes_Sanad,0), ISNull(A.Bed_Sanad - A.Bes_Sanad,0) AS Mande ' +
'FROM Hsb_De_Sanad A INNER JOIN ' +
'Hsb_Bod_Sanad B ON A.No_Sanad = B.No_Sanad AND A.Sal = B.Sal ' + LTrim(RTrim(@My_WHERE)) + LTrim(RTrim(@My_Order1)) +
' Set @RecCount = (SELECT Count(*) ' +
'FROM Hsb_De_Sanad A INNER JOIN Hsb_Bod_Sanad B ON A.No_Sanad = B.No_Sanad AND A.Sal = B.Sal ' + LTrim(RTrim(@My_WHERE)) + ')' +
' CREATE TABLE #T1 (Id_2 int IDENTITY (1, 1) NOT NULL , Id Int , No_Sanad Int , Code_Kol Int , Bed_Sanad BigInt , Bes_Sanad BigInt , Mande BigInt ) ' +
'Open MyCur ' +
'FETCH Next FROM MyCur INTO @My_Id ,@My_No , @My_Kol , @My_Bed, @My_Bes, @Mande ' +
'INSERT INTO #T1 (Id , No_Sanad , Code_Kol , Bed_Sanad , Bes_Sanad , Mande ) Values (IsNull(@My_Id,0) ,IsNull(@My_No,0) , IsNull(@My_Kol,0) , IsNull(@My_Bed,0) , IsNull(@My_Bes,0) , IsNull(@Mande,0)) ' +
'Set @Mande1 = @Mande ' +
'Set @Rec = 1 '+
'WHILE @Rec < @RecCount ' +
'BEGIN ' +
'Fetch Next FROM MyCur INTO @My_Id ,@My_No , @My_Kol , @My_Bed, @My_Bes, @Mande ' +
'Set @Mande1=@Mande1 + @Mande ' +
'Set @Rec = @Rec + 1 ' +
'INSERT INTO #T1 (Id , No_Sanad , Code_Kol , Bed_Sanad , Bes_Sanad , Mande ) Values(@My_Id ,@My_No , @My_Kol , @My_Bed, @My_Bes, @Mande1) ' +
'END ' +
'Close MyCur ' +
'DEALLOCATE Mycur ' + @My_Mande2 +
'SELECT 0 Type , A.No_Sanad, D.Date_Sanad, A.Code_Kol, C.Name, A.Bed_Sanad, A.Bes_Sanad, B.Shar_Sanad, ' +
'M_Bed = IsNull(CASE WHEN A.Mande>0 THEN A.Mande End,0), ' +
'M_Bes = IsNull(CASE WHEN A.Mande<0 THEN ABS(A.Mande) End,0) ' +
'FROM #T1 A INNER JOIN Hsb_De_Sanad B ON A.Id = B.Id INNER JOIN ' +
'KIC_Kol C ON A.Code_Kol = C.Cod INNER JOIN ' +
'Hsb_Bod_Sanad D ON A.No_Sanad = D.No_Sanad AND C.Sal = D.Sal AND B.Sal = D.Sal ' +
'WHERE D.Sal = ' + LTrim(RTrim(@My_Sal)) + LTrim(RTrim(@My_Order)) +
' Drop Table #T1'

Set @NMy_SQL = N''+@My_Sql+''
Exec Sp_executesql @NMy_SQL
-- SELECT @My_Sql AS TXT INTO Table1
-- print @My_Sql
-- HSB_Daf_Kol 0,0,0,1,2000,1,2,3,1,'ASC',1

mzjahromi
سه شنبه 13 دی 1384, 10:33 صبح
یک راه خیلی ساده بهت پیشنهاد می کنم که راحت جواب میگیری
1- یک Query بنویس و توش یک فیلد اضافه بذار به شکل زیر


Select TafziliCode,SanadDate,Bedehkar,Bestankar,'00000000 00' As Mandeh

حالا اینا رو تو AdoQuery یا تو TQuery نوشتی دیگه
2-از Tab DataAccess یک DataSetProvider بذار روی فرمت و DataSet اونو بذار Query1 یا AdoQuery1
3- حالا یک ClientDataSet بذار رو فرمت و ProviderName رو بذار DataSetProvider1
4- حالا بعد از باز کردن این ClientDataSet از اول شروع کن و فیلد Mandeh رو رکورد به رکورد مقداردهی کن. مشکلت حل میشه
نگاه نکن که من اینهمه خط نوشتم کار خیلی ساده ایه. باز اگر مشکلی داشتی بگو

سید مسعود موحد
سه شنبه 13 دی 1384, 10:56 صبح
محمد جان کار شما هم جالب است ولی سرعت اون SP خیلی بیشتر از اینها است من تمام این راه حلها را آزمایش کردم با مقادیر واقعی و سال مالی پر کار ولی جوابی که بهش رسیدم همین است و حتما هم آخرین و کارآمدترین راه نیست ولی راه شما را من آزمایش کردم و جواب خوبی نگرفتم از نظر سرعت چون فیلد مانده بجای لایه SERVER‌ در لایه CLIENT‌ پر میشود و سرعت خیلی پایینی دارد

mzjahromi
سه شنبه 13 دی 1384, 11:01 صبح
من گفتم که این فقط یک روش خیلی ساده هست همین ... مسلما هر روش ساده ای Performance خوبی نداره. قبول دارم اینو.
یه چیز دیگه هم هست شاید بانک اطلاعاتی SP رو پشتیبانی نکنه(البته نه در این مورد) موردی که من استفاده کردم بانکش اکسس بود

AminSobati
چهارشنبه 14 دی 1384, 22:00 عصر
http://www.barnamenevis.org/forum/showthread.php?t=21194

سید مسعود موحد
شنبه 17 دی 1384, 11:43 صبح
لینک شما خیلی خوب بود ولی باید در نظر بگیرید که ردیف در گزارشات اصلا معنا پیدا نمیکند زیرا با تغییر نوع گزارش ردیف ان از حالت مرتب خارج میشود