Работаю над проектом, который подключен к двум базам SQLite. Не могу придумать, как читать данные из BLOB полей дополнительной базы.


Подключение второй базы делаю так:


ATTACH DATABASE base2.db as base2 

Запись в BLOB тоже работает, а вот с чтением - проблемы, так как стандартная функция SaveFileFromDataBase ( SaveFileFromDataBaseToStream) не принимает алиас второй базы в имени таблицы.


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


Может, есть ещё какие-нибудь рабочие варианты?


Костыли тоже рассматриваю )))


Литературный вариант данной истории:
https://k245.ru/mvdb/fajlovoe-hranilishhe.html

sparrow wrote:

k245 Я не могу это подтвердить

в MVDB - dataset Report присутствует всегда, даже если данные передаются программно.

.

Ниже скрин одного из примеров.

Спасибо за вдохновение - поищу в своих скриптах дефект, из-за которого у меня болтается под ногами этот самый Report1 smile

adiziktdy wrote:
adiziktdy wrote:

Дать ему другое имя пользователя?

Изменила

   ReportMM.UserName        := 'Report';

на

    ReportMM.UserName        := 'Report1';

Откорректировала шаблон. И вуаля - ошибок нет yikes

Это "особенность" работы FastReport в MVDB - dataset Report присутствует всегда, даже если данные передаются программно. Отсюда следствие - передаваемые датасеты не должны называться "Report"  smile

sparrow wrote:

Решение SQLite рекурсивным запросом.

Лучшее решение! 

Если не ошибаюсь, в MySQL начиная с версии 8.х тоже есть поддержка рекурсивных запросов.

480

(7 replies, posted in General)

Hi Sabine, Hi Derek!


It makes no sense to repeat Excel, and the MVDB will not allow this to be done in a simple way.

Direct editing of the table is possible, but as Derek rightly pointed out, nothing will work with images.

The difference between MVDB and Excel and Notepad is that MVDB is designed to store data in a structured form. At the same time, it is best to use the edit form to enter data.


Perhaps we can give you better advice if you describe the business problem you need to solve.

По хорошему для такой задачи нужны интервальные деревья, но поскольку в MVDB их нет, то подойдёт SQL-запрос и процедура, которая возвращает список ID для конечных дочерних узлов (листьев) заданного узла дерева:


function GetSQLIDs( ARow:integer ):string;
// возвращает список ID для всех его дочерних элементов, являющихся конечными элементвми дерева
var
  tmpChildCount: integer;
  tmpRow: integer;
begin
  Result := '';
  if ARow <> -1 then
  begin
    if Form1.TreeView1.HasChildren( ARow ) then
    begin
      tmpRow := Form1.TreeView1.GetFirstChild( ARow );
      repeat
        if Result <> '' then
          Result := Result + ',';
        Result := Result + GetSQLIDs( tmpRow );
        tmpRow := Form1.TreeView1.GetNextSibling( tmpRow );
      until tmpRow = -1;
    end
    else
      Result := IntToStr( Form1.TreeView1.dbIndexToID( ARow ) );
  end;
end;

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
// ShowMessage( GetSQLIDs( Form1.TreeView1.SelectedRow ) );
  Form1.Button1.dbSQL := 'SELECT name FROM test WHERE id_testtree in ('+GetSQLIDs( Form1.TreeView1.SelectedRow )+')';
end;

Пример будет работать для любой конфигурации дерева, при относительно небольшом числе узлов (каком именно - сказать затрудняюсь. Думаю, это будет зависеть от СУБД).

482

(7 replies, posted in General)

Your request is not entirely clear. The picture is also not informative. Specify what exactly you would like to implement?

Охотник куда-то потерялся....

https://www.prikol.ru/wp-content/gallery/january-2010/she-bear-vs-hunters-02.jpg

Вы задачу уточните. А то непонятно: узел выделяете в TreeView, в каком-то гриде хотите видеть все скрытые элементы выделенного узла...


Дочерние записи бывают 1) конкретного узла. 2) конкретного узла и все вложенные. 
Скрытые элементы бывают  1) свёрнутые дочерние элементы  2) visible = false


P.S. А тема вообще про сортировку.... вы уж определитесь ))))

glkonst79 wrote:

Да, но мне надо осуществить привязку табличной части формы к id счета, а его можно получить только при сохранении формы счета.

Программное сохранение формы без закрытия формы. Кнопка сохранения в данном случае называется rbtOK, замените название на ваше.

function EditForm_SaveWithoutClose(AForm: TAForm;): integer;
// сохранение без закрытия формы, возвращает ID добавленной записи
// AForm - форма редактирования
// если результат -1, значит сохранить не удалось
var
  tmpButton: TdbButton;
  tmpEdit: TdbEdit;
begin
  FindC(AForm, 'rbtOK', tmpButton);
  // сохраняем
  tmpButton.dbCloseFormAfterSave := False;
  tmpButton.dbDontResetID := True;
  tmpButton.Click;
  tmpButton.dbCloseFormAfterSave := True;
  Result := tmpButton.dbGeneralTableId;
end;

procedure FindC(AForm: TAForm; AName: string; var AComponent: TComponent; ACheck: boolean = True);
// поиск компонента на форме с контролем
begin
  AComponent := AForm.FindComponent(AName);
  if ACheck and (AComponent = nil) then
    ErrMsg('FindC()', 'Не найден компонент ' + AForm.Name + '.' + AName);
end;
CDB wrote:

Константин - Я перевел ваш проект Clear App на английский язык, если вам интересно.

Я не переводил и не обновлял файл справки.


Konstantin - I've translated your 'Clear App' project into English if you are interested.

I haven't translated or updated the 'help' file though..

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


You have done a titanic job! My original plans were to add localization, as was done in a series of projects in 2018-2019, but the priorities have changed, I need to earn my daily bread. In any case, I am pleased that ClearApp is of interest.

Сначала записывается id главной записи, затем добавляются дочерние записи.


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

488

(4 replies, posted in General)

Everything can be done, but what cannot be done takes more time smile


There is no such built-in functionality. But...
You can add scripts everywhere that would keep track of user actions, writing them into tables created for this purpose.
If you are using MySQL, then you can write triggers and add them to the database.

489

(5 replies, posted in Russian)

Была проблема с функциями EncryptRC5() и DecryptRC5(), но сейчас все работает как надо. Пароль можно каждый раз спрашивать у пользователя. Если забудет, то данные будут недоступными от слова совсем )))

CDB, согласен с вами - использование отдельных DLL для каждого вида СУБД позволит элегантно решить вопрос с поддержкой множества стандартов не утяжеляя основное приложение. Также я согласен, что Pascal Script является оптимальным решением для создания расширений.


CDB, I agree with you - the use of separate DLLs for each type of DBMS will allow you to elegantly solve the issue of supporting many standards without burdening the main application. I also agree that Pascal Script is the best solution for creating extensions.

pavlenko.vladimir.v wrote:
k245 wrote:

ClearApp

в Вашем блоге по ссылке ClearApp – архив проекта  закрыт доступ


Так и есть: для доступа к некоторым файлам требуется платная подписка на библиотеку. Условия подписки можно получить в ответ на запрос доступа к библиотечным файлам.


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

ClearApp
https://k245.ru/wp-content/uploads/2022/11/krasivie-kartinki-leta-9.jpg


The project serves as an illustration of the capabilities of programs created on the My Visual Database platform. There is detailed on-line documentation describing both standard forms and subsystems, as well as improved versions. The program is the basis for creating your application programs. You can use it in its entirety or copy the blocks (scripts) you need.


Read: https://k245.ru/en/software-en/clearapp-2.html

ClearApp
https://k245.ru/wp-content/uploads/2022/11/krasivie-kartinki-leta-9.jpg


Проект служит иллюстрацией возможностей программ, созданных на платформе My Visual Database. Имеется подробная on-line документация, описывающая как стандартные формы и подсистемы, так и улучшенные версии. Программа является основой для создания ваших прикладных программ. Вы можете использовать её целиком или копировать нужные вам блоки (скрипты).


Читать: https://k245.ru/software-ru/clearapp.html

pavlenko.vladimir.v wrote:

Блоки программ по типу сервиса https://appmaster.io/


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

Это ведь просто "полёт мысли", чётких планов по реализации пока нет.


Присматриваюсь к существующим сервисам, в которых всё это реализовано, но по частям.
Если делать, то делать на Delphi, на компонентах FireMonkey, чтобы работало на всех платформах.
Что же касается плагинов, то это очень интересная тема. Прямо отдельный слой мыслей )))

This is the date/time display format that is accepted for your region, so the db browser displays the date according to the selected locale. Physically, the data is stored in the format that I wrote above.


Enter a simple SQL query to see how the data is actually stored:

SELECT  Ημερομηνίαπροσθήκης FROM products 

Alternatively, it's just a text field, not a date/time field. I don't see it in your screenshot.

geochrist wrote:

I am using sqlite.

In the above example the string variable dateSearchString contains a value like this: 21/11/2014 6:09:41 μμ

How can I use the date() function in the sql satetement mentioned in the first post. Can you write an example?

The date values in the sqlite database table have the same format like this 21/11/2014 6:09:41 μμ

Thank you

Form1.Tablegrid1.dbSQL := 'SELECT * FROM table WHERE date( DateField ) < date( "'+dateSearchString+'" ) ORDER BY 1';

Are you sure that the date data is stored in the database in the format you specified? Usually there is something like this:

2022-11-01 14:52:34.543

YYYY-MM-DD HH:MM:SS.SSS

498

(9 replies, posted in Script)

sonixax wrote:

I have a question,
this

Main.TransGrid.Cells[9,i] := 'Nein';

return an error and said Nein is not integer!!!!!!
before update to v6 this one was ok but now its not working anymore sad

How can I fix it?

Many thanks

You cannot write a text value to a Boolean field.
There are several solutions:
1. Add an empty text field to the query and then enter a text value into it.
2. Form the desired text directly in the SQL query using the CASE command  like Sparrow writing

Please specify which DBMS are you using? You need conversion functions to work with dates. For SQLite, these are the SQL functions date() - converts a string representation to a date, or julianday() - converts a string representation to a number of days.

My Visual Multibase
https://k245.ru/wp-content/uploads/2022/10/virtualnyj-mozg.jpg


The obsession with building the perfect tool for the app developer haunts me, and the best way to calm it down is to share your thoughts with others. And watch what happens next. If the idea is good, then it will be supported, if so-so, it will fall off by itself.


Read: https://k245.ru/en/bez-rubriki-en/my-vi … ase-2.html