Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2015, 17:09   #11
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
А зачем? Это нужно только показывать на экране, а хранить это нет смысла. Вот почитайте: https://ru.wikipedia.org/wiki/Нормальная_форма
Иными словами любое дублирование в хранении информации есть плохо.
что то я не совсем понимаю, как я смогу показывать клиента во втором DBGrid-e (на экране), если я переношу только его id
Jenny89 вне форума Ответить с цитированием
Старый 27.07.2015, 17:30   #12
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
ошибка выскакивает:
Jenny89 На каком СУБД вы работайте ??? Отвечайте пожалуйста.! вопрос не понятно ?

Последний раз редактировалось xxbesoxx; 27.07.2015 в 17:41.
xxbesoxx вне форума Ответить с цитированием
Старый 27.07.2015, 21:05   #13
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Автор, солнышко, перенос какой Вы хотите выполнить называется программная репликация.
Чтобы перенести с таблицы А (основной источник) в таблицу Б (синхронизируемый источник) все записи по алгоритму близкому к репликации вам нужно выполнить три шага.
Шаг 1. Обновить все записи таблицы Б которые совпадаю по ID с таблицей А
Код:
UPDATE Б SET (Б.поле1, Б.поле2, Б.поле3, .... Б.полеN) = (SELECT A.поле1, A.поле2, A.поле3, .... A.полеN FROM А) WHERE A.id=Б.id
или 
MERGE (если подерживается)
Шаг 2. Перенос с таблицы А в таблицу Б недостающих записей
Код:
INSERT INTO Б (поле1, поле2, поле3, .... полеN) 
 SELECT поле1, поле2, поле3, .... полеN  FROM A 
WHERE not A.id IN (SELECT id FROM Б)
Шаг 3. Удалить с таблицы Б лишние записи
Код:
DELETE FROM Б WHERE not id in (SELECT id FROM Б)
Цитата:
Jenny89 На каком СУБД вы работайте ??? Отвечайте пожалуйста.! вопрос не понятно ?
У Вас в Грузии все к девушкам в таком тоне обращаются?
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 28.07.2015, 00:37   #14
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
JUDAS У Вас в Грузии все к девушкам в таком тоне обращаются?
1) было интересно на каком СУБД человек работал хотел довать готовый пример . НО, раз вы уже рассказывайте "Я промолчу"
2) Можете спросить у девочках.
Цитата:
Автор, солнышко, перенос какой Вы хотите выполнить называется программная репликация.
Удивительно . от куда ты знаешь "Автор" девушка или парень ? Это у тебя волшебная ачки что ли ? Угадал
3) Давайте по делу . Для примеров создаю таблицу
Код:
create table Tab1
(
 id int identity(1,1),
 name nvarchar(30) not null,
 price money
);
Добавляю несколько запись
Код:
insert into Tab1(name, price) values(N'Чай',50),
                                    (N'Кофе',60),
                                    (N'Сахар',45)
select * from Tab1
Создаю еще таблицу Tab2 и на эту таблицу буду перенос данных из Tab1
Код:
create table Tab2
(
 id int not null,  
 name nvarchar(30) not null,
 price money
);
Цитата:
Jenny89 происходит перенос данных из одной таблицы в другую . Подскажите как сделать так чтобы не было повторного переноса одной и той же записи.
Первый вариант
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 with qryTab2 do
 begin
   Close;
   SQL.Clear;
   SQL.Add(' INSERT Tab2 (id, name, price) '+
           ' SELECT id, name, price   '+
           ' FROM Tab1                '+
           ' WHERE NOT EXISTS (SELECT name, price  FROM Tab2  '+
                              ' WHERE Tab1.id = Tab2.id   '+
                              ' AND Tab1.name=Tab2.name  '+
                              ' AND Tab1.price=Tab2.price )') ;
   ExecSQL;
   SQL.Text := ' select * from Tab2';
   Open;
 end;

end;

end.
Второе вариант MERGE да
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 with qryTab2 do
 begin
   Close;
   SQL.Clear;
   SQL.Add(' merge  Tab2 as T2   '+
	        ' using Tab1 T1       '+
	        ' on(T2.id=T1.id)     '+
                ' when not matched by target '+
                ' then                       '+
	        ' insert (id, name, price)   '+
	        ' values(T1.id, T1.name, T1.price);') ;
   ExecSQL;
   SQL.Text := ' select * from Tab2';
   Open;
 end;

end;

Последний раз редактировалось xxbesoxx; 28.07.2015 в 09:22.
xxbesoxx вне форума Ответить с цитированием
Старый 28.07.2015, 08:11   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
что то я не совсем понимаю, как я смогу показывать клиента во втором DBGrid-e (на экране), если я переношу только его id
Вы в одном запросе можете получать данные из двух таблиц. Вот простенький пример: https://ru.wikipedia.org/wiki/Join_%28SQL%29
Обратите внимание - никакого слияния таблиц не происходит. Вы получаете результат запроса, который содержит сводные данные из нескольких таблиц.

JUDAS, xxbesoxx завязывайте.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 28.07.2015 в 10:18.
Utkin вне форума Ответить с цитированием
Старый 28.07.2015, 12:32   #16
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Автор, солнышко, перенос какой Вы хотите выполнить называется программная репликация.
Чтобы перенести с таблицы А (основной источник) в таблицу Б (синхронизируемый источник) все записи по алгоритму близкому к репликации вам нужно выполнить три шага.
Шаг 1. Обновить все записи таблицы Б которые совпадаю по ID с таблицей А
Код:
UPDATE Б SET (Б.поле1, Б.поле2, Б.поле3, .... Б.полеN) = (SELECT A.поле1, A.поле2, A.поле3, .... A.полеN FROM А) WHERE A.id=Б.id
или 
MERGE (если подерживается)
Шаг 2. Перенос с таблицы А в таблицу Б недостающих записей
Код:
INSERT INTO Б (поле1, поле2, поле3, .... полеN) 
 SELECT поле1, поле2, поле3, .... полеN  FROM A 
WHERE not A.id IN (SELECT id FROM Б)
Шаг 3. Удалить с таблицы Б лишние записи
Код:
DELETE FROM Б WHERE not id in (SELECT id FROM Б)

Прежде всего спасибо за ответ. Я во всем этом не сильно разбираюсь, но помоему ваш код копирует все записи с одной таблицы в другую (так и не смогла проверить, выскакивала ошибка), а мне бы хотелось, чтобы копировались только выделенные записи....

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Jenny89 На каком СУБД вы работайте ??? Отвечайте пожалуйста.! вопрос не понятно ?

MySQL Workbench

Последний раз редактировалось Stilet; 28.07.2015 в 12:36.
Jenny89 вне форума Ответить с цитированием
Старый 28.07.2015, 14:05   #17
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
MySQL Workbench
СУБД MySQL, инструмент разработки MySQL WorkBench. Он умеет строить ER-модельки. Покажите нам свою, это многое объяснит и упростит понимание процесса.
Цитата:
но помоему ваш код копирует все записи с одной таблицы в другую
Ставьте условия для копирования в WHERE.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.07.2015, 14:17   #18
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Jenny89 MySQL Workbench
Смотрите
Код:
create database DBTest; # БД для тест
#------------
use DBTest; # Переходим на БД DBTest

#-------------------------------------

create table T1 (Id int NOT NULL AUTO_INCREMENT,
                 T_Names varchar(40) NOT NULL,
                 Price  DOUBLE(19,4) ,
                 PRIMARY KEY (Id)
                 );
                 
#------------  INSERT 

INSERT INTO
      `T1` (`T_Names`, `Price`) 
      VALUES
      ('Чай', 26 );
      
INSERT INTO
      `T1` (`T_Names`, `Price`) 
      VALUES
      ('Кофе', 30 );
      
#----- SELECT
select * from T1;

#--  Создаю второе таблицу и там буду копировать все из T1
create table T2 (Id int ,
                 T_Names varchar(40) NOT NULL,
                 Price  DOUBLE(19,4) );
                 
                 
# ----------------- Копируем только те запись который есть T1 и нету Т2

INSERT T2 (id, T_Names, price) 
             SELECT id, T_Names, price   
             FROM T1                
             WHERE NOT EXISTS (SELECT T_Names, price  FROM T2 
                                WHERE T1.id = T2.id  
                                AND T1.T_Names=T2.T_Names 
                                AND T1.price=T2.price );

Последний раз редактировалось xxbesoxx; 28.07.2015 в 14:39.
xxbesoxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос данных из одной таблицы в другую FtorKlork БД в Delphi 6 10.06.2015 17:02
Перенос данных из одной таблицы в другую atenon Фриланс 5 23.07.2014 06:18
Перенос данных из одной таблицы в другую atenon Microsoft Office Access 1 21.07.2014 21:36
Перенос данных из одной таблицы в другую nastena_r_v БД в Delphi 4 04.05.2014 21:59
Перенос данных из одной таблицы в другую D.O.G БД в Delphi 3 07.10.2010 12:23