아래는 RefreshGrid 함수이다.
무지 어렵다. 여기서 내부 함수로서 꽤나 중요해 보이는 Ubound!
배열을 차원과 함께 넣어주면, 배열의 크기를 리턴하는 함수이다.
예를들어 (a, b) 배열이면, 2차원이고, 여기에 (0, 0), (0, 1) ... (4, 4)까지 들어가 있으면, 4가 리턴된다.
참 유용한 함수라고 할 수 있다. 배열에 들어가는 자료의 크기에 따라 자료를 출력해 줘야할 때, 일일이 반복문에 써주지 않아도 되기 때문이다.
아무튼 많이 헤맸다. 그리드 제어에서 배워야 할 것들이 많다. Col 과 Row에 관련된 내부함수들과 오퍼레이터 등이 있는 것 같은데, 전혀 몰라서, 현재 가로형으로 되어있는 레코드 출력을 세로형으로 바꾸려다가 시간을 꽤나 보냈다.(결국은 포기하고, 리스팅 구현을 하면서, DB구조를 연구하고 있다.)
DB에 왜 테이블을 4개나 만들어서 사용하는지를 좀더 고민해 봐야 겠다.
Function RefreshCDGrid() As Boolean
Dim strSortField As String
Dim i As Long
Dim strSQL As String
On Error Resume Next
RefreshCDGrid = False
' cd 레코드셋이 오픈되어 있다면 닫음
If gobjCD.State = adStateOpen Then
gobjCD.Close
End If
' SQL 문 작성
strSQL = "SELECT "
' columns 추가
For i = 0 To UBound(gstrCDCols, 2)
strSQL = strSQL & gstrCDCols(0, i) & ","
Next
' RowData를 위한 id 추가
strSQL = strSQL & "CDId"
Label1.Caption = strSQL
' 데이터 선택
' 현재 정렬 방법으로 정렬
strSQL = strSQL & " FROM cd INNER JOIN " _
& " Genre ON cd.GenreId = genre.GenreID "
' 현재 Project에 대한 데이터 필터
strSQL = strSQL & "WHERE ProjectId = " & CStr(glngProjectId)
' 현재 정렬 방법대로 데이터 정렬
strSQL = strSQL & " ORDER BY " & gstrCDCols(0, glngCDSortCol)
' 레코드셋 오픈
gobjCD.Open strSQL, gobjConnection, adOpenForwardOnly, adLockReadOnly
' grid clear
grdCD.Clear
' row 설정
grdCD.Rows = 1
' count 만큼 col count 설정
grdCD.Cols = gobjCD.Fields.Count - 1
' header row 설정
grdCD.Row = 0
For i = 0 To UBound(gstrCDCols, 2)
'grid에 label 추가
grdCD.TextMatrix(0, i) = gstrCDCols(1, i)
' labels을 볼드체로
grdCD.Col = i
grdCD.CellFontBold = True
Next
grdCD.Col = 0
' 레코드 추가
Do While Not gobjCD.EOF
' cd 이름과 row 추가
grdCD.AddItem gobjCD.Fields("CDName").Value
' 각각의 columns 값 설정
For i = 0 To UBound(gstrCDCols, 2)
grdCD.TextMatrix(grdCD.Rows - 1, i) = _
gobjCD.Fields(gstrCDCols(0, i)).Value
Next
' Primary Key에 rowdata 설정
grdCD.RowData(grdCD.Rows - 1) = gobjCD.Fields("CDId").Value
' 다음 레코드로 이동
gobjCD.MoveNext
Loop
' 에러 체크
If Err.Number = 0 Then
RefreshCDGrid = True
End If
End Function
무지 어렵다. 여기서 내부 함수로서 꽤나 중요해 보이는 Ubound!
배열을 차원과 함께 넣어주면, 배열의 크기를 리턴하는 함수이다.
예를들어 (a, b) 배열이면, 2차원이고, 여기에 (0, 0), (0, 1) ... (4, 4)까지 들어가 있으면, 4가 리턴된다.
참 유용한 함수라고 할 수 있다. 배열에 들어가는 자료의 크기에 따라 자료를 출력해 줘야할 때, 일일이 반복문에 써주지 않아도 되기 때문이다.
아무튼 많이 헤맸다. 그리드 제어에서 배워야 할 것들이 많다. Col 과 Row에 관련된 내부함수들과 오퍼레이터 등이 있는 것 같은데, 전혀 몰라서, 현재 가로형으로 되어있는 레코드 출력을 세로형으로 바꾸려다가 시간을 꽤나 보냈다.(결국은 포기하고, 리스팅 구현을 하면서, DB구조를 연구하고 있다.)
DB에 왜 테이블을 4개나 만들어서 사용하는지를 좀더 고민해 봐야 겠다.
Function RefreshCDGrid() As Boolean
Dim strSortField As String
Dim i As Long
Dim strSQL As String
On Error Resume Next
RefreshCDGrid = False
' cd 레코드셋이 오픈되어 있다면 닫음
If gobjCD.State = adStateOpen Then
gobjCD.Close
End If
' SQL 문 작성
strSQL = "SELECT "
' columns 추가
For i = 0 To UBound(gstrCDCols, 2)
strSQL = strSQL & gstrCDCols(0, i) & ","
Next
' RowData를 위한 id 추가
strSQL = strSQL & "CDId"
Label1.Caption = strSQL
' 데이터 선택
' 현재 정렬 방법으로 정렬
strSQL = strSQL & " FROM cd INNER JOIN " _
& " Genre ON cd.GenreId = genre.GenreID "
' 현재 Project에 대한 데이터 필터
strSQL = strSQL & "WHERE ProjectId = " & CStr(glngProjectId)
' 현재 정렬 방법대로 데이터 정렬
strSQL = strSQL & " ORDER BY " & gstrCDCols(0, glngCDSortCol)
' 레코드셋 오픈
gobjCD.Open strSQL, gobjConnection, adOpenForwardOnly, adLockReadOnly
' grid clear
grdCD.Clear
' row 설정
grdCD.Rows = 1
' count 만큼 col count 설정
grdCD.Cols = gobjCD.Fields.Count - 1
' header row 설정
grdCD.Row = 0
For i = 0 To UBound(gstrCDCols, 2)
'grid에 label 추가
grdCD.TextMatrix(0, i) = gstrCDCols(1, i)
' labels을 볼드체로
grdCD.Col = i
grdCD.CellFontBold = True
Next
grdCD.Col = 0
' 레코드 추가
Do While Not gobjCD.EOF
' cd 이름과 row 추가
grdCD.AddItem gobjCD.Fields("CDName").Value
' 각각의 columns 값 설정
For i = 0 To UBound(gstrCDCols, 2)
grdCD.TextMatrix(grdCD.Rows - 1, i) = _
gobjCD.Fields(gstrCDCols(0, i)).Value
Next
' Primary Key에 rowdata 설정
grdCD.RowData(grdCD.Rows - 1) = gobjCD.Fields("CDId").Value
' 다음 레코드로 이동
gobjCD.MoveNext
Loop
' 에러 체크
If Err.Number = 0 Then
RefreshCDGrid = True
End If
End Function
댓글 달기