Последняя версия DataExpress 3 beta от 11 августа 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

Метаданные

Вопросы о применении того или иного класса или функции.
neitri
Мастер скриптов
Сообщения: 537
Зарегистрирован: Пн фев 13, 2017 5:42 pm

Метаданные

Сообщение neitri » Пн авг 28, 2017 12:31 pm

Написл модуль для построения метаданных базы.
Подключаем пользовательский модуль и выполняем следующий код.

Код: Выделить всё

{$i MetaData}
var
  MD:array of TMetadataform;
 
procedure Database_open;
var
  s:TstringList;
begin
  CreateMetaData(MD);
  s:=PrintMetaData(MD);
  debug(s.text);
  s.free;
end;


CreateMetaData(MetaData: array of TMetadataform) - построение дерева метаданных
WriteMetaData(MetaData:TMetaDataForm;var Stream:TStringList); - печать метаданных одной формы
PrintMetaData(metaData:Array of TMetaDataForm):TStringlist; - печать метаданных всех форм.
Вложения
metadata.zip
(2.04 КБ) 22 скачивания
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

Аватара пользователя
YurAnt
Эксперт
Сообщения: 3361
Зарегистрирован: Чт апр 13, 2017 8:57 am
Контактная информация:

Re: Метаданные

Сообщение YurAnt » Ср сен 06, 2017 4:31 pm

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

P.S. Результат работы скрипта было увидеть довольно интересно. Это же считай прототип для построения реляционной модели структуры базы! То есть - если это преобразовать в графический или табличный вид можно увидеть "карту косяков" и прочие моменты... Не планируется расширение этой примочки?
Изображение

neitri
Мастер скриптов
Сообщения: 537
Зарегистрирован: Пн фев 13, 2017 5:42 pm

Re: Метаданные

Сообщение neitri » Ср сен 06, 2017 4:51 pm

Там косячки в коде наверно. Последний вариант у меня не ругается.
Сбой распознавания пишет в случае если ендов больше чем объектов.
Вложения
metadata.zip
(2.16 КБ) 20 скачиваний
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

Аватара пользователя
YurAnt
Эксперт
Сообщения: 3361
Зарегистрирован: Чт апр 13, 2017 8:57 am
Контактная информация:

Re: Метаданные

Сообщение YurAnt » Ср сен 06, 2017 5:03 pm

Ну а второй вопрос? ;) Это интересное начало аналитической утилиты:

Изображение
Изображение

neitri
Мастер скриптов
Сообщения: 537
Зарегистрирован: Пн фев 13, 2017 5:42 pm

Re: Метаданные

Сообщение neitri » Ср сен 06, 2017 6:00 pm

Это инструмент. А как его использовать ограничивается только фантазией.
Можно и структуру графически выводить. Не мешало бы для этого TdxTreeView какой ни будь.
А так для экспорта импорта задумывалось.
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

Аватара пользователя
YurAnt
Эксперт
Сообщения: 3361
Зарегистрирован: Чт апр 13, 2017 8:57 am
Контактная информация:

Re: Метаданные

Сообщение YurAnt » Ср сен 06, 2017 6:24 pm

Заинтересовало в общем. Попробую что-то наглядное прикрутить...
Изображение

Аватара пользователя
YurAnt
Эксперт
Сообщения: 3361
Зарегистрирован: Чт апр 13, 2017 8:57 am
Контактная информация:

Re: Метаданные

Сообщение YurAnt » Ср сен 06, 2017 10:12 pm

Сделал черновичок. Осталось только (всего-то :| ):
1. Прикрутить какую нибудь библиотечку для плавающих div-ов.
2. Сanvas-нити для соединения IP-PID и визуального отображения связей.
3. Дать волю фантазии. Какие будут пожелания к отчету?

Уже автоматически сформированный отчет:
Изображение
Отчет структура БД.zip
(66.04 КБ) 20 скачиваний

Код: Выделить всё

...

function PrintMetaData(metaData:Array of TMetaDataForm):TStringlist;
var
i,j:integer;
begin
result:=TStringlist.Create();

Result.add('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'+
'<html xmlns="http://www.w3.org/1999/xhtml">  '+
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> '+
'<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Отчет структура БД</title></head><body>'+
'<div style="font-family: Roboto, Verdana, Arial; height: auto; position: absolute; width: 100%;"> <!--div 1 (Форма)--> '+
''+
''+
'');


for i:= 0 to GetArrayLength(MetaData)-1 do
  begin
    if Metadata[i].Id=0 then continue;



Result.add(''+
'   <div style="width: 206px; margin: 10px; float: left; height: auto;"> <!--div 2-->  '+
'      <div style="width: 200px; padding: 5px; position: inherit;">'+
'      <div style="margin: 1px; width: 100%; padding: 5px; background-color: #0000FF; color: #FFFFFF; position: relative; font-size: 0.8rem; left: 0px; top: 0px;" class="style1"> '+
'         <strong>'+ Metadata[i].FormCaption +' <i>('+Metadata[i].name+')</i></strong></div> <!---->  ');


  for j:=0 to GetArrayLength(Metadata[i].Fields)-1 do
      begin
        Result.add  ('      <div style="margin: 1px; width: 100%; padding: 5px; background-color: #E8E8FF; position: relative; '+
'    padding-top: 2px; padding-bottom: 2px; font-size: 0.8rem;" class="style1"> '+
'    ■ '+Metadata[i].Fields[j].FieldName+' ('+IntToStr(Metadata[i].Fields[j].FieldSize)+')</div>  ');

       { Result.add  ('Поле: '+
                         '<b>Имя:</b> '+Metadata[i].Fields[j].FieldName+' ('+IntToStr(Metadata[i].Fields[j].FieldSize)+') <br>'); +
                    '<b>ObjectName:</b> '+Metadata[i].Fields[j].ObjectName + '<br>' +
                    '<b>TypeName:</b> '+ Metadata[i].Fields[j].TypeName + '<br>' +
                    '<b>Id:</b>'+IntToStr(Metadata[i].Fields[j].Id)+ '<br>' +
                    '<b>SourceTId:</b> '+IntToStr(Metadata[i].Fields[j].SourceTId)+  '<br>' +
                    '<b>SourceFId:</b> '+IntToStr(Metadata[i].Fields[j].SourceFId)+ '<br>' +
                    '<b>Required:</b> '+BoolToStr(Metadata[i].Fields[j].Required)+'<p>'); }
      end;


Result.Add('      </div> '+
' </div> <!--div 2-->'+
'');



    {
Result.add(''+


'<div style="font-family: Arial; height: auto; position: absolute; width: 100%;"> '+
'   <div style="font-family: Roboto, Verdana, Arial; width: 206px; margin: 10px; float: left; height: auto;">  '+
'      <div style="width: 200px; padding: 5px; position: inherit;">  '+
'      <div style="margin: 1px; width: 100%; padding: 5px; background-color: #0000FF; color: #FFFFFF; position: relative; font-size: 0.8rem;" class="style1">  '+
'            <strong>Форма 1</strong></div> '+
'         <div style="margin: 1px; width: 100%; padding: 5px; background-color: #E8E8FF; position: relative; padding-top: 2px; padding-bottom: 2px; font-size: 0.8rem;" class="style1"> '+
'            Фамилия 1</div> '+
'         </div> '+
'      </div> '+
'   </div> ')     }


 {   Result.add('Название формы: '+ Metadata[i].FormCaption +' <i>('+Metadata[i].name+')</i>');
    Result.add('Id='+IntToStr(Metadata[i].id)+' '+IntToStr(Metadata[i].id)+'<br>');
  //  Result.add('PId='+IntToStr(Metadata[i].PId)+'<br>');
   // Result.add('ConfirmSaveRecord='+BoolToStr(Metadata[i].ConfirmSaveRecord)+'<br>');
    //Result.add('ConfirmAutoSaveRecord='+BoolToStr(Metadata[i].ConfirmAutoSaveRecord)+'<br>');
    //Result.add('ConfirmCancelEditing='+BoolToStr(Metadata[i].ConfirmCancelEditing)+'<br>');

    Result.add('Список полей:<br>');
    for j:=0 to GetArrayLength(Metadata[i].Fields)-1 do
      begin
        Result.add  ('Поле: '+
                         '<b>Имя:</b> '+Metadata[i].Fields[j].FieldName+' ('+IntToStr(Metadata[i].Fields[j].FieldSize)+') <br>'); +
                    '<b>ObjectName:</b> '+Metadata[i].Fields[j].ObjectName + '<br>' +
                    '<b>TypeName:</b> '+ Metadata[i].Fields[j].TypeName + '<br>' +
                    '<b>Id:</b>'+IntToStr(Metadata[i].Fields[j].Id)+ '<br>' +
                    '<b>SourceTId:</b> '+IntToStr(Metadata[i].Fields[j].SourceTId)+  '<br>' +
                    '<b>SourceFId:</b> '+IntToStr(Metadata[i].Fields[j].SourceFId)+ '<br>' +
                    '<b>Required:</b> '+BoolToStr(Metadata[i].Fields[j].Required)+'<p>');
      end;
    Result.add('EndFields');
    Result.add('EndForm');}






  end;
  Result.add('</div></body></html>');
end;

// Конец модуля и всех процедур Metadata.

Изображение

Аватара пользователя
YurAnt
Эксперт
Сообщения: 3361
Зарегистрирован: Чт апр 13, 2017 8:57 am
Контактная информация:

Re: Метаданные

Сообщение YurAnt » Ср сен 06, 2017 10:47 pm

Вариант фильтра отчета: "Экспресс-анализ всех выражений" (скажем - на предмет тяжелых db-функций или паразитных "петелек")

Изображение

Классный Вы сделали инструмент, neitri ;) . Целая куча идей, как его можно применить. Предлагаю по функционалу устроить коллективный мозговой штурм.
Изображение

neitri
Мастер скриптов
Сообщения: 537
Зарегистрирован: Пн фев 13, 2017 5:42 pm

Re: Метаданные

Сообщение neitri » Чт сен 07, 2017 3:29 am

Можно ещё sql запросы писать. Или наоборот из запроса select f1, f4 from t1 вернуть понятные имена полей и форм.
Можно чуть до пилить и будет список шаблонов.

Хотелось бы его в штатный функционал, на объектах/классах. И доступный глобально.
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

Аватара пользователя
YurAnt
Эксперт
Сообщения: 3361
Зарегистрирован: Чт апр 13, 2017 8:57 am
Контактная информация:

Re: Метаданные

Сообщение YurAnt » Чт сен 07, 2017 7:32 am

Можно чуть до пилить и будет список шаблонов

Было бы неплохо. Это кстати ещё и потенциальная заготовка для "конструктора шаблонов". Ещё бы как-то возращать список полей объекта автоциклом и запросы на формах с их полями.
Думаю к этому скрипту можно прикрутить панель настроек и в ней различного рода предустановки - что именно мы хотим от него получить и в каком виде. Сами предустановки можно хранить в ini.
Изображение