1,401

(8 replies, posted in Russian)

pt.82 wrote:

И вот про файлики script tables и forms можно поподробней чуть не понял

Для примера возьмем проект с названием "project", который работает с SQLite, и разберём его анатомию. В папке с проектом находятся:

  • Report - папка, в которой хранятся файлы с отчетными формами *.fr3

  • Script - папка, в которой хранятся файлы со скриптами *.pas и главный скомпилированный файл script.dcu

  • forms.xml - файл с описанием пользовательского интерфейса: формы и компоненты.

  • settings.ini - настройки проекта

  • sqlite.db - база данных

  • sqlite3.dll - библиотека для работы с СУБД SQLite

  • tables.ini - описание структуры базы данных

  • project.exe - исполняемый файл

  • project.vdb - служебный файл

Жирным шрифтом выделены файлы, которые содержат информацию, относящуюся к конкретному проекту. То есть новая версия проекта отличается от предыдущей версии этого же проекта только этими файлами.  Предполагается, что файл с исходниками (script.pas) не передаются конечным пользователям. Файлы settings.ini и sqlite.db содержат пользовательскую информацию, а остальные файлы не изменяются от версии к версии.

Таким образом, при переходе к следующей версии конечному пользователю необходимо:

  • заменить файлы *.fr3, script.dcu, forms.xml, tables.ini новыми

  • обновить структуру базы данных с помощью SQL-скрипта

То есть изменение версии вы делаете в среде разработки (конструкторе), в том числе и необходимые изменения в структуре базы данных. Но дополнительно вы создаёте SQL-скрипт, который необходимо однократно выполнить на базе данных конечного пользователя, чтобы привести её в соответствие со структурой новой версии проекта. Он необходим только в случае наличия в базе пользовательских данных, которые нужно сохранить. Если данные не важны, то можно просто удалить старую базу данных,а при запуске проекта создастся новая (пустая), на основании информации, хранящейся в tables.ini.

При переходе на другую версию среды разработки так же потребуется заменить файлы project.exe и project.vdb

1,402

(8 replies, posted in Russian)

Я предполагал, что новую версию базы / клиента вы создаёте в конструкторе, параллельно создавая скрипт для обновления баз, находящихся у заказчиков. А после обновлении клиентской части запускаете скрипт, который приводит в соответствие их базы. Новая клиентская версия состоит из файлов script.dcu, tables.ini, forms.xml и файлов с отчётами.

1,403

(8 replies, posted in Russian)

В общем виде данную задачу вы не решите, так как изменение структуры может быть сопряжено с переносом или конвертацией данных. Поэтому для каждого изменения версии БД пишется отдельный sql-скрипт, который производит нужные изменения структуры от одной версии БД к другой. Данный скрипт можно выполнить функцией SQLExecute() прямо из приложения сразу после подключения к БД после проверки текущей версии БД и наличия файла с обновлением структуры.

karim wrote:


1. А чем отличается А от Б?

Правильней использовать sqlValue, так как в случае, когда в комбике не выбрано ни одно из значений, sqlValue будет равно null, а dbitemid равен -1, что при записи в базу данных приводит к ошибке контроля внешнего ключа.

1,405

(6 replies, posted in Russian)

m.prokhachev wrote:

Без чёткого ТЗ - результат хз.

Отличный слоган! +100500

1,406

(6 replies, posted in Russian)

superir wrote:

У меня есть база написанная в access. Нужно "мигрировать" с microsoft. Если стоимость "миграции" будет сопоставима со стоимостью лицензии access, смысла нет. Покажите какой нибудь проект, цену за этот проект... я прикину и уже тогда будем вести переговоры.

Напишите, пожалуйста, мне в  личку: есть готовые проекты и цены, есть желание и возможность делать проекты на заказ.

1,407

(8 replies, posted in Russian)

"Ничто так не постоянно, как временное".  В одном из проектов мне нужно было создавать довольно сложные отчёты, а так как писать сохраненные процедуры для их реализации я не стал, то создал таблицу, в которую накидывал нужные мне данные для текущего пользователя/отчёта (добавил поле id_user для связи с пользователями системы). Данные по текущему пользователю из этой таблицы удалялись при подключении и отключении пользователя к БД одним простым запросом с клиентской части. Такое решение гораздо проще создания настоящих временных таблиц, так как позволяет при необходимости легко задействовать конструктор визуальных форм и генератор отчетов для отображения хранимых в них данных.

Строки в таблице "раскрашиваются" в обработчике OnChange.

см. пример в  http://myvisualdatabase.com/forum/viewtopic.php?id=1087

1,409

(1 replies, posted in Russian)

Для этого, как правило, достаточно настроить параметры отображения таблицы, а для формы отображения формы использовать кнопки с действием "Показать форму".
http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=4372&download=0

Если вы открываете форму другим способом, то потребуется обновить содержимое вручную, например, если данные в таблице отображаются по настройке, то выполните метод dbUpdate;


Form1.TableGrid1.dbUpdate;

1,410

(8 replies, posted in Russian)

kovalenko wrote:

Спасибо! Попробую сам разобраться.

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

1,411

(11 replies, posted in Russian)

Исправил ваш проект
http://f3.s.qip.ru/pgTu2DNl.jpg

1,412

(11 replies, posted in Russian)

Используйте функцию TimeToStr, например:

Form1.Edit4.Text := TimeToStr( Form1.DateTimePicker1.DateTime - Form1.DateTimePicker2.DateTime );

1,413

(4 replies, posted in Russian)

http://f2.s.qip.ru/pgTu2DMT.jpg

Рекомендую использовать сервис для публикации картинок, скриншотов и т.д.: http://shot.qip.ru

Да, действительно, на Win10 не работает sad  Могу лишь предположить, что это как-то связано с системой безопасности Win10 и теперь добраться до чужого процесса стало сложней..
P.S. я в шоке - в Win10 калькулятор на пол-экрана 8-()

Проверил на Win7 - всё работает. Обратите внимание на название окна, которое вы хотите закрепить.

http://f5.s.qip.ru/pgTu2DMN.jpg

1,416

(4 replies, posted in Russian)

Константин wrote:

Изучаю программу впервые как альтернативу access на примере из книги. Появляется ошибка при запуске программы. Как исправить ее?

Изучаю экстрасенсорные возможности человека и чтение мыслей на расстоянии. Не могу увидеть ошибку, которая появляется на вашем компьютере при запуске программы. Что делать?

1,417

(3 replies, posted in Russian)

Для фильтрации по периоду используйте два поля для ввода даты (начало периода, окончание периода), в свойстве Filter которых выберите значение  >=   и  <=  . Все элементы фильтрации работают одновременно, проблем в вашем случае быть не должно smile

Возможна авторизация в MySQL с помощью скрипта, пример можно посмотреть здесь: http://myvisualdatabase.blogspot.ru/p/blog-page_10.html , но  получить пароль под которым пользователь вошёл в компьютер и передать его для подключения вряд ли получится.

Evgeniy D wrote:

Сделал по вашим советам, теперь подскажите как примерно выглядит запрос чтобы вывести записи от родителя и ниже и отсортировать по порядку записи?

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

1,420

(2 replies, posted in Russian)

Перенос строк в заголовках грида - http://myvisualdatabase.blogspot.ru/p/blog-page_1.html

1,421

(25 replies, posted in Russian)

Это супер! Дерево - один из самых ожидаемых компонент! Пример, конечно, порадовал, но смутило немного обязательное наличие связанной таблицы (Свойство ForeignKey). То есть, чтобы отобразить дерево, на него должна быть ссылка? Согласен, что в 90% случаев так оно и есть, но... необычное решение smile.

1,422

(2 replies, posted in Russian)

Структура данных далека от оптимальной. sad


Почитайте книги по проектированию БД, Например, здесь http://myvisualdatabase.com/forum/viewtopic.php?id=2554  доступно всё изложено с примерами на My Visual Database smile

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


То, о чем вы спрашиваете, называют пагинацией (постраничным отображением данных), и легко реализуется на уровне SQL-запроса с помощью ключевых слов OFFSET и LIMIT. Например, запрос:

SELECT * FROM table1 LIMIT 20 OFFSET 40;

вернёт 20 записей, пропустив от начала 40 записей.


Подробней об использовании этих возможностей в SQLite можете почитать здесь: http://www.sqlite.org/lang_select.html#limitoffset и здесь: http://zametkinapolyah.ru/zametki-o-mys … qlite.html

netros, воля ваша, но речь шла о табеле - то есть о хранении даты выхода конкретного сотрудника в конкретное время. Если нужно, то в нем в дополнительном поле можно хранить фактические отработанные часы и другие отметки вроде выходных, больничных или отпускных. Обычно использую для этого односимвольное значение, как это принято у кадровиков и зарплатников.
Для графика выходов, естественно, нужна отдельная таблица, которая, кстати, по структуре не сильно отличается от табеля.
Вопрос о способах хранения напрямую зависит от потребностях в получении аналитической информации. Если речь идёт о хранении, то можно и в строке, но когда вам понадобятся запросы вида "Сколько сантехников в возрасте от 30 до 40 лет выходили работать по воскресеньям в прошлом году?", вы снова вернётесь к этому вопросу smile

Надпись на кнопке в несколько строчек http://myvisualdatabase.blogspot.ru/p/blog-page_5.html