Как в LUA не получится.
Массив вам в помощь:
var
num : array [1..3] of integer;
ind: integer;
...
ind := 2;
result := num[ind];
My Visual Database → Posts by k245
Как в 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;
Фокус в том, что значение вычисляемого поля не должно быть пустым. Если по каким-то причинам не можете туда записать целевое выражение, то нужно вставлять заглушку:
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;
Подскажите пожалуйста, вычисляемые поля работают в MySQL или в них запрос немного отличается в отличии от SQLlite
Про вычисляемые поля в MVDB ( https://k245.ru/mvdb/ispolzovanie-sql-v-mvdb.html ), но в основном про SQLite.
Проверьте, используете ли вы скобки.
Построитель выражений ориентирован на SQLite, если вы используете MySQL, то пишите SQL самостоятельно.
Вычисляемые поля - это механизм сборки SQL-запроса.
А то, что есть разница в функциях, реализованных в SQLite и MySQL - это факт.
Смотрите документацию, сравнивайте...
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
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;
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?
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;
а можно как то зациклить проверку , например на каждые 5 минут , и программа закрывалась ?
Перенесите проверку в таймер и установите интервал таймера на 5 минут.
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:
The articles provide several practical tips on implementing protection and licensing
Сначала отвечу на второй вопрос - используйте 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 )
и так для каждого условия.
Вариант со скриптом предполагает, что вы включаете нужные строки в запрос только в том случае, если они содержат значение, отличное от пустого. Решение привязывается к конкретным названиям компонентов формы. Для того, чтобы я смог его написать для вас, приложите ваш проект .
Всем привет. А подскажите есть ли возможность в программе сделать чтобы логи велись конкретно по изменениям:
например есть столбцы Имя Фамилия Дата рождения телефон в окне логов. Если изменить телефон то в логах у меня появляется запись изменена но непонятно что изменено... Есть ли возможность сделать так чтоб если изменили телефон то высвечивается изменен телефон может подкрашивается цветом ??? Помогите пожалуйста
Если записи лога отражаются в хронологическом порядке, то можно сделать обработку для грида на событие onChange, в которой сравнивать текущую строку с предыдущей и, если есть отличия, то менять цвет фона у ячейки.
Банальный отсев по номеру авто, спасибо, раньше с 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;
Но все равно не ясно, что вы им ищете:
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}%')
А здесь нужно заголовки для таблицы указать:
так это мой скрипт я не пойму что тут не так он и не работает вы можете 2 примера показать как правильно делать запрос
ищет, вставьте его вместо того, что у вас в кнопке.
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.
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;
как описать точней проблему не работает поиск не могу понять если не сложно приведите пример пару а дальше сам по пробую допилить
Нужно записать корректный запрос на языке SQL.
SELECT <что> FROM <откуда> WHERE <по условию>
My Visual Database → Posts by k245
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi