Гений кроется в деталях.
Последняя статья из цикла "ClassExplorer", которая рассказывает о некоторых вспомогательных процедурах и функциях.
My Visual Database → Posts by k245
Гений кроется в деталях.
Последняя статья из цикла "ClassExplorer", которая рассказывает о некоторых вспомогательных процедурах и функциях.
Три главные кнопки
Три самые популярные кнопки в приложениях, создаваемых в среде разработки My Visual Dtabase, - это кнопки редактирования табличных данных: добавление, изменение и удаление записи. Обычно они находятся рядом с каждой таблицей, которую пользователь намеревается редактировать. Но в нашем приложении кнопок редактирования всего три, поэтому они будут не обычными, а "богатырскими".
4. Свойство дерева dbGeneralTable не содержит названия таблицы
Задумал я одну полезную функцию написать - определять имя таблицы, с которой работает форма табличного представления.
function Form_GetTableName(AForm:TAForm):string;
// функция возвращает название таблицы, с которой работает форма
var
tmpButton:TdbButton;
tmpGrid: TdbStringGridEx;
tmpTree: TdbTreeView;
begin
Result := '';
FindC(AForm,'btnUpdate',tmpButton,False);
if tmpButton <> nil then
Result := tmpButton.dbGeneralTable
else
begin
FindC(AForm,'tgrMain',tmpGrid,False);
if tmpGrid <> nil then
Result := tmpGrid.dbGeneralTable
else
begin
FindC(AForm,'trvMain',tmpTree,False);
if tmpTree<>nil then
Result := tmpTree.dbGeneralTable;
end;
end;
end;
Функция прекрасно работает с формами, на которых имеется таблица с именем tgrMain или кнопка поиска с именем btnUpdate, извлекая имя таблицы из свойства dbGeneralTable. Но оказалось, что это свойство для дерева пустое.
Справедливости ради надо отметить, что данное свойство для дерева не документировано. Но оно существует, а так как TdbTreeView является наследником TdbStringGridEx, то ожидается, что данное свойство содержит имя таблицы, с котором работает компонент. Но в данном случае ожидания не совпадают с реальностью.
Версия MVDB 6.6.1 beta
Кстати, независимая сортировка отдельных выборок возможна в MySQL, но записывается чуть иначе:
( SELECT name FROM table_1 ORDER BY name )
UNION
( SELECT name FROM table_2 ORDER BY name )
В SQLite такая запись недопустима.
Ну ладно )
Ничего не имею против подзапросов но вот ваш пример и правильный в действии в MVD для SQLite
И пример использования https://www.w3schools.com/sql/sql_union.asp
SELECT City FROM Customers UNION ALL SELECT City FROM Suppliers ORDER BY City;
Ваша правда - практика всегда лучше рассуждений. Пожалуй, надо исправить моё неверное утверждение насчет сортировок в пределах запроса. Благодарю за науку.
5. Сортировки действуют только в пределах каждого отдельного запроса. - ?
Если речь о ORDER BY ... то только в самом конце всех запросов, после всех UNION
table_1
Вася
Света
Алеся
table_2
Коля
Юля
Маша
SELECT name FROM table_1 ORDER BY name
UNION
SELECT name FROM table_2 ORDER BY name
выдаст
Алеся
Вася
Света
Коля
Маша
Юля
Чтобы упорядочить всю выборку, нужно сделать подзапрос:
SELECT data.name FROM
(
SELECT name FROM table_1
UNION
SELECT name FROM table_2
) as Data
ORDER BY Data.name
выдаст
Алеся
Вася
Коля
Маша
Света
Юля
Давайте дружить таблицами
Как организовать глобальный поиск на практике, если нужно искать в разных таблицах, а результат формировать в одном запросе? В этом нам поможет SQL-команда UNION.
Читать: https://k245.ru/mvdb/davajte-druzhit-tablitsami.html
There is only one connection to the base.
My script is universal, it is not tied to the names of the project forms.
procedure Form1_OnShow (Sender: string; Action: string);
var
ok: boolean;
begin
frmWait.Show;
Application.ProcessMessages;
ok := ConnectToDB('10.24.221.20',3306,'myBase','admin','password');
if not ok then
ok := ConnectToDB('192.168.1.85',3306,'myBase','admin','password');
if ok then
UpdateDatabase('')
else
begin
frmWait.Close;
ShowMessage('Проверьте подключение к базе данных');
Form1.Close;
end;
end;
And, by the way, on the topic of copy-paste in the program code:https://k245.ru/mvdb/lechenie-kopipasta.html
{$MySQL disable_connectdialog}
var
// системные переменные
SQLCon: TMyConnection; // соединение с базой
function ConnectToDB(AServer: string; APort: integer; ADataBase: string'; AUsername: string'; APassword: string): boolean;
// подключение к Базе данных; Возвращает True при успешном подключении;
begin
SQLCon.Server := AServer;
SQLCon.Port := APort;
SQLCon.Database := ADataBase;
SQLCon.Username := AUsername;
SQLCon.Password := APassword;
try
SQLCon.Connect;
result := SQLCon.Connected;
except
result := False;
end;
end;
procedure InitSystemVar;
var
i: integer;
tmpForm: TAForm;
begin
for i := 0 to Screen.FormCount - 1 do
begin
tmpForm := TAForm(Screen.Forms[i]);
FindC(tmpForm, 'MySQLConnection', SQLCon, False);
if SQLCon <> nil then
break;
end;
end;
procedure FindC(AForm: TAForm; AName: string; var AComponent: TComponent; ACheck: boolean = True);
// поиск компонента на форме с контролем
begin
AComponent := AForm.FindComponent(AName);
if ACheck and (AComponent = nil) then
ShowMessage('Не найден компонент ' + AForm.Name + '.' + AName);
end;
begin
InitSystemVar;
end.
Use the ConnectToDB() to connect to the desired server.
ConnectToDB('192.168.0.1',3306,'myBase','admin','password')
Basic Level. Relational databases
You cannot connect to two databases at the same time, but you can connect to different databases in turn, saving the data received from the first database in local files for later transfer to the second database.
I do know that I had to create a new account, because I could no longer login through google. loginza google login was failing like it hadn't been renewed. I was sdhale29. I hope that Dmitry is ok. Sorry to post in the Russian thread, but no-one is talking about the absence it in the other.
Are you reporting a problem logging into the forum via Google? Maybe something has changed in Google policy or in the security settings of your account?
Лечение копипаста
Копипаст – это самое распространенное заболевание исходного кода программы. Генезис его таков: кажется, что достаточно скопировать, немного подправив, некий участок кода несколько раз и результат готов! Зачем делать сложно, если можно сделать просто?
Для начала несколько слов в защиту данной методики достижения цели. Так можно делать, если вы хотите проверить какую-то концепцию, быстро сделать прототип и показать его конечному пользователю. В этом случае копипаст вполне оправдан и даже полезен, так как экономит время получения первого результата.
Однако, если вы делаете рабочий проект и хотите, чтобы он (и вы вместе с ним) жили долго и счастливо, от копипаста в коде нужно избавляться. И вот почему.
Сложная простота
Концепция объектно-ориентированного программирования одновременно проста и сложна. Её простота в лаконичности решений: иерархическая структура описания множества сущностей с их свойствами, связями и возможностями взаимодействия с другими сущностями практически исключает дублирование терминов и их толкований. Данная статья посвящена попытке создания удобной и эффективной системы упорядочивания знаний в области программирования, которая может пригодиться не только в работе с My Visual Database (MVDB), но и с другими системами, использующими объектно-ориентированный подход (ООП).
Читать: http://k245.ru/?p=119
I adapt the images to the color of my form so it looks like the background is transparent.
That's right, it works well if the required transparency is 100%. But I was spoiled by free libraries with images of buttons with translucent elements, in PNG format. They look very good due to anti-aliasing, which is achieved by smoothly changing the transparency of the edge of the image.
I'm currently working on responsive button images that will change color depending on the UI style chosen (active and passive button colors). Unfortunately, I will have to switch to the BMP format - only with it in MVDB it is possible to implement what I had in mind.
Perfect solution! I take it in my piggy bank. It's a pity that in MVDB there is no full-fledged support for working with PNG format, so that transparency is not lost.
Perhaps this is due to the fact that several instances of the application were launched, one of which hung (which often happens if there was an error in the script) and blocked access to the file with graphic resources. Try to end in the task manager all the processes created by My Visual Database.
There is no such thing in the standard features, but it can be done through scripts. Here it is written in detail how to do it.
Well, then tell me, I have a dashboard and it shows open deals, closed deals, and now I want to add NULL - they are waiting for how to implement this? Despite the fact that I have open = 1 closed 0, everything counts the computational field
Using the standard checker field will not work, since such a field in the column with checkers has the Boolean type. To implement the plan, you will have to use scripts to create and display a column with three-state checker images. You will also need a table click handler to change images.
Hello everyone, how can I find out in the computational field that checkbox = Null?
(select count(*) from table where checkbox = -1) ?
By default, the field with checkboxes is not stored in the database, but you can create a field for storing checkers yourself and use a script to set or write the state of checkers to the database. Then you will be able to extract data about their health status from the database.
Есть еще событие .OnActivate
А меньше танцев от рамок и .Sorted := True если использовать :
.dbSQLexecute('SELECT id, username FROM _user ORDER BY username')
и
.dbUpdate
Полностью согласен!
procedure F_OnActivate (Sender: TObject);
var
tmpCombo: TdbCombobox;
begin
tmpCombo := GetCombo;
tmpCombo.dbSQLexecute('SELECT id, username FROM _user ORDER BY username');
tmpCombo.dbUpdate;
end;
function GetCombo: TdbComboBox;
//
var
i: integer;
begin
for i := 0 to frmdbCoreLogin.componentCount - 1 do
begin
if frmdbCoreLogin.Components[i] is TdbCombobox then
begin
Result := TdbCombobox( frmdbCoreLogin.Components[i] );
exit;
end;
end;
end;
begin
TAForm(frmdbCoreLogin).OnActivate := @F_OnActivate;
end.
Результат:
Результат:
P.S.: Хотел прикрутить Component Explorer чтобы посмотреть имена полей в окне авторизации но не получается, т.к. нет процедуры Combo_GetFormList.
Исходники доступны через платный абонемент.
function GetCombo: TdbComboBox;
//
var
i: integer;
begin
for i := 0 to frmdbCoreLogin.componentCount - 1 do
begin
if frmdbCoreLogin.Components[i] is TdbCombobox then
begin
Result := TdbCombobox( frmdbCoreLogin.Components[i] );
exit;
end;
end;
end;
procedure F_OnResize (Sender: TObject);
var
tmpCombo: TdbCombobox;
begin
tmpCombo := GetCombo;
// сортировка включается, но появляется рамка вокруг комбобокса, избавиться от которой очень сложно...
tmpCombo.Sorted := True;
// подогнать размер, чтобы выглядело нормально
tmpCombo.Top := 0;
tmpCombo.Left := 0;
tmpCombo.Width := frmdbCoreLogin.pnLogin.width;
frmdbCoreLogin.pnLogin.Height := tmpCombo.Height;
end;
begin
// трудноуловимый комбобокс со списком пользователей появляется в момент появления формы,
// поэтому доступ к нему будет только после того, как форма отобразится.
// слава богам, создавшим классы Delphi, есть событие OnResize,
// которое происходит после события OnShow
TAForm(frmdbCoreLogin).OnResize := @F_OnResize;
end.
How make a third handler in which call the procedures?
like this?
procedure Client_addtwoprocedure_onChange (Sender: TObject; Var Cancel: String);
begin
procedure Client_culc2_onChange (Sender: TObject; Var Cancel: String);
procedure Client_culcCovid1_onChange (Sender: TObject; Var Cancel: String);end;
procedure Client_addtwoprocedure_onChange (Sender: TObject; Var Cancel: String);
begin
Client_culc2_onChange (Sender, Cancel);
Client_culcCovid1_onChange (Sender, Cancel);
end;
My Visual Database → Posts by k245
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi