Задачка вот какая встала передо мной, как лист перед травой
 :
 :
Сделать сложную выборку в 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.



