EDMIService: Property Filtering/Sorting, Handle Empty Results

This commit is contained in:
Jonathan Jenne 2020-12-08 16:42:36 +01:00
parent 4c9abf3b1f
commit 502793aed5
7 changed files with 116 additions and 33 deletions

View File

@ -24,7 +24,7 @@ Partial Class Form1
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1))
Dim DockingContainer1 As DevExpress.XtraBars.Docking2010.Views.Tabbed.DockingContainer = New DevExpress.XtraBars.Docking2010.Views.Tabbed.DockingContainer()
Dim DockingContainer2 As DevExpress.XtraBars.Docking2010.Views.Tabbed.DockingContainer = New DevExpress.XtraBars.Docking2010.Views.Tabbed.DockingContainer()
Me.DocumentGroup1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.DocumentGroup(Me.components)
Me.Document1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.Document(Me.components)
Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl()
@ -44,6 +44,10 @@ Partial Class Form1
Me.TextboxDatatableName = New DevExpress.XtraBars.BarEditItem()
Me.RepositoryItemTextEdit2 = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit()
Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem()
Me.TextboxDatatableFilter = New DevExpress.XtraBars.BarEditItem()
Me.RepositoryItemTextEdit3 = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit()
Me.TextboxDatatableSort = New DevExpress.XtraBars.BarEditItem()
Me.RepositoryItemTextEdit4 = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit()
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonPageGroup4 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
@ -73,11 +77,14 @@ Partial Class Form1
Me.DockPanel2_Container = New DevExpress.XtraBars.Docking.ControlContainer()
Me.DocumentViewer1 = New DigitalData.Controls.DocumentViewer.DocumentViewer()
Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
Me.BarEditItem1 = New DevExpress.XtraBars.BarEditItem()
CType(Me.DocumentGroup1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.Document1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RepositoryItemTextEdit1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RepositoryItemTextEdit2, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RepositoryItemTextEdit3, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RepositoryItemTextEdit4, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.DocumentManager1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.TabbedView1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.DockManager1, System.ComponentModel.ISupportInitialize).BeginInit()
@ -115,14 +122,14 @@ Partial Class Form1
'RibbonControl1
'
Me.RibbonControl1.ExpandCollapseItem.Id = 0
Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.ButtonSelectFiles, Me.ButtonImportFiles, Me.buttonClearLog, Me.buttonClearFiles, Me.TextboxObjectId, Me.ButtonLoadFile, Me.BarListItem1, Me.BarButtonItem2, Me.BarToggleSwitchItem1, Me.BarDockingMenuItem1, Me.BarMdiChildrenListItem1, Me.BarButtonItem1, Me.TextboxDatatableName, Me.BarButtonItem3})
Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.ButtonSelectFiles, Me.ButtonImportFiles, Me.buttonClearLog, Me.buttonClearFiles, Me.TextboxObjectId, Me.ButtonLoadFile, Me.BarListItem1, Me.BarButtonItem2, Me.BarToggleSwitchItem1, Me.BarDockingMenuItem1, Me.BarMdiChildrenListItem1, Me.BarButtonItem1, Me.TextboxDatatableName, Me.BarButtonItem3, Me.TextboxDatatableFilter, Me.TextboxDatatableSort})
Me.RibbonControl1.Location = New System.Drawing.Point(0, 0)
Me.RibbonControl1.MaxItemId = 17
Me.RibbonControl1.MaxItemId = 19
Me.RibbonControl1.Name = "RibbonControl1"
Me.RibbonControl1.PageHeaderItemLinks.Add(Me.BarDockingMenuItem1)
Me.RibbonControl1.PageHeaderItemLinks.Add(Me.BarMdiChildrenListItem1)
Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1})
Me.RibbonControl1.RepositoryItems.AddRange(New DevExpress.XtraEditors.Repository.RepositoryItem() {Me.RepositoryItemTextEdit1, Me.RepositoryItemTextEdit2})
Me.RibbonControl1.RepositoryItems.AddRange(New DevExpress.XtraEditors.Repository.RepositoryItem() {Me.RepositoryItemTextEdit1, Me.RepositoryItemTextEdit2, Me.RepositoryItemTextEdit3, Me.RepositoryItemTextEdit4})
Me.RibbonControl1.Size = New System.Drawing.Size(1310, 158)
Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1
'
@ -218,6 +225,7 @@ Partial Class Form1
'
Me.TextboxDatatableName.Caption = "Datatable Name"
Me.TextboxDatatableName.Edit = Me.RepositoryItemTextEdit2
Me.TextboxDatatableName.EditWidth = 100
Me.TextboxDatatableName.Id = 15
Me.TextboxDatatableName.ImageOptions.SvgImage = CType(resources.GetObject("TextboxDatatableName.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.TextboxDatatableName.Name = "TextboxDatatableName"
@ -234,6 +242,32 @@ Partial Class Form1
Me.BarButtonItem3.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem3.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.BarButtonItem3.Name = "BarButtonItem3"
'
'TextboxDatatableFilter
'
Me.TextboxDatatableFilter.Caption = "Filter Expr."
Me.TextboxDatatableFilter.Edit = Me.RepositoryItemTextEdit3
Me.TextboxDatatableFilter.EditWidth = 100
Me.TextboxDatatableFilter.Id = 17
Me.TextboxDatatableFilter.Name = "TextboxDatatableFilter"
'
'RepositoryItemTextEdit3
'
Me.RepositoryItemTextEdit3.AutoHeight = False
Me.RepositoryItemTextEdit3.Name = "RepositoryItemTextEdit3"
'
'TextboxDatatableSort
'
Me.TextboxDatatableSort.Caption = "Sort Expr."
Me.TextboxDatatableSort.Edit = Me.RepositoryItemTextEdit4
Me.TextboxDatatableSort.EditWidth = 100
Me.TextboxDatatableSort.Id = 18
Me.TextboxDatatableSort.Name = "TextboxDatatableSort"
'
'RepositoryItemTextEdit4
'
Me.RepositoryItemTextEdit4.AutoHeight = False
Me.RepositoryItemTextEdit4.Name = "RepositoryItemTextEdit4"
'
'RibbonPage1
'
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroup4, Me.RibbonPageGroup3, Me.RibbonPageGroup2})
@ -267,6 +301,8 @@ Partial Class Form1
'RibbonPageGroup2
'
Me.RibbonPageGroup2.ItemLinks.Add(Me.TextboxDatatableName)
Me.RibbonPageGroup2.ItemLinks.Add(Me.TextboxDatatableFilter)
Me.RibbonPageGroup2.ItemLinks.Add(Me.TextboxDatatableSort)
Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem3)
Me.RibbonPageGroup2.Name = "RibbonPageGroup2"
Me.RibbonPageGroup2.Text = "Retrieve Datatable"
@ -294,8 +330,8 @@ Partial Class Form1
'
Me.TabbedView1.DocumentGroups.AddRange(New DevExpress.XtraBars.Docking2010.Views.Tabbed.DocumentGroup() {Me.DocumentGroup1})
Me.TabbedView1.Documents.AddRange(New DevExpress.XtraBars.Docking2010.Views.BaseDocument() {Me.Document1})
DockingContainer1.Element = Me.DocumentGroup1
Me.TabbedView1.RootContainer.Nodes.AddRange(New DevExpress.XtraBars.Docking2010.Views.Tabbed.DockingContainer() {DockingContainer1})
DockingContainer2.Element = Me.DocumentGroup1
Me.TabbedView1.RootContainer.Nodes.AddRange(New DevExpress.XtraBars.Docking2010.Views.Tabbed.DockingContainer() {DockingContainer2})
'
'DockManager1
'
@ -481,6 +517,15 @@ Partial Class Form1
'
Me.Timer1.Interval = 3000
'
'BarEditItem1
'
Me.BarEditItem1.Caption = "Datatable Name"
Me.BarEditItem1.Edit = Me.RepositoryItemTextEdit2
Me.BarEditItem1.EditWidth = 100
Me.BarEditItem1.Id = 15
Me.BarEditItem1.ImageOptions.SvgImage = CType(resources.GetObject("BarEditItem1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.BarEditItem1.Name = "BarEditItem1"
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
@ -499,6 +544,8 @@ Partial Class Form1
CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RepositoryItemTextEdit1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RepositoryItemTextEdit2, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RepositoryItemTextEdit3, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RepositoryItemTextEdit4, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.DocumentManager1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.TabbedView1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.DockManager1, System.ComponentModel.ISupportInitialize).EndInit()
@ -569,4 +616,9 @@ Partial Class Form1
Friend WithEvents RepositoryItemTextEdit2 As DevExpress.XtraEditors.Repository.RepositoryItemTextEdit
Friend WithEvents BarButtonItem3 As DevExpress.XtraBars.BarButtonItem
Friend WithEvents RibbonPageGroup2 As DevExpress.XtraBars.Ribbon.RibbonPageGroup
Friend WithEvents TextboxDatatableFilter As DevExpress.XtraBars.BarEditItem
Friend WithEvents RepositoryItemTextEdit3 As DevExpress.XtraEditors.Repository.RepositoryItemTextEdit
Friend WithEvents TextboxDatatableSort As DevExpress.XtraBars.BarEditItem
Friend WithEvents RepositoryItemTextEdit4 As DevExpress.XtraEditors.Repository.RepositoryItemTextEdit
Friend WithEvents BarEditItem1 As DevExpress.XtraBars.BarEditItem
End Class

View File

@ -341,4 +341,30 @@
<metadata name="Timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>453, 17</value>
</metadata>
<data name="BarEditItem1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v19.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGkEAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAxNiAxNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MTYgMTYiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
R3JlZW57ZmlsbDojMDM5QzIzO30KCS5XaGl0ZXtmaWxsOiNGRkZGRkY7fQoJLnN0MHtvcGFjaXR5OjAu
Njt9Cgkuc3Qxe29wYWNpdHk6MC41O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTE1LDFIMUMwLjUsMSww
LDEuNSwwLDJ2MTJjMCwwLjUsMC41LDEsMSwxaDE0YzAuNSwwLDEtMC41LDEtMVYyQzE2LDEuNSwxNS41
LDEsMTUsMXogTTE1LDE0SDFWMmgxNFYxNHoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPHBhdGggZD0iTTAs
NVYyYzAtMC41LDAuNS0xLDEtMWgxNGMwLjYsMCwxLDAuNSwxLDF2M0gweiIgY2xhc3M9IkdyZWVuIiAv
Pg0KICA8ZyBpZD0iTGF5ZXJfMiIgY2xhc3M9InN0MCI+DQogICAgPHJlY3QgeD0iMSIgeT0iMiIgd2lk
dGg9IjE0IiBoZWlnaHQ9IjIiIHJ4PSIwIiByeT0iMCIgY2xhc3M9IldoaXRlIiAvPg0KICA8L2c+DQog
IDxyZWN0IHg9IjEiIHk9IjUiIHdpZHRoPSIxNCIgaGVpZ2h0PSI5IiByeD0iMCIgcnk9IjAiIGNsYXNz
PSJXaGl0ZSIgLz4NCiAgPHBhdGggZD0iTTUsMTJWN2gxdjVINXoiIGNsYXNzPSJCbGFjayIgLz4NCiAg
PHBhdGggZD0iTTExLDEyaC0xbDAtMC42QzkuOCwxMS42LDkuNSwxMiw4LjcsMTJjLTAuNSwwLTAuOS0w
LjItMS4yLTAuNUM3LjIsMTEuMiw3LDEwLjcsNywxMC4xQzcsOS41LDcuMiw5LDcuNSw4LjcgIGMwLjMt
MC4zLDAuNy0wLjUsMS4yLTAuNXMwLjksMC4yLDEuMiwwLjVWN0gxMVYxMnogTTguMSwxMC4xYzAsMC40
LDAsMS4yLDAuOSwxLjJjMC44LDAsMC45LTAuOCwwLjktMS4xQzkuOSw5LjgsOS44LDksOSw5ICBDOC4z
LDksOC4xLDkuNyw4LjEsMTAuMXoiIGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
</value>
</data>
</root>

View File

@ -224,10 +224,17 @@ Public Class Form1
End If
Dim oDatatableName As String = TextboxDatatableName.EditValue
Dim oResponse As DataTable = Await _Client.GetDatatableByNameAsync(oDatatableName)
Dim oSortExpression As String = TextboxDatatableSort.EditValue
Dim oFilterExpression As String = TextboxDatatableFilter.EditValue
Dim oResponse As TableResult = Await _Client.GetDatatableByNameAsync(oDatatableName, oFilterExpression, oSortExpression)
oSWTotal.Stop()
AddLogMessage($"DataTable [{oResponse.TableName}] loaded: [{FormatTime(oSWTotal.ElapsedMilliseconds)}]")
If oResponse.OK Then
AddLogMessage($"DataTable [{oDatatableName}] loaded: [{FormatTime(oSWTotal.ElapsedMilliseconds)}]")
Else
AddLogMessage($"DataTable [{oDatatableName}] could not be loaded. Error: {oResponse.ErrorMessage}")
End If
Catch ex As FaultException
MsgBox(ex.Reason.ToString, MsgBoxStyle.Critical, "Error from Service")
_Client.Reconnect()

View File

@ -131,15 +131,10 @@ Public Class Client
End Try
End Function
Public Async Function GetDatatableByNameAsync(DatatableName As String) As Task(Of DataTable)
Public Async Function GetDatatableByNameAsync(DatatableName As String, Optional FilterExpression As String = "", Optional SortByColumn As String = "") As Task(Of TableResult)
Try
Dim oResponse = Await _channel.ReturnDatatableFromCacheAsync(DatatableName)
If oResponse.OK Then
Return oResponse.Table
Else
Return Nothing
End If
Dim oResponse = Await _channel.ReturnDatatableFromCacheAsync(DatatableName, FilterExpression, SortByColumn)
Return oResponse
Catch ex As Exception
_logger.Error(ex)
Throw ex

View File

@ -18,6 +18,8 @@
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="FilterExpression" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="SortByColumn" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>

View File

@ -154,11 +154,11 @@ Namespace EDMIServiceReference
<System.ServiceModel.OperationContractAttribute(Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatableFromCache", ReplyAction:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatableFromCacheResp"& _
"onse")> _
Function ReturnDatatableFromCache(ByVal Name As String) As EDMIServiceReference.TableResult
Function ReturnDatatableFromCache(ByVal Name As String, ByVal FilterExpression As String, ByVal SortByColumn As String) As EDMIServiceReference.TableResult
<System.ServiceModel.OperationContractAttribute(Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatableFromCache", ReplyAction:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatableFromCacheResp"& _
"onse")> _
Function ReturnDatatableFromCacheAsync(ByVal Name As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult)
Function ReturnDatatableFromCacheAsync(ByVal Name As String, ByVal FilterExpression As String, ByVal SortByColumn As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult)
<System.ServiceModel.OperationContractAttribute(Action:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatable_Firebird", ReplyAction:="http://DigitalData.Services.EDMIService/IEDMIService/ReturnDatatable_FirebirdResp"& _
"onse")> _
@ -419,12 +419,12 @@ Namespace EDMIServiceReference
Return MyBase.Channel.HeartbeatAsync
End Function
Public Function ReturnDatatableFromCache(ByVal Name As String) As EDMIServiceReference.TableResult Implements EDMIServiceReference.IEDMIService.ReturnDatatableFromCache
Return MyBase.Channel.ReturnDatatableFromCache(Name)
Public Function ReturnDatatableFromCache(ByVal Name As String, ByVal FilterExpression As String, ByVal SortByColumn As String) As EDMIServiceReference.TableResult Implements EDMIServiceReference.IEDMIService.ReturnDatatableFromCache
Return MyBase.Channel.ReturnDatatableFromCache(Name, FilterExpression, SortByColumn)
End Function
Public Function ReturnDatatableFromCacheAsync(ByVal Name As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) Implements EDMIServiceReference.IEDMIService.ReturnDatatableFromCacheAsync
Return MyBase.Channel.ReturnDatatableFromCacheAsync(Name)
Public Function ReturnDatatableFromCacheAsync(ByVal Name As String, ByVal FilterExpression As String, ByVal SortByColumn As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) Implements EDMIServiceReference.IEDMIService.ReturnDatatableFromCacheAsync
Return MyBase.Channel.ReturnDatatableFromCacheAsync(Name, FilterExpression, SortByColumn)
End Function
Public Function ReturnDatatable_Firebird(ByVal SQL As String) As EDMIServiceReference.TableResult Implements EDMIServiceReference.IEDMIService.ReturnDatatable_Firebird

View File

@ -82,9 +82,18 @@ Public Class EDMIService
' Apply filter and sorting to data
Dim oFilterExpression As String = Utils.NotNull(FilterExpression, String.Empty)
Dim oSortByColumn As String = Utils.NotNull(SortByColumn, String.Empty)
Dim oFilteredTable = oDataTable.
Select(oFilterExpression, oSortByColumn).
CopyToDataTable()
Dim oFilteredRows = oDataTable.Select(oFilterExpression, oSortByColumn)
Dim oFilteredTable As DataTable = Nothing
If oFilteredRows.Count > 0 Then
oFilteredTable = oFilteredRows.CopyToDataTable()
oFilteredTable.TableName = Name
Else
' Produce empty table
oFilteredTable = oDataTable.Clone()
oFilteredTable.TableName = Name
End If
_logger.Debug("Datatable Stats for [{0}]:", Name)
_logger.Debug("Unfiltered: [{0}] rows", oDataTable.Rows.Count)
@ -94,14 +103,6 @@ Public Class EDMIService
Else
Throw New ApplicationException($"DataTable {Name} does not exist")
End If
'If oDataset.Tables.Contains(Name) Then
' oDataTable = oDataset.Tables.Item(Name).Clone()
' Return New TableResult(oDataTable)
'Else
' Throw New ApplicationException($"DataTable {Name} does not exist")
'End If
Catch ex As Exception
_logger.Error(ex)
Return New TableResult(ex.Message)