Как в LUA не получится.
Массив вам в помощь:

var
  num : array [1..3] of integer;
  ind: integer;
...

ind := 2;  
result := num[ind];

У кнопок добавляете обработчик, в котором в тег формы записываете нажимаемую кнопку:

procedure frm_add_new_category_bt1_select_OnClick (Sender: TObject; var Cancel: boolean);
begin
  frm_select_slovar.Tag := ObjectToInt(Sender);
end;

А потом вытаскиваете кнопку и смотрите, что за кнопка. И меняете логику работы:

procedure frm_select_slovar_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  btn: TdbButton;
begin
  if frm_select_slovar.Tag <> 0 then
  begin
    btn := TdbButton( frm_select_slovar.Tag );
    ShowMessage(btn.Name); // какую кнопку нажали
    frm_select_slovar.Tag := 0;
  end;
  //
...
end;

Фокус в том, что значение вычисляемого поля не должно быть пустым. Если по каким-то причинам не можете туда записать целевое выражение, то нужно вставлять заглушку:

https://k245.ru/wp-content/uploads/2023/09/s18.png

https://k245.ru/mvdb/ispolzovanie-sql-v-mvdb.html

4

(4 replies, posted in General)

Hi AD1408

Use onChange event handler for combo:

procedure frmItems_ComboBox2_OnChange (Sender: TObject);
begin
  frmItems.RichEdit1.Text := frmItems.ComboBox2.Text;
end;

procedure frmItems_ComboBox1_OnChange (Sender: TObject);
begin
  frmItems.Memo1.Text := frmItems.ComboBox1.Text;
end;

You can add an eternal repeat..until loop, which is exited with the break command if the input is correct or if the input is not repeated. The exit command terminates the execution of the main loop when the Cancel button on the text entry form is clicked.

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var  vi: integer; vs: string;
begin
  for vi := 0 to form1.tablegrid1.RowCount-1 do
  begin
    form1.tablegrid1.SelectedRow := vi;
    repeat
      if inputquery('Candidate:  ' + form1.tablegrid1.cells[1,vi] + ' ' + form1.tablegrid1.cells[0,vi], 'Review:', vs) then
      begin
        if not (vs in ['a','d','A','D']) then
        begin
          if (messagebox('Invalid Input','Warning',MB_RETRYCANCEL+MB_ICONWARNING) = IDCANCEL) then
            break;
        end
        else
        begin
          if (vs in ['a','A']) then vs := 'APPROVED' else if (vs in ['d','D']) then vs := 'DENIED';
          sqlexecute('update candidates set outcome = "'+uppercase(vs)+'" where id = "'+inttostr(form1.tablegrid1.row[vi].id)+'"');
          form1.tablegrid1.dbupdate;
          vs := '';
          break;
        end;
      end
      else
        exit;
    until 1=0;
  end;
end;
Новичок wrote:

Подскажите пожалуйста, вычисляемые поля работают в MySQL или в них запрос немного отличается в отличии от SQLlite

Про вычисляемые поля в MVDB ( https://k245.ru/mvdb/ispolzovanie-sql-v-mvdb.html ), но в основном про SQLite.
https://k245.ru/wp-content/uploads/2023/09/s7-1.png
Проверьте, используете ли вы скобки.
https://k245.ru/wp-content/uploads/2023/09/s13.png
Построитель выражений ориентирован на SQLite, если вы используете MySQL, то пишите SQL самостоятельно.

Вычисляемые поля - это механизм сборки SQL-запроса.
А то, что есть разница в функциях, реализованных в SQLite и MySQL - это факт.
Смотрите документацию, сравнивайте...

8

(8 replies, posted in General)

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  ID : String;
  NextID : String;
begin
  ID := SQLExecute('SELECT id FROM myData WHERE toAdd = 0') ;
  NextID := SQLExecute('SELECT id FROM myData WHERE id > '+ID+' ORDER BY id LIMIT 1' ) ;
  if NextID = '' then
    NextID := SQLExecute('SELECT id FROM myData ORDER BY id LIMIT 1' ) ;
  SQLExecute('UPDATE myData SET toAdd = NULL where id = '+ID ) ;
  SQLExecute('UPDATE myData SET toAdd = 0 where id = '+NextID ) ;
  Form1.TableGrid1.dbUpdate;
end;

The procedure moves the data to the toAdd field, using the ID field as the serial number

Universal Copy
https://k245.ru/wp-content/uploads/2023/04/dvojnyashki.jpg

To copy a record you need very little code


function DB_CopyRecord( ATableName: string; AID: integer ):integer;
// universal function for copying a record
begin
   // create a temporary table with a structure identical to the copied record
   SQLExecute('CREATE TEMPORARY TABLE tmp AS SELECT * FROM ['+ATableName+'] WHERE id = '+IntToStr(AID));
   // reset the value of the ID field
   SQLExecute('UPDATE tmp SET id = NULL');
   // insert record back
   SQLExecute('INSERT INTO ['+ATableName+'] SELECT * FROM tmp');
   // get the ID of the new entry
   Result := Last_Insert_ID();
   // delete temporary table
   SQLExecute('DROP TABLE tmp');
end;

https://k245.ru/en/mvdb-en/universal-copy.html

10

(8 replies, posted in General)

You need to formulate the problem more precisely, for example:
I need a button to cycle through data in a table, so that the desired value in a specified field moves through the records (rows on the screen) from the beginning to the end, and then back to the beginning.
If this is what you need, then let me clarify: should the result of the “movement” be saved in the database or will it be relevant only during a program session? That is, you need to “move” the data in a table view on the screen or in a database table?

11

(1 replies, posted in General)

The technology of launching a report using a script may be suitable for you. Pay attention to the Report_Open() procedure.

https://k245.ru/en/mvdb-en/qr-codes-in-mvdb.html


You can find examples of creating menus for performing certain actions on the forum.

Да, Derek прав -  ошибка из-за разделителя (точки/запятой), но я пока не смог исправить...

CONST
    VERSION = 12; // текущая версия вашего проекта

procedure Form1_OnShow (Sender: TObject; Action: string);
var
  tmpTimer:TTimer;
begin
  // создаем таймер на 5 минут
  tmpTimer := TTimer.Create(Application);
  tmpTimer.OnTimer := @OnTimer;
  tmpTimer.Interval := 1000*60*5;  // 5 минут
  tmpTimer.Enabled := True;
  // первая проверка при запуске программы
  OnTimer(tmpTimer);
end;

procedure OnTimer(Sender: TObject);
var
    s: string;
begin
    s := HTTPGet('http://yoursite.com/version.txt');
    if ValidInt(s) then
    begin
        if StrToInt(s) > VERSION then
        begin
            TTimer(Sender).Enabled := False;
            ShowMessage('У Вас не актуальная версия программы, обратитесь к разработчику');
            Form1.Close;
        end;
    end;
end;
hugo wrote:

а можно как то зациклить проверку , например на каждые 5 минут , и программа закрывалась ?

Перенесите проверку в таймер и установите интервал таймера на 5 минут.

15

(4 replies, posted in General)

You are offered a ready-made free solution that will require minimal effort to apply it in your project. But no - you needs to be even simpler. With one button "Do everything". I guessed? Why are you not satisfied with the proposed options?


There are many third-party solutions, but you will also have to understand them and think about how to use them:


https://3freesoft.ru/p/windows/categori … wf67344304

16

(4 replies, posted in General)

The articles provide several practical tips on implementing protection and licensing

https://k245.ru/en/mvdb-en/modular-licensing.html

https://k245.ru/en/mvdb-en/correction-of-mistakes.html

Сначала отвечу на второй вопрос - используйте JOIN для соединения таблиц:

SELECT 
  p.id, t.edType, d.edDensity, c.edColor, p.height, p.weight  
FROM pieces p
LEFT JOIN type t ON t.id = p.id_type
LEFT JOIN density d ON d.id = p.id_density
LEFT JOIN color c ON c.id = p.id_color
WHERE
...

Ответ на первый вопрос сложней. И есть два пути решения: 1) усложнять запрос  2) создавать сам запрос с помощью скрипта

Усложнение состоит в том, что для каждого элемента нужно предусмотреть значение по умолчанию, которое бы отменяло  условие элемента, например:

Pieces.height >= {btn_search_1}

заменить на

( (Pieces.height >= {btn_search_1}) OR ( {btn_search_1} is NULL  )

и так для каждого условия.


Вариант со скриптом предполагает, что вы включаете нужные строки в запрос только в том случае, если они содержат значение, отличное от пустого. Решение привязывается к конкретным названиям компонентов формы. Для того, чтобы я смог его написать для вас, приложите ваш проект .

senseyesenseye1983 wrote:

Всем привет. А подскажите есть ли возможность в программе сделать чтобы логи велись конкретно по изменениям:
например есть столбцы Имя Фамилия Дата рождения телефон в окне логов. Если изменить телефон то в логах у меня появляется запись изменена но непонятно что изменено... Есть ли возможность сделать так чтоб если изменили телефон то высвечивается изменен телефон может подкрашивается цветом ??? Помогите пожалуйста

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

Patriot10200 wrote:

Банальный отсев по номеру авто, спасибо, раньше с SQL вообще не пытался связываться, но буду стараться потихоньку изучать, Спасибо еще раз, но все таки мне не дает покоя прикол с обычным поиском, почему после поиска в расходе получается 0 вместо суммы?

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

Запрос должен выглядеть так:

SELECT                       
AC.Category,  
AP.Podcategory,   
Arenda_Autos_Money.Data_Operacii, 
Arenda_Autos_Money.Dohod, 
Arenda_Autos_Money.Rashod
FROM 
Arenda_Autos_Money
LEFT JOIN Arenda_Category AC ON AC.ID = Arenda_Autos_Money.id_Arenda_Category                  
LEFT JOIN Arenda_Podcategory AP ON AP.ID = Arenda_Autos_Money.id_Arenda_Podcategory    

WHERE        
Arenda_Autos_Money.Auto_Number_Money LIKE "%{Edit9}%"   

ORDER BY Arenda_Autos_Money.Data_Operacii;

Но все равно не ясно, что вы им ищете:

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

21

(9 replies, posted in Russian)

6katran6 wrote:
k245 wrote:
SELECT *
FROM "rabnar"
WHERE
   (kol LIKE '%{Edit1}%') 
OR (koef LIKE '%{Edit1}%')
OR (user_name LIKE '%{Edit1}%')  
OR (user_fomiliya  LIKE '%{Edit1}%') 
OR (user_patronymic LIKE '%{Edit1}%') 
OR (user_position LIKE '%{Edit1}%') 
OR (user_full LIKE '%{Edit1}%') 
OR (key LIKE '%{Edit1}%') 
OR (key1 LIKE '%{Edit1}%') 
OR (key2 LIKE '%{Edit1}%') 
OR (key3 LIKE '%{Edit1}%') 
OR (key4 LIKE '%{Edit1}%') 
OR (key5 LIKE '%{Edit1}%') 
OR (key6 LIKE '%{Edit1}%') 
OR (key7 LIKE '%{Edit1}%') 
OR (key8 LIKE '%{Edit1}%') 
OR (key9 LIKE '%{Edit1}%') 
OR (kol LIKE  '%{Edit1}%') 
OR (kol-1 LIKE '%{Edit1}%') 
OR (kol-2 LIKE '%{Edit1}%') 
OR (kol-3 LIKE '%{Edit1}%') 
OR (kol-4 LIKE '%{Edit1}%') 
OR (kol-5 LIKE '%{Edit1}%') 
OR (kol-6 LIKE '%{Edit1}%') 
OR (kol-7 LIKE '%{Edit1}%') 
OR (kol-8 LIKE '%{Edit1}%') 
OR (kol-9 LIKE '%{Edit1}%') 
OR (kol-10 LIKE '%{Edit1}%') 
OR (kol-11 LIKE '%{Edit1}%') 
OR (kol-12 LIKE '%{Edit1}%') 
OR (kol-13 LIKE '%{Edit1}%') 
OR (kol-14 LIKE '%{Edit1}%') 
OR (kol-15 LIKE '%{Edit1}%') 
OR (kol-16 LIKE '%{Edit1}%') 
OR (kol-17 LIKE '%{Edit1}%') 
OR (kol-18 LIKE '%{Edit1}%') 
OR (kol-19 LIKE '%{Edit1}%') 
OR (kol-20 LIKE '%{Edit1}%') 
OR (kol-21 LIKE '%{Edit1}%') 
OR (kol-22 LIKE '%{Edit1}%') 
OR (kol-23 LIKE '%{Edit1}%') 
OR (kol-24 LIKE '%{Edit1}%') 
OR (tab LIKE   '%{Edit1}%') 
OR (tab-1 LIKE '%{Edit1}%') 
OR (tab-2 LIKE '%{Edit1}%') 
OR (tab-3 LIKE '%{Edit1}%') 
OR (tab-4 LIKE '%{Edit1}%') 
OR (tab-5 LIKE '%{Edit1}%') 
OR (tab-6 LIKE '%{Edit1}%') 
OR (tab-7 LIKE '%{Edit1}%') 
OR (tab-8 LIKE '%{Edit1}%') 
OR (tab-9 LIKE '%{Edit1}%') 
OR (tab-10 LIKE '%{Edit1}%') 
OR (tab-11 LIKE '%{Edit1}%') 
OR (tab-12 LIKE '%{Edit1}%') 
OR (tab-13 LIKE '%{Edit1}%') 
OR (tab-14 LIKE '%{Edit1}%') 
OR (tab-15 LIKE '%{Edit1}%') 
OR (koef LIKE   '%{Edit1}%') 
OR (koef-1 LIKE '%{Edit1}%') 
OR (koef-2 LIKE '%{Edit1}%') 
OR (koef-3 LIKE '%{Edit1}%') 
OR (koef-4 LIKE '%{Edit1}%') 
OR (koef-5 LIKE '%{Edit1}%') 
OR (koef-6 LIKE '%{Edit1}%') 
OR (koef-7 LIKE '%{Edit1}%') 
OR (koef-8 LIKE '%{Edit1}%') 
OR (koef-9 LIKE '%{Edit1}%') 
OR (RustID LIKE '%{Edit1}%') 
OR (Rustpass LIKE '%{Edit1}%') 
OR (AnyDesk LIKE '%{Edit1}%') 

А здесь нужно заголовки для таблицы указать:

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

так это мой скрипт я не пойму что тут не так он и не работает вы можете 2 примера показать как правильно делать запрос

ищет, вставьте его вместо того, что у вас в кнопке.

22

(13 replies, posted in General)

The entire developer community wishes the creator of MVDB to return. But, as far as I know, Dmitry made the final decision. But in life anything happens. Especially if it happens in a galaxy far, far away.

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=10334&amp;download=1

23

(4 replies, posted in General)

This happens if you open other people's projects. Open any form and edit anything. This will signal the recompilation of the forms file that stores the license information. This is a feature of this version - to recompile you need to edit something on the project form.

procedure frm_Arenda_Dohod_Rashod_ComboBox1_OnChange (Sender: TObject);
begin
  if frm_Arenda_Dohod_Rashod.ComboBox1.ItemIndex = 1 then
    frm_Arenda_Dohod_Rashod.ed_Dohod_Rashod.dbField := 'Dohod'
  else
  if frm_Arenda_Dohod_Rashod.ComboBox1.ItemIndex = 2 then
    frm_Arenda_Dohod_Rashod.ed_Dohod_Rashod.dbField := 'Rashod'
  else ;
end;

25

(9 replies, posted in Russian)

6katran6 wrote:

как описать точней проблему не работает поиск не могу понять если не сложно приведите пример пару а дальше сам по пробую допилить

Нужно записать корректный запрос на языке SQL.

SELECT <что> FROM <откуда> WHERE <по условию>