Topic: Ряд вопросов от новичка.

Здравствуйте!
Знакомлюсь с программой понемногу. Вопросов уйма. Делаю пока в большинстве своем копипастом из выложенных здесь работ с мизерными изменениями. Буду благодарен за помощь, и, в идеале, не доделкой/переделкой за меня, а с комментариями, хотя бы кратенькими как и что. Или примерами заготовок/работ для "домашней работы".

Общие вопросы возникшие:
С какой целью чек "таблица является словарем"? Что меняется?
Зачем в сортировке в гриде ORDER BY если и так столбец выбрать можно. Как-то "шире" выбирать позволяет?
Поддержка целостности при связах означает, что при удаление, допустим, пользователя, удаляться все записи с "его присутствием"?
Можно ли в DateTimePicker убрать секунды?

Конкретно по моему барану:
Буду благодарен за анализ скрипта. Может я лишнего чего накопипастил. Ошибки-то не прыгают, но все же.

Переделывал несколько раз, почему-то в форме авторизации по Enter перестал входить. Кликать мышой надо или через Tab. Где испортил?

Не для админа скрыть нужно две кнопки. Сейчас сделал, уверен, неправильно двумя строками:

if SQLExecute ('SELECT admin FROM users WHERE id = '+IntToStr(idUser)) = '1' then isAdmin := True else frmFind.btDir.Visible:=False;
if SQLExecute ('SELECT admin FROM users WHERE id = '+IntToStr(idUser)) = '1' then isAdmin := True else frmFind.btJour.Visible:=False;

ведь можно как-то "и" сказать? ) Мои попытки увенчались ошибкой.

Не смог сам разобраться, можно ли в фильтре автозаполнения грида сказать "от сегодняшней даты"? По логике должно быть как-то "events.date >= ?", нет?

Существует ли возможность ведения журнала действий пользователей: пользователь, дата, время, действие (вход, выход, добавил запись, редактировал, удалил)? В идеале, чтоб только последине 60 дней хранились записи. Чтоб сильно база не росла. Если существует, может какая-то готовая работа есть для "поковырять самостоятельно"?

Хотелось бы выполнять проверку на совпадения по саунам/времени, соответственно с оповещением о накладке. Может тоже работа какая есть с примером?

И самое для меня сложное. В конечном итоге хочется сделать калькулятор стоимости. Но, слишком много вводных, даже не знаю как таблицу организовать. Цена зависит от: сауны, времени (9-18, 18-22, 22-9), дня (буд./вых.), кол-во человек (до 6 - ставка, свыше за каджого человека по ... с 9 до 18 и по ... с 18 до 9), скидки. При создании записи мы получаем: часы, сауна, кол-во человек, буд./вых., скидка. С чего начать ковырять?

Post's attachments

Attachment icon сауны.rar 390.79 kb, 448 downloads since 2016-02-28 

Re: Ряд вопросов от новичка.

Приветствую,


С какой целью чек "таблица является словарем"? Что меняется?

Необходимо для правильной работы внутренних алгоритмов программы, словарные таблицы это как правило таблицы с постоянным набором записей, например таблица статусов заказа (Новый, В работе, Закрыт) или перечисление полов (Неопределен, Мужской, Женский)


Как правило ничего страшного не произойдет если вы неверно отметите эти галочки, т.к. нужны они в редких случаях.


Зачем в сортировке в гриде ORDER BY если и так столбец выбрать можно. Как-то "шире" выбирать позволяет?

Позволяет указать произвольную сортировку сразу по нескольких столбцам, например: lastname, status
т.о. отсортирует сперва по фамилии, затем по статусам.


Поддержка целостности при связах означает, что при удаление, допустим, пользователя, удаляться все записи с "его присутствием"?

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


Можно ли в DateTimePicker убрать секунды?

У компонента есть свойство Format, в котором вы можете задать свой формат времени, в данном случае: HH:mm



Переделывал несколько раз, почему-то в форме авторизации по Enter перестал входить. Кликать мышой надо или через Tab. Где испортил?

для кнопки авторизации установите свойство Default = true


Не для админа скрыть нужно две кнопки. Сейчас сделал, уверен, неправильно двумя строками:

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

  if SQLExecute ('SELECT admin FROM users WHERE id = '+IntToStr(idUser)) = '1' then
  begin 
      isAdmin := True
  end else 
  begin
     frmFind.btDir.Visible:=False;
     frmFind.btJour.Visible:=False;
  end;

Не смог сам разобраться, можно ли в фильтре автозаполнения грида сказать "от сегодняшней даты"? По логике должно быть как-то "events.date >= ?", нет?


events.date >= date('now')

Существует ли возможность ведения журнала действий пользователей

http://myvisualdatabase.com/forum/viewtopic.php?id=1058


И самое для меня сложное. В конечном итоге хочется сделать калькулятор стоимости

С этим к сожалению не смогу помочь, могу помочь только с конкретными вопросами.

Dmitry.

3 (edited by Raspr 2016-02-29 16:20:10)

Re: Ряд вопросов от новичка.

Спасибо!
Получается, при фильтре events.date >= date('now') записи с датой предыдущей не будут отображаться даже когда я захочу через поиск их найти. Во всяком случае, у меня не получается.
А варианта с датой вчерашней нет?

С логом получилось. Только вот битый час не могу понять как чистить таблицу и хранить только последние 60 дней. Планировал при закрытие удалять все записи старше 60 дней запросом. Т.е. в
procedure frmFind_OnClose
добавить
SQLExecute('DELETE FROM logs WHERE date = ???-60');
В сети тем много, но рабочего варианта я не подобрал. ) Или вообще так делать нельзя?

Еще немного побился и с этим вариантом ошибка больше не вываливается, но работать-то будет? )

DELETE FROM logs WHERE date = CURRENT_DATE-60

Re: Ряд вопросов от новичка.

Raspr
Чтобы было видно и записи за предыдущий день, попробуйте так

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


Для удаления попробуйте такой запрос

SQLExecute('DELETE FROM logs WHERE datefield < date("now", "- 60 days")');

CURRENT_DATE() - это синтаксис для MySQL, в запросе выше я привел пример для SQLite, какую СУБД вы используете?

Dmitry.

Re: Ряд вопросов от новичка.

DriveSoft wrote:

какую СУБД вы используете?

Lite.
Спасибо! Вроде, все как надо. Буду учиться стряпать калькулятор.

Re: Ряд вопросов от новичка.

До калькулятора пока мозгов не хватает. Тренируюсь на кошках.  Захотел выкрасить ячейки в гриде, где запись моложе одного часа. Ошибок нет, результата нет (выкрашивает все). Не приходилось такое делать?

procedure frmFind_TableGrid1_OnChange (Sender: string);
var
    i,c: integer;
begin
    c := frmFind.TableGrid1.RowCount -1;

    for i := 0 to c do
    begin
        if SQLExecute('SELECT * FROM events WHERE date_ins < datetime("now","-1 hour")') then frmFind.TableGrid1.Cell[2,i].Color := clYellow
    end;
end;

Делал по аналогии с чисткой логов. Там корректно работает как так:

SQLExecute('DELETE FROM logs WHERE date < date("now","-60 day")');

так и эдак:

SQLExecute('DELETE FROM logs WHERE date < datetime("now","-1 hour")');

Re: Ряд вопросов от новичка.

И буду очень признателен за информацию о том, где почитать как правильно передавать переменные разных типов в запрос SQLite. Запутался совсем в ошибках. По примерам не догоняю, к сожалению.

Re: Ряд вопросов от новичка.

Raspr wrote:

И буду очень признателен за информацию о том, где почитать как правильно передавать переменные разных типов в запрос SQLite. Запутался совсем в ошибках. По примерам не догоняю, к сожалению.

Приветствую,


Извиняюсь за задержку с ответом, был в отпуске, вопрос все еще актуален для вас?

Dmitry.

Re: Ряд вопросов от новичка.

DriveSoft wrote:

Извиняюсь за задержку с ответом, был в отпуске, вопрос все еще актуален для вас?

Здравствуйте!
Ничего страшного. Спасибо,  разобрался.

10 (edited by Raspr 2016-03-20 06:48:38)

Re: Ряд вопросов от новичка.

То ли лыжи не едут, то ли я... как известно.

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

Post's attachments

Attachment icon 1.rar 293.13 kb, 466 downloads since 2016-03-20 

Re: Ряд вопросов от новичка.

Может тип поля имеет формат цифровой, а нужно текстовый. С телефона - поэтому догадки:-)

12 (edited by iacovlogica 2016-03-20 21:27:19)

Re: Ряд вопросов от новичка.

Правильно будет в запрос передавать sqlValue
Form1.edNom.Text := SQLExecute('SELECT nom FROM primer WHERE number = '+Form1.edNumber.sqlValue );
Но если вам скучно то можно написать и так :
Form1.edNom.Text := SQLExecute('SELECT nom FROM primer WHERE number = '+chr(39)+Form1.edNumber.text+chr(39) );

chr(39) это вставка символа с 39 номером ' ( апостроф )
Таблицу мона глянуть тут например http://book.itep.ru/10/ascii.htm

Так же можете посмотреть пример

Post's attachments

Attachment icon Справочник.zip 331.97 kb, 471 downloads since 2016-03-20 

Re: Ряд вопросов от новичка.

iacovlogica wrote:

Правильно будет в запрос передавать sqlValue

Спасибо! Не внимательно мануал смотрел.

iacovlogica wrote:

Но если вам скучно то можно написать и так :

Спасибо, мне не достаточно скучно. ))

Re: Ряд вопросов от новичка.

Еще вопрос.
В форме, при сохранении выполняется простой математ. расчет (на клик). И хотелось бы при определенных условиях (в частности, результат < 0) не сохранять запись. Сейчас у меня получается только вывести сообщение о том, что так делать нельзя )), но запись сохраняется. Есть какой-то способ не сохранять запись? Если только способом сохранения записи скриптом, то нельзя ли пример запроса с одним, двумя полями на добавление записи с данными из текстбокса, комбобокса?

15 (edited by iacovlogica 2016-03-23 06:56:51)

Re: Ряд вопросов от новичка.

if aaa < 0 then
    begin
           //.....
           // Тут мы не сохраняем запись а что нибудь еще например считаем
           // .....
    end
else
    begin
     SQLExecute('INSERT INTO sobitiya ( data , sobitie ) VALUES ( '+zakazi.DateTimePicker1.sqlDateTime+', '+ zakazi.Edit1.sqlValue +' )');
    end;

http://www.mysql.ru/docs/man/INSERT.html

Re: Ряд вопросов от новичка.

Raspr wrote:

Еще вопрос.
В форме, при сохранении выполняется простой математ. расчет (на клик). И хотелось бы при определенных условиях (в частности, результат < 0) не сохранять запись. Сейчас у меня получается только вывести сообщение о том, что так делать нельзя )), но запись сохраняется. Есть какой-то способ не сохранять запись? Если только способом сохранения записи скриптом, то нельзя ли пример запроса с одним, двумя полями на добавление записи с данными из текстбокса, комбобокса?

Вы можете создать событие OnClick у кнопки с действием "Сохранить запись", в этом событии вы можете проверить какое либо условие и запретить сохранение, например

procedure frmAddEdit_ButtonSave_OnClick (Sender: string; var Cancel: boolean);
begin
    if (ваше условие) then
    begin
        ShowMessage('ваше сообщение');
        Cancel := True; // запрещаем сохранять запись
    end;
end;
Dmitry.

17 (edited by Raspr 2016-03-27 07:12:35)

Re: Ряд вопросов от новичка.

Спасибо за подробные ответы!
Еще вопрос по фильтру в таблице возник. Не удается вывести строки, в которых определенное поле пустое.
Фильтр вида

request.user_r <> ''

правильно выводит только строки с непустыми значениями, а вот аналогично для пустых 

request.user_r = ''

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

SQLExecute('SELECT count(id) FROM request WHERE user_r = ''') > 0

Re: Ряд вопросов от новичка.

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

request.user_r IS NULL
Dmitry.

Re: Ряд вопросов от новичка.

Так работает, спасибо!
Традиционно, еще вопрос. ))
Пытаюсь выкрасить в таблице строки, дата в которых ближе, чем 30 дней от нынешней. У меня сравнивается только число, а не дата и выкрашиваются, соответственно, даты, число в которых меньше. Я так полагаю, это происходит из-за того, что в гриде все данные - строка, не смотря на формат поля в таблице? Если так, то каким способом мнеб даты сравнить? Можно логику, не код, чтоб время не тратить.

procedure frmFind_TableGrid1_OnChange (Sender: string);
var
    i,iI,cR,cC: integer;
begin
    cR := frmFind.TableGrid1.RowCount -1;
    cC := frmFind.TableGrid1.Columns.Count -1;
    for i := 0 to cR do
        begin
            if frmFind.TableGrid1.Cells[6,i] < FormatDateTime('ddddd', Now+30) then
                begin
                    for iI := 0 to cC do frmFind.TableGrid1.Cell[iI,i].Color := clYellow
                end;
        end;
end;

20 (edited by iacovlogica 2016-03-29 04:44:33)

Re: Ряд вопросов от новичка.

...я бы преобразовал текст в DateTime ( а не наоботот ) и сравнивал бы .
DateTime   это число где целая часть это дни а дробная это часть суток ( часы минуты секунды миллисекунды в тиках )
С DateTime  можно проводить любые арифметические операции
....и именно потому что DateTime число абсолютно все равно какой месяц год и положение звезд на небе ))))
Пример Дмитрия ( ниже ) более корректен ( свой удалил )

Re: Ряд вопросов от новичка.

Raspr
Условие должно выглядеть так

if ValidDate(frmFind.TableGrid1.Cells[6,i]) then
   if StrToDate(frmFind.TableGrid1.Cells[6,i]) < Now+30 then ...
Dmitry.

Re: Ряд вопросов от новичка.

Знания - сила! Очередное спасибо и с новым вопросом:
Не удается с помощью MessageDlg продолжить или отменить. Две кнопки не дружатся. Пробовал так:

MessageDlg('бла-бла-бла',mtConfirmation,mbOKCancel,0);

и

MessageDlg('бла-бла-бла',mtConfirmation,[mbOK, mbCancel],0);

не хотит. И если я просто в чем-то накосорезил подскажите, правильны ли дальнейшие действия вида:

if buttonSelected = mrOK

Re: Ряд вопросов от новичка.

И еще замечание и вопрос по сообщениям.
Заметил, что если текст сообщения заканчивается на "я", дальше все смотрится как код (вложение).

И можно ли переименовать само окно? У меня задача сделать окошко подтверждения удаления записи. Действием я запись удалить не могу, т.к. фактически у меня просто удаляются значения из некоторых полей, а подтверждения хочется.

Post's attachments

Attachment icon Без-имени-1.jpg 18.72 kb, 276 downloads since 2016-03-30 

Re: Ряд вопросов от новичка.

Есть ли возможность импорта данных? или я не заметил?

Re: Ряд вопросов от новичка.

Raspr wrote:

Знания - сила! Очередное спасибо и с новым вопросом:
Не удается с помощью MessageDlg продолжить или отменить. Две кнопки не дружатся. Пробовал так:


Примеры

if MessageDlg('Сообщение?', mtWarning, mbCancel+mbOK, 0) = mrOk then ShowMessage('нажали ок');

if MessageDlg('Exit?', mtInformation, mbYes+mbNo, 0) = mrYes then ShowMessage('нажали Yes);
Dmitry.