ورود

View Full Version : ادغام ردیفهای دارای کد مشابه در یک ردیف



sh
جمعه 13 بهمن 1385, 12:33 عصر
سلام
یه جدول داریم با محتویات زیر

1- شماره حواله 2- تاریخ و .....

در جدول دوم :
1- شماره حواله 2- کد کالا و ....

به ازای هر شماره حواله در جدول اول ما چند رکورد در جدول دوم داریم که مشخص میشود حواله شماره فلان چند کالا داشته

برای اینکه به کاربر نشون بدم با شماره حواله چه کالاهائی ارسال شده میشه با دو DataGridView حالت مستر دیتیل رو بوجود آورد ولی آیا میشه حالت زیر رو هم داشت ؟

حواله 1 || کالای 1 - کالای 2 - کالای 3
حواله 2 || کالای 2- کالای 4
.....

یعنی ردیفها یجوری خلاصه شده و در یک دیتاگرید نشان داده شود

منتظر راهنمائی دوستان هستم

AminSobati
جمعه 13 بهمن 1385, 23:50 عصر
اگر SQL Server 2005 استفاده میکنید، به زیبایی هر چه تمامتر میتونید با User Defined Aggregate در محیط Dot NET این کار رو انجام بدین! اما در SQL Server 2000 هم قابل انجامه:
من این مثال رو برای اینکه شهرها جلوی نام کشور قرار بگیرند نوشته بودم:


use northwind
go
create function fn_SumBC (@acc nvarchar(40))
returns nvarchar(4000)
as
begin
declare @SumBC nvarchar(4000)
set @SumBC=''
select @SumBC=@SumBC+city+',' from
(SELECT distinct city, country FROM customers) tmp
where country = @acc
set @SumBC= left(@SumBC,len(@SumBC)-1)
return @SumBC
end
go
select country,dbo.fn_SumBC (country) from customers group by country

sh
شنبه 14 بهمن 1385, 15:42 عصر
سلام امین جان
آیا این کدی که نوشتی مخصوص نسخه 2005 هست یا برای ورژن 2005 راه ساده تری هم هست ؟چون من از Sql Express 2005 استفاده میکنم

AminSobati
شنبه 14 بهمن 1385, 18:12 عصر
این کد برای همه ورژنهای SQL Server کار میکنه! برای 2005 همونطور که عرض کردم از User Defined Aggregate میشه استفاده کرد که اساسا برای همین منظوره

sh
شنبه 14 بهمن 1385, 20:36 عصر
سلام
من از SqlExpress 2005 استفاده میکنم ممکنه خواهش کنم یه مثال در مورد حل این مشکل با User Defined Aggregate برام بنویسی

ممنون

AminSobati
شنبه 14 بهمن 1385, 21:52 عصر
این کد در Dot NET باید Compile بشه و در SQL Server تبدیل بشه به UDA، اما بعید میدونم بدون اطلاعات کافی از Integration بین SQL Server و Dot NET بتونین از این قابلیت استفاده کنین. منظورم اینه که این کار به سر راستی اجرا کردن یک Script نیست.



Imports System
Imports System.Data
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.IO
Imports System.Text

<Serializable(), SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToNulls:=True, IsInvariantToDuplicates:=False, IsInvariantToOrder:=False, MaxByteSize:=8000)> _
Public Class Concatenate
Implements IBinarySerialize

Private intermediateResult As StringBuilder

Public Sub Init()
Me.intermediateResult = New StringBuilder()
End Sub


Public Sub Accumulate(ByVal value As SqlString)
If value.IsNull Then
Return
End If

Me.intermediateResult.Append(value.Value).Append(","c)
End Sub

Public Sub Merge(ByVal other As Concatenate)
Me.intermediateResult.Append(other.intermediateRes ult)
End Sub


Public Function Terminate() As SqlString
Dim output As String = String.Empty

If Not (Me.intermediateResult Is Nothing) AndAlso Me.intermediateResult.Length > 0 Then
output = Me.intermediateResult.ToString(0, Me.intermediateResult.Length - 1)
End If

Return New SqlString(output)
End Function

Public Sub Read(ByVal r As BinaryReader) Implements IBinarySerialize.Read
intermediateResult = New StringBuilder(r.ReadString())
End Sub

Public Sub Write(ByVal w As BinaryWriter) Implements IBinarySerialize.Write
w.Write(Me.intermediateResult.ToString())
End Sub
End Class