Update Subquery Study/Oracle2014. 3. 4. 15:58
SET TABLE1.COLUMN1 = (SELECT COL1 FROM TABLE2 WHERE TABLE2.COL2 = TABLE1.COLUMN2 AND TABLE2.COL3 = TABLE1.COLUMN3)
Group Merge
Merge에 대한 간단한 팁입니다.
DevExpress의
XtraGrid뿐만 아니라 거의 대부분의 그리드에서 Cell Merge 기능을 제공하고
있습니다.
XtraGrid에서
Merge를 설정하는 방법은 다음과 같습니다
1.먼저
Views의 Options중에 OptionsView 항목중에서 AllowCellMerge를 True로 설정합니다.
2.각 컬럼에서 1에서 설정한 속성을 따르지 않는 컬럼만 별도로 설정하고 나머지는 Default로 둡니다(Columns->Options->OptionsColumn 항목에 있습니다)
하지만 이 Merge 기능에는 불편한 점이 하나 있는데 아마
한 번쯤은 다들 겪어보셨으리라 생각합니다.
각 컬럼별로 독립적으로 Megre를 하다보니 트리구조의 Merge가 되지 않는다는 것입니다.
상위 항목에 따라서 하위 컬럼들이 Merge가 되면 좋겠는데
이게 잘 안된다는 것이죠(저는 Group Merge라고 이름을
붙였습니다).
아래 그림을 보면 이해가 더 쉬우리라 생각합니다.
이 그림은 흔히 볼 수 있는 Merge화면입니다.
Order 번호 별로 각 차수가 있고 Order 별 상태와 Order별
Branch가 있습니다.
원래 의도는 Order별로
Merge를 하려는 것이었는데, 컬럼별 Merge속성을
주다보니 Order번호와는 관계없이 같은 값을 가지면 전부 Merge가
되어 버립니다.
우리가 원하는 형태의 그림은 아래와 같습니다.
이 그림은 오더번호를 기준으로 하위 컬럼들이 Merge된 형태입니다.
제가 찾아본 바로는 XtraGrid에서 바로 지원하는 속성은
없는 듯 싶습니다(물론 제가 찾지 못했을 수도 있습니다).
그래서 결국 코딩으로 구현했습니다.
그 코딩은 아래와 같습니다.
Private Sub GV1_CellMerge(sender As
System.Object, e As
DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs)
Handles GV1.CellMerge
Select Case e.Column.FieldName
Case
"Sts. Column Name", "Branch Column Name "
Dim
view As DevExpress.XtraGrid.Views.Grid.GridView = CType(sender,
DevExpress.XtraGrid.Views.Grid.GridView)
Dim
val1 As String
= view.GetRowCellValue(e.RowHandle1, "Order No
Column Name")
Dim
val2 As String
= view.GetRowCellValue(e.RowHandle2, " Order
No Column Name ")
e.Merge = (val1 = val2)
e.Handled = True
Case Else
End Select
End Sub
내용은 간단합니다.
GV1.CellMerge는 그리드에서 Merge가 발생할 때 일어나는 이벤트입니다.
Merge가 발생하는 컬럼이 내가 원하는 컬럼이고
기준이 되는 컬럼(여기서는 Order No)의 값이 같으면 Merge를 실행하도록 하는 코딩입니다.
이렇게 함으로써 원하는 컬럼에 대해서 원하는 방식으로 Merge를
할 수 있습니다.
오늘은 이상입니다.
이번에는 Grid Layout의 Save와 Load에 대해서 알아보겠습니다.
이 기능은 DevExpress
Component에서 지원하는 기능을 YJIT Framework에 Grid Properties로 추가해서 쉽게 사용할 수 있도록 만들었습니다.
먼저 사용방법을 보도록 하겠습니다.
우선 Grid의 SaveLayout properties를 True로 설정합니다.
이것으로 설정은 끝입니다.
이렇게 하고 컴파일 한 후 프로그램을 실행하면 겉으로 보기에는 아무런 변화가
없지만, Grid가 포함된 화면을 닫을 때, 현재 Grid에 대한 Layout을 저장합니다.
저장되는 경로는 프로그램 실행파일이 있는 경로에 GridLayout이라는 Folder를 생성하고 그 안에 2개의 파일을 생성합니다.
생성되는 두 개의 파일 명은 다음과 같습니다.
1.
Grid가 포함된 Form Name + 그리드 View 이름 + ‘_ORIGIN’ : 처음에 디자인된 Grid Layout File
2.
Grid가 포함된 Form Name + 그리드 View 이름 : 최종 저장된
Grid Layout File
GridLayout Folder에
이런식으로 파일이 생성됩니다.
Grid Layout을 불러오는 시점은 Grid의 OnCreateControl( ) 함수이고, 최종 Layout을 저장하는 시점은 Dispose( ) 함수입니다.
아래 그림은 Grid변경의 예시입니다.
최초 Grid의 모습입니다.
최초 Grid에서 첫번째 컬럼을 Hide 하고 Type과
Contract Date를 앞으로 옮기고, Contract Date에 Sort를 지정하고 Branch로 Group을
걸고 확인한 결과 이 상태가 그대로 저장되었습니다.
최초 xml 파일과 저장된 xml 파일은 맨 마지막에 따로 적도록 하겠습니다. 참고하십시오.
이 방법의 단점은 개발자가 새로 Grid를
수정해서 배포했을 경우, 사용자는 계속 마지막에 저장된 형태의 Grid
Layout으로만 보인다는 단점이 있습니다.
그래서 최초 배포시에 디자인된 Layout으로
되돌리는 기능이 필요합니다.
처음 디자인된 Grid Layout으로
되돌리려면 Grid Header에서 마우스 오른쪽 클릭을 합니다.
그러면 아래 그림과 같은 Popup
Menu가 뜨는데 맨 아래 보면 Layout Reset이라는 메뉴가 추가로 생성되어 있음을
볼 수 있습니다.
Layout Reset을 누르면 확인 창이 뜨고
OK를 누르면 원래의 Layout으로
돌아갑니다. 이전에 저장된 Grid Layout으로 돌아갈
수 없습니다.
이 방법은 xml 파일로 Client에 저장되는 방식이기 때문에 사용자가 아니라 컴퓨터마다 다른 Layout이 나올 수 있습니다.
이것을 사용자별로 Layout을
적용하도록 하려면 xml 파일이 아니라 DataBase에 xml 파일 내용을 저장하고 불러오는 방식을 사용해야 할 것입니다.
하지만 아직은 검증도 안된 상태이고 그렇게 하면 속도문제도 있을 것 같아서
현재는 Client에 저장하는 방식만을 사용하고 있습니다.
이상으로 Grid Layout Save
& Load를 알아보았습니다.
참고 링크 : http://documentation.devexpress.com/#WindowsForms/CustomDocument2404
참고로 DevExpress에서는
위와 같은 방식으로 Grid 뿐만 아니라 Form 자체의 Layout을 저장하는 방법도 제공하고 있습니다.
별첨. Grid Layout의
xml 파일 내용.
1. TmsVehChassisGV1_ORIGIN
<XtraSerializer
version="1.0" application="View">
<property name="#LayoutVersion"
/>
<property
name="ActiveFilterEnabled">true</property>
<property name="Columns"
iskey="true" value="10">
<property name="Item1"
isnull="true" iskey="true">
<property
name="Visible">true</property>
<property
name="VisibleIndex">0</property>
<property
name="Name">GridColumn1</property>
</property>
<property name="Item2"
isnull="true" iskey="true">
<property
name="Width">107</property>
<property name="Visible">true</property>
<property
name="VisibleIndex">1</property>
<property
name="Name">GridColumn2</property>
</property>
<property name="Item3"
isnull="true" iskey="true">
<property
name="Visible">true</property>
<property
name="VisibleIndex">5</property>
<property
name="Name">GridColumn9</property>
</property>
<property name="Item4"
isnull="true" iskey="true">
<property
name="Visible">true</property>
<property name="VisibleIndex">2</property>
<property
name="Name">GridColumn3</property>
</property>
<property name="Item5"
isnull="true" iskey="true">
<property
name="Width">116</property>
<property
name="Visible">true</property>
<property
name="VisibleIndex">3</property>
<property
name="Name">GridColumn5</property>
</property>
<property name="Item6"
isnull="true" iskey="true">
<property
name="Width">223</property>
<property
name="Visible">true</property>
<property
name="VisibleIndex">4</property>
<property
name="Name">GridColumn6</property>
</property>
<property name="Item7"
isnull="true" iskey="true">
<property
name="Width">206</property>
<property
name="Visible">true</property>
<property
name="VisibleIndex">6</property>
<property
name="Name">GridColumn4</property>
</property>
<property name="Item8"
isnull="true" iskey="true">
<property
name="Width">115</property>
<property name="Visible">true</property>
<property
name="VisibleIndex">7</property>
<property
name="Name">GridColumn7</property>
</property>
<property name="Item9"
isnull="true" iskey="true">
<property
name="Width">121</property>
<property name="Visible">true</property>
<property
name="VisibleIndex">8</property>
<property
name="Name">GridColumn8</property>
</property>
<property name="Item10"
isnull="true" iskey="true">
<property
name="Width">62</property>
<property
name="Visible">true</property>
<property
name="VisibleIndex">9</property>
<property
name="Name">GridColumn10</property>
</property>
</property>
<property name="OptionsView"
isnull="true" iskey="true">
<property name="ShowGroupPanel">false</property>
<property
name="ShowViewCaption">true</property>
<property
name="EnableAppearanceEvenRow">true</property>
<property
name="ColumnAutoWidth">false</property>
</property>
<property
name="ActiveFilterString" />
<property
name="GroupSummarySortInfoState" />
</XtraSerializer>
2. TmsVehChassisGV1
<XtraSerializer
version="1.0" application="View">
<property name="#LayoutVersion"
/>
<property
name="ActiveFilterEnabled">true</property>
<property name="Columns"
iskey="true" value="10">
<property name="Item1"
isnull="true" iskey="true">
<property
name="Name">GridColumn1</property>
</property>
<property name="Item2"
isnull="true" iskey="true">
<property
name="Width">107</property>
<property name="Visible">true</property>
<property
name="VisibleIndex">0</property>
<property
name="Name">GridColumn2</property>
</property>
<property name="Item3"
isnull="true" iskey="true">
<property
name="Visible">true</property>
<property
name="VisibleIndex">1</property>
<property
name="Name">GridColumn9</property>
</property>
<property name="Item4"
isnull="true" iskey="true">
<property
name="Visible">true</property>
<property
name="VisibleIndex">3</property>
<property
name="Name">GridColumn3</property>
</property>
<property name="Item5"
isnull="true" iskey="true">
<property
name="Width">116</property>
<property
name="Visible">true</property>
<property name="VisibleIndex">3</property>
<property
name="Name">GridColumn5</property>
</property>
<property name="Item6"
isnull="true" iskey="true">
<property
name="Width">137</property>
<property
name="Visible">true</property>
<property name="VisibleIndex">4</property>
<property
name="Name">GridColumn6</property>
</property>
<property name="Item7"
isnull="true" iskey="true">
<property
name="Width">84</property>
<property
name="Visible">true</property>
<property name="VisibleIndex">5</property>
<property
name="Name">GridColumn4</property>
</property>
<property name="Item8"
isnull="true" iskey="true">
<property
name="Width">115</property>
<property
name="Visible">true</property>
<property
name="VisibleIndex">6</property>
<property
name="Name">GridColumn7</property>
</property>
<property name="Item9"
isnull="true" iskey="true">
<property
name="Width">121</property>
<property
name="Visible">true</property>
<property
name="VisibleIndex">2</property>
<property
name="Name">GridColumn8</property>
</property>
<property name="Item10"
isnull="true" iskey="true">
<property
name="Width">62</property>
<property
name="Visible">true</property>
<property
name="VisibleIndex">7</property>
<property
name="Name">GridColumn10</property>
</property>
</property>
<property name="OptionsView"
isnull="true" iskey="true">
<property
name="ShowGroupPanel">false</property>
<property name="ShowViewCaption">true</property>
<property
name="EnableAppearanceEvenRow">true</property>
<property
name="ColumnAutoWidth">false</property>
</property>
<property
name="ActiveFilterString" />
<property
name="SortInfo">~Xtra#Base64AAEAAAD/////AQAAAAAAAAAMAgAAAF5EZXZFeHByZXNzLlh0cmFHcmlkLnYxMS4xLCBWZXJzaW9uPTExLjEuMTEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iODhkMTc1NGQ3MDBlNDlhBQEAAAA4RGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mb0NvbGxlY3Rpb24EAAAACmdyb3VwQ291bnQFY2xvbmUPY2xvbmVHcm91cENvdW50E0NvbGxlY3Rpb25CYXNlK2xpc3QAAwADCLMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tEZXZFeHByZXNzLlh0cmFHcmlkLkNvbHVtbnMuR3JpZENvbHVtblNvcnRJbmZvLCBEZXZFeHByZXNzLlh0cmFHcmlkLnYxMS4xLCBWZXJzaW9uPTExLjEuMTEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iODhkMTc1NGQ3MDBlNDlhXV0IHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAAAQAAAAkDAAAAAAAAAAkEAAAABAMAAACzAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbRGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mbywgRGV2RXhwcmVzcy5YdHJhR3JpZC52MTEuMSwgVmVyc2lvbj0xMS4xLjExLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAwRGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mb1tdAgAAAAgICQUAAAABAAAAAQAAAAQEAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QDAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgUAAAgICQYAAAACAAAABwAAAAcFAAAAAAEAAAAEAAAABC5EZXZFeHByZXNzLlh0cmFHcmlkLkNvbHVtbnMuR3JpZENvbHVtblNvcnRJbmZvAgAAAAkHAAAADQMQBgAAAAQAAAAJCAAAAAkJAAAADQIMCgAAABlEZXZFeHByZXNzLlh0cmFHcmlkLnYxMS4xBQcAAAAuRGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mbwIAAAAJU29ydE9yZGVyCkNvbHVtbk5hbWUAAQgKAAAAAQAAAAYLAAAAC0dyaWRDb2x1bW44AQgAAAAHAAAAAQAAAAYMAAAAC0dyaWRDb2x1bW4zAQkAAAAHAAAAAQAAAAkLAAAACw==</property>
<property name="GroupSummarySortInfoState"
/>
</XtraSerializer>
Dim View As DevExpress.XtraGrid.Views.Grid.GridView = CType(WG1.MainView,DevExpress.XtraGrid.Views.Grid.GridView)
If Not View Is Nothing Then
If dlgSaveExcel.ShowDialog() = DialogResult.OK Then
View.OptionsPrint.ExpandAllDetails = True
View.ExportToXls(dlgSaveExcel.FileName)
MsgBox("Savecomplete.")
End If
End If
Dim View As DevExpress.XtraGrid.Views.BandedGrid.AdvBandedGridView = CType(WG1.MainView, DevExpress.XtraGrid.Views.BandedGrid.AdvBandedGridView)
If Not View Is Nothing Then
If dlgSaveExcel.ShowDialog() = DialogResult.OK Then
Dim currentCursor As Cursor = Cursor.Current
Cursor.Current = Cursors.WaitCursor
View.OptionsPrint.ExpandAllDetails = True
View.OptionsPrint.PrintBandHeader = False
View.ExportToXls(dlgSaveExcel.FileName)
'File Open
If MessageBox.Show("Do you want open this file?", "Open", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
Dim process As System.Diagnostics.Process = New System.Diagnostics.Process()
process.StartInfo.FileName = dlgSaveExcel.FileName
process.StartInfo.Verb = "Open"
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
process.Start()
End If
Cursor.Current = currentCursor
End If
End If
.
참고 사이트
http://documentation.devexpress.com/#WindowsForms/CustomDocument8869
그리드에서 간단하게 사용할 수 있는 Find Panel 기능에 대한 간단한 소개입니다.
XtraGrid는 엑셀처럼 각 컬럼의 헤더에서 적용할 수 있는 Filter 기능외에 Find Panel을 이용한 전체 필터링 기능을 제공합니다.
별다른 코드 없이 간단한 설정만으로 가능합니다.
Search, Find 등 간단한 조회화면에서 유용하게 사용할 수
있으리라고 기대됩니다.
간단한 예를 보겠습니다.
입력란은 콤보박스로 되어 있어서 위의 그림과 같이 이전에 입력했던 히스토리를 볼 수 있습니다.
설정 방법에 대해 알아보겠습니다.
Grid의 Run Designer를
실행시켜서 해당 Grid View를 선택합니다.
Options에서
OptionsFind를 펼쳐서 세부 설정을 할 수 있습니다.
AllowFindPanel : Find Panel 사용여부에 대한 설정입니다. True인 경우에 사용할 수 있습니다.
이 부분이 True로 되어 있다면 그리드를 선택하고 Ctrl+F를 누르면 FindPanel이 나타납니다. 입력란 왼쪽의 x 표시를 누르거나 Close 버튼으로 감출 수 있습니다.
AlwaysVisible : Find Panel을 항상 보여줍니다.
ClearFindOnClose : Find Panel을 닫을 때 검색 히스토리를 삭제합니다.
FindDelay : 문자를 입력할 때 마다 Filtering을 할 지연시간입니다. 시간이 짧을수록 바로바로 Filtering이 됩니다. 단위는 밀리세컨드입니다.
FindFilterColumns : Filtering을 할 컬럼을 설정합니다. ‘*’로 설정할 경우 전체 컬럼에 적용됩니다.
FindMode : 입력할 때마다 Filtering을 할 것인지, Find 버튼이나 엔터키로 Filtering을 할 것인지를 결정합니다. Default는 입력할 때마다 Filtering을 합니다.
HighlightFindResults : Filtering값을 강조해서 보여줍니다.
ShouCloseButton : 닫기 버튼을 보여줍니다.
참고 사이트를 보시면 알 수 있듯이 두 단어 이상을 조합해서 And, Or 검색도
가능하고 특정 단어가 들어가지 않은 단어만 Filtering 하는 것도 가능합니다.
참고 사이트
http://documentation.devexpress.com/#WindowsForms/CustomDocument8869