Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.10.2011, 13:01
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию Заполнение компонентов на форме из разных таблиц

Доброго времени суток всем. Я совершенно не представляю что делать. У меня есть форма в ней я заполняю всю нужную мне информацию и добавляю её в разные таблицы. На главной форме есть dbGrid в которой отображаются некоторые данные а именно Ф.И.О и мне нужно при выборе записи в Grid и при нажатии на кнопку "Изменить" открывалась предыдущая таблица с заполненными компонентами из разных таблиц соответствующая выбранной записи.
P.S База Access все таблицы имею столбец id_info главная таблица "Ф.И.О" имеет связь один ко многим.

Буду благодарен.
Ответить с цитированием
  #2  
Старый 10.10.2011, 17:54
Zhigalov Zhigalov вне форума
Начинающий
 
Регистрация: 27.05.2009
Сообщения: 100
Репутация: -1277
По умолчанию

Цитата:
Сообщение от Amilman
Доброго времени суток всем. Я совершенно не представляю что делать. У меня есть форма в ней я заполняю всю нужную мне информацию и добавляю её в разные таблицы. На главной форме есть dbGrid в которой отображаются некоторые данные а именно Ф.И.О и мне нужно при выборе записи в Grid и при нажатии на кнопку "Изменить" открывалась предыдущая таблица с заполненными компонентами из разных таблиц соответствующая выбранной записи.
P.S База Access все таблицы имею столбец id_info главная таблица "Ф.И.О" имеет связь один ко многим.

Буду благодарен.


Если я правельно понял. На событие дабл клик в гриде нужно вызвать вашу форму заполнения и там использовать команду редоктирования Edit.

Код:
begin
  With Datamodule2.People do
  begin
    Edit;
    if Form1.ShowModal = mrOk Then
      Post
    else
      Cancel;
  end;
Ответить с цитированием
  #3  
Старый 10.10.2011, 18:22
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ох и не люблю же я такие вопросы. Гадать приходится постоянно.
Может Zhigalov прав, а может и не так. Может у автора несколько таблиц и для каждой нужна своя форма ввода и нужен навигатор перехода между этими формами по аналогии кнопок перехода в IE.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 10.10.2011, 19:19
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ох и не люблю же я такие вопросы. Гадать приходится постоянно.
Может Zhigalov прав, а может и не так. Может у автора несколько таблиц и для каждой нужна своя форма ввода и нужен навигатор перехода между этими формами по аналогии кнопок перехода в IE.
Извините. У меня несколько таблиц,есть одна форма с разным способом ввода. С одной формы заполняется сразу несколько таблиц. и мне нужно:
1)На главной форме выделить нужную запись в grid.
2)Нажать кнопку на форме.
3)Должна открыться форма заполнения только уже с заполненными компонентами из разных таблиц.
4)Потом я вношу изменения жму кнопку и все изменения вносятся в разные таблицы. (не добавление а изменение текущих записей)

Добавление производится через эту-же форму таким способом:
Код:
procedure TForm4.Button5Click(Sender: TObject);
begin
  if DataModule1.ADOQuery2.Active = True then
    DataModule1.ADOQuery2.Close;
  DataModule1.ADOQuery2.sql.Text :=
    'insert into Работники (Фамилия, Имя, Отчество, Подразделение, Статус_работника, Пол, id_info) values ("'
    + Edit_fio.Text + '", "' + Edit_name.Text + '", "' + Edit_otch.Text + '", "'
    + ComboBox1.Text + '", "' + DBLookUpCombobox.Text + '", "' + ComboBox2.Text
    + '", "' + Inttostr(seInfo.Value) + '")';
  DataModule1.ADOQuery2.ExecSQL;
Ответить с цитированием
  #5  
Старый 10.10.2011, 19:32
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Так, уже проясняется. Итак, вот что вам видимо нужно:
1. Поместить на вторую форму для каждой из используемых таблиц свою пару компонентов TAdoTable и TDataSource. Связать TAdoTable с TDataSource через свойство TDataSource.Dataset
2. Далее надо установить правильно связь между самими таблицами, так-что бы данные правильно разносились автоматом. Делается это через свойство таблицы MasterSource и связку по ключевым полям MasterFields
Как я понял таблица Работники у вас главная (MasterSource) а на нее завязаны уже остальные таблицы. Не имея схемы вашей БД я пока дальше немогу объяснить что и как вам связать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 10.10.2011, 20:38
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Вот схема данных

Ответить с цитированием
  #7  
Старый 10.10.2011, 21:05
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Окно моей программы :

Хотелось бы при выборе в главной форме записи и при нажатии на кнопку изменить открывалась форма на добавление с заполненными полями.

Последний раз редактировалось Amilman, 10.10.2011 в 21:19.
Ответить с цитированием
  #8  
Старый 11.10.2011, 11:39
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

Цитата:
Вот схема данных
Структура базы ,IMHO, не продумана.
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!
Ответить с цитированием
  #9  
Старый 11.10.2011, 15:36
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Цитата:
Сообщение от Viajero
Структура базы ,IMHO, не продумана.
Ну тогда скажите как правильно буит?
Ответить с цитированием
  #10  
Старый 11.10.2011, 16:08
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Мдаааа..., структурка БД конечно...
Ну не суть. Я вам объясню сам принцип, а структуру мы вам можем подсказать уже потом. Итак, с учетом вашей схемы будет так:
Главной таблицей у вас является "Работники", с другими таблицами у вас организована связь по ключу id_info. Тогда на форму кидаете 3 пары компонент
1: AdoTable1,DataSource1 - подключение к таблице Работники
2: AdoTable2,DataSource2 - подключение к таблице Основное
3: AdoTable3,DataSource3 - подключение к таблице Паспорт
Для AdoTable2 и AdoTable3 установите MasterSource = DataSource1, MasterFields = id_info и IndexFieldNames = id_info
Теперь AdoTable1,AdoTable2,AdoTable3 можно активировать.
Если сделали все правильно, то при выборе записи в таблице Работники у вас автоматом будут выбраны все записи из таблиц Основное и Паспорт где id_info совпадает. Если-же в Основное или Паспорт нет данных, то при добавлении новой записи в любую из этих таблиц будет автоматом прописан ключ id_info от таблицы Работники.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 11.10.2011, 16:52
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

Цитата:
Сообщение от Amilman
Ну тогда скажите как правильно буит?
Разработать правильную структуру БД - это уже наполовину решить задачу. Короче надо думать (а мне как и каждому прапорщику лень). Кроме того необходимы исходные данные задачи - для чего она и что планирует делать. Но, впрочем, могу подсказать, если это что-то вроде учёта кадров, то структура БД должна примерно повторять структуру учреждения. И посмотри здесь и здесь
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!

Последний раз редактировалось Viajero, 11.10.2011 в 17:00.
Ответить с цитированием
  #12  
Старый 11.10.2011, 16:58
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Попытался вывести записи из таблицы таким методом:
Код:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  with TForm4.Create(Application) do
    Show;
    Form4.Edit_name.Text:= DataModule1.ADOQuery2.FieldByName('Имя').AsString;
    Form4.MaskEdit4.Text:= DataModule1.ADOQuery6.FieldByName('Дата_приёма_на_работу').AsString;
end;
но при выборе записи после открытия формы вылетает ошибка.
Ответить с цитированием
  #13  
Старый 11.10.2011, 17:12
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

Цитата:
Сообщение от Страдалецъ
Я вам объясню сам принцип, а структуру мы вам можем подсказать уже потом.
Обычно формы привязываются к структуре а не наоборот. IMHO, без правильной структуры ничего путного не выйдет. Это ж потом практически всю программу придётся переделывать.
Цитата:
Для AdoTable2 и AdoTable3 установите MasterSource = DataSource1
это при отношениях Основное - Сотрудники 1:M, что не очевидно, и опять же упирается в структуру.
Цитата:
Сообщение от Amilman
with TForm4.Create(Application) do
Тут видидимо дело не только в структуре, но и в незнании синтаксиса Delphi . Советую почитать это
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!

Последний раз редактировалось Viajero, 11.10.2011 в 17:25.
Ответить с цитированием
  #14  
Старый 11.10.2011, 17:34
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Цитата:
Сообщение от Viajero
Тут видидимо дело не только в структуре, но и в незнании синтаксиса Delphi .

Вы имеете введу что форму можно вызвать таким методом "Form4.Show;" ?
Ответить с цитированием
  #15  
Старый 11.10.2011, 17:56
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

Цитата:
Сообщение от Amilman
Вы имеете введу что форму можно вызвать таким методом "Form4.Show;" ?
Причём тут метод, я про синтаксис говорю, который можно даже по F1 посмотреть
Код:
A with statement is a shorthand for referencing the fields of a record or the fields, properties, and methods of an object. The syntax of a with statement is

with obj do statement

or

with obj1, ..., objn do statement

where obj is an expression yielding a reference to a record, object instance, class instance, interface or class type (metaclass) instance, and statement is any simple or structured statement. Within statement, you can refer to fields, properties, and methods of obj using their identifiers alone--without qualifiers.

For example, given the declarations

type TDate = record
  Day: Integer;
  Month: Integer;
  Year: Integer;
end;
var OrderDate: TDate;

you could write the following with statement.

with OrderDate do
  if Month = 12 then
  begin
    Month := 1;
    Year := Year + 1;
  end
  else
    Month := Month + 1;

This is equivalent to

if OrderDate.Month = 12 then
begin
  OrderDate.Month := 1;
  OrderDate.Year := OrderDate.Year + 1;
end
else
  OrderDate.Month := OrderDate.Month + 1;

If the interpretation of obj involves indexing arrays or dereferencing pointers, these actions are performed once, before statement is executed. This makes with statements efficient as well as concise. It also means that assignments to a variable within statement cannot affect the interpretation of obj during the current execution of the with statement.

Each variable reference or method name in a with statement is interpreted, if possible, as a member of the specified object or record. If there is another variable or method of the same name that you want to access from the with statement, you need to prepend it with a qualifier, as in the following example.

with OrderDate do
  begin
    Year := Unit1.Year
    ...
  end;

When multiple objects or records appear after with, the entire statement is treated like a series of nested with statements. Thus

with obj1, obj2, ..., objn do statement

is equivalent to

with obj1 do
	  with obj2 do
	     ...
	     with objn do
	statement

In this case, each variable reference or method name in statement is interpreted, if possible, as a member of objn; otherwise it is interpreted, if possible, as a member of objn-1; and so forth. The same rule applies to interpreting the objs themselves, so that, for instance, if objn is a member of both obj1 and obj2, it is interpreted as obj2.objn.
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!

Последний раз редактировалось Viajero, 11.10.2011 в 17:58.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter