Вы пытаетесь по действию с кнопки, сохранить данные в разные таблицы, что вызывает ошибку. А ошибка гласит: В таблице Clients нет поля id_Service. Такая же ошибка будет с файлом.
Нужно структуру таблицы Клиенты изменить под нужды и сохранять данные в одну таблицу.

Отлично, спасибо!

По аналогии с запоминанием некоторых данных в соседней ветке, решил "запоминать" последний логин. Все работает, за исключением ошибки, когда ключа еще нет. Помогите, пожалуйста, избежать?

procedure frmLogin_OnShow (Sender: string; Action: string);
var
    reg: TRegistry;
begin
    reg := TRegistry.Create;
    reg.Access := KEY_ALL_ACCESS;
    reg.RootKey := HKEY_CURRENT_USER;
    reg.OpenKey('software\Test_project',true);
    frmLogin.cbLogin.dbItemID := reg.ReadInteger('Login');
    reg.CloseKey;
    reg.Free;
    if frmLogin.cbLogin.dbItemID <> -1 then frmLogin.edPassword.SetFocus;
end;

procedure frmLogin_btOk_OnClick (Sender: string; Action: string);
var
    reg: TRegistry;
begin
    reg := TRegistry.Create;
    reg.Access := KEY_ALL_ACCESS;
    reg.RootKey := HKEY_CURRENT_USER;
    reg.OpenKey('software\Test_project',true);
    reg.WriteInteger('Login', idUser);
    reg.CloseKey;
    reg.Free;
end;

54

(12 replies, posted in FAQ)

Хотел ознакомиться с проектом, при запуске получил ошибки (вложил) (с я.диска что-то картинки не удалось прилепить). Сам процесс виснет и грузит ЦП на 100%.

Недавно поставил MVDB "сверху" 3.5 на 2.8. Предположил, что в этом может быть причина. Удалил MVDB, поставил заново 3.5. Та же ситуация.

55

(5 replies, posted in Russian)

Смотря после какого события нужно? Цель указанного скрипта не ясна.

Можно создать кнопку с необходимым действием (полагаю, в данном случае - показать запись), назначить Visible := False, а скриптом инициировать её клик. Form1.Button1.Click.

56

(5 replies, posted in Russian)

Невидимая кнопка и Form1.Button1.Click не вариант?

1. Решение нашел через "невидимый клик" ):

procedure frmIndex_lbLogin_OnClick (Sender: string);
begin
    frmUser.TableGrid1.dbUpdate;
    frmUser.TableGrid1.dbItemID := idUser;
    frmUser.btEdit.Click;
end;

2. Пока решение только через грид. Может идеи есть у кого?

1. Трей, трей, трей. smile Где-то встречал, что не востребовано - по этому в три голоса.
2. Возможность задавать настройки по умолчанию для проекта. Шрифт, размер шрифта, зафиксировать некие элементы формы (т.е. любая форма по умолчанию создается с этим набором элементов).
3. Автоматически настройки логирования. Вкл/выкл, какие "движения".
4. Оооочень не хватает Ctrl+Z. smile
5. Окна в главном окне.
6. Копирование форм со всем содержимым и свойствами.
7. Скрипт разделить на закладки (по аналогии с закладками форм, но что бы в единый файл сохранялся). Куда легче работать было бы.

1. Можно ли показать запись, если id записи лежит в переменной, а клик не в TableGrid?

2. И, можно ли получить id уже открытой записи? Удобно было бы получить именно в уже открытой форме, т.к. из разных форм запись открыть можно и привязываться через кучу TableGrid.dbItemID не удобно.

В заголовке весь вопрос. Хочется разделителем меню "прорядить".

mnSpace:=TMenuItem.Create (frmIndex);
mnSpace.Caption:='-';

Скрин прилепил. Пытаясь вставить в разных местах - получаем: Menu inserted twice. Никак обойти нельзя? Только плодить аналогичные пункты меню?

Спасибо, решено.

Да, это-то и нужно. Но выбирая сегодняшнюю дату получаем ошибку.

Спасибо!
Еще касаемо DateTimePicker что бы не плодить темы:

Form1.DateTimePicker1.MinDate := now();

Выбирая сегодняшнюю дату, получаем ошибку: "Date is less than minimum of текущее число". Однако дату ставит.  Может как-то иначе изобразить желаемое можно?

Хочется не видеть секунды.
Работая с SQLite, при фильтре DateTimePicker = HH:mm, в TableGrid и выводится в таком виде время.
В MySQL время с секундами.
Можно как-то либо сохранять без секунд, либо отображать без секунд?

В общем, вопрос в теме. С фильтром или скриптом подможите, пожалуйста. Провозился два дня безуспешно...

Хочется логировать все изменения в записи. Складывать в логи уйму лишний информации не хочется. 11 полей - изменено может быть лишь одно. Как проще отобрать только измененные и записать старое и новое значение?

И, помогите, пожалуйста, с запросом. В SQLite фильтр TableGrid работал, в MySQL, видимо иначе нужно?

logs.events >= date('now','-1 day') 

Спасибо! Многие вопросы закрылись.
Не совсем понял пример с получением значения в разные формы. Цель - в разные формы получать значение из TableGrid одной другой. Пример приложил. Упростить реализацию задачи нельзя? Для 30 форм скрипт громоздкий.
И еще несколько вопросов.
Можно ли запустить несколько таймеров с разными интервалами для разных целей в одном проекте?
Экспортируя таблицы в SQLiteStudio загрузить их не удается. Есть платные конверторы, с помощью которых выгружается/загружается корректно, но ради одно раза покупать не хочется. Известных бесплатных не сложных решений нет?
Ну и вопрос без ответа:

Вижу, в версии 3.* есть ряд полезных вещей. Покупателям 2.* скидок не предусмотрено?

Во-первых, после полутора лет использования продукта - есть желание поблагодарить за продукт. Как ребенок балуюсь и радуюсь! smile
Напилил ряд БД для внутренних нужд предприятия и теперь понял, что нужно было делать иначе. Осваиваю MySQL, ищу возможность перехода на него совмещая все этого безобразие. В связи с тем и сем ряд вопросов.

Совместив всех своих баранов я получу форм 50-60, таблиц 30, 12-15 пользователей он-лайн. Интенсивность работы, скажем, не высокая. Я совершенно не представляю как и что должно работать и что такое нагрузка в этом контексте. О чем хоть поверхностно нужно думать, говоря о нагрузке? Что нужно понимать?

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

Можно ли завести несколько таймеров с разными интервалами в одном проекте?

Есть ли готовое решение по обновлению программы? На период теста я реализовал так: в одно место в сети выкладываю актуальную версию, в БД запись о версии, в программе надпись с версией. Если они не соответствуют при запуске на главной форме появляется кнопулька "обновить" которая 1. закрывает программу 2. запускает батник, который копирует с заменой все в папке 3. запускает. Работать-то работает, но может как-то "красивее" можно?

Каким-то чудом вычищается БД (тестовая на MySQL) в нуль! Не понимаю, что происходит. Структура вся неизменна, данные исчезают. При каких обстоятельствах выяснить не могу. Может при переключении с SQLite и обратно что-то подобное происходить? Никто не сталкивался?

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

var
    sClient: string;
    sForm: string = '';

procedure Form1_btSearchClient_OnClick (Sender: string; Action: string);
begin
    sForm := 'Form1';
    sClient := Form1.cbClient.Text; 
    frmClients.Show;
    frmClients.edSurname.Text := sClient;
    frmClients.btSearch.Click;
end;

procedure frmClients_OnShow (Sender: string; Action: string);
begin
    frmClients.TableGrid1.dbPopupMenu.Items[0].Enabled := False;
end;

procedure frmClients_TableGrid1_OnCellDoubleClick (Sender: string; Action: string; var Cancel: boolean);
begin
    if iForm = '' then frmClients.btEdit.Click;
    if iForm = 'Form1' then
    begin
        Form1.cbClient.dbItemID := frmClients.TableGrid1.dbItemID;
        frmClients.Close;
    end;
    if iForm = 'Form2' then
    begin
        Form2.cbClient.dbItemID := frmClients.TableGrid1.dbItemID;
        frmClients.Close;
    end;
    ...
        if iForm = 'Form31' then
    begin
        Form31.cbClient.dbItemID := frmClients.TableGrid1.dbItemID;
        frmClients.Close;
    end;
end;

Вижу, в версии 3.* есть ряд полезных вещей. Покупателям 2.* скидок не предусмотрено?

А я при выходе из поля так проверяю. Это кривой способ?

begin
    if sLastActionForm = 'NewRecord' then
        if SQLExecute('SELECT count(id) FROM clients WHERE tel = '+frmClientsAdd.edTel.sqlValue) > 0
            then
                begin
                    MessageDLG('Данный телефон уже есть в базе!'#13#10'"Ищите женщину!" (с)',mtError, mbOK,0);
                    frmClientsAdd.btOk.Enabled := False;
                end
            else
                begin
                    frmClientsAdd.btOk.Enabled := True;
                end;
end;

Тут вопрос в назначении. Задача какая, учитывая, что содержимое боксов равно? Смысл брать ID из второго? А если текст нужен, то проще текстовое поле наполнять значением из бокса и сохранять как текст.

72

(1 replies, posted in Russian)

SQLExecute('UPDATE employees SET record_count = '+ IntToStr(iMax) + ', dateready='+ form1.datetimepicker1.sqlDateTime + '"' +' WHERE id='+IntToStr(id));

или sqlDate только для даты,
или sqlTime только для времени.

73

(11 replies, posted in Russian)

По-моему, решений много. Я в силу своего мизерного опыта добавил бы поле в таблицу (допустим "count") и сделал бы событие на двойной клик по гриду, где

var
   sCount: integer;
begin
   sCount := SQLExecute('SELECT count FROM таблица WHERE id='+IntToStr(форма.TableGrid1.dbItemID)+1;
   SQLExecute('UPDATE таблица SET count='+sCount+' WHERE id='+IntToStr(форма.TableGrid1.dbItemID);
end;

Проверить сейчас возможности нет, да и, уверен, Дмитрий может оптимизировать решение. )

Но... Для начала. Это не может быть качественным показателем интереса. Ошибочный выбор, еще что-то... Тут, правда, по проекту смотреть надо. Может, на какое-то конкретное действие в открывшейся форме лучше бы действие привязал, чтоб погрешность "интереса" уменьшить, если я правильно понимаю. Если там выполняются какие-то действия.

Помогите, пожалуйста, доработать для полей Memo. Мои эксперименты методом тыка результата не принесли. )

Есть потребность главной форме присвоить Form1.FormStyle := fsStayOnTop;
При таком раскладе все формы открывающиеся из неё - открываются за ней. Решение - только для каждой формы при открытии fsStayOnTop? Или есть вариант проще?