Гений кроется в деталях.


https://k245.ru/wp-content/uploads/2022/07/Mikelandzhelo.jpg


Последняя статья из цикла "ClassExplorer", которая рассказывает о некоторых вспомогательных процедурах и функциях.


Читать: https://k245.ru/mvdb/genij-kroetsya-v-detalyah.html

Три главные кнопки


https://k245.ru/wp-content/uploads/2022/07/Tri-bogatyrya.jpg


Три самые популярные кнопки в приложениях, создаваемых в среде разработки My Visual Dtabase,  - это кнопки редактирования табличных данных: добавление, изменение и удаление записи. Обычно они находятся рядом с каждой таблицей, которую пользователь намеревается редактировать. Но в нашем приложении кнопок редактирования всего три, поэтому они будут не обычными, а "богатырскими".


Читать: https://k245.ru/mvdb/tri-glavnye-knopki.html

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 такая запись недопустима.

sparrow wrote:

Ну ладно )


Ничего не имею против подзапросов но вот ваш пример и правильный в действии в MVD для SQLite


И пример использования https://www.w3schools.com/sql/sql_union.asp

SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;

Ваша правда - практика всегда лучше рассуждений. Пожалуй, надо исправить моё неверное утверждение насчет сортировок в пределах запроса. Благодарю за науку.

sparrow wrote:

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

выдаст

Алеся
Вася
Коля
Маша
Света
Юля

Давайте дружить таблицами


https://k245.ru/wp-content/uploads/2022/07/druzhba.jpg


Как организовать глобальный поиск на практике, если нужно искать в разных таблицах, а результат формировать в одном запросе? В этом нам поможет SQL-команда UNION.


Читать: https://k245.ru/mvdb/davajte-druzhit-tablitsami.html

683

(5 replies, posted in Script)

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

684

(5 replies, posted in Script)

{$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')

685

(1 replies, posted in General)

Basic Level. Relational databases

https://docs.google.com/document/d/16ZV … sp=sharing

686

(5 replies, posted in Script)

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.

spoogerwooger wrote:

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?

Лечение копипаста

https://k245.ru/wp-content/uploads/2022/07/lechenie.jpg


Копипаст – это самое распространенное заболевание исходного кода программы. Генезис его таков: кажется, что достаточно скопировать, немного подправив, некий участок кода несколько раз и результат готов! Зачем делать сложно, если можно сделать просто?


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


Однако, если вы делаете рабочий проект и хотите, чтобы он (и вы вместе с ним) жили долго и счастливо, от копипаста в коде нужно избавляться. И вот почему.


Читать: https://k245.ru/mvdb/lechenie-kopipasta.html

Сложная простота

http://k245.ru/wp-content/uploads/2022/06/%D1%81%D0%BD%D0%B5%D0%B6%D0%B8%D0%BD%D0%BA%D0%B8.png


Концепция объектно-ориентированного программирования одновременно проста и сложна. Её простота в лаконичности решений: иерархическая структура описания множества сущностей с их свойствами, связями и возможностями взаимодействия с другими сущностями практически исключает дублирование терминов и их толкований. Данная статья посвящена попытке создания удобной и эффективной системы упорядочивания знаний в области программирования, которая может пригодиться не только в работе с My Visual Database (MVDB), но и с другими системами, использующими объектно-ориентированный подход (ООП).


Читать:  http://k245.ru/?p=119

690

(4 replies, posted in FAQ)

Destiny wrote:

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.

691

(4 replies, posted in FAQ)

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.

692

(1 replies, posted in General)

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.

693

(21 replies, posted in General)

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.

http://k245.ru/?p=23

http://k245.ru/wp-content/uploads/2022/06/CyanDusk.png

chartcatuser wrote:

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.

chartcatuser wrote:

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.

sparrow wrote:

Есть еще событие .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.


Результат:

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

Результат:

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

0anion0 wrote:

P.S.: Хотел прикрутить Component Explorer  чтобы посмотреть имена полей в окне авторизации но не получается, т.к. нет процедуры Combo_GetFormList.

Исходники доступны через платный абонемент.

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

  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.
Aza wrote:

      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;