1 (edited by agatlogic101 2019-06-26 09:44:06)

Topic: дата изменения даты

Добрый день. Появилось необходимость видеть когда была изменена последний раз дата. То есть при изменении даты, была бы рядом графа с датой этого изменения. То есть видеть когда последний раз менялась дата в таблице. Как реализовать?
Важно что бы если менялась любая другая информация в гриде, допустим название или что то еще, и это не считалось изменениями. То есть дата на дату изменения нужна только для даты)

2 (edited by sibprogsistem 2019-06-26 13:49:04)

Re: дата изменения даты

agatlogic101 wrote:

То есть видеть когда последний раз менялась дата в таблице

если дата меняется, то это и есть дата смены
или вам нужна предыдущая дата

Re: дата изменения даты

Нене, нужно 2 даты. Одну мы можем изменять, допустим у меня есть таблица дня города. И я ставлю что дата дня города будет 5 августа. А рядом дата сохраняет и показывает сегодняшнее число. То есть допустим через 2 недели я буду видеть что дата дня города 5 августа, была поставлена 24 июня. И пока 5 августа я не поменяю на любую другую дату, дата даты будет 24 июня

Re: дата изменения даты

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

Re: дата изменения даты

Лучше всего это реализовать через тригер, который выполняется автоматически при изменении указанного поля в БД, даже если это изменение было сделано с помощью SQL запроса, пример


procedure Form1_OnShow (Sender: TObject; Action: string);
begin
    // trigger when update a field
    SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_log_update AFTER UPDATE OF birthdate ON person '+
    'WHEN NEW.birthdate <> OLD.birthdate '+
    'BEGIN '+
    '    UPDATE person SET datetimechanged = datetime(''now'', ''localtime'') WHERE id = NEW.id; '+    
    'END'
    );
end;

при изменении даты в поле birthdate, записывается текущая дата в поле datetimechanged
Работает только для SQLite

Dmitry.

Re: дата изменения даты

Ой, а на MySQL какие варианты? Просто программа именно на нём

Re: дата изменения даты

Я предполагаю можно какой то скрипт придумать, что при изменении бы в первой дате, во вторую подставлялась сегодняшнее число. Как это реализовать в MySQL?

Re: дата изменения даты

для MySQL тригер будет таким

    SQLExecute(
        'CREATE TRIGGER my_log_update BEFORE UPDATE ON person '+
        'FOR EACH ROW '+
        'BEGIN '+
        'IF NEW.birthdate <> OLD.birthdate THEN '+
        '    SET NEW.datetimechanged = NOW(); '+
        'END IF; '+
        'END;' +
    );
Dmitry.

9 (edited by agatlogic101 2019-07-02 10:21:44)

Re: дата изменения даты

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

Post's attachments

Attachment icon Script.zip 335.46 kb, 236 downloads since 2019-07-02 

Re: дата изменения даты

Удалите из таблицы уже созданные тригеры или вообще очистите БД
тригер нужно проверять на (есть нет) или просто удалять его по закрытию программы
потому как вы постояно пытаетесь создать то, что уже есть..

ну а так программа работает ...

Post's attachments

Attachment icon Script.7z 2.66 kb, 250 downloads since 2019-07-02 

Re: дата изменения даты

А как удалить тригер? Или сделать на проверку есть, нет?

Re: дата изменения даты

PS, ну я примерно смысл понял. Я удалил тригер из скрипта и он остался работать. Но всё еще не работает изминении с пустой даты на любую. Что то дописать в тригере возможно? Что бы он начинал работать не только когда было изменение, но и вообще дата первый раз выбиралась

Re: дата изменения даты

Для этого Вам нужен еще один тригер, который будет срабатывать на создание новой записи

SQLExecute(
    'CREATE TRIGGER IF NOT EXISTS my_equipment_insert AFTER INSERT ON equipment '+
    'BEGIN '+
    '    INSERT INTO logiUsers(action, date) VALUES (''New equipment'', datetime(''now'',''localtime'')); '+
    'END;'
    );

Re: дата изменения даты

Да, но у меня MySQL. И я так понимаю в нём этот код не работает. Что нужно добавить в предыдущий код что бы добавилась эта функция?

DriveSoft wrote:

для MySQL тригер будет таким

    SQLExecute(
        'CREATE TRIGGER my_log_update BEFORE UPDATE ON person '+
        'FOR EACH ROW '+
        'BEGIN '+
        'IF NEW.birthdate <> OLD.birthdate THEN '+
        '    SET NEW.datetimechanged = NOW(); '+
        'END IF; '+
        'END;' +
    );

Re: дата изменения даты

вроде бы так

CREATE TRIGGER `delete_cities` BEFORE INSERT ON `countries`
FOR EACH ROW BEGIN
  INSERT INTO salaries ( date) VALUES  ( SYSDATE());
END

Re: дата изменения даты

Попробуйте так

    SQLExecute(
        'CREATE TRIGGER my_log_update BEFORE UPDATE ON person '+
        'FOR EACH ROW '+
        'BEGIN '+
        'IF IFNULL(NEW.birthdate, ''1899-12-31'') <> IFNULL(OLD.birthdate, ''1899-12-31'') THEN '+
        '    SET NEW.datetimechanged = NOW(); '+
        'END IF; '+
        'END;' +
    );

    SQLExecute(
        'CREATE TRIGGER my_log_insert BEFORE INSERT ON person '+
        'FOR EACH ROW '+
        'BEGIN '+
        '   SET NEW.datetimechanged = NOW(); '+
        'END;' +
    );


предварительно удалите тригер

SQLExecute('DROP TRIGGER IF EXISTS my_log_update');
Dmitry.