k245 wrote:

In theory, the printer selection should look like this:

Form1.frxReport.PrintOptions.Printer := 'PrinterName';
Form1.frxReport.PrintOptions.Copies := 1;
Form1.frxReport.PrepareReport;
Form1.frxReport.Print;

Unfortunately, this code will not work, since the TfrxReport.Print method is not supported in MVDB. And this is very sad. If anyone knows how to programmatically send a report to print, bypassing the preview window, please let me know.

427

(10 replies, posted in Script)

sonixax wrote:

Many thanks,
so there is no way to show qr code in the program itself? (only in reports?)

This will require a little more code))


https://k245.ru/wp-content/uploads/2023/02/image-1.png

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

In The Name Of Progress

https://k245.ru/wp-content/uploads/2023/03/a_ignore_q_80_w_1000_c_limit_001.jpg

If the execution of an action takes a long time, then it is desirable to inform the user about how things are going: what percentage of the actions have been completed and what exactly the program is doing now. And the universal function of displaying the progress form will help us with this.


Read: https://k245.ru/en/mvdb-en/in-the-name-of-progress.html

Во имя прогресса

https://k245.ru/wp-content/uploads/2023/03/a_ignore_q_80_w_1000_c_limit_001.jpg

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


Читать: https://k245.ru/mvdb/vo-imya-progressa.html

430

(8 replies, posted in Russian)

Интересное решение - одна форма и три кнопки для добавления в три таблицы...  Оспаривать его не буду, только замечу, что вы не сохраняете нигде значения для полей id_tablica_vtoraya и  id_tablica_tretya, поэтому ничего и не подтягивается в таблицу на главной форме.

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

Решение: после добавления во вторую и третью таблицы получать ID добавленных записей функцией Last_Insert_ID и записывать их в дополнительные компоненты, связанные с первой таблицей и предназначенные для сохранения значений id_tablica_vtoraya и  id_tablica_tretya...


Сейчас придет Владимир и спросит: а какая задача стоит? )))

431

(8 replies, posted in Russian)

Вариантов несколько, но начать нужно с правильной формулировки вопроса. И вы упомянули о примере, но его нет...

432

(7 replies, posted in General)

What do you mean by "report logo"?

433

(2 replies, posted in Script)

Your code does not work because the form property BuchhaltungsManager.KeyPreview = False.
But it will be right to add setting the focus to the event BuchhaltungsManager.Save.OnAfterClick:

procedure BuchhaltungsManager_Save_OnAfterClick (Sender: TObject);
begin
  BuchhaltungsManager.Grund.SetFocus;
end;

When you press the Enter key, the Save button will automatically click because it has the Default property set to True.

Form1.combobox2.dbUpdate;
if Form1.combobox2.Items.Count > 0 then
 Form1.combobox2.ItemIndex := 0;

In theory, the printer selection should look like this:

Form1.frxReport.PrintOptions.Printer := 'PrinterName';
Form1.frxReport.PrintOptions.Copies := 1;
Form1.frxReport.PrepareReport;
Form1.frxReport.Print;

Философское отступление


Тема: реализация дерева с двумя уровнями с применением текстового поразрядного ключа.


Плюсы: простота выборки данных по каждому узлу и связанных данных.
Минусы: ограничения числа элементов каждого уровня задаются форматом поразрядного ключа; выборка по текстовому ключу медленнее, чем по целочисленному; сложность редактирования ключа подчиненных узлов (товаров по категориям/субкатегориям при изменении ключа верхнего уровня.


Пояснение. Имеет место быть задача классификации, которая имеет следующие параметры:

  • число уровней классификации заранее определено;

  • максимальное число элементов на каждом уровне заранее определено длиной последовательности и его алфавитом;

  • родительский элемент определяется текстовым значением ключа классификатора без поддержки целостности данных на уровне БД.


По научному такое дерево называется "визуальный путь". По сравнению с деревом, построенном на связке ID-ParentID, позволяет извлекать данные о дочерних элементах более простым SQL-запросом, но имеет ряд ограничений, описанных выше. В MVDB нет встроенной поддержки такого дерева, но скриптами его легко организовать.


P.S. "Забивание шурупа молотком" иногда вполне себя оправдывает, так как "создание шуруповёрта" гораздо сложнее "создания молотка".

А категории и субкатегории не связаны реляционными отношениями на уровне БД? Еще есть вариант с деревом, но там сложней с выборкой данных.

438

(5 replies, posted in General)

Hello all!


I had some experience with code shaping( https://k245.ru/en/mvdb-en/code-alignment.html ) and syntax highlighting( https://k245.ru/en/mvdb-en/markup-highlighting.html ).


In the database, I store two versions of the snippet: plain text (for searching and editing)

https://k245.ru/wp-content/uploads/2022/08/izobrazhenie_2022-08-08_145709846-1024x665.png

and formatted (for display).

https://k245.ru/wp-content/uploads/2022/08/izobrazhenie_2022-08-08_145902206-1024x645.png

estimation411 wrote:

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


procedure Form1_Combobox2_OnChange (Sender: TObject);
begin
  Form1.Combobox2.Filter := 'SUBSTR( <имя поля>, 1, 1) =  '+copy( Form1.Combobox2.Text,1,1 );
  Form1.Combobox2.dbUpdate;
end;



Здесь везде повтор Combobox2
Прошу прощения, а что означают цифры ,1,1 - это некий диапазон?

Спасибо

Исправил опечатку.
Функции
SUBSTR для базы данных
COPY для скрипта
Они выделяют из строки подстроку указанной длины, начиная с указанного символа. В данном случае интересует первый символ.

В обработчике события Combobox1.OnChange устанавливайте свойство Combobox2.Filter и обновляйте данные:

procedure Form1_Combobox1_OnChange (Sender: TObject);
begin
  Form1.Combobox2.Filter := 'SUBSTR( <имя поля>, 1, 1) =  '+copy( Form1.Combobox1.Text,1,1 );
  Form1.Combobox2.dbUpdate;
end;

<имя поля> - поле, указанное в свойстве Combobox2.FieldName

441

(3 replies, posted in FAQ)

Form editing example

procedure App_InitAboutForm;
// настройка формы "О программе"
var
  tmpLabel:TLabel;
  tmpLabel2:TLabel;
  tmpImage: TImage;
  tmpImageFileName :string;
begin
  frmdbCoreAbout.Caption := 'О программе';

  FindC(frmdbCoreAbout,'LinkLabel1',tmpLabel);
  tmpLabel.Caption := APP_NAME;
  tmpLabel.Font.Size := 14;
  tmpLabel.Font.Style := fsBold;

  tmpLabel2 := TLabel.Create( frmdbCoreAbout );
  tmpLabel2.Name := 'labVersion';
  tmpLabel2.Parent := tmpLabel.Parent;
  tmpLabel2.Left := tmpLabel.Left;
  tmpLabel2.Top := tmpLabel.Top + 30;
  tmpLabel2.Caption := 'Версия '+App_GetVersion;
  tmpLabel2.Font.Size := 11;

  FindC(frmdbCoreAbout,'Label2',tmpLabel);
  tmpLabel.Caption := 'Copyright '+chr($A9)+' '+APP_COPYRIGHT;
  tmpLabel.Top := tmpLabel.Top + 50;
  tmpLabel.Font.Size := 11;

  tmpLabel2 := TLabel.Create( frmdbCoreAbout );
  tmpLabel2.Name := 'labLink';
  tmpLabel2.Parent := tmpLabel.Parent;
  tmpLabel2.Left := tmpLabel.Left;
  tmpLabel2.Top := tmpLabel.Top + 24;
  tmpLabel2.Font := tmpLabel.Font;

  Label_LinkCreate( tmpLabel2, APP_SITE);

  tmpLabel2 := TLabel.Create( frmdbCoreAbout );
  tmpLabel2.Name := 'labDatabaseDate';
  tmpLabel2.Parent := tmpLabel.Parent;
  tmpLabel2.Left := tmpLabel.Left;
  tmpLabel2.Top :=  tmpLabel.Top + 224;
  tmpLabel2.Font := tmpLabel.Font;
  tmpLabel2.Hint := App_GetDBFileName(True);
  tmpLabel2.ShowHint := True;
  tmpLabel2.Caption := 'Дата обновления базы: '+DateToStr(GetFileLastWriteTime(tmpLabel2.Hint));
  //
  FindC(frmdbCoreAbout,'Image1',tmpImage);
  tmpImageFileName := ExtractFilePath(Application.ExeName)+APP_ABOUT_LOGO_FILE_NAME;
  if not FileExists(tmpImageFileName) then
    RaiseException('App_InitAboutForm() Не найден файл '+tmpImageFileName)
  else
   tmpImage.Picture.LoadFromFile(tmpImageFileName);
end;

More information: https://k245.ru/en/mvdb-en/component-explorer-2.html
https://k245.ru/en/mvdb-en/butterfly-effect.html

442

(3 replies, posted in Russian)

Напишите разработчику (support@drive-software.com) , он гражданин РФ со всеми возможностями получения платежей из РФ.

Library is the ability to access all books and articles, including applications, without buying the books themselves. Thanks to Google Docs technology, you can view and download books in the formats you need to read them offline. All publications presented in the library are divided into two categories according to the type of access to them: with free access and with paid access. Sometimes in paid access there are applications that include the source codes of the projects considered in the book or article.

https://k245.ru/wp-content/uploads/2022/06/%D0%9C%D0%B5%D1%81%D1%8F%D1%87%D0%BD%D1%8B%D0%B9.png


For students and pensioners the subscription is free


https://k245.ru/en/library

Библиотека – это возможность доступа ко всем книгам и статьям, включая приложения, без покупки самих книг. Благодаря технологиям Гугл-документов, вы можете просматривать, а также скачивать книги в нужных вам форматах, чтобы читать их офф-лайн. Все издания, представленные в библиотеке, разделены на две категории по виду доступа к ним: со свободным доступом и с платным доступом. Иногда в платном доступе находятся приложения, которые включают в себя исходные коды рассматриваемых в книге или статье проектов.

https://k245.ru/wp-content/uploads/2022/06/%D0%93%D0%BE%D0%B4%D0%BE%D0%B2%D0%BE%D0%B9.png


Для студентов и пенсионеров абонемент предоставляется бесплатно.


https://k245.ru/biblioteka

В этом случае нужно добавить ещё один обработчик:

procedure Form1_TableGrid1_OnCellClick (Sender: TObject; ACol, ARow: Integer);
begin
  if ACol = 7 then
  begin
    form1.TableGrid1.Cell[7,ARow].asBoolean := not form1.TableGrid1.Cell[7,ARow].asBoolean;
    Calc;
  end;
end;

Семейный альбом. Анимация

https://k245.ru/wp-content/uploads/2023/03/Semejnyj-albom-1.1.jpg


После выхода первой версии “Семейного альбома” прошло 8 месяцев. И у меня появился повод продолжить эту историю в позитивном ключе. Дело в том, что при разработке данной программы я столкнулся с очень серьёзной проблемой – низкой производительностью компонентов, отвечающих за отображение изображений: обычная загрузка картинки из файла и отображение на форме может занимать секунду и даже более, в зависимости от размера файла. С такими скоростями о режиме презентации можно забыть, а сам проект перевести в разряд учебных. Однако, после серии экспериментов с прозрачностью формы, мне удалось добиться приемлемой анимации при смене изображений с эффектом плавного перехода одного изображения в другое.


Читать: https://k245.ru/mvdb/semejnyj-albom-animatsiya.html

estimation411 wrote:

Вариант от DEREK -а работает.
Остальные нет.
Но.. Есть все-же одно НО.
Результат реагирует на нажатую ячейку, где находится сам checkbox, даже если он не выбран.

Задача в том чтобы уже готовая сумма в footer менялась в зависимости от выбора checkbox-а.

например есть таблица:

ААА      10     (*)
ВВВ      15     (*)
ССС      45    (*)
--------------------
сумма:  70

checkbox по умолчанию (*) отмечен у всех

и теперь снимаем галочку в checkbox ( ) в одной из строк (например в ВВВ)

ААА      10    (*)
ВВВ      15    (  )
ССС      45    (*)
----------------------
сумма:  55

при этом сумма получается уже без учета ВВВ

То есть суммируются только отмеченные checkbox - м строки, остальные игнорируются.

Спасибо.


Что именно не работает? Вы проект исправленный открывали?

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

448

(5 replies, posted in Script)

function BMI( w:double; h:double):double;
begin
  result := 1.3 * w / Power( h, 2.5);
end;

SQLite also supports this function.
https://www.sqlite.org/lang_mathfunc.html

449

(3 replies, posted in Russian)

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


Описанный вами алгоритм не полный: в нем нет описания действий при модификации/удалении данных, действий при обнаружении дубликатов и т.д.

procedure Form1_TableGrid1_OnAfterEdit (Sender: TObject; ACol, ARow: Integer; Value: String);
begin
  Calc;
end;

procedure Calc;
var
  iRow: integer;
  s1: integer;
  s2: integer;
begin
  s1 := 0;
  s2 := 0;
  for iRow := 0 to form1.TableGrid1.RowCount - 1 do
  begin
    if form1.TableGrid1.Cell[7,iRow].asBoolean then
    begin
      s1 := s1 + form1.TableGrid1.Cell[4,iRow].asInteger;
      s2 := s2 + form1.TableGrid1.Cell[6,iRow].asInteger;
    end;
  end;
  form1.Edit6.Value := s1;
  form1.Edit5.Value := s2;

  Form1.tablegrid1.columns[4].footer.Caption := form1.Edit6.Text;
  Form1.tablegrid1.columns[6].footer.Caption := form1.Edit5.Text;

end;