Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/36: Рейтинг темы: голосов - 36, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 26
1

Копирование поля из одной таблицы в другую(ADO)

17.11.2009, 16:03. Показов 7403. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.В базах данных я не особо силен.Работу делаю с пом. ADO.
Имеется вот такой код, взял я его с какой то книжки:
При нажатии на кнопке Удалить:

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button3Click(Sender: TObject);
begin
if Application.MessageBox(PChar('Вы действительно хотите удалить запись :'
+DataModule1.ADOTable1DSDesigner.Asstring+' '+DataModule1.ADOTable1DSDesigner2.Asstring
+' '+DataModule1.ADOTable1DSDesigner3.Asstring), 'Внимание!!!',
MB_OKCANCEL)=id_OK then
begin
DataModule1.ADOTable1.Delete;
end;
end;


Но перед удалением мне нужно скопировать удаляемое поле в другую таблицу(напр table_arxiv), а из этой таблицы(напр. table_main) удалить эту запись.
Проблема вроде простая, но я не могу понять, как получить,идентификатор, так чтоли сказать; т.е я не могу объяснить программе, какую имеено запись ему нужно скопировать в table_arxiv, т.к не пойму, где это прописывается.
Работаю с компонентами ADOConnection, ADOTable,DataSource и DBGrid.
Скрин прикладываю для наглядности.
http://mediapix.ru/pics/1401f3... 8f2784.jpg
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2009, 16:03
Ответы с готовыми решениями:

Копирование данных из одной таблицы в другую в пределах одной базы. Не работает счетчик
Делаю копирование данных из одной таблицы в другую в пределах одной базы. procedure...

Копирование таблицы из одной БД в другую
Добрый вечер, Уважаемые Форумчане! Подскажите, пожалуйста, как скопировать данные таблицы из одной...

Копирование из одной таблицы БД в другую
Добрый день. Подскажите, пожалуйста как можно копирывать данные из одной таблицы, в...

Копирование таблицы из одной БД в другую
Данное действие элементарно сделать через импорт в Access, но это необходимо сделать через макрос,...

13
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.11.2009, 16:16 2
активная запись в ДБГриде соответствует конкретной записи в источнике данных, вот и решение простое берете источник данных и с помощью FieldByName узнаете значение ключевого поля. остальное - это уже дело техники... можно в два запроса все организовать...
0
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 26
17.11.2009, 16:40  [ТС] 3
Можно немного по конкретнее?(хотя судя по вашей подписи...)
Просто для меня это дремучий лес, а делать срочно надо.
Источник данных-base.mdb, с полями типа name,surname,birthdate и т.п. Ключевое поле наз-ся key.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.11.2009, 17:39 4
RamireZ, под исчтоником данных для дбгрида подразумевается объект, который вы указываете в TDataSource... например TTable, тогда чтобы получить ключевое поле выбранной в гриде строки надо написать так
Table.FieldByName('key').AsInteger (или какой у вас там тип)
0
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 26
17.11.2009, 23:04  [ТС] 5
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
RamireZ, под исчтоником данных для дбгрида подразумевается объект, который вы указываете в TDataSource... например TTable, тогда чтобы получить ключевое поле выбранной в гриде строки надо написать так
Table.FieldByName('key').AsInteger (или какой у вас там тип)
С этим вроде бы разобрался.
Сделал так

ADOTable2.Append;
ADOTable2.FieldByName('xxx').Value := ADOTable1.FieldByName('xxx').Value;
...
ADOTable2.Post;
Сейчас возник следующий аспект:
У меня есть номер в очереди(на скрине можно увидеть, первое поле) и мне нужно организовать эту очередь,т.е добавляется запись-и ей присваиваетсяпоследний номер в очереди+1, удаляется первая запись, и очередь продвигается на 1 человека, т.е то кто был 2 стал 1, кто 3 стал 2, кто 4 стал 3 и т.п.
Как это можно реализовать? ДУмаю понятно выразился,данные добавляются тольков конец очереди.
(Блин, никогда так не тупил)
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.11.2009, 23:12 6
ну во многих базах поддерживается тип данных - счетчик, а тебе просто надо источником данных сделать запрос такой:
SQL
1
SELECT * FROM TABLE ORDER BY KEY
но есть нюанс, счетчик до полного уничтожения таблицы или полной очистчки запросом truncate table будет помнить порядковые номера, даже если ты затрешь все данные таблице, поэтому рекомендую счетчик этот скрыть, пользователю порядковый номер явно не нужен, главное, чтобы порядок поступления данных был верен ИМХО
0
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 26
19.11.2009, 21:31  [ТС] 7
Не стану создавать новую тему, думаю вопрос не сложный:
Как поместить текущую дату в поле редактирования DBEdit?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.11.2009, 09:43 8
RamireZ, никак, разве что поставить в поле в базе это значение по умолчанию. Этот компонент данные тянет из базы, лучше использовать простой Edit
0
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 26
20.11.2009, 10:52  [ТС] 9
ТОже была мысль поставить как значение по умолчанию, но так и не нашел, где у DBEdit нах-ся это свойство...
А насчет простого Edit'a, как потом из него данные в таблицу передать тогда?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.11.2009, 11:16 10
RamireZ, элементарно, запросом
0
3 / 3 / 0
Регистрация: 13.11.2009
Сообщений: 43
20.11.2009, 11:40 11
Одааа с гридами я на мучался здорово, но проще сделать так
на кнопке изменить(та что на первой форме) вы просто закрепляете код открытия формы для редактирования
(Form2.Show) далее кидешь DBEdit столько сколько нужно на форму 2
прописываем в Uses 1формы Unit 2формы а в Uses 2формы Unit 1формы таким образом Dbgrid"ы смогут обмениваца информацией

далее просто у каждого DBEdit"ов указываем DataSource ,Form1.DataSource1 а DataFiels соответсвующую колонку

как только ты наеченаешь редактировать едиты таблица входить в режим редактирования(Edit) автоматом так что нигде не надо писать ADOTable2.Edit;
Как только во всех полях сделаны изменения
Form1.ADOTable1.Post на кнопке сохранить
Form1.ADOTable1.Cancel на кнопке отменить

чтоб добавлятьновую строку
Form1.ADOTable1.Insert;режим добавления
Form1.ADOTable1.Post; подтверждает изменения
0
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 26
20.11.2009, 18:45  [ТС] 12
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
RamireZ, элементарно, запросом
А как через запрос стянуть данные из простого Edit'a в саму БД?
0
3 / 3 / 0
Регистрация: 13.11.2009
Сообщений: 43
20.11.2009, 20:22 13
сори не понял попроса.........
Этож проще простого
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Procedure TForm1.IDSort(Table:TADOTable);
var I:integer;
Begin
I:=0;
With Table Do Begin
First;
  While Not EOF Do Begin
    Edit;
    Fields[0].Value:=I;
    post;
    I:=I+1;
    Next;
  End;
End;
End;
ADOTable1.Delete;
IDSort(ADOTable1);прономерует заново по порядку правдо если будет какой сбой и индексы будут идти не последовательно может случища ошибка
тоесть допустим
сроки
1
3
5
6
12
прономерует
в
1
2
3
4
5
но если будет
4
1
8
2
будет ошибка

вычесляем следующий id
Delphi
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
Function TForm1.SeachFreeID(Table:TADOTable):Integer;
Var
I:Integer;
EndSeach,Yes:Boolean;
begin
SeachFreeID:=-1;
EndSeach:=True;
I:=0;
 
 
With Table Do Begin
    while EndSeacH Do Begin
    First; 
    Yes:=True;
      While Not EOF Do Begin
        if Fields[0].Value = I Then Begin
        Yes:=False;
        Break;
        End Else Begin
        Next;
        End;
      End;
    If Yes Then Begin EndSeach:=False;  SeachFreeID:=I; End;
    If EndSeach Then I:=I+1;
    End;
End;
End;
SeachFreeID(ADOTable1)//вернёт первый не задействованый id

Добавлено через 12 минут
а на счет даты те нужен компонент TDateTimePicker при сохранение таблицы прям из него выдераешь и вставляешь в ячейку

Добавлено через 14 минут
ADOTable1.Edit;//если не включен;
ADOTable1.Fields[{номер столбца}].AsDateTime:=DateTimePicker1.DateTime;
перед
ADOTable1.Post;

и
DateTimePicker1.DateTime:=ADOTable1.Fields[{номер столбца}].AsDateTime;
перед
Form2.Show
1
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 26
25.11.2009, 23:50  [ТС] 14
Как сделать онлайн фильтрацию через скуль запрос?
Сейчас у меня так: есть Edit у него в onChange прописано
Delphi
1
2
3
4
5
6
if Length(FindEdit.Text)>0 then
  Datamodule1.LgotaTable.Filtered:=true
else
  Datamodule1.LgotaTable.Filtered:=false;
 
Datamodule1.LgotaTable.Filter:='Surname>'''+FindEdit.Text+'''';
Фильтр по фамилии.

Затем прописано еще в самом DataModule
Delphi
1
2
3
4
5
6
7
8
procedure TDataModule1.LgotaTableFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
Accept:=false;
if copy(LgotaTableSurname.AsString,1,Length(Form1.FindEdit.Text))=
  Form1.FindEdit.Text then
  Accept:=true;
end;
Делал я все это по книге и там было написано, что если в базе предполагается большое количество записей-то этот способ будет долгим и база будет тормозить.
Необходима именно онлайн фильтрация(т.е набираем в поле поиска "с" остаются только фамилии на "с" и т.д)
0
25.11.2009, 23:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2009, 23:50
Помогаю со студенческими работами здесь

Копирование из одной таблицы в другую
Есть 1 таблица ИНДЕКСА, в ней 1 й большой список индексов деталей. У каждого индекса есть пока...

Копирование из одной таблицы в другую
Доброго времени суток!нужна помощь. Хочу сделать Передачу id из одной таблицы в другую с помощью...

Копирование из одной таблицы в другую
Здравствуйте. Есть две таблицы, первая заполнена вторая пустая. В первой 5 полей в второй 6, пять...

Копирование данных из одной таблицы в другую
Есть два файла с разными таблицами, надо по номеру из 3-го столбца в одной таблице найти и...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru