Совет по 1С хорош - там же совершенно другое программирование.
По поводу примера, который есть на сайте - он простой, т.к. в нем создается копия только одной записи в одной таблице.
А у меня на форме штук тридцать взаимозависимых комбобоксов, три грида  и связи с кучей таблиц БД.

Пытаюсь перейти с базы данных Sqlite на базу в MySQL, чтобы перевести приложение в сетевой режим работы.
Таблиц в базе много, поэтому создавать их вручную - дурацкая затея.
Поэтому, ищу скрипт, который из базы Sqlite создаст базу в MySQL. (данные даже не нужны, достаточно структуры)
Встретившееся на форуме решение создания скрипта с помощью SQLite Manager от Мозиллы не помогло.
SQLite Manager создает SQL скрипт, который имеет кучу ошибок с точки зрения бесплатного MySQL Workbench 6.3 от Oracle.
Нашел программу конвертации базы данных DBConvert for SQLite & MySQL.
Программа часть таблиц создает нормально, а некоторые не может - выпадает ошибка
-- Error 1022: Can't write; duplicate key in table 'tbl_goods'
Подозреваю, что эта ошибка возникает в таблице, где есть несколько ссылок на одну и ту же таблицу-справочник "Валюты".
(У меня товар имеет несколько цен и для каждой цены указывается своя валюта).
Кто-нибудь подскажет как это вылечить?
и еще возникает ошибка:
Creating table 'Tbl_Project_Specification'.
-- Error 1215: Cannot add foreign key constraint
По какой причине это может быть?

В БД есть две таблицы - "Проекты" и "Спецификации проектов".
Для создания документа "Проект" на форме "Проект" вводятся реквизиты проекта (дата, номер, описание).
На этой же форме есть табличная часть, где указываются товары данного проекта.
Список всех проектов отображается на форме "Журнал проектов".
Надо иметь возможность создания нового проекта в который автоматом попадет все из проекта-основания.
Т.е. ставим на нужный проект курсор (активируем строку журнала проектов), нажимаем "копировать" - открывается форма добавления нового проекта, в которой уже заполнены все реквизиты и табличная часть товаров на основе проекта-основания.
Подскажите, есть ли какие-либо способы упростить написание кода для такой возможности или надо просто в лоб прописывать перенос значения компонентов из проекта-основания, и искать по таблицам в БД связи с проектом-основанием, чтобы заполнить табличную часть проекта?
Может есть какие-либо более элегантные способы для этого?

Спасибо за ответ!
Причиной появления моего вопроса о наличии документации к отчетам стала непонятная ситуация с созданием отчета через кнопку "Отчет".
Допустим мне надо вывести с формы документа "Спецификация" его печатную форму с табличной частью.
Я делаю поиск по id данной спецификации в базе данных по таблице, где лежит список спецификаций.
Все работает как положено.
Однако, мне надо еще вывести некоторые данные с формы (номер документа, срок поставки (комбобокс) и т.п.).
Если я эти дополнительные данные с формы размещаю в бенде Header, то данные выводятся как нужно.
Но, если эти данные разместить в любом бенде после MasterData (например в Footer), то они не выводятся !!!
Голову сломал, почему данные компонентов после MasterData теряются.
За выходные перечитал весь форум, но ничего путного на эту тему не нашел, кроме того, что в версии 4.05 есть возможность передавать в отчет значения компонентов с формы через переменные.
И действительно, в версии 4.05 свою проблему решил - данные компонентов с формы теперь отображаются в любом бенде и до и после masterdata.
Вопрос решен

Проблема с кодировкой у меня была в версии 3.6
Т.е. это тоже самое, что в этом топике: http://myvisualdatabase.com/forum/viewtopic.php?id=3870
В версии 4.05 проблемы с чтением ANSI файла не наблюдается.
Вопрос решен.

Просьба сообщить, где есть документация по настройке передачи данных для построения отчета с помощью мастера.
Нашел только пример в картинках для SQL отчета. Но это не то.
Не ясно, что надо указывать в секции "1.Выберите компоненты участвующие в поиске" и "2.Выберите таблицу БД для поиска".
Проблема такая:
Есть таблицы в БД: проекты, спецификации, товары, клиенты
На форме "Проект" есть table_grid со списков товаров данного проекта, а также комбобокс с клиентом.
Надо вывести в отчет все по данному проекту, т.е. номер проекта, название клиента и список товаров.
Непонятно, какие компоненты нужно указать в секции 1 (участвующие в поиске) и по какой таблице указывать поиск (по таблице проектов или по таблице спецификаций).
Если языком запросов, то мне надо получить список товаров из таблицы спецификаций, по ключу "id проекта", и ряд данных этого же проекта.
Почему то все время получается избыточный вывод.

Если нажать на клавиатуре клавишу Enter в любом поле ввода на форме, то форма закрывается.
Как отключить такое поведение формы?
Надо чтобы форма могла закрыться только по нажатию на кнопки Cancel, Close или Save и никак иначе.

Прикручивая к своему проекту импорт данных из csv файла на основе предложенного разработчиком кода столкнулся с неожиданной проблемой: если в csv файле встречается хотя бы одно слово на русском языке, то импорт не осуществляется.
Импорт не происходит из-за подсчета количества строк в загруженном файле.
          sl := TStringList.Create;
          sl.LoadFromFile (OpenDialog.FileName);
         c := sl.Count - 1;
          for i := 0 to c do
          begin ...
Если файл содержит русские символы, то Count возвращает 0. А если в файле только английские символы, то возвращается как положено имеющееся число строк.
При этом, если попытаться русскоязычный файл загрузить например в комбобокс (Form1.ComboBox1.Items.LoadFromFile('1.csv')), то все строки загружаются нормально.
И в комбобоксе Count работает тоже нормально (Form1.ComboBox1.Items.Count).
Очевидно, TStringList не хочет работать с русской кодировкой, поэтому и Count никаких строк в нем не находит.
Протестировал при разных кодировках файла и стало ясно, что проблемы возникают если csv файл записан не в кодировке UTF-8.
Как сделать так, чтобы при загрузке файла его кодировка(разная) обрабатывалась корректно?

У меня отчет открывается в PDF.
При этом, ОС ему автоматически присваивает случайное имя и сохраняет во временной папке.

Каким образом сделать так, чтобы при открытии отчета он сразу имел нужное имя файла и сохранялся в заданном месте?

Есть таблица на форме.
В ней список товаров и кнопка Печать для вывода в отчет.
Когда открываю эту форму, то в Tablegrid ни одна из строк товара не выделена.
Нажимаю Печать и в отчет выводится как положено весь список товаров.
Однако, если перед выводом отчета отредактировать какой-нибудь товар, то строка товара в таблице становится активной и при выводе отчета в него выводится только эта одна строка.
Как выводить в отчет все строки TableGrid без учета активных(выбранных) строк?

Правильно так: if Form1.Edit1.Text = ";

В вопросе было указано, что значение поля ЧИСЛОВОЕ!!!
В свойствах поля указано "Numbers only".
Проверять это поле на сравнение с '' вызывает ошибку несовместимости типов.

Так как же все таки проверить что пользователь указал в поле числовое значение, а не оставил его пустым?

Как проверить числовое поле на форме на пустоту?

214

(4 replies, posted in Russian)

Файл с расширением pas пустой.
Поэтому и скриптов не видно.
Т.е. во время зависания содержимое этого файла не сохранилось.
У меня уже третий раз пропадают скрипты за несколько месяцев работы.
Все это происходит во время зависаний.
А зависания происходят только при работе с этой программой.
Вынужден констатировать, что программа обладает низкой надежностью.
Чтобы не тратить время на повторное написание кода приходится делать частые страховые копирования с помощью сторонней программы.
Для платной (хотя и недорогой) программы это недопустимо.

215

(4 replies, posted in Russian)

Вчера при последнем сохранении программа зависла и подвесила комп.
Сегодня программа работает корректно и скрипты выполняются правильно, но самого текста скриптов на закладке Скрипт почему-то нет.
Есть только begin end.
При этом файл script.dcu содержит весь пропавший текст скриптов в xml.

Как восстановить скрипты?

Есть главная форма Form1. 
На ней несколько кнопок для открытия разных форм. Например, проекты, контрагенты, товары.
Когда открываю одну из таких форм, а потом ее закрываю штатной кнопкой "закрыть", то открытая форма как положено закрывается, но главная форма Form1 тоже пропадает с экрана.
При этом, похоже что Form1 просто не видна, т.к. запущенное приложение не выгружается из процессов (т.е. на тулбаре оно не пропадает).
Странно, что такое происходит только если с Form1 вызывали только открытие списка проектов.
А если открывать другие формы с Form1, то при их закрытии Form1 отображается нормально.
Похоже, что дочерняя форма проектов что-то делает с родительской формой.
Но в событиях ничего такого не прописано.
Каким образом можно понять в чем причина?
Подскажите, что надо проверить в коде.

Есть три вкладки на PageControl, которые надо скрывать/показывать в зависимости от переключения флажков на форме.
Обращаясь к этим вкладкам Имя_формы.Имя_вкладки.Visble := false скрывается только содержимое вкладки, но название самой вкладки остается.
Причем, таком образом можно скрыть содержимое только активной вкладки, а необходимо скрыть все вкладки, даже если они неактивные.
Как это сделать?

Дмитрий,
Да, я видел этот топик.
У меня скорее вопрос о том, как вывести результат запроса в TableGrid?
Какой-то цикл строить?
Можно пример?

Есть в базе данных две таблицы "Контрагенты" и "Контактные лица".
В Контактных лицах есть связь с таблицей Контрагенты.
В таблице Контактные лица есть два поля "Рабочий e-mail" и "Личный e-mail".

Пытаюсь организовать поиск Контактного лица по его e-mail.
Для этого делаю форму поиска с одним Edit "искомый e-mail".
Искать введенный e-mail надо в таблице Контактные лица одновременно и в поле "Рабочий e-mail" и в поле "Личный e-mail".
Стандартная кнопка поиска здесь не поможет, т.к. она делает поиск только по одному полю таблицы.

Вопрос - как организовать поиск одновременно по двум полям таблицы Контактные лица и как результат вывести в TableGrid, включая название Контрагента найденного контактного лица?

Спасибо. Ход мыслей понятен - надо работать с базой напрямую, а не пытаться менять свойства у компонента DBFile.
Ваш скрипт надо поправить - в тексте запроса UPDATE надо добавить такой же WHERE, как и в SELECT.

Поясняю: есть таблица клиентов с полем DBFile (LinkFolder).
Это поле предназначено для того, чтобы указать директорию (а не файл), в которой лежат документы от данного клиента.
Т.е. каждому клиенту на форме Frm_Client указываем свою отдельную папку.
Если пользователь программы указал клиентскую папку, лежащую на его сетевом диске, то в базу сохраняется ее путь, например, X:\Клиенты\Клиент_1. 
Однако, другие пользователи программы (работающие по сети) открыть эту папку не могут, т.к. сетевого диска с именем X у них нет.
Чтобы иметь возможность другим пользователям открывать данную папку этого клиента, надо заменить диск X:\ в имени папки на полный сетевой путь этого диска, который я получаю из реестра windows.
Т.е. папку X:\Клиенты\Клиент_1 надо заменить на полный сетевой путь, например, на \\SERVER\SALE\Клиенты\Клиент_1
Для этого, в момент сохранения клиента надо сделать замену, чтобы в БД сохранилось \\SERVER\SALE\Клиенты\Клиент_1, а не указанное пользователем X:\Клиенты\Клиент_1

Каким образом сделать это?

Есть поле DBFile1 для сохранения в БД ссылок на папки (LinkFolder).
Выбираем в нем нужную папку и после нажатия btnSave в БД сохраняется, например, выбранная "С:\Моя папка".
Открываем эту форму для редактирования записи и нажимаем имеющуюся на форме кнопку "Заменить папку на С:\ ". 
Она делает так Frm_File.DBFile_Dir.dbFileName := 'C:\' и Frm_File.DBFile_Dir.Text := 'C:\'.
Имя папки в поле DBFile1 меняется на C:\, но при сохранении записи новое имя папки не сохраняется.
Каким образом программно заменить имя папки?
Тестовый проект приложен.

Надо было Frm_Client.Btn_Save_Client.dbGeneralTableId повесить на событие кнопки AfterClick, а не на закрытие формы.

Есть форма "Проект".
На ней комбобокс "Клиент". Рядом кнопка "Добавить".
Если в комбобоксе нет клиента, нажимаем "Добавить" и открываем форму "Клиент" (новая запись).
После ввода данных о клиенте нажимаем кнопку "Сохранить клиента".
Форма "Клиент" закрывается и только что добавленного клиента уже можно выбрать из комбобокса.
А как сделать так, чтобы только что добавленный клиент сразу появлялся в комбобоксе Проекта после закрытия формы Клиент?

Что то никак не удается получить id только что добавленного клиента, чтобы установить на него комбобокс.
Повесил на событие закрытия формы "Клиент" функцию Frm_Client.Btn_Save_Client.dbGeneralTableId. Но она возвращает -1.
Как решить проблему?

225

(7 replies, posted in Russian)

Нет, так не работает.
Когда нажимаешь открытие формы кнопкой то, вылетает ошибка "Could not convert variant of type (OleStr) into type (Boolean).
Видимо потому, что Sender - это кнопка, а не форма.
Получается, что всегда надо вызывать процедуру именно с названием формы.
Т.е. правильный код:
procedure Form1_OnShow (Sender: string; Action: string);
begin
      Form1.OnMouseWheel := @OnMVDMouseWheel;
end;

А может можно как то внутри процедуры получить имя текущей формы, чтобы можно было универсальный код написать? Например:

procedure Form1_OnShow (Sender: string; Action: string);
begin
      ИмяТекущейФормы.OnMouseWheel := @OnMVDMouseWheel;
end;