none
обновление данных в связанных DataTable RRS feed

  • Вопрос

  • Здравствите , помогите пожалуйста решить вопрос или ткните ссылкои где про это можно почитать

    Вопрос в следующем

    В программе есть база данных , которая состоит из нескольких Data Table

    На Form1 данные заносятся в одну  DataTable1 , назовем ее BSМатериалы , в DataTable1 есть строки «наименование бренда» и столбцы , определенные числовые характеристики различных параметров выбранного бренда .На Form2 данные из DataTable1 выбираются и заносятся  в DataTable2, BSПользователи,  в  данную DataTable2 для конкретного пользователя заносятся выбранные им для работы из DataTable1 «Наименования брендов» с числовыми характеристиками различных параметров выбранного бренда

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

    Как сделать так , чтоб при изменении числовых характеристик по любому из «наименовании бренда» в DataTable1 эти изменения автоматом бы переписывались в DataTable2  по каждому пользователю и по каждому бренду , выбранному им для работы. Как то так , объяснил как смог …

     VB на VS2008



    • Изменено eikhner 4 сентября 2013 г. 20:51
    4 сентября 2013 г. 20:42

Ответы

  •  здравствуите , решили проблему след образом

    Sub UpdateBD1()

    Dim Имя As String = ""  'имя бренда ( Дю , Шпис , Юпол , ППГ и тд )

    Dim Вид As String = ""  'расход брендового материала (ЛакР, ГрунтР, КраскаР и тд )

    Dim Вид1 As String = "" 'название брендового материала (Лак, Грунт, Краска и тд )

    Dim X() As DataRow      'строка таблицы

    'для всех строк базы материалов

    For i = 0 To Главная.Bd1.Материалы.Rows.Count - 1

    'находим название бренда в начале строки , занесли в переменную Имя (Например Дюпонт)

    Имя = Главная.Bd1.Материалы.Rows(i).Item(0)

    'Console.WriteLine("строка " & i)'вывести в консольное приложение строки

    'для всех столбцов таблицы материалов , начиная со 2го , тк в 1 имя бренда

    For n = 2 To Главная.Bd1.Материалы.Columns.Count - 1

    'получаем имя колонки (например  - ЛакР) , это значение мы будем менять

    Вид = Главная.Bd1.Материалы.Columns(n).ColumnName

    'Console.WriteLine("столбец  " & Вид) 'вывести в консольное приложение названия столбцов

    Select Case Вид 'если расход материала проверяется для краски ,  т.е.= "базаР", "ЗслР" и тд

    Case "базаР", "ЗслР"

    Вид1 = "Краска" 'то ищем в столбце "краска" имя бренда

    X = Главная.Bd1.СТО.Select(Вид1 & " Like '" & Имя & "'") '

    If X.Length > 0 Then '

    ‘X(0).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид) '

    End If

    For j=0 to  X.Length-1

    X(j).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид)

    next

    Case Else 'иначе

    'имя  материала  = вид минус один знак с конца (если проверяем ЛакР то ищем Лак)

    Вид1 = Mid(Вид, 1, Вид.Length - 1)

    Try

    X = Главная.Bd1.СТО.Select(Вид1 & " Like '" & Имя & "'")'ищем строки в колонке Лак Имя

    If X.Length > 0 Then '

    ‘X(0).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид) '

    End If

    For j=0 to  X.Length-1

    X(j).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид)'заменяем значения

    next

    Catch ex As Exception

    End Try

    End Select

    Next

    Next

    End Sub



    6 сентября 2013 г. 18:52

Все ответы

  • Вам надо в DataTable2 хранить ссылки на таблицу DataTable1, а при выборке создавать сводную таблицу где и показывать данные из обоих таблиц, в этом случае вам не придется все время синхронизирова ть данные в обоих таблицах, и они будут всегда актуальны

    например вот такие таблицы

    table1                                   table2

    pk(guid)  ------------|              pk(guid)

    name                      |--------> pk_table1(guid) FK

    .......                                      ........

    5 сентября 2013 г. 5:18
  • Добрый день.

    Я могу ошибаться, но у вас, такое ощущение, что единица данных храниться в двух местах. Это самая главная проблема при проектировании базы данных.

    Насколько я понял вашу предметную область у вас должно быть 3 таблицы: пользователи, бренды, числа определяющие связь между пользователями и брендами. Как то так:

    Запись в промежуточной таблице говорит о том, что сотрудник отвечает за бренд. Т.е. изменяя для одного сотрудника число в таблице, вы будите получать изменения при выборке данных по бренду...

    Как то так.

    5 сентября 2013 г. 6:30
    Отвечающий
  • Я согласен с предыдущими ораторами, что, вероятно, следует изменить саму структуру БД.

    Между тем, как я понимаю, у вас проблема в части реализации интерфейса пользователя. Имхо, самый простой (и правильный) выход - использовать DataView. Таблица остаётся всего одна, в которой наименования брендов и их характеристики. А для показа пользователю только выбранных брендов создаём DataView, устанавливаем у него фильтр RowFilter, и связываем этот DataView с компонентом (например, DataGridView). Всё! Синхронизация изменений будет автоматически.

    Могу привести пример кода на C#.

    5 сентября 2013 г. 12:10
  • Здравствуите , спасибо за ответы , хотел отписать днем с работы , но на раб компе выкидывает из регистрации , не оставить сообщение никак . Сеичас отпишу более подробно

    В базе данных есть 2 таблицы (DataTable) , первая Материалы , вторая Пользователи

    Таблица материалы состоит из наименования бренда , и расхода брендовых материалов например бренд Дюпонт , далее идет расход материалов данного бренда ЛакР, ГрунтР, КраскаР и так далее

    Брендов может быть несколько

    В Таблицу Пользователи делается выборка из таблицы Материалы Там есть столбцы  - пользователь , Лак , ЛакР, Грунт, ГрунтР , Краска, КраскаР  и тд

    Если пользователь пользуется Лаком Бренда1 , то в столбце Пользователи.Лак стоит значение Бренда1 ( стринг )

     а в столбце Пользователи.ЛакР стоит значение расхода

    Данного лака на единицу  площади  (дубле),  если пользователь пользуется краскои Бренда2 ,

    то в столбце Пользователи.Краска стоит Бренд2, а в столбце Пользователи.КраскаР

    Стоит расход краски из Бренда2 и тд

    Если мы изменяем расход любого материала из Брендов , он должен поменяться для данного бренда и в таблице пользователей

     

    На данном этапе есть 2 варианта решения проблемы

    1         При изменении данных в таблице Материалы  записать измененные данные во временную таблицу

    В виде бренд и позицию измененную , например Бренд1 , ЛакР  и Бренд2 , ГрунтР

    Затем пробегаемся по столбцам в таблице Пользователи , Лак, если там есть Имя Бренда1 , то Пользователи.ЛакР = Бренд1.ЛакР

    Затем пробегаемся по столбцам в таблице Пользователи , Грунт, если там есть Имя Бренда2 , то Пользователи.ГрунтР = Бренд2.ГрунтР

    2         При изменении данных в таблице Материалы просто перезаписываем все данные из таблицы материалы в таблицу пользователи

    встаем на первую строку в таблице Материалы , Бренд1 , проходим по столбцу Пользователи.Лак , если там есть имя Бренд1 , меняем значение Пользователи.ЛакР на Бренд1.ЛакР , далее проверяем столбец , проверили , теперь проверяем столбец Пользователи.Грунт , если там есть имя Бренд1 , заменяем значение Пользователи .ГрунР на Бренд1.ГрунтР идем далее по столбцу , затем проверяем столбец Пользователи.КраскаР , если там есть Бренд1 , то для данного пользователя меняем Пользователи.КраскаР на значение ячеики Бренд1.КраскаР ,........ проверили последнии столбец
    начинаем все сначала для бренда2 и тд пока не кончатся бренды

    Таблицы небольшие не более 10- 20 брендов , с 20 позициями , и до 20 – 30 пользователей , которые используют данные материалы в работе.

     

    Пути к таблицам выглядят так     Главная.Bd1.Материалы и Главная.Bd1.СТО

    первый столбец Материалов  - имя бренда

    первый столбец СТО  - пользователь


    • Изменено eikhner 5 сентября 2013 г. 19:46
    5 сентября 2013 г. 18:33
  •  здравствуите , решили проблему след образом

    Sub UpdateBD1()

    Dim Имя As String = ""  'имя бренда ( Дю , Шпис , Юпол , ППГ и тд )

    Dim Вид As String = ""  'расход брендового материала (ЛакР, ГрунтР, КраскаР и тд )

    Dim Вид1 As String = "" 'название брендового материала (Лак, Грунт, Краска и тд )

    Dim X() As DataRow      'строка таблицы

    'для всех строк базы материалов

    For i = 0 To Главная.Bd1.Материалы.Rows.Count - 1

    'находим название бренда в начале строки , занесли в переменную Имя (Например Дюпонт)

    Имя = Главная.Bd1.Материалы.Rows(i).Item(0)

    'Console.WriteLine("строка " & i)'вывести в консольное приложение строки

    'для всех столбцов таблицы материалов , начиная со 2го , тк в 1 имя бренда

    For n = 2 To Главная.Bd1.Материалы.Columns.Count - 1

    'получаем имя колонки (например  - ЛакР) , это значение мы будем менять

    Вид = Главная.Bd1.Материалы.Columns(n).ColumnName

    'Console.WriteLine("столбец  " & Вид) 'вывести в консольное приложение названия столбцов

    Select Case Вид 'если расход материала проверяется для краски ,  т.е.= "базаР", "ЗслР" и тд

    Case "базаР", "ЗслР"

    Вид1 = "Краска" 'то ищем в столбце "краска" имя бренда

    X = Главная.Bd1.СТО.Select(Вид1 & " Like '" & Имя & "'") '

    If X.Length > 0 Then '

    ‘X(0).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид) '

    End If

    For j=0 to  X.Length-1

    X(j).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид)

    next

    Case Else 'иначе

    'имя  материала  = вид минус один знак с конца (если проверяем ЛакР то ищем Лак)

    Вид1 = Mid(Вид, 1, Вид.Length - 1)

    Try

    X = Главная.Bd1.СТО.Select(Вид1 & " Like '" & Имя & "'")'ищем строки в колонке Лак Имя

    If X.Length > 0 Then '

    ‘X(0).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид) '

    End If

    For j=0 to  X.Length-1

    X(j).Item(Вид) = Главная.Bd1.Материалы.Rows(i).Item(Вид)'заменяем значения

    next

    Catch ex As Exception

    End Try

    End Select

    Next

    Next

    End Sub



    6 сентября 2013 г. 18:52