Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Сообщение EUGY от alexfor Добавлено: 03.06.07 01:03  

Автор вопроса:  alexfor
EUGY, так все-таки, как в обычный репорт вб(не в кристал репортс) вставить подчиненный репорт или таблицу, ты уж извини чайника

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #1 Добавлено: 03.06.07 01:58
в ADO есть возможность создавать иерархические рекордсеты, а в DataReport в каждой секции отражать нужный уровень иерархии этого recordset.

Извини, выдрал из какого-то своего кассового отчета дремучей давности,самому не очень наглядно, поэтому просматривай критично.


Dim cn As ADODB.Connection
Dim strShape As String
  Set rsc = New ADODB.Recordset
  Set rscus = New ADODB.Recordset
  cn.Open "PROVIDER=MSDataShape;DATA PROVIDER=NONE;"
strShape = _
"SHAPE APPEND NEW adDate AS DATA, NEW adDouble AS STARTOST,NEW adDouble AS ENDOST, " & _
         " ((SHAPE APPEND NEW adDate AS DATA," & _
                        " NEW adBSTR AS DOC, " & _
                        " NEW adBSTR AS STROKA, " & _
                        " NEW adDouble AS SUMPLUS, " & _
                        " NEW adDouble AS SUMMIN) " & _
                        " AS Com RELATE DATA TO DATA) as Com1 "
rsc.Open strShape, cn, adOpenStatic, adLockOptimistic

'заполнить уровень 0
For x = 0 to ....
    rsc.AddNew
    rsc.Fields(";DATA";) = CDate(...
    rsc.Fields("STARTOST";) = ...
    rsc.Fields("ENDOST";) = ...
Next

'заполнить подчиненный уровень
for y = 0 to ...
   Set rscus = rsc("Com1";).Value
            With rscus
                .AddNew
                .Fields(";DATA";) = CDate(....
                .Fields(";DOC";) = ...
                .Fields("STROKA";) = ...
                .Fields("SUMPLUS";) = ...
                .Fields("SUMMIN";) = ....
            End With
Next

  Set DataReport1.DataSource = rsc
  ;DataReport1.Show 1


В этом конкретном DataReport есть секция Detail
и секции Group Header & Group Footer.

В секции Detail расположены по гориз. четыре RptTextBox, в их свойствах DataField стоит DOC, STROKA, SUMPLUS, SUMMIN соответственно. Все четыре элемента имеют DataMember в свойствах "Com1".
В Group Header у меня RptTextBox STARTOST и DATA
В Group Footer - RptTextBox ENDOST
DataMember - пустые.
При запуске отчета в Group Header отображаются данные из рекордсета rsc о дате кассовых операций и начальный остаток, а в секции Detail подчиненный rscus с деталями конкретных сумм прихода- расхода денег.
в Group Footer итог на конец дня.

Связкой двух рекордсетов служит их поля ";Data"
(RELATE DATA TO DATA)

внешний вид таблиц образуется с помощью RptLines обрамляющих поля DOC, STROKA, SUMPLUS, SUMMIN.

Ну, в кратце так.






Ответить

Номер ответа: 2
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #2 Добавлено: 03.06.07 04:42
Ладно уж, раз начал.. блохи, грабли...

В данном случае Connection в отчете не привязан к базе данных (DATA PROVIDER=NONE), т.к. требовалась большая свобода маневра. Данные для отчета были предварительно запрошены другим коннектом, и занесены в массив.
Логику занесения из массивов в рекордсеты не показываю из-за внешней громоздкости, но там все банально.
Есть некоторая сложность в написании SHAPE,
надо не забывать закрывающие скобки и связки между иерархиями(RELATE).
DataEnvironment лучше не использовать, в работе он ужасен, но как построитель выражений SHAPE нагляден.
При занесении подчиненного рекордсета нужно его инициализировать (Set rscus = rsc("Com1";).Value)
Не допускать закрытие коннекта до закрытия DataReport.
Сменить книжную/альбомную ориентацию DataReport настройками принтера (DEVMODE,DocumentProperties).
пойду за пивом.






Ответить

Номер ответа: 3
Автор ответа:
 alexfor



Вопросов: 28
Ответов: 68
 Профиль | | #3 Добавлено: 03.06.07 13:23
EUGY - большое спасибо, буду пробывать, о результатах сообщу.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам