826

(14 replies, posted in General)

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

827

(1 replies, posted in General)

In MVD for each table, a primary key is automatically created by the ID field, which is not displayed in the designer, but exists in the database.


A foreign key is automatically created when you add a field with the "LINK" type and support CASCADE or RESTRICT referential actions.


More detail:
https://en.wikipedia.org/wiki/Primary_key
https://en.wikipedia.org/wiki/Foreign_key

828

(13 replies, posted in General)

v_pozidis wrote:

I have understood your software script. The program works correct. My question is how is it possible when you close the program to change the database ...,'' it will close Form1, then replace sqlite.db with the user's selected [filename].dbbak, then reopen the program''
.... i will use your script. .. thanks

There is an assumption that when the main form close event occurs, the connection to the database file is closed, and this happens before the application terminates. And judging by the above code, this assumption is correct.

829

(13 replies, posted in General)

v_pozidis wrote:

Hi, I have create a backup procedure by script for the database sqlite.db. But how can I make a restore procedure? As I know I can not restore the file when the database is active . Any idea???

Actions to restore the database (copying files) can be performed from a batch file. So the scenario is:

1. The program creates a batch file, runs it and exits
2. A small delay (1-2 seconds) is made in the batch file so that the program is guaranteed to close and release access to the database file.
3. In the batch file, the database file is copied.
4. The main program is launched in the batch file.

Done: The database has been restored from a backup.

830

(10 replies, posted in FAQ)

sibprogsistem wrote:
k245 wrote:

Жаль, что MVDB не умеет запускать проекты из папки. В результате в каждой папке проекта одинаковые файлы exe (с разными названиями) по 19 МБ каждый

это Вы про мой проект ?  странно У меня все работает, я даже  iso использовал, все ок, образы открываются и работают

С вашим проектом все ОК, работает, как часы. Это я ворчу про то, что если на компьютере установлены несколько проектов на платформе My Visual Database, то в каждом из них скопирован exe файл, хотя по факту он одинаковый для всех проектов.

831

(10 replies, posted in FAQ)

Жаль, что MVDB не умеет запускать проекты из папки. В результате в каждой папке проекта одинаковые файлы exe (с разными названиями) по 19 МБ каждый...


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

832

(3 replies, posted in General)

brian.zaballa wrote:

I'm not sure to what you really need but this might give you an idea.

https://www.dropbox.com/s/74n585xw84u73 … a.zip?dl=1

Great solution! Thank you very much!

I note that library files will be needed for work (32 bit version):  msvcr100.dll  from Microsoft Visual C++ 2010 Service Pack 1 Redistributable Package MFC Security Update

Операторы цикла


https://blogger.googleusercontent.com/img/a/AVvXsEgvxn5vDmpOqodQh7RC83ecwq1AdGtHe3AQCUphCoWuPG1P5bWwnJPA7kqAXfqj8AhXeguxvPLJ5eeWdAl3FU4Knre97-b_EDIuAfx839IZUqHIsW5qyoxA2rSRf31wVcgBx0aeTYz7AjcumMP6yfGlDbjD4IA8xqOjxTuZNPfmUfaiL1_sHHiqcr3n=w640-h516

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


Читать: https://createmyvisualdatabaseapp.blogs … st_23.html

Условный и составной операторы


https://blogger.googleusercontent.com/img/a/AVvXsEgsG03ThrzFLuUtfKVI9DirxDU3q3iUv88PjIJGPxlcsucea-agzyJpCUZ9UExyWWuqXUwHcgrh9f7GXyCKTNKIHksKOix59OnbqwmRSd8N4KDSQO-li-1zNyMRsO1vHjziaFQWd6P55U4xKtS0AdVM9--ZfbbHlMBV2oLJd82HD8lrOtparUYzEuGi=w640-h394


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


Читать: https://createmyvisualdatabaseapp.blogs … st_16.html

Событийно-ориентированное программирование


https://blogger.googleusercontent.com/img/a/AVvXsEgek0ey1TZbS7X9zUDo0v93hMr4kfgvahh3Gbey_emAX2chcHllk4Ut9KNJfDdUjUMXcXtzWeb3ObRiFJb4ZyCE_SjIBZY-4egFuwVLp87DrpqYWjJIHDhIVPiuK4ZmQmxzRSjHhW06Jv8lT58PuvhiWpJDA8P3gJyZD7pmtsdNLWTb3MxyH3sOODON=w640-h280


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

Mass Effect. Шепард.


В основе любого оконного приложения Windows лежит принцип обработки событий. Программа реагирует на различные события как внешние (движение и клики мышкой, нажатия клавиш на клавиатуре), так и внутренние (отображение формы, нажатие кнопки на экране, обновление отображаемых данных). Программы, созданные в среде разработки My Visual Database, также обрабатывают различные события. Все обработчики "скрыты под капотом" системы, что позволяет в полной мере наслаждаться технологией no-code для создания довольно сложных приложений для работы с базами данных. Но в какой-то момент вам понадобится изменить реакцию системы на событие и добавить новый функционал. Тогда вы открываете редактор скриптов и начинаете писать свой код.


Чуть ранее, для понимания базовых принципов, мы рассмотрели структурное и объектно-ориентированное программирование. Что же нового добавляет событийно-ориентированное программирование (СОП) и какие подводные камни могут попасться?


В качестве примера разберём создание "зебры" для таблицы.

Читать: https://createmyvisualdatabaseapp.blogs … st_14.html

Объектно-ориентированное программирование


https://blogger.googleusercontent.com/img/a/AVvXsEjfAfmR7pGAUACCSuvtxN3Jsglja6i_jkAVlF9kcUWEZNjrKVC0N_lp4FKL09F97R59DF5GtaUQ76gUIB_Q0i7iY1SS8-LmOZiIx-4fFIoOYsjvqy3jjyeGHmeZSMMHQ_3UXuqggrreVcxLjcTSSeDZdKTmtyuUYhYNavQPI6wdOh77rQI8UFmcbbAL=w640-h480


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


Для начала изучим несколько терминов, раскрывающих суть ООП, с примерами реализации в MVDB. В частности, мы научимся менять стандартную форму "О программе".


Читать: https://createmyvisualdatabaseapp.blogs … st_13.html

No-code и Low-code программирование


https://blogger.googleusercontent.com/img/a/AVvXsEhQNA_qDtFlHkss4InnUo2VdN91GnwTYmEjdliAfHu-SAVoUx_D2RffLkrUM18-F8qN8udlE5tW5kqu1yYL4LVA_XJ6n1AHFUqK8lqrbWlEqIZVx1Us1vWzk5TFY35zIufahEWFuhFbpc6bDlOTeqDhIfSoJQIfyZ7kccOYDjs77kiBXi2SEBwf2abF=w640-h400


Если бы да кабы на носу росли грибы,
Сами бы варилися, сами в рот валилися.


Примерно так представляют себе будущее программистов. Точнее - будущее без программистов: в новостях периодически публикуют новости от "английских учёных", которые уже создали системы для написания исходных кодов для любого программного обеспечения. И многие задумываются - а стоит ли изучать эту профессию, если программистов вскоре заменят компьютерами?


Давайте выясним, как обстоят дела на самом деле и для начала разберёмся в терминологии.


Читать: https://createmyvisualdatabaseapp.blogs … -code.html

Структурное программирование


https://blogger.googleusercontent.com/img/a/AVvXsEgWsXUvcpRqbK36xg--VImjkNzMt2Ho5qJCYI5wmYwDRVsG-VRxEw8edN_eG1Iz8hI1cGFyv2ZIp0JXrbighkHM7sb_iQLn-6O66NsfGWU5faIAgXEWTl5ErdQ3EIxTNHfVSdi-UDptx3fThXmpHaExUuX-_ur7_77B99uxLmRxF1IV6i_dux8ACc-f=w640-h480


Продолжаем освоение среды разработки приложений My Visual Database и быстрое погружение в её богатейшие возможности.


Если вы сторонник non code разработки, то эту статью можете пропустить, но если хотите c нуля разобрать, что такое программирование и как его использовать для создания крутых программ, то эта статья для вас!


Читать:  https://createmyvisualdatabaseapp.blogs … -post.html

Hello, world!


https://lh5.googleusercontent.com/1KpF4KFkalGEJ7_AfCEFGvJqmrDiUyVoUHJNg-E9E6ua0tp-eFyo1q8-AnpBX7mx3aafcniV3gQi3ZE8cMCqaGwSTdct1OndmGBaK4YCdWhLxl8G75_015R-0K_f0qT-lv4fj0RD=w640-h360


Прошло три года с момента написания моей первой статьи, посвященной программированию в среде разработки My Visual Database (MVDB). Что же поменялось за это время? Какие новые возможности появились в этом проекте и как это повлияло на применяемые решения?


Я начинаю новый цикл публикаций, в которых вместе с читателем пройду по всем этапам разработки приложения. И традиционно начну своё повествование с первой формы, которую обычно видит пользователь при запуске приложения для работы с базами данных. Это форма авторизации.


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


Далее: https://createmyvisualdatabaseapp.blogs … world.html

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

841

(10 replies, posted in Script)

sibprogsistem wrote:

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

refer all components to the same procedure name..
and in general, specify what you want to do.

sibprogsistem, он (она) хочет, чтобы ты готовый код написал )))
Задача несложная: на форме 200 панелей, каждая панель связана с записью в таблице (как именно связана, автор не уточняет), при нажатии на панель должна открываться форма редактирования для данной записи. Например, при создании панелей их можно назвать panShowRecordButton_#, где # - ID записи, которую нужно показать.

ИМХО, информации для реализации этого функционала предостаточно, но автор топика хочет готовый код. Мой ответ здесь: http://myvisualdatabase.com/forum/viewtopic.php?id=6262
Но наверняка есть и другие варианты   )))

842

(10 replies, posted in Script)

sonixax wrote:

Many many Thanks,
Is it possible to have such a functionality for events too?
For example onclick?

Many many Thanks again.

The name of the event handler is in the db<event> property, for example onClick:

procedure frmForm_btnButton_OnClick (Sender: TObject; var Cancel: boolean);
var  
  i: integer;
begin
  for i := 0 to frmForm.ComponentCount-1 do
    if frmForm.components[i] is TdbPanel then 
      TdbPanel(frmForm.components[i]).caption := TdbPanel(frmForm.components[i]).dbOnClick;
end;

843

(1 replies, posted in General)

Attach your project, please.

844

(10 replies, posted in Script)

Hi Sonixax and Derek!

Small clarification: the name of the panel class used in the MVDB is TdbPanel.

procedure frmForm_btnButton_OnClick (Sender: TObject; var Cancel: boolean);
var  
  i: integer;
begin
  for i := 0 to frmForm.ComponentCount-1 do
    if frmForm.components[i] is TdbPanel then 
      TdbPanel(frmForm.components[i]).caption := 'Component number is: ' + IntToStr(i);
end;

The code Derek suggested will also work, since TdbPanel is the heir of TPanel. However, to access all the properties of the MVDB panel, you need to use a cast to the TdbPanel class.

845

(15 replies, posted in Russian)

newusr wrote:
for i:=0 to Form1.ComponentCount -1 do IF Form1.Components[i] is TdbStringGridEx Then
 TdbStringGridEx(Form1.Components[i]).Font.Size:=12;

Работает...
Косяк был в другом.

Не жадничайте, поделитесь косячком )))

846

(2 replies, posted in General)

There is no ready-made solution for using a Word document template. Look on the forum for examples of using TWord, in particular the procedure FindAndReplace() for replacing text in a template with text from a database.

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

848

(11 replies, posted in Russian)

sparrow wrote:

Если позволите я дам ссылку, чтоб не умничать
Решение как для UPDATE так и для DELETE.

https://sqlinfo.ru/articles/info/19.html

Вторая часть статьи тоже интересна.

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


Вот пример присвоения следующего номера для документа с ID=3

UPDATE doc SET DocNum = ( select * from ( select coalesce(max(rd.DocNum)+1,1) from doc rd  ) as t1 ) WHERE id = 3

849

(11 replies, posted in Russian)

sparrow wrote:
k245 wrote:

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

Не свосем так. Можно решить через 1. вложеный подзапрос или 2.так называемую табличную форму. Такие решения приводят к созданию временной таблицы из которой проводится чтение и обновление основной.

Очень любопытно. Буду признателен за пример.

850

(11 replies, posted in Russian)

sibprogsistem wrote:

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

Повторюсь, что если система многопользовательская, то велика вероятность одновременного создания документов с одинаковым номером.


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


Вот пример процедуры, которая создает уникальные номера (DocNum) в рамках одного календарного года (RegDate - дата документа) для каждого типа документа (id_folder)


CREATE PROCEDURE `updnum`( IN AIDdoc int )
BEGIN
  DECLARE tmpNextNumber INT;
  DECLARE tmpIDFolder;
  DECLARE tmpDate DATE;
  SELECT RegDate INTO tmpDate FROM doc WHERE id = AIDdoc;
  SELECT id_folder INTO tmpIDFolder FROM doc WHERE id = AIDdoc;
  SELECT coalesce( res.NNum, 1 ) INTO tmpNextNumber 
    FROM ( SELECT max(rd.DocNum)+1 as NNum FROM doc rd WHERE rd.id_Folder = tmpIDFolder AND YEAR( rd.RegDate ) = YEAR( tmpDate ) ) res;
  UPDATE doc SET DocNum = tmpNextNumber WHERE id = AIDdoc;
END

Вызывать её нужно после сохранения записи в базу:

procedure frmDocEdit_rbtOK_OnAfterClick(Sender: TObject);
var
  tmpID: string;
begin
  tmpID := IntToStr(frmDocEdit.rbtOK.dbGeneralTableId);
  SQLExecute( 'call updnum('+tmpID+') ' );
end;