На форме есть грид.
Если выбрать через кнопку запись на редактирование (Показать запись - выбрать форму) с одним незаполненным полем - выдаёт ошибку.
Казалось бы всё логично.
НО!!! Этот же проект, скомпилированный 2 месяца назад в этой же версии нормально работает!
В чём разница то?
Версия 1.46 бета

k245, вы как-то сильно упрощаете задачу.
Не считая того, что у работников может быть (и есть)  несколько графиков сменности (это может решаться ещё одной таблицей и ссылкой на неё, но в которой опять же должен лежать календарь), существует и такая вещь, как разного рода неявки и выходы вне графика.
Так что всё равно надо держать полный график выходов.
Я решил просто всё обрабатывать как строковые данные. В поле типа Мемо можно впихивать довольно большие значения.

Да это понятно, что работники и табель в разных таблицах.
Речь идёт именно о таблице табель: мне не хочется создавать 31 поле, по количеству дней. Запросы будут гигантскими.

для табелирования народа.
Т.е. просто проставить в какую смену кто когда вышел
А вытащить - просто пройтись циклом по строке

проще говоря месячный календарь в одно поле, или для каждого числа всё-таки придётся создавать своё поле?

31

(5 replies, posted in Russian)

GROUP BY AUTO_TB.Госномер

Искал по форуму, но не нашёл.
Как можно получить в проекте системную переменную (к примеру %HOMEPATH%)
А то из объявленных функций только получение имени юзера.
А функции дельфи не работают.

Можно ли сделать так, чтобы в панели задач отображались не все вкладки, а только последняя открытая?
Ну или только процесс. Чтобы при переключении с другой задачи кликнуть на вкладку процесса и высветилась последняя открытая форма.
А то некоторые пользователи впадают в ступор, какую вкладку выбирать.

Я её использую, чтобы вновь введённое значение сразу же появилось для выбора в комбобоксах.
В противном случае иногда приходится перезапускать программу.
А по поводу begin'а - у вас описана процедура, но нет главной программы.
А она, пусть и пустая, должна быть.

procedure бла-бла-бла;
begin
тело процедуры
end;

begin
end.

procedure form1_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
     if form1.Edit1.Text = SQLExecute ('SELECT поле FROM таблица WHERE поле = '''+form1.Edit1.Text+'''') then
     showmessage('Такое значение уже существует') else
         begin
         SQLExecute('INSERT INTO таблица (поле) VALUES  ('''+form1.Edit1.Text+''')');
         end;
     UpdateDatabase('таблица');
end;

Если значение вносится с помощью действия "Сохранить запись" то можно на кнопку сохранения повесить событие OnClick, где выбрать все записи и пристрелить последнюю.

procedure form1_btAddRecord_OnClick (Sender: string; var Cancel: boolean);
begin
SQLExecute('DELETE FROM таблица WHERE таблица.поле = ''' + form1.Edit1.Text + ''' AND таблица.id > (SELECT MIN(id) FROM таблица)') ;
end;

Но первый метод, ИМХО, более правильный

Вот теперь работает.
Огромное спасибо, Derek!

Нет, к сожалению не помогло.
В версии, которую я использую, функции dbSQLExecute нет.

Есть Комбобокс, куда выводятся записи из таблицы с одинаковыми значениями.
Как сделать так, чтобы в комбобоксе такая запись выводилась только 1 раз?

WHERE поле по которому нужна выборка ={элемент формы из которого берётся требуемое поле}

Есть вариант
GROUP BY {элемент формы из которого берётся требуемое поле}

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

var  sDate : string = FormatDateTime('yyyy-mm-dd', Form.DateTimePicker.DateTime);

Begin
SQLExecute('INSERT INTO table (Date) VALUES ('''+sDate+''')');
end;

Спасибо большое! Заработало.

Есть 2 формы и такой кусок скрипта

procedure frmAddPribor_btAddPribor_OnClick (Sender: string; var Cancel: boolean);
var sType : string = IntToStr(frmAddPribor.cbTypeModel.DbItemID);
    sModel : string = IntToStr(frmAddPribor.cbModel.DbItemID);
    sDate : string = FormatDateTime('yyyy-mm-dd',frmAddPribor.dtpDate_izg.DateTime);
    sPribor : string;
begin

if frmAddPribor.tbZav_num.Text = SQLExecute('SELECT Zav_num FROM Pribor WHERE Zav_num = '''+frmAddPribor.tbZav_num.Text+'''')then
      showmessage('Прибор с таким номером уже существует') else
      begin
      SQLExecute('INSERT INTO Pribor (id_Type, id_Model, Zav_num, Inv_num, Date_izg) VALUES ('''+sType+''', '''+sModel+''', '''+ frmAddPribor.tbZav_num.Text + ''', '''+ frmAddPribor.tbInv_num.Text + ''', Date('''+sDate+'''));');
      MoviePribors.Show;
     MoviePribors.cbType.dbItemID := frmAddPribor.cbTypeModel.dbItemID;
     MoviePribors.cbModel.dbItemID := frmAddPribor.cbModel.dbItemID;
     MoviePribors.cbPribor.dbItemID := SQLExecute('SELECT id FROM Pribor WHERE Zav_num = '''+frmAddPribor.tbZav_num.Text+'''');
      end;
end;

Комбобоксы со второй формы имеют полностью аналогичную структуру комбобоксам второй формы.
По идее данные должны передаться, но по факту этого не происходит.
Я так понимаю это связано с parent'ом.
Подскажите, пожалуйста, как можно выкрутится в версии 1.46 ?
Метод Form.Combobox.dbSQLExecute не работает.