SUBSTRING('+Form2.Edit9.Text+', '-', 1):
1) первый параметр - строка, в которой производится поиск-выделение
2) второй параметр - это порядковый номер символа в строке
3) третий параметр - это длина "вырезаемого" куска из строки
Вы пытаетесь найти дефис в строке и уже от него оттолкнутся далее при поиске - эта функция так не работает.
Кроме того, вы пытаетесь применить SQL-команду не к записи в базе данных, а к компоненту на форме вашего приложения. Это неверно и некорректно. Либо вы используете SQL-команду для конкретного поля в какой-либо таблице вашей БД, либо используете функции-аналоги, но уже из скрипта MVD.
Вообще, пример использования этой функции в SQL-команде выглядит так:

SELECT name, SUBSTRING(name, 2, LEN(name)) FROM Ships;
SELECT name, SUBSTRING(name, 2, 3) FROM Ships;

первый SELECT выдаст вам name и "укороченный" спереди на 1 символ этот же name
второй SELECT выдаст вам name и 3 символа из name, начиная со второго символа
функция LEN(name) в данном случае возвращает длину строки в количестве символов
Вам строку "порезать" надо при выводе данных из БД на форму в компонент EditText?

Ну, как я понимаю, это вам не только для этого ГОСТа надо, но и для других тоже. Если запись вида "ГОСТ Р 50444-92" строго фиксирована по длине символов и не может быть длинее или короче, то это субстрингом решаемо элементарно, но если у вас шифр ГОСТов разный от ГОСТа к ГОСТу - то тут лучше задуматься над другим способом... Например, SplitString. Разбить строку на слова и собрать в кучу первые три или четыре слова (сколько надо по необходимости).

Дмитрий, держите - https://drive.google.com/open?id=1PA6Hv … 0-xjbUXAtL, не работает

Так, ладно, заработало. Пока что.
Однако после выполнения куска кода

frmMain.frxReport.Variables.Clear;
frmMain.frxReport.Variables[' ' + 'UserVariables'] := Null;

frmMain.frxReport.Variables['ReportCode'] := 'М' + GroupID + '-00' + FormatDateTime('yy', now); // формируем шифр отчета

почему-то в разделе Variables в дизайнере отчета не появляется ни указанная переменная с именем ReportCode, ни категория переменных с именем UserVariables. Что здесь я не так делаю?

Дело в том, что по данному куску кода кажется, что объект именуется как Emploees с s на конце, а присваиваем датасет с именем Emploee (без s). Получается Emploees - это имя формы, к которой привязывается frxDBDataset? Или это опечатка? Потому что в примере такой переменной Emploees (с s на конце) не имеется.

SensorsSettingData не является главной формой, в том-то всё и дело. Это имя переменной типа TDataSet. Я отчет создаю при помощи второстепенной формы. Получается, я неверно понял пример кода. Значит, надо использовать так же имя главной формы в этом куске кода:

frmMain.frxReport.Clear;
frmMain.frxReport.DataSets.Clear;
frmMain.frxReport.DataSets.Add(frxDBDataset_Sensors);

И сразу еще вопрос по пониманию сути вещей...
В этом примере

frxDBDataset1 := TfrxDBDataset.Create(Employees);
frxDBDataset1.UserName        := 'Employee';
frxDBDataset1.CloseDataSource := True;
frxDBDataset1.OpenDataSource  := True;
frxDBDataset1.DataSet         := Employee;

какой параметр за что отвечает?
Потому как мой кусок кода:

frxDBDataset_Sensors := TfrxDBDataset.Create(SensorsSettingData);
frxDBDataset_Sensors.UserName        := 'SensorsSettingData';
frxDBDataset_Sensors.CloseDataSource := True;
frxDBDataset_Sensors.OpenDataSource  := True;
frxDBDataset_Sensors.DataSet         := SensorsSettingData;

SensorsSettingData.frxReport.Clear;
SensorsSettingData.frxReport.DataSets.Clear;
SensorsSettingData.frxReport.DataSets.Add(frxDBDataset_Sensors);

опять не нравится интерпретатору-компилятору с сообщением "Undeclared identifier: frxReport"... Опять что-то с главной формой связано?

Ок, а возможен гибридный вариант сборки данных в отчет: часть данных придет с грида на активной форме, часть данных соберется при помощи скрипта на событии OnClick кнопки с действием "отчет" на этой же форме?

Задача стоит такая: выбрать в гриде мультиселектом (например, по методу derek'а) несколько позиций-строк и передать их в отчет через DataSet.
Тогда вопрос стоит так: любое изменение наполнения грида имеет актуальное на текущий момент TableGrid1.dbGetSqlStatement?
Например, при показе формы грид заполняется по настройкам в самом гриде, в процессе работы с формой содержимое грида меняется (например, изменяется количество показанных строк) при помощи кнопок поиска-фильтрации, а при этом TableGrid1.dbGetSqlStatement меняет свое значение-содержимое?

Ругается именно на frxReport. Ок, принято - указывать главную форму проекта. Компонент на ней висит, значит.

А по поводу присвоения содержимого TableGrid переменной типа TDataSet что скажете?

Пошли первые проблемы... На кусок кода:

frmSettingReport.frxReport.Variables.Clear;
frmSettingReport.frxReport.Variables[' ' + 'UserVariables'] := Null;
frmSettingReport.frxReport.Variables['ReportCode'] := 'М' + GroupID + '-00' + FormatDateTime('yy', now); // формируем шифр отчета

MVD ругается "Undeclared identifier". Где и что надо прописать?..

ну c имеющегося TableGrid мы формируем DataSet такой же структуры, а потом уже впихиваем это в DBDataSet.. как я понимаю этот процесс... могу и неверно себе это представлять... Отсюда и вопрос - очистка Variables затронет DataSet'ы?

Сразу же и второй вопрос: как текущее содержимое TableGrid на форме присвоить переменной типа TDataSet?

а Form1.frxReport.Variables.Clear; очистит и те переменные, которые придут через грид?

Далее нюансы пошли:

Нюанс 1. Передача переменных в отчет, не связанных с БД.
1) можно добавлять компоненты в отчет, даже если они не связаны с БД, таким образом их значение будет передано в отчет и не будут учавствовать в поиске. При этом компоненты формы должны быть в списке "Участвующие в поиске" при настройке кнопки с действием "Отчет".
2) можно добавлять переменные в отчет с помощью скрипта, для этого создайте событие OnClick для кнопки с действием "Отчет"

procedure Form1_ButtonReport_OnClick (Sender: TObject; var Cancel: boolean);
begin
    Form1.frxReport.Variables.Clear;
    Form1.frxReport.Variables[' ' + 'My Category 1'] := Null;
    Form1.frxReport.Variables['My Variable 1'] := 10;
    Form1.frxReport.Variables['My Variable 2'] := 20;
    Form1.frxReport.Variables['My Variable 3'] := '''Hello''';
end;

Здесь не очень понятна строка Form1.frxReport.Variables[' ' + 'My Category 1'] := Null; - это типа название переменной с пробелом перед названием? а зачем?

114

(8 replies, posted in Russian)

pt.82, а рассказать???)))

115

(6 replies, posted in Russian)

Так... Я не совсем понял. Пример derek'а посмотрел. Но результат выводится в тот же грид, в котором и выбираются несколько строк таблицы. А как отправить на печать выбранные записи?

UPD. А, я дурак, да? ведь в гриде будут лишь те записи, которые и необходимо отправить на печать, правильно?) а дальше уже дело за кнопкой "Отчет"

116

(3 replies, posted in Russian)

О, мне как раз актуален этот вопрос. Можно получить ответ?)

117

(28 replies, posted in Russian)

Простите, а чем мой вариант с dbItemID хуже вашего варианта с sqlValue?

то есть

Form.TableGrid.dbFilter := 'CommitteeMembers.id_DesignTempalte = ' + IntToStr(frmSettingReport.cbDesignPattern.dbItemID);
Form.TableGrid.dbUpdate;

118

(28 replies, posted in Russian)

корректно ли будет написать в окне настройки компонента таблицы в графе "3. Фильтр (необязательно)" такое выражение:

CommitteeMembers.id_DesignTempalte = {frmSettingReport.cbDesignPattern.dbItemID}

?

cbDesignPattern - это комбобокс, лежащий на той же форме, где и грид, для которого устанавливается фильтр

Тогда вопрос такой: из кучи малосвязанных и несвязанных таблиц возможно ли подготовка и наполнение такого вот установочного отчета (см. по ссылке)???

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

https://ru.files.fm/u/ug2wnfct

То есть сам MVD, по сути, это расширение FastReport'а до некой заточенной под создание СУБД IDE, ясно)

Ага, посмотрел код, понял, куда лепить куски из шага 4. Получается, мы тупо соединяем два шаблона в один генеральный шаблон. И можно не заморачиваться с наследуемыми отчетами.

Почитав тут разные темы, решил обобщить все, что прочитал.

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

Шаг 1. Создание шаблона отчета (.fr3-файла). То есть надо вписать статический текст, разметить поля для вывода меняющихся данных (из БД), подготовить те же диаграммы для выводимых данных. Создание шаблона мною пока не изучено, интересовали пока следующие шаги.

Шаг 2. Создание скрипта, подготавливающего наборы данных и связывающий эти наборы с шаблоном отчета. По следующему шаблону:

procedure Employees_Button5_OnClick (Sender: string; var Cancel: boolean);
var
    frxDBDataset1, frxDBDataset2,frxDBDataset3: TfrxDBDataset;
    Employee, Email, Phone: TDataSet;
begin

SQLQuery('SELECT id, FirstName, Surname FROM Employees', Employee);
SQLQuery('SELECT id_Employees, emailaddress FROM email', Email);
SQLQuery('SELECT id_Employees, phonenumber FROM phone',  Phone);

 // create Employees
    frxDBDataset1 := TfrxDBDataset.Create(Employees);
    frxDBDataset1.UserName        := 'Employee';
    frxDBDataset1.CloseDataSource := True;
    frxDBDataset1.OpenDataSource  := True;
    frxDBDataset1.DataSet         := Employee;

    // create second Email
    frxDBDataset2 := TfrxDBDataset.Create(Email);
    frxDBDataset2.UserName        := 'Email';
    frxDBDataset2.CloseDataSource := True;
    frxDBDataset2.OpenDataSource  := True;
    frxDBDataset2.DataSet         := Email;

    // create phone
    frxDBDataset3 := TfrxDBDataset.Create(Phone);
    frxDBDataset3.UserName        := 'Phone';
    frxDBDataset3.CloseDataSource := True;
    frxDBDataset3.OpenDataSource  := True;
    frxDBDataset3.DataSet         := Phone;

    Employees.frxReport.Clear;
    Employees.frxReport.DataSets.Clear;
    Employees.frxReport.DataSets.Add(frxDBDataset1);
    Employees.frxReport.DataSets.Add(frxDBDataset2);
    Employees.frxReport.DataSets.Add(frxDBDataset3);

    // DESIGN MODE
      //Employees.frxReport.LoadFromFile(ExtractFilePath(Application.ExeName)+'Report\Cards.fr3');
      //Employees.frxReport.DesignReport;

    // PREVIEW MODE
      frxDBDataset1.DataSet.Close;
      frxDBDataset2.DataSet.Close;
      frxDBDataset3.DataSet.Close;

      Employees.frxReport.LoadFromFile(ExtractFilePath(Application.ExeName)+'Report\Cards.fr3');
      Employees.frxReport.ShowReport;

    frxDBDataset1.Free;
    frxDBDataset2.Free;
    frxDBDataset3.Free;

end;

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

Не совсем понятна разница между DESIGN MODE и PREVIEW MODE, хотелось бы узнать подробнее об этом.

Шаг 3. Возможность выбора шаблона отчета у кнопки с действием "Отчет":

Form1.ButtonReport.dbReportFile:='print.fr3'; 

Вообще шикарный инструмент. Must to use.

Шаг 4. Составной отчет. В котором несколько блоков ReportTitle, MasterData, Footer. Возможность создания - через метод TfrxReport.PrepareReport и скрипт а-ля

frxReport1.LoadFromFile('1.fr3');
frxReport1.PrepareReport;
frxReport1.LoadFromFile('2.fr3');
frxReport1.PrepareReport(False);
frxReport1.ShowPreparedReport;

Данная возможность расписана слабо, и хотелось бы узнать о ней побольше.

122

(10 replies, posted in Russian)

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

С выводом в грид разного количества столбцов таки справился тупо путем перестройки БД, нормализовал ее по максимуму. Все-таки правильно структурированная БД - это 80% успеха в написании ПО

123

(10 replies, posted in Russian)

Нашел. Согласно этой теме - http://www.delphisources.ru/forum/showt … hp?t=11225 - ошибка была в основном блоке приложения, видимо, игры с выводом в грид трех наборов данных с разным числом колонок играет свою роль... в основном блоке begin...end таки не стоит в динамическом режиме устанавливать ширину столбцов для грида, в который в зависимости от нескольких SQL-запросов выводится разное количество столбцов.

124

(10 replies, posted in Russian)

Переустановил MVD 4.5 - не помогло. А как понять все же, где ошибка - не могу. На код жалоб нет у интерпретатора, на формы и компоненты тоже не жалуется. однако какой-то "лист индекс аут оф баундс" - и хоть об стену убейся. EListError - что-то со списком, но где конкретно - с ходу не понять. Код проверил в местах, где списки используются - вроде на глаз ничего криминального нет... А где она конкретно возникает, на каком этапе - хз.

125

(10 replies, posted in Russian)

Что-то у меня приложение при запуске начало выдавать ошибку с отсылкой на дебаг-окно:

Сигнатура проблемы:
  Имя события проблемы:    APPCRASH
  Имя приложения:    Monitoring.exe
  Версия приложения:    1.0.0.0
  Отметка времени приложения:    5b34ab48
  Имя модуля с ошибкой:    KERNELBASE.dll
  Версия модуля с ошибкой:    6.1.7601.23572
  Отметка времени модуля с ошибкой:    57fd0379
  Код исключения:    0eedfade
  Смещение исключения:    0000c54f
  Версия ОС:    6.1.7601.2.1.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    a70a
  Дополнительные сведения 2:    a70af4299e524ee78ba3a9ea87cff008
  Дополнительные сведения 3:    a67c
  Дополнительные сведения 4:    a67c877ebe4b58016e0695c79471daeb

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid= … cid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\Windows\system32\ru-RU\erofflps.txt

и месседжем:

Exception EListError in module Monitoring.exe at 000BB6E2. List index out of bounds (0).

Не могу понять, в чем дело.