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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2013, 01:43   #1
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию Перезапись таблицы MYSQL

Юзаю связку стандартных компонентов для получение данных в DBGrid:
  1. SimpleDataSet
  2. DataSource
  3. SQLConnection
Пишу в свойстве SimpleDataSet - "SELECT * FROM таблица", получаю данные в DBGrid.

Далее выполняю обработку данных DBGrid, и теперь мне нужно сделать запись таблицы назад в MySQL.

Я так понимаю мне нужно прописать вместо - "SELECT * FROM таблица", запрос записи, но SQL запросы не знаю вовсе, помогите.

Как записать назад данные?
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 20.10.2013, 02:00   #2
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Смотрите тут ест ьдва варианта использовать TTable и он как бы сам всё запишит, вроде бы я не помню точно уже давно так не работаю...

Есть второй вариант который последнее время использую, да и я думаю он будет более правильным.

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

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

ну пример кода такой

Код:
procedure TfrmWorkCard.btSaveClick(Sender: TObject);
begin
  qRecord.SQL.Text :=
    'CALL work_ins_up(:id, :idcl, :idsotr, :idhcold, :idhlold, :idhc, :idhl, :visit, :flagend, :w_pay)';//тут идёт выполнение хранимой процедуры в MySQL
  if OpenStatus = WorkCreate then // Проверка на условие открытие формы
  begin
    qRecord.ParamByName('id').Value := -1; // параметр
    qRecord.ParamByName('flagend').Value := 0;
    qRecord.ParamByName('w_pay').Value := '0.00';
  end;

  qRecord.ParamByName('id').Value := WorkID;
  if edPay.Text <> '' then
    qRecord.ParamByName('w_pay').Value := frmServiceCard.AddDote(edPay.Text)
  else
    qRecord.ParamByName('w_pay').Value := '0.00';


  qRecord.ParamByName('idcl').Value := SelectClientID;
  qRecord.ParamByName('idsotr').Value := SelectSotrID;

  qRecord.ParamByName('idhcold').Value := SelectColorOldID;
  qRecord.ParamByName('idhlold').Value := SelectLnOldID;
  qRecord.ParamByName('idhc').Value := SelectColorID;
  qRecord.ParamByName('idhl').Value := SelectLnID;
  qRecord.ParamByName('visit').Value :=
    StrToDateTime(dVisit.Text + ' ' + tVisit.Text + ':00');
  qRecord.ParamByName('flagend').Value := flag;
  qRecord.ExecSQL; // Выполнение запроса что находится в SQL.text
  frmBase.WorkSelect(WorkSQL);
  Close;
end;
собствено сама хранимая процедура

Код:
DELIMITER $$

USE `hairsalon`$$

DROP PROCEDURE IF EXISTS `work_ins_up`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `work_ins_up`(
id         INT(11),   
idcl       INT(11),   
idsotr     INT(11),   
idhcold    INT(11),   
idhlold    INT(11),   
idhc       INT(11),   
idhl       INT(11),   
visit      DATETIME,  
flagend    TINYINT(4),
w_pay      DECIMAL(10,2)
)
BEGIN
    IF(id < 0) THEN
       INSERT INTO `hairsalon`.`work` (id_cl, id_sotr, id_hc_old, id_hl_old, id_hc, id_hl, visit, flag_end) 
                               VALUES (idcl, idsotr, idhcold, idhlold, idhc, idhl, visit, flagend);
    ELSE
      UPDATE `hairsalon`.`work` SET  
       `id_cl` = idcl,
       `id_sotr` = idsotr, 
       `id_hc_old` = idhcold,
       `id_hl_old` = idhlold,
       `id_hc` = idhc,
       `id_hl` = idhl,
       `visit` = visit,
       `flag_end` = flagend,
       `suma` = w_pay
      WHERE 
       `id_w` = id;
    END IF;
    END$$

DELIMITER ;
я так понимаю для вас это всё пока мало понятно

да и плохо понятно как у вас устроено отображение и занесения изменений
ну а SQL запрос на изменение даных
Update `Таблица` Set `поле1` = значение1 ,`поле2` = значение2 WHERE id = ади записи которую надо изменить
Dozent вне форума Ответить с цитированием
Старый 20.10.2013, 02:11   #3
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию

Ну я понял вашу мысль, конечно я не понял не смысл sql кода не смысл дефли кода (так как компонент с помощью которого вы делаете не юзал). Можете Var тоже скинуть, а то я не понял, что вы объявили.

А вообще дополняю. Задача мной преследуется несколько иная. Я выгружаю 50к записей в Grid, это товары. Далее сравниваю их с прайсом, что - то удаляю, что - то редактирую и соответственно мне их надо обновить уже в MySQL. То бишь просто заменить таблицу, и в проге ненужно никакого взаимодействия с юзером.

Цитата:
Update `Таблица` Set `поле1` = значение1 ,`поле2` = значение2 WHERE id = ади записи которую надо изменить
Отдельно спасибо, если не найду более простого варианта, буду так юзать. Но хз как себя поведёт когда 50к таких будет.
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 20.10.2013, 02:15   #4
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию

И ещё, просто я подумал, что если простой запрос - "SELECT * FROM таблица", выгружает всё, то и запись так же можно сделать.

Ну а как вариант, если совсем всё глухо, тупо дропнуть все записи и просто заново заполнить вышеприведённым запросом.
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 20.10.2013, 02:38   #5
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

так) каким образом вы их проверяете? на совпадения? если есть отличие разница между прайсом и выборкой то в выборку делаете изменения?

допустим берёте запись первую из выборки

1, Товар1, 500 руб

а впрайсе
1 Товар1 550 руб

то вам нужно записать новые занчения в таблицу товаров из прайса?

Блин перемудрил с вопросами ну думаю понятно что я хочу спросить)
Dozent вне форума Ответить с цитированием
Старый 20.10.2013, 02:40   #6
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

как выглядит таблица? как вы проверяете её? тут подругому можно сделать, нужна ли вообще выгрузка в грид? для чего? МОжно просто дать даные из прайса на инсерт или апдейт...
Dozent вне форума Ответить с цитированием
Старый 20.10.2013, 03:03   #7
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию

Выгрузка нужна, так как данные хранятся не в одной таблице. Три таблицы, выгружаются, далее ищем наименование из прайса в таблице. Если есть, то сравниваем данные, если всё одинаково, то далее, иначе, фиксим.
Если не нашли, добавляем. Если остались наименование в таблице которых нет в прайсе, то удаляем их из таблицы.

Плюс ко всему, я хочу просто выгрузить, сделать все операции в делфи, а не sql запросами, а потом загрузить обратно. Просто лучше работать в той среде, которую знаешь. Так и мне легче будет, и ошибок меньше получиться.
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 20.10.2013, 03:08   #8
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

ну делать всё в делфи это конечно как вам удобно просто как пример приведу работу с скл
для того чтобы вам допустим изменить значения стоймости товара для какойто категории то вам нужно будет пробежать по всей табилце с условиями что запись принадлежит категории или нет и если принадлежит то изменить при этом ввести датасет в режим редактирования изменить и сделать Post и так к каждой записи в датасете а у вас их там 50к

а скл запрос это

Код:
Update таблица set поле= новое значение Where category = нужная категория;
и всё)
Dozent вне форума Ответить с цитированием
Старый 20.10.2013, 03:12   #9
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

3 таблицы? вы делаете выборку через джойны? или как?

Вообщем мне кажется что вы мудрите, база MySQL очень удобная, можно избежать кучи кода в делфи а ещё если внешнии ключи поставить можно вообще избежать кучи проверок...
Dozent вне форума Ответить с цитированием
Старый 20.10.2013, 03:22   #10
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию

Сборку не делаю, просто нужные мне данные в принципе в одной хранятся таблице, но если допустим удалять, то нужно в трёх таблицах удалять. Ну а кстати на берегу(в смысле в проге) будет работать по любому быстрее, чем каждое наименование sql запрос отправлять и ждать возвращения.

Что касается описанного вами алгоритма, не понял немного, что вы имеет под "сделать Post"? В смысли отправить все 50к?

А так, я раз выгрузил таблицу в grid, все изменения сделал, и вкинул назад.
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Mysql запрос на 2 таблицы Abuhamed PHP 1 21.08.2012 08:52
Перезапись поля во всех строках таблицы Бд mmihan БД в Delphi 6 13.06.2012 13:41
MySQL: таблицы и их движки palevg БД в Delphi 4 11.02.2011 21:36
Связать таблицы (mysql) aisthetes SQL, базы данных 0 28.03.2010 14:45
Mysql Таблицы вроде.. Юрий777 PHP 4 28.02.2008 09:50