드로우홀릭 더베이직
액세스 VBA를 배우며 업무에 적용하고 있습니다. 물론 ‘직장인을 위한 실무 액세스’도 몇번 읽어보고 공부하고 있습니다. 며칠 동안 자력으로 풀어보려고 노력했으나 답을 못 구해서 도움을 요청 드립니다.
테이블과 폼을 바운드하면 저절로 해결되나 언바운드 폼(서브폼이 포함된 일대다 폼) 으로는 되지 않습니다.
f출고등록 폼에서 ‘출고번호’에 ‘201230S10’ 값을 입력한 다음 ‘읽기’ 단추를 클릭하면 ‘출고등록’ 테이블에서 레코드를 제대로 불러와 f출고등록 폼에 표시되는데, 서브폼에는 ‘출고’ 테이블의 출고번호(201230S10)에 해당하는 레코드가 5개이나 마지막 1개만이 표시될 뿐입니다. 여러 방법을 모색하여도 해결되지 않는데, 서브폼에 모든 레코드를 표시할 방법을 조언해주시면 감사하겠습니다.
읽기 버튼의 프로시저는 아래와 같습니다.
Private Sub cmd읽기_Click()
If IsNull(Me.txt출고번호.Value) Then Exit Sub
Dim db As DAO.Database
Set db = CurrentDb
Dim rs As DAO.Recordset
Dim vSQL As String
'일측 레코드의 읽기
vSQL = "SELECT 출고일자, 판매처코드, 유무상 FROM 출고등록 "
vSQL = vSQL & "WHERE 출고번호 = '" & Me.txt출고번호.Value & "';"
Set rs = db.OpenRecordset(vSQL)
If rs.BOF And rs.EOF Then
MsgBox "대상 레코드가 없습니다.", vbInformation, "확인"
GoTo Finally
End If
Me.txt출고일자.Value = rs!출고일자
Me.txt판매처코드.Value = rs!판매처코드
Me.txt유무상.Value = rs!유무상
rs.Close
'다측 레코드의 읽기
Dim i As Integer
vSQL = "SELECT 상품코드, 출고수량, 참고 FROM 출고 "
vSQL = vSQL & "WHERE 출고번호 = '" & Me.txt출고번호.Value & "';"
Set rs = db.OpenRecordset(vSQL)
rs.MoveFirst
Do While Not rs.EOF
Me.f출고.Form.txt상품코드 = rs!상품코드
Me.f출고.Form.txt출고수량 = rs!출고수량
Me.f출고.Form.txt참고 = rs!참고
rs.MoveNext
Loop
Finally:
If Not rs Is Nothing Then
rs.Close
Set rs = Nothing
End If
If Not db Is Nothing Then
db.Close
Set db = Nothing
End If
End Sub
일단, 언바운드 폼을 이런 식으로 사용하는 것은..
정말 특별한 이유가 있지 않고서는 권장하지 않습니다.
바운드 폼으로 하면, 특정 출고번호로 '이동'하는 것이 쉽지 않아서 이렇게 구현하신건가요?
그렇다면 차라리 특정 출고번호로 '이동'하는 방법을 문의하심이 좋겠습니다.
일단, 질문에 대해 답을 드리자면..
한 화면에 여러 레코드가 나오는 하위 폼의 경우..
언바운드로는 여러 레코드를 나오게 할 수 있는 방법이 없습니다.
액세스의 데이터시트는 일반적인 프로그래밍 도구에 포함되어 나오는 '그리드(grid)'와는 그 의미가 완전히 다릅니다.
지금은 그리드를 사용하듯 하려고 하시는 것인데요..
방법이 없습니다.
쉬운 예로, 그리드를 사용하는 것처럼 하려면, 몇 번째 줄에 값이 표시되어야 하는지.. 그 속성을 정의하셔야 할텐데..
'원죽' 님께서 작성한 코드에는 '몇 번째 줄' 이라는 개념은 없지요?
'상품코드', '출고수량' 같은 '열'에 어떤 값을 표시하라는 개념은 있지만요.
액세스 데이터시트는 언바운드로는 한 줄만 표시할 수 있습니다.