Задачка вот какая встала передо мной, как лист перед травой :
Сделать сложную выборку в MSHFlexGrid из нескольких таблиц БД.
"Основная" - паспортные данные (rsIss As New Recordset), 5 таблиц, для каждой своя ... As New Recordset. Каждая из 5-ти таблиц - определенные данные исследований. Одинаковые в этих 5-ти таблицах только номер чела (nBol), дата записи, время записи.
В грид хочу вывести номер, фамилию, инициалы из "основной" таблицы, и данные из остальных таблиц исследований. Учитываем то, что в "основной" таблице может записей не быть (если новая БД), соответственно таблицы исследований тоже пусты. При заполнении "основной" не обязательно заполняются исследования, а при заполнении исследованиями их м.б. несколько на одного чела в одной таблице (и в остальных так же).
Делаю так (отрывок кода):
- Код: Выделить всё
sSQL = "SELECT nBol, Fam, Name, Otch FROM Pasp ORDER BY Fam"
rsIss.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
If rsIss.RecordCount <> 0 Then 'если есть записи в "основной" таблице
ReDim aArr(5, 0) 'инициализируем масив
Do While Not rsIss.EOF
'****************** до следующего ряда звездочек - код выборки из 1-й таблицы
sSQL = "SELECT DateIs, TimeIs FROM BAK WHERE BAK.nBol = " & isBol & _
" ORDER BY DateIs, TimeIs"
rsBAK.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
If rsBAK.RecordCount <> 0 Then 'если есть записи в 1-й таблице исследований
Do While Not rsBAK.EOF
aArr(1, j) = Str(isBol)
aArr(2, j) = rsIss.Fields("Fam") & " " & _
IIf(IsNull(rsIss.Fields("Name")), Empty, Left(rsIss.Fields("Name"), 1) & ".") & _
IIf(IsNull(rsIss.Fields("Otch")), Empty, Left(rsIss.Fields("Otch"), 1) & ".")
aArr(3, j) = "БАК" 'в ячейке грида название признака
aArr(4, j) = rsBAK.Fields("DateIs") 'дата исследования
aArr(5, j) = rsBAK.Fields("TimeIs") 'время исследования
rsBAK.MoveNext: j = j + 1
ReDim Preserve aArr(5, j) 'переопределяем массив
Loop
End If
rsBAK.Close
'******************
'далее еще 4 куска абсолютно идентичных кода выборки для других таблиц,
'разные только переменные ... As New Recordset
'******************
rsIss.MoveNext
Loop
End If
'заполняем грид
For i = 0 To j - 1
MSHFlexGrid1.AddItem aArr(0, i) & vbTab & aArr(1, i) & vbTab & aArr(2, i) & vbTab & _
aArr(3, i) & vbTab & aArr(4, i) & vbTab & aArr(5, i)
Next i
rsIss.Close
Код хорошо работает, но... Несмотрибелен он и неизящен!
Вопросы:
1. Можно ли всю эту лабуду загнать в один SQL-запрос? Да еще, чтоб в одной ячейке (элемент массива aArr(3, j)) было значение, не относящееся к БД, т.е., название исследования. Если да, то подскажите, как?
2. Возможно ли через SQL-запрос вывести в одной ячейке грида фамилию и ИНИЦИАЛЫ чела (они в разных полях БД), да еще чтоб после каждого инициала стояла точка? Т.е., взять 1-ю букву поля (типа Left()).
На 1. чувствую, есть положительное решение, просто не знаю, как реализовать. На 2. - не уверен, но не удивлюсь!
С уважением - Dummiel.