7,851

(1 replies, posted in Russian)

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


встроенной возможности логирования SQL запросов базы нет, но это вполне реализуемо скриптами.


Есть пример ведения логов базы данных
http://myvisualdatabase.com/forum/misc. … download=1
только в вашем случае логи необходимо писать не в базу данных, а в текстовый файл, и писать их в виде SQL запросов (INSERT, UPDATE, DELETE)

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


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


Можете прислать свой проект на support@drive-software.com
постараюсь помочь.

7,853

(3 replies, posted in Russian)

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

7,854

(3 replies, posted in Russian)

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


На форме frmMusicianEdit, вместо TextBox для инструмента и стиля необходимо использовать ComboBox

7,855

(8 replies, posted in General)

rjkantor
You use the button with the action "SQL Query"?
Like an edit field, you can reference TableGrid1 as {TableGrid1} in SQL in this way you get id selected record.

7,856

(17 replies, posted in Russian)

zoomix
Вы про пример Calculated Footer.zip ?


Результат можно вывести и через Label,
Например вместо этого

Form1.GridAbonent.Columns[3].Footer.Caption := IntToStr(q); // result

написать

Form1.Label1.Caption := IntToStr(q); 

7,857

(8 replies, posted in General)

Hakimzadeh
Soon I'll make a FAQ section on the forum.


Thanks for feedback.

Добавление своего пункта меню для компонента TableGrid


Проект с примером:
http://myvisualdatabase.com/forum/misc. … download=1


Скрипт:

procedure Form1_OnShow (Sender: string; Action: string);
var
   MyItem1: TMenuItem;
begin
   MyItem1 := TMenuItem.Create (Form1);
   MyItem1.Caption := 'My Item1';
   MyItem1.OnClick := @MenuClick1;

   Form1.GridEmployees.dbPopupMenu.Items.Insert(0, MyItem1);
end;

procedure MenuClick1;
begin
    ShowMessage('Hello from PopupMenu');
end;

begin
end.

Изменение цвета ячеек компонента TableGrid, в зависимости от его содержимого.


procedure Form1_GridEmployees_OnChange (Sender: string);
var
   i,c: integer;
begin
     c := Form1.GridEmployees.RowCount - 1;
     for i := 0 to c do
     begin
         if Form1.GridEmployees.Cells[3,i] = 'Yes' then Form1.GridEmployees.Cell[3,i].Color := clRed
             else Form1.GridEmployees.Cell[3,i].Color := clGreen;
     end;
end;

begin

end.

Проект с примером:

Проверка существования дубликата записи перед сохранением.


Проект с примером:
http://myvisualdatabase.com/forum/misc. … download=1



Скрипт

function CheckDublicate (Action, sTable, sField, sValue: string; id: integer;): boolean;
var
   s: string;
   sIdSQL: string;

   arrFields: array of string;
   arrValues: array of string;

   sWhere: string;
   i,c: integer;
begin
    result := False;
    arrFields := SplitString(sField, ';');
    arrValues := SplitString(sValue, ';');
    if Length(arrFields) <> Length(arrFields) then exit;

    sWhere := '';
    c := Length(arrFields)-1;
    for i := 0 to c do
    begin
        if arrValues[i] <> 'NULL' then
            sWhere := sWhere + arrFields[i]+' LIKE ' + arrValues[i] + ' AND '
        else sWhere := sWhere + arrFields[i]+' IS NULL AND '
    end;

    if sWhere<>'' then SetLength(sWhere, Length(sWhere)-4);

    if Action = 'NewRecord' then
    begin
          s := SQLExecute ('SELECT Count(*) FROM '+sTable+' WHERE '+sWhere);
          if StrToInt(s) > 0 then result := True;
    end;

    if Action = 'ShowRecord' then
    begin
          if id <> -1 then sIdSQL := ' AND (id <> '+ IntToStr(id) +')';
          s := SQLExecute ('SELECT Count(*) FROM '+sTable+' WHERE ('+ sWhere +') ' + sIdSQL);
          if StrToInt(s) > 0 then result := True;
    end;
end;



procedure frmEmployee_Button2_OnClick (Sender: string; var Cancel: boolean);
var
    sFields, sValues: string;
begin
    sFields := 'lastname;firstname';
    sValues := frmEmployee.edLastName.sqlValue+';'+frmEmployee.edFistName.sqlValue;

   if CheckDublicate(frmEmployee.dbAction, 'employees', sFields, sValues, frmEmployee.ButtonSave.dbGeneralTableId) then
   begin
        ShowMessage('Person already exists.');
        Cancel := True;
   end;
end;

begin
end.

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

Проект с примером:
http://myvisualdatabase.com/forum/misc. … download=1



Вход через логин и пароль, с защитой от повторного захода пользователя в базу данных.
http://myvisualdatabase.com/forum/misc. … download=1

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


Проект с примером:
http://myvisualdatabase.com/forum/misc. … download=1




Этот же проект, но с возможностью смены пароля пользователем самостоятельно:
http://myvisualdatabase.com/forum/misc. … download=1





----------

Просмотр изображения из базы данных рядом с TableGrid

Скрипт:

procedure Form1_GridEmployees_OnCellClick (Sender: string; ACol, ARow: Integer);
begin
     Form1.DBImage1.Clear;
     Form1.DBImage1.LoadFromDatabase('employees', 'photo', Form1.GridEmployees.dbItemID);
end;

begin
end.

Проект с примером

Проект с примером ведения логов редактирования базы данных
http://myvisualdatabase.com/forum/misc. … download=1


Проект с примером, в логи добавляется также имя пользователя ПК
http://myvisualdatabase.com/forum/misc. … download=1


-

7,865

(4 replies, posted in Reports)

jean.brezhonek
Please, send me your project to support@drive-software.com
I'll try to help you.

Создание горячего сочетания клавиш на примере Shift+Ctrl+P



procedure Form1_OnKeyDown (Sender: string; var Key: Word; Shift, Alt, Ctrl: boolean);
begin
     if (Key = ORD('P')) and Shift and Ctrl then
     begin
          ShowMessage('Shift + Ctrl + P');
     end;
end;


begin
     Form1.KeyPreview := True;
end.

Проект с данным примером:

В папке "backup" создаются резервные копии базы данных вида backup_дата_время.db при входе в программу, каждые три часа и при выходе.


Проект с данным примером:
http://myvisualdatabase.com/forum/misc. … download=1



Скрипт:

var
   Timer: TTimer;
   iSeconds: integer;

procedure Form1_OnShow (Sender: string; Action: string);
begin
     CopyFile('sqlite.db', 'backup/backup '+ FormatDateTime('dd-mm-yyyy hh-nn-ss', now)+'.db');

     Timer := TTimer.Create (Form1);
     Timer.Interval := 1000;
     Timer.Enabled := True;
     Timer.OnTimer := @OnTimer;
end;

procedure Form1_OnClose (Sender: string; Action: string);
begin
     CopyFile('sqlite.db', 'backup/backup '+ FormatDateTime('dd-mm-yyyy hh-nn-ss', now)+'.db');
     Timer.Free;
end;


procedure OnTimer;
begin
     iSeconds := iSeconds + 1;
     if iSeconds > 10800 then // backup every 3 hours (10800 seconds)
     begin
          iSeconds := 0;
          CopyFile('sqlite.db', 'backup/backup '+ FormatDateTime('dd-mm-yyyy hh-nn-ss', now)+'.db');
     end;
end;


begin
end.

7,868

(0 replies, posted in FAQ)

Начиная с версии 1.49, есть возможность отправлять SMS используя SMS шлюзы



Через http://turbosms.ua (Россия, Украина, Беларусь)
Проект с примером: http://myvisualdatabase.com/forum/misc. … download=1



Через http://clickatell.com (все страны)
Проект с примером: http://myvisualdatabase.com/forum/misc. … download=1

Сортировка колонки вида n1-n2-n3
например:
3-34-1
3-34-2
..........
3-34-10
............
3-36-1


В настройках компонента TableGrid1 (либо в настройках кнопки с действием "Поиск"), выбрать сортировку ORDER BY и вставить следующее условие:

CAST (trim(substr(replace(fieldnumber, '-', '     '), 1, 3)) AS INTEGER), CAST (trim(substr(replace(fieldnumber, '-', '     '), 7, 5)) AS INTEGER), CAST (trim(substr(replace(fieldnumber, '-', '     '), 12)) AS INTEGER)

где fieldnumber - поле текстового вида


http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=639&amp;download=0



Скачать проект с данным примером:
http://myvisualdatabase.com/forum/misc. … download=1



-

Вычисление на форме (frmZakaz)


Допустим есть текстовые поля, в которых содержится цена продукта (edCost) и его количество (edQ), необходимо вычислить Итого (edTotal).

procedure CalculateTotal;
begin
    frmZakaz.edTotal.Value := frmZakaz.edCost.Value * frmZakaz.edQ.Value; // calculate
end;

procedure frmZakaz_edQ_OnChange (Sender: string);
begin
    CalculateTotal;
end;

procedure frmZakaz_edCost_OnChange (Sender: string);
begin
    CalculateTotal;
end;


begin

end.

Проект с данным примером:

zoomix wrote:

Спасибо. А редакция в гридах, в 1.46 - тоже невозможна?

К сожалению нет, в принципе даже в последней версии нет удобного способа это реализовать.

7,872

(17 replies, posted in Russian)

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

К сожалению убрать данное сообщение об ошибке не получится в версии 1.46, исправил это в бета версии 1.50
можете скачать отсюда:
https://www.dropbox.com/s/0m799p8qxh5kb … 0.zip?dl=0


Доработал немного ваш проект:

7,874

(17 replies, posted in Russian)

zoomix wrote:

Научите, пож-ста, как выводить результаты каких-либо расчетов или полей в Label.

Сделал для вас пример:

7,875

(4 replies, posted in Reports)

Hello,


Here you can download the example, how to display picture
http://myvisualdatabase.com/forum/misc. … download=1