Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi и базы данных
Войти
Регистрация
Восстановить пароль
 
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
#1

Редактирование - Delphi БД

18.12.2013, 17:38. Просмотров 702. Ответов 17
Метки нет (Все метки)

Помогите пожалуйста сделать редактирование и добавление! И не могу понять что с поиском почему то не работает
http://www.cyberforum.ru/delphi-database/thread122125.html
0
Вложения
Тип файла: rar Курс.rar (569.1 Кб, 10 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2013, 17:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Редактирование (Delphi БД):

Редактирование бд
Здравствуйте, есть бд, скрин ниже. Вывожу таблицу в dbgrid с помощью такого...

Редактирование БД
Здравствуйте, вот создаю в Delphi 7 проект, нужна работа с базами данных. ...

Редактирование
Здравствуйте многоуважаемые) У меня есть форма на ней dbgrideh к ней подключен...

Редактирование БД
Здравствуйте! Есть база данных (MDF) и Delphi7. Можно ли, чтобы программа...

Редактирование БД
Здравствуйте! Есть база данных (MDF) и Delphi7. Можно ли, чтобы программа...

17
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
18.12.2013, 18:11 #2
Цитата Сообщение от Dasha18 Посмотреть сообщение
не могу понять что с поиском почему то не работает
Потому, что Вы отображаете в DBGrid'е ADOSotr, а фильтр делаете в ADOQuery1.

Добавлено через 24 минуты
Цитата Сообщение от Dasha18 Посмотреть сообщение
Помогите пожалуйста сделать редактирование и добавление!
Код для добавления новой записи:
Delphi
1
2
3
4
5
6
DM.ADOQuery1.SQL.Text:='INSERT INTO [Должность] ([Название], [Нижний оклад], [Верхний оклад]) VALUES (:p1, :p2, :p3)';
DM.ADOQuery1.Parameters.ParamByName('p1').Value:=Edit2.Text;
DM.ADOQuery1.Parameters.ParamByName('p2').Value:=StrToFloat(Edit3.Text);
DM.ADOQuery1.Parameters.ParamByName('p3').Value:=StrToFloat(Edit4.Text);
DM.ADOQuery1.ExecSQL;
DM.ADODol.Requery();
Для редактирования:
Delphi
1
2
3
4
5
6
7
DM.ADOQuery1.SQL.Text:='UPDATE [Должность] SET [Название]=:p1, [Нижний оклад]=:p2, [Верхний оклад]=:p3 WHERE [Код  должности]=:p4';
DM.ADOQuery1.Parameters.ParamByName('p1').Value:=Edit2.Text;
DM.ADOQuery1.Parameters.ParamByName('p2').Value:=StrToFloat(Edit3.Text);
DM.ADOQuery1.Parameters.ParamByName('p3').Value:=StrToFloat(Edit4.Text);
DM.ADOQuery1.Parameters.ParamByName('p4').Value:=DM.ADODol.Fields[0].AsInteger;
DM.ADOQuery1.ExecSQL;
DM.ADODol.Requery();

Не по теме:

Старайтесь не давать имена полям русскими буквами, тем более с пробелами (иногда даже с двумя подряд) - в дальнейшем очень намучаетесь.

1
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
18.12.2013, 18:35  [ТС] #3
спасибо большое! Правда на счет поиска я не совсем поняла
0
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
18.12.2013, 18:57 #4
Цитата Сообщение от Dasha18 Посмотреть сообщение
Правда на счет поиска я не совсем поняла
Это называется не поиск, а фильтр. Вы отображаете одни данные: все записи из таблицы Сотрудники вы помещаете в ADOSotr и далее показываете в DBGrid. При фильтрации вы выбираете необходимые записи в ADOQuery1 и дальше нигде их не показываете. Если Вы отображаете ADOSotr, то и фильтруйте его. Пример фильтрования без использования RadioButton (будет отображать, если искомый текст есть в Номере или ФИО).
Для этого необходимо создать обработчик события OnChange компонента Edit1:
Delphi
1
2
3
4
5
procedure TForm1.Edit1Change(Sender: TObject);
begin
  DM.ADOSotr.Filtered:=False;
  DM.ADOSotr.Filtered:=Length(Edit1.Text)>0;
end;
и обработчик события OnFilterRecord компонента ADOSotr:
Delphi
1
2
3
4
5
6
procedure TDM.ADOSotrFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept:=(Pos(AnsiUpperCase(Form1.Edit1.Text),AnsiUpperCase(DataSet.FieldByName('Номер').AsString))>0) or
          (Pos(AnsiUpperCase(Form1.Edit1.Text),AnsiUpperCase(DataSet.FieldByName('ФИО').AsString))>0)
 
end;
RadioButton'ы вообще можно удалить.
1
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
24.12.2013, 18:45  [ТС] #5
помогите пожалуйста сделать кнопки перевести, удалить и уволить
0
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
24.12.2013, 18:47  [ТС] #6
Цитата Сообщение от Dasha18 Посмотреть сообщение
помогите пожалуйста сделать кнопки перевести, удалить и уволить
вот
0
Вложения
Тип файла: rar Курс.rar (582.5 Кб, 10 просмотров)
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
24.12.2013, 18:56 #7
Цитата Сообщение от Dasha18 Посмотреть сообщение
помогите пожалуйста сделать кнопки перевести, удалить и уволить
Что вообще эти кнопки должны делать?
1
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
24.12.2013, 19:19  [ТС] #8
ну вот мы запустили программу, при выборе какого нибудь сотрудника в трудовой книжки должны отображаться его история работы(т.е. допустим он был преподавателем а его перевели в старшего препод.) ну вот допустим перевести с должности доцент на профессор, а уволить удалить я так думаю все, а кнопку принять я сейчас попробую сделать сама
0
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
24.12.2013, 19:23 #9
Цитата Сообщение от Dasha18 Посмотреть сообщение
ну вот мы запустили программу, при выборе какого нибудь сотрудника в трудовой книжки должны отображаться его история работы
В примере который вы выложили записи трудовой книжки не отображаются.
0
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
24.12.2013, 19:26  [ТС] #10
вот, извините
0
Вложения
Тип файла: rar Курс.rar (606.1 Кб, 6 просмотров)
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
24.12.2013, 19:40 #11
Dasha18, у Вас получается каша: таблицы, расположенные на вкладках "Сотрудники" и "Трудовая книжка" должны относится друг к другу как <Главная>-<Подчиненная>. Т.е. в таблице, расположенной на вкладке "Трудовая книжка" должны отображаться только те записи, которые соответствуют записи, на которой установлен курсор в таблице, расположенной на вкладке "Сотрудники". И вообще, лучше вкладки убрать и расположить таблицы одна под другой.

Кнопка перевести:
1. Должно открываться окно с выбором должностей. Пользователь выбирает новую должность и нажимает кнопку <Ok>.
2. К таблице отправляется запрос на изменение данных (проставляется у последней должности Дата окончания).
3. К таблице отправляется запрос на добавление записи (добавляете новую должность и Дату начала).
4. Обновляете DataSet, отображающий трудовую книжку.

Кнопка Принять: всё то же, что и "Перевести", только без пункта 2.

Кнопка Уволить: всё то же, что и "Перевести", только без пункта 3.
0
Absorber001
1 / 1 / 1
Регистрация: 13.12.2013
Сообщений: 26
25.12.2013, 03:41 #12
Мне бы сделать выбор ФИО из таблицы водители с помощью DBLookUPComboBox и вставить в SQL запрос на добавление на соотв. кнопку. Нужно переслать табельный номер водителя, и добавить его в табл. но отобразить в DBLookUPComboBox ФИО..

Помогите плиз!
0
Вложения
Тип файла: rar практика_18.11.13.rar (466.2 Кб, 2 просмотров)
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
26.12.2013, 17:55  [ТС] #13
Waddonator, можешь еще помочь?
Вот почему то не работает кнопки принять и изменить, не добавляет данные в трудовую книжку
0
Вложения
Тип файла: rar Курс.rar (651.9 Кб, 8 просмотров)
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
26.12.2013, 18:04 #14
Цитата Сообщение от Dasha18 Посмотреть сообщение
не добавляет данные в трудовую книжку
Потому, что вы пытаетесь добавить/изменить данные не в таблице История, где хранится "трудовая книжка", а в запросе Сотрудник Запрос1.
0
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
26.12.2013, 18:16  [ТС] #15
а не подскажете как в истории сохранить?
0
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
26.12.2013, 19:18 #16
Цитата Сообщение от Dasha18 Посмотреть сообщение
а не подскажете как в истории сохранить?
Точно так же, запросом INSERT. Только смотрите, чтобы типы параметров совпадали с типами полей, т.е. Вы должны заполнять поля не названиями из ComboBox'ов, а кодами (Код должности, код подразделения и номер сотрудника).
Правда существует единственное "Но". На форме frmNov Вы заполнили ComboBox'ы, которые отображают должности и подразделения руками, а следовало бы заполнять их программно из соответствующих таблиц (Например в процессе работы программы добавится какая-то должность или подразделение). Для этого при отображении формы frmNov в событии OnShow мы должны заполнить эти ComboBox'ы. И заполняем не только названия, но и коды. Для это используем процедуру AddItem:

Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TfrmNov.FormShow(Sender: TObject);
begin
  DM.ADODol.First;
  ComboBox3.Items.Clear;
  while not DM.ADODol.Eof do
    begin
      ComboBox3.AddItem(DM.ADODol.Fields[1].AsString,Pointer(DM.ADODol.Fields[0].AsInteger));
      DM.ADODol.Next;
    end;
  ComboBox3.ItemIndex:=1;
end;
Аналогично сделайте для подразделений. Теперь запрос на добавление данных в таблицу "История" будет выглядеть следующим образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses DateUtils;
...
var NewNumber:integer;
...
      SQL.Text:='SELECT MAX([Номер]) FROM [Сотрудник]';
      Open;
      NewNumber:=Fields[0].AsInteger;
      SQL.Clear;
      SQL.Add('INSERT INTO [История]  ([Номер], [Код подразделения], [Код должности], [Дата начала], [Дата окончания],[Оклад])');
      SQL.Add(' VALUES (:pNom, :pPod,:pDol,:pNa,:pOk,:pOkl)');
      Parameters.ParamByName('pNom').Value:=NewNumber;
      Parameters.ParamByName('pPod').Value:=integer(ComboBox4.Items.Objects[ComboBox4.ItemIndex]);
      Parameters.ParamByName('pDol').Value:=integer(ComboBox3.Items.Objects[ComboBox3.ItemIndex]);
      if DateTimePicker2.Checked then Parameters.ParamByName('pNa').Value:=DateOf(DateTimePicker2.DateTime);
      if DateTimePicker3.Checked then Parameters.ParamByName('pOk').Value:=DateOf(DateTimePicker3.DateTime)
      else Parameters.ParamByName('pOk').Value:=null;
      Parameters.ParamByName('pOkl').Value:=StrToFloatDef(Edit4.Text,0);
      ExecSQL;
И удали все связи в самом Access. Delphi они только мешают.
1
Dasha18
5 / 5 / 1
Регистрация: 20.04.2013
Сообщений: 95
26.12.2013, 20:14  [ТС] #17
вот сделала для изменения почему то не работает
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL.Text:='SELECT MAX([Номер]) FROM [Сотрудник]';
      Open;
      NewNumber:=Fields[0].AsInteger;
      SQL.Clear;
      SQL.Add('UPDATE История');
      SQL.Add('SET [Код подразделения]=:pPod,[Код должности]=:pDol, [Дата начала]=:pNa,[Дата окончания]=:pOk,[Оклад]=:pOkl');
      SQL.Add('WHERE [Номер]=:pNom');
      Parameters.ParamByName('pNom').Value:=NewNumber;
      Parameters.ParamByName('pPod').Value:=integer(ComboBox4.Items.Objects[ComboBox4.ItemIndex]);
      Parameters.ParamByName('pDol').Value:=integer(ComboBox3.Items.Objects[ComboBox3.ItemIndex]);
      if DateTimePicker2.Checked then
      Parameters.ParamByName('pNa').Value:=DateTimePicker2.DateTime;
      if DateTimePicker3.Checked then
      Parameters.ParamByName('pOk').Value:=DateTimePicker3.DateTime
      else Parameters.ParamByName('pOk').Value:=null;
      Parameters.ParamByName('pOkl').Value:=StrToFloatDef(Edit4.Text,0);
      ExecSQL;
Добавлено через 12 минут
теперь еще и уволить не работает
0
Waddonator
962 / 638 / 96
Регистрация: 01.11.2012
Сообщений: 1,447
27.12.2013, 11:26 #18
Этот код нужен только для вставки нового сотрудника, т.к. Вы добавляете его в таблицу и ему присваивается новый Номер. Этот номер и нужно получить с сервера:
Delphi
1
2
3
SQL.Text:='SELECT MAX([Номер]) FROM [Сотрудник]';
Open;
NewNumber:=Fields[0].AsInteger;
Для запроса Update необходимо брать Номер из ADOSotr:
Delphi
1
NewNumber:=DM.ADOSotr.Fields[0].AsInteger;
0
27.12.2013, 11:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2013, 11:26
Привет! Вот еще темы с решениями:

Редактирование DBgrid
Добрый день. Возникла такая проблема: нужно отредактировать таблицу,созданную в...

Редактирование таблицы
Добрый вечер! Помогите разобраться у меня есть таблица Успеваемость, хочу...

Редактирование данных
SQLConnection1, SimpleDataSet. Как сделать редактирование выбранного мне...

Редактирование в EXCEL
Есть программа делающая некие расчеты, потом сохраняет их в Эксель, после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru