powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Master detail для больших таблиц
5 сообщений из 5, страница 1 из 1
Master detail для больших таблиц
    #38609949
salex42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток, уважаемые коллеги!

Помогите пожалуйста построить форму со сценарием Master detail.
Есть две связанные таблицы в Oracle:
- KABONENT - абонентs (тысячи строк)
- ELECBA - квитанции(миллионы строк).
Находил в интернете варианты построения Master detail форм (пр. ), но все они основаны на принципе: ограничивается число записей подчиненной таблицы, выставлением свойства DataView.RowFilter.
Т.е. вся таблица загружается в память, а затем выводятся часть ее строк после фильтрации.
А мне необходимо для каждого абонента выполнять заново запрос к таблице с квитанциями, чтобы выбрать только его строки.
Как это сделать?

Буду очень благодарен любой помощи
...
Рейтинг: 0 / 0
Master detail для больших таблиц
    #38609966
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
salex42Буду очень благодарен любой помощи Тут масса примеров master-detail с перезапросом detail с сервера.
...
Рейтинг: 0 / 0
Master detail для больших таблиц
    #38610072
salex42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Спасибо, что отозвались. Я посмотрел ваш проект, но мало что там понял. Я только начал изучать WPF. Не могли бы Вы привести какой-нибудь пример по проще?
...
Рейтинг: 0 / 0
Master detail для больших таблиц
    #38611728
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничё не понял. В чём проблема?

Если надо сделать что-то трудоёмкое - зачем это выводить пользователю? Делайте в памяти клиента или на сервере, а после фильтрации уже показывайте. В т. ч. с мастер-деталями.

Вообще, всегда, когда просят "вывиди мине сто тыщь мильёнов строк", нужно спрашивать - "а накуа?". Пользователь что, будет в этом списке полосой прокрутки свою фамилию искать? Загрузите ему только кусочек на букву такую-то или по фамилии такой-то, или постраничный вывод.

Я не знаю, что у вас за область и ситуация, но все эти мастер-детали, которые автоматом привязываются к выбранной строке из списков и тому подобное - в основном на небольшие списки рассчитаны и небольшие же детали.
...
Рейтинг: 0 / 0
Master detail для больших таблиц
    #38612144
salex42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user7320Ничё не понял. В чём проблема?

Проблема в том что я не знал, как сделать перезапрос detail c сервера, а пользователю не нужно выводить миллионы строк, ему надо около сотни для каждой строки мастер блока.

В общем после некоторых ковыряний и изменения алгоритма описанного здесь , получилось следующее:
XAML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
    <Page.Resources>
        <ObjectDataProvider x:Key="EnterpriseDataProvider"
            ObjectType="{x:Type local:EnterpriseDataProvider}"/>
        <ObjectDataProvider x:Key="Enterprise"
          ObjectInstance="{StaticResource EnterpriseDataProvider}"
          MethodName="GetEnterprises"/>
        <ObjectDataProvider x:Key="TuedogDataProvider"
           ObjectType="{x:Type local:TuedogDataProvider}"/>
        <ObjectDataProvider x:Key="Tuedog1" MethodName="GetTuedogByEnterprice"
                ObjectInstance="{StaticResource TuedogDataProvider}">
            <ObjectDataProvider.MethodParameters>
                <system:String>2085</system:String>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider> 
    </Page.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <DataGrid ItemsSource="{Binding Source={StaticResource Enterprise}}"  Height="189" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" 
                  Width="800" SelectionChanged="dataGrid1_SelectionChanged" />
        <DataGrid Grid.Row="1"
              ItemsSource="{Binding Source={StaticResource Tuedog1}}"/>
    </Grid>


C# DataProvider для Detail блока:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
    class TuedogDataProvider
    {
        private MainDataSetTableAdapters.TUEDOGTableAdapter adapter;

        private MainDataSet dataset;

        public TuedogDataProvider()
        {
            dataset = new MainDataSet();
            adapter = new MainDataSetTableAdapters.TUEDOGTableAdapter();
            adapter.FillBy(dataset.TUEDOG, 0);

            dataset.TUEDOG.TUEDOGRowChanged +=
                new MainDataSet.TUEDOGRowChangeEventHandler(TuedogRowModified);
            
            dataset.TUEDOG.TUEDOGRowDeleted +=
                new MainDataSet.TUEDOGRowChangeEventHandler(TuedogRowModified);
        }

        public DataView GetTuedog()
        {
            return dataset.TUEDOG.DefaultView;
        }

        void TuedogRowModified(object sender, MainDataSet.TUEDOGRowChangeEvent e)
        {
            adapter.Update(dataset.TUEDOG);
        }

        public DataView GetTuedogByEnterprice(String pkdog)
        {
            if (pkdog == null || pkdog == string.Empty)
            {
                return null;
            }
            if (pkdog != "")
            {
                dataset = new MainDataSet();

                adapter.FillBy(dataset.TUEDOG, Convert.ToDecimal(pkdog.ToString())); // здесь выполняется перезапрос к БД
                dataset.TUEDOG.TUEDOGRowChanged +=
                    new MainDataSet.TUEDOGRowChangeEventHandler(TuedogRowModified);

                dataset.TUEDOG.TUEDOGRowDeleted +=
                    new MainDataSet.TUEDOGRowChangeEventHandler(TuedogRowModified);
            }
            DataView view = dataset.TUEDOG.DefaultView;
/*          if (pkdog != null && pkdog != String.Empty) 
            {
                view.RowFilter = string.Format("KDOG=" + pkdog); // выбирает нужные строки из таблицы (не выполняется запроса к БД)
            }*/
            return view;
        }
    }


Связь реализована через DataSet, а FillBy - метод содержащий запрос с Bind переменной подобного вида
Код: plsql
1.
2.
3.
select *
from tuedog
where kdog = :p_kdog


Согласен, что реализация так себе, но рабочая, метод GetTuedogByEnterprice реализован плохо, пересоздавать dataset не стоит, но без этого возникает ошибка уникальности таблицы.

Как можно реализовать по другому? Или по другому реализовать MethodName?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Master detail для больших таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]