1 (edited by Godless 2024-01-12 05:46:12)

Topic: Запутался в связях

Всем привет. Может кто глянет свежим глазом, запутался в связях.
Вроде как бы нормально для работы, а вот для вывода на "печать", мне нужно использовать все записи со всех таблиц - для формирования бланка акта услуг, с заполненными полями о моей фирме, контрагенте и позиций услуг/номенклатуры

А значит привязаться к одной таблице для вывода - не могу sad

https://i.ibb.co/0jR9Mt8/image.jpg

Заранее спасибо smile

2 (edited by k245 2024-01-19 12:11:22)

Re: Запутался в связях

А зачем вам привязываться к одной таблице? Поищите на форуме скрипты, которые позволяют формировать отчет из любого количества таблиц и параметров.


Если не найдете, то посмотрите здесь:
https://k245.ru/software-ru/clearapp.html


Модуль: report.pas
Процедура: Report_Open()


Пример использования:
https://k245.ru/mvdb/linejnyj-raskroj.html


UserApp_LinearCalc_Report()

Визуальное программирование: блог и телеграм-канал.

3 (edited by Godless 2024-01-12 09:13:14)

Re: Запутался в связях

Спасибо. Поковырялся чутка, собрал пример

procedure Print_Button_OnClick (Sender: string; var Cancel: boolean);
var
    frxDBActs, frxDBMyFirm, frxDBCounterparty, frxDBNomenclature, frxDBActsPositions: TfrxDBDataset;
    Acts, MyFirm, Counterparty, Nomenclature, ActsPositions: TDataSet;

begin

SQLQuery('SELECT * FROM Acts WHERE Acts.id ='+ Main.TableGrid1.sqlValue , Acts);
SQLQuery('SELECT * FROM MyFirm', MyFirm);
SQLQuery('SELECT * FROM Counterparty WHERE Counterparty.id ='+ Main.TableGrid1.sqlValue, Counterparty);
SQLQuery('SELECT * FROM Nomenclature WHERE Nomenclature.id ='+ Main.TableGrid1.sqlValue, Nomenclature);
SQLQuery('SELECT * FROM ActsPositions', ActsPositions);

 // create Acts
    frxDBActs := TfrxDBDataset.Create(Acts);
    frxDBActs.UserName        := 'Acts';
    frxDBActs.CloseDataSource := True;
    frxDBActs.OpenDataSource  := True;
    frxDBActs.DataSet         := Acts;

 // create MyFirm
    frxDBMyFirm := TfrxDBDataset.Create(MyFirm);
    frxDBMyFirm.UserName        := 'MyFirm';
    frxDBMyFirm.CloseDataSource := True;
    frxDBMyFirm.OpenDataSource  := True;
    frxDBMyFirm.DataSet         := MyFirm;

 // create Counterparty
    frxDBCounterparty := TfrxDBDataset.Create(Counterparty);
    frxDBCounterparty.UserName        := 'Counterparty';
    frxDBCounterparty.CloseDataSource := True;
    frxDBCounterparty.OpenDataSource  := True;
    frxDBCounterparty.DataSet         := Counterparty;

 // create Nomenclature
    frxDBNomenclature := TfrxDBDataset.Create(Nomenclature);
    frxDBNomenclature.UserName        := 'Nomenclature';
    frxDBNomenclature.CloseDataSource := True;
    frxDBNomenclature.OpenDataSource  := True;
    frxDBNomenclature.DataSet         := Nomenclature;

 // create ActsPositions
    frxDBActsPositions := TfrxDBDataset.Create(ActsPositions);
    frxDBActsPositions.UserName        := 'ActsPositions';
    frxDBActsPositions.CloseDataSource := True;
    frxDBActsPositions.OpenDataSource  := True;
    frxDBActsPositions.DataSet         := ActsPositions;

    Main.frxReport.Clear;
    Main.frxReport.DataSets.Clear;
    Main.frxReport.DataSets.Add(frxDBActs);
    Main.frxReport.DataSets.Add(frxDBCounterparty);
    Main.frxReport.DataSets.Add(frxDBMyFirm);
    Main.frxReport.DataSets.Add(frxDBNomenclature);
    Main.frxReport.DataSets.Add(frxDBActsPositions);


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

    frxDBActs.Free;
    frxDBMyFirm.Free;
    frxDBCounterparty.Free;
    frxDBNomenclature.Free;
    frxDBActsPositions.Free;

end;

Вроде бы норм, но выводит всего одну дочернюю запись с доп.тапблицы ActsPositions

Re: Запутался в связях

Обычно формируют два SQL-запроса по одному ID. Первый запрос  для шапки документа, второй - для детализации.

SELECT * FROM acts 
LEFT JOIN MyFirm ON MyFirm.id = acts.id_MyFirm 
LEFT JOIN ConuterParty ON ConuterParty.id = acts.id_ConuterParty
WHERE act.id = <значение>
SELECT * FROM ActsPosition
LEFT JOIN nomenclature ON nomenclature.id = ActsPosition.id_nomenclature
WHERE ActsPosition.id_acts = <значение>

Первый запрос возвращает реквизиты документа, второй - все записи, которые относятся к документу:

Визуальное программирование: блог и телеграм-канал.

5 (edited by Godless 2024-01-15 04:21:08)

Re: Запутался в связях

k245 wrote:

Первый запрос возвращает реквизиты документа, второй - все записи, которые относятся к документу:

Спасибо за подсказки! Получилось все.

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

https://i.ibb.co/NKCMSch/image.jpg

Re: Запутался в связях

procedure Price_OnChoose (Sender: string; Action: string);
begin
        AddActPosition.Edit2.Text := SQLExecute ('SELECT Cena FROM Nomenclature WHERE id = ' + IntToStr(AddActPosition.ComboBox1.dbItemID) );
end;

Сам себе отвечу. Вроде работает. Вдруг кому то пригодиться

Re: Запутался в связях

k245 спасибо еще раз. Жалко "плюсов" нет для кармы, натыкал бы smile
Получилось все что задумал, даже применил "дизайнерские способности", что бы сделать не таким "обычным" интерфейс.
Жалко нет возможности "скруглить" поля ввода и таблиц, либо просто не нашел ,но , вроде бы, перерыл все настройки

https://i.ibb.co/ZXZx7xT/111.jpg
https://i.ibb.co/xf1gnfQ/111.jpg

8 (edited by k245 2024-01-19 12:07:27)

Re: Запутался в связях

Отличный дизайн интерфейса!


Насчет скруглений - можно заморочиться и сделать так:
1) убрать штатные границы и добавить картинки с нарисованными круглыми рамками
2) убрать штатные границы и добавить TShape c закругленными углами.
3) убрать штатные границы и рисовать на канве формы/панелей


https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=10213&amp;download=0

Первый способ дает больше красоты, но дизайн жёстко привязывается к размеру форм и компонентов. Второй боле гибкий, но нужно писать много кода. Третий не пробовал )))

Post's attachments

Attachment icon design.jpg 153.62 kb, 14 downloads since 2024-01-19 

Визуальное программирование: блог и телеграм-канал.

Re: Запутался в связях

Do you have an example on how to do these designs? The rounded boxes look nice, how about the special icons next to the window controls?

Re: Запутался в связях

Hi All,
I was also having a look at this post a couple of days ago.
The main problem for me was that using a picture with a rounded frame only really works with form objects where the background colour can be changed (to match the background of the picture itself) and / or the object's frame can be minimised;  fine for edit objects, memo objects. panel object and combobox objects but it rather falls down with datetimepicker objects, checkbox objects, tablegrid objects and, of course, the form itself.
One further point, if you use 'styles', then you additionally need to switch off style elements for each object that you are trying to 'round' in a script.
So while the effect looks very good, it's possibly outweighed by the inconsistencies and extra code. 
So rather than try to apply 'round edges' to all form elements, an acceptable compromise, as Konstantin writes,  might be to just use rounded images as pseudo panels and then have any other objects inside the 'panel image' without any rounding.  Personally, I prefer to use 'panel images' that are solid colour rather than with a thin border - this helps to minimise the distortion that you get when you resize the 'panel image'..

Derek.

11 (edited by k245 2024-01-21 08:10:18)

Re: Запутался в связях

tcoton wrote:

Do you have an example on how to do these designs? The rounded boxes look nice, how about the special icons next to the window controls?

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=10219&amp;download=0

I had to “invent” and create many components myself (date input, scroll bar, checker, etc.). But this process was not completed: the color of the drop-down list is not controlled, problems with tables (color of scroll bars and footer/header lines). A lot of code was written, a whole library of “virtual classes”, but for a private project. Perhaps after some time I will have the opportunity to publish applied solutions.

Post's attachments

Attachment icon изображение_2024-01-21_110943304.png 23.98 kb, 12 downloads since 2024-01-21 

Визуальное программирование: блог и телеграм-канал.

12 (edited by Godless 2024-01-22 01:26:16)

Re: Запутался в связях

k245 wrote:

2) убрать штатные границы и добавить TShape c закругленными углами.

А что за TShape  ?Не нашел в описании для МВДБ. Как это выглядеть в коде должно? Что-то типа

KPADDUslugi.Edit4.Tshape := 20;

?

Так же интересно для КомбоКса и ТейблГРида тоже сработает ?

13 (edited by k245 2024-01-22 07:42:17)

Re: Запутался в связях

Вот пример создания Мемо с закруглениями:

procedure RoundedMemo_Create(AMemo: TdbMemo);
// создание
// если в свойстве TEXT указать NOFRAME, то отображение будет без рамки; COPY_TO_CLIPBOARD - добавляет кнопку копирования в буфер обмена
var
  s: TShape;
  tmpLabel: TdbLabel;
  tmpLabelLimit: TdbLabel;
  tmpForm: TAForm;
  tmpName: string;
  tmpImage: TdbImage;
  tmpImageName: string;
  tmpPanel: TdbPanel;
  tmpParam: array of string; // параметры
  tmpBPanel: TdbPanel;
  i: integer;
begin
  tmpParam := SplitString(AMemo.Text, '%');
  AMemo.Text := '';
  CForm(AMemo, tmpForm);
  tmpName := DeleteClassName(AMemo.Name);
  // панель - подложка
  tmpPanel := TdbPanel.Create(tmpForm);
  tmpPanel.Name := T_PANEL + tmpName + SX_BACK;
  tmpPanel.Caption := '';
  tmpPanel.Parent := AMemo.Parent;
  tmpPanel.BevelWidth := 0;
  tmpPanel.Top := AMemo.Top;
  tmpPanel.Left := AMemo.Left;
  tmpPanel.Width := AMemo.Width;
  tmpPanel.Height := AMemo.Height;
  tmpPanel.Anchors := AMemo.Anchors;
  // пересаживаем на неЄ мемку
  AMemo.Parent := tmpPanel;
  AMemo.Top := 0;
  AMemo.Left := 0;
  //
  AMemo.BorderStyle := bsNone;
  SetFont(AMemo.Font, FORM_TEXT_SIZE);
  if (Length(tmpParam) = 1) and (tmpParam[0] = 'NOFRAME') then
  begin // нет рамки и надписи - используетс¤ дл¤ отображени¤ на панели
    AMemo.TagString := 'NOFRAME'
  end
  else
  begin
    // красивая рамка состоит из 10-ти элементов
    // верхний левый угол
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_TOP_LEFT;
    s.Parent := tmpPanel;
    s.Shape := stCircle;
    s.Top := 0;
    s.Left := 0;
    s.Height := RP_SIZE;
    s.Width := RP_SIZE;
    s.Anchors := akTop + akLeft;
    // верхний правй угол
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_TOP_RIGHT;
    s.Parent := tmpPanel;
    s.Shape := stCircle;
    s.Top := 0;
    s.Left := tmpPanel.Width - RP_SIZE;
    s.Height := RP_SIZE;
    s.Width := RP_SIZE;
    s.Anchors := akTop + akRight;
    // нижний левый угол
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_BOTTOM_LEFT;
    s.Parent := tmpPanel;
    s.Shape := stCircle;
    s.Top := AMemo.Height - RP_SIZE;
    s.Left := 0;
    s.Height := RP_SIZE;
    s.Width := RP_SIZE;
    s.Anchors := akBottom + akLeft;
    // нижний правый угол
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_BOTTOM_RIGHT;
    s.Parent := tmpPanel;
    s.Shape := stCircle;
    s.Top := tmpPanel.Height - RP_SIZE;
    s.Left := tmpPanel.Width - RP_SIZE;
    s.Height := RP_SIZE;
    s.Width := RP_SIZE;
    s.Anchors := akBottom + akRight;
    // горизонтальна¤ полоска
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_HORIZ;
    s.Parent := tmpPanel;
    s.Shape := stRectangle;
    s.Top := RP_SIZE div 2;
    s.Left := 0;
    s.Height := tmpPanel.Height - RP_SIZE;
    s.Width := tmpPanel.Width;
    s.Anchors := akBottom + akRight + akTop + akLeft;
    // вертикальна¤ полоска
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_VERT;
    s.Parent := tmpPanel;
    s.Shape := stRectangle;
    s.Top := 0;
    s.Left := RP_SIZE div 2;
    s.Height := tmpPanel.Height;
    s.Width := tmpPanel.Width - RP_SIZE;
    s.Anchors := akBottom + akRight + akTop + akLeft;
    // верхн¤¤ горизонтальна¤ лини¤
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_TOP;
    s.Parent := tmpPanel;
    s.Shape := stRectangle;
    s.Top := 0;
    s.Left := RP_SIZE div 2;
    s.Height := 1;
    s.Width := tmpPanel.Width - RP_SIZE;
    s.Anchors := akRight + akTop + akLeft;
    // нижн¤¤ горизонтальна¤ лини¤
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_BOTTOM;
    s.Parent := tmpPanel;
    s.Shape := stRectangle;
    s.Top := tmpPanel.Height - 1;
    s.Left := RP_SIZE div 2;
    s.Height := 1;
    s.Width := tmpPanel.Width - RP_SIZE;
    s.Anchors := akBottom + akRight + akLeft;
    // лева¤ вертикальна¤ лини¤
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_LEFT;
    s.Parent := tmpPanel;
    s.Shape := stRectangle;
    s.Top := RP_SIZE div 2;
    s.Left := 0;
    s.Height := tmpPanel.Height - RP_SIZE;
    s.Width := 1;
    s.Anchors := akBottom + akTop + akLeft;
    // права¤ вертикальна¤ лини¤
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + SX_RIGHT;
    s.Parent := tmpPanel;
    s.Shape := stRectangle;
    s.Top := RP_SIZE div 2;
    s.Left := tmpPanel.Width - 1;
    s.Height := tmpPanel.Height - RP_SIZE;
    s.Width := 1;
    s.Anchors := akBottom + akRight + akTop;
    // надпись
    tmpLabel := TdbLabel.Create(tmpForm);
    tmpLabel.Name := T_LABEL + tmpName + SX_CAPTION;
    tmpLabel.Parent := tmpPanel.Parent;
    tmpLabel.Alignment := taLeftJustify;
    tmpLabel.Caption := AMemo.Hint;
    //
    if isRequiredMark(tmpLabel.Caption) then
      tmpLabel.Tag := TG_REQUIRED_FIELD;
    //
    tmpLabel.Top := tmpPanel.Top - tmpLabel.Height - 10; // - 2
    tmpLabel.Left := tmpPanel.Left; // AEdit.Left;

    SetFont(tmpLabel.Font, EDIT_CAPTION_FONT_SIZE);
    if (Length(tmpParam) = 2) and (tmpParam[0] = 'CHECK_LENGTH') then
    begin
      // добавляем контрол отображения лимита
      tmpLabelLimit := TdbLabel.Create(tmpForm);
      tmpLabelLimit.Name := T_LABEL + tmpName + SX_TOP_RIGHT;
      // лимит храним в теге
      tmpLabelLimit.Tag := StrToInt(tmpParam[1]);
      tmpLabelLimit.Parent := tmpPanel.Parent;
      tmpLabelLimit.Alignment := taRightJustify;
      tmpLabelLimit.Anchors := AMemo.Anchors;
      tmpLabelLimit.Autosize := False;
      SetFont(tmpLabelLimit.Font, EDIT_CAPTION_FONT_SIZE);
      // положение на экране
      tmpLabelLimit.Top := tmpLabel.Top;
      tmpLabelLimit.Left := tmpLabel.Left;
      tmpLabelLimit.Height := tmpLabel.Height;
      tmpLabelLimit.Width := tmpPanel.Width;
      // обработчик на изменение данных
      AMemo.OnChange := @RoundedMemo_CheckLimit;
      RoundedMemo_CheckLimit(AMemo);
    end;
    // коррекци¤ по ширине
    AMemo.Width := AMemo.Width - 16;
    AMemo.Height := AMemo.Height - 16;
    AMemo.Left := AMemo.Left + 8;
    AMemo.Top := AMemo.Top + 8;
    // положение на экране

    for i := 0 to Length(tmpParam) - 1 do
    begin
      if tmpParam[i] = 'COPY_TO_CLIPBOARD' then
      begin
        // добавляем панель с кнопкой правее основной панели
        tmpBPanel := TdbPanel.Create(tmpForm);
        tmpBPanel.Name := T_PANEL + tmpName + SX_BUTTON_PANEL;
        tmpBPanel.Caption := '';
        tmpBPanel.Parent := tmpPanel.Parent;
        tmpBPanel.BevelWidth := 0;
        //
        tmpBPanel.Height := 33; // уточнить
        tmpBPanel.Top := tmpPanel.Top + tmpPanel.Height - tmpBPanel.Height;
        tmpBPanel.Width := tmpBPanel.Height;
        tmpBPanel.Left := tmpPanel.Left + tmpPanel.Width - tmpBPanel.Width;
        // коррктировка ширины основной панели
        tmpPanel.Width := tmpPanel.Width - tmpBPanel.Width - 4;
        tmpBPanel.Tag := 1; // признак наличия кноки
        // якоря зависят от якорей основной панели
        if tmpPanel.Anchors AND akRight then
          tmpBPanel.Anchors := akRight
        else
          tmpBPanel.Anchors := akLeft;
        //
        if tmpPanel.Anchors AND akBottom then
          tmpBPanel.Anchors := tmpBPanel.Anchors + akBottom
        else
          tmpBPanel.Anchors := tmpBPanel.Anchors + akTop;
        // добавляем кнопку
        tmpBPanel.TagString := 'CopyToClipboard';
        PanelButton_Create('CopyToClipboard', tmpBPanel, -1, 'RoundedMemo_CopyToClipboard',
          'Скопировать текст в буффер обмена');
        break;
      end;
    end;

  end;
end;

Выглядит так:

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=10222&amp;download=0

Использование. На форму накидывается обычный TdbMemo, затем в скрипте вызывается RoundedMemo_Create(), в который передается ссылка на компонент. Процедура добавляет красоты и функциональности.

Post's attachments

Attachment icon изображение_2024-01-22_103605688.png 61.65 kb, 9 downloads since 2024-01-22 

Визуальное программирование: блог и телеграм-канал.

Re: Запутался в связях

Занимательно )))

Re: Запутался в связях

k245 wrote:

Вот пример создания Мемо с закруглениями:

Капец... для одного поля столько строчить - нервов не хватит ))

Есть вопрос, сюда напишу тоже. Надо отоформатировать вычисляемое поле, что бы стало выглядить  "0 000,00", типа такого формата.

(SELECT printf('%,.2f', SUM(TovarMain.CenaTovarItem * TovarMain.KolvoTovara)) AS Total 
FROM TovarMain                   
WHERE TovarMain.id_kp = kp.id)

Если убрать printf, считает нормально. Если добавить - получаю пустое поле. Где то ошибся в синтаксисе ?

Re: Запутался в связях

k245 wrote:

Вот пример создания Мемо с закруглениями:
...

2d массив не пошел. Было бы понятнее.
Можно большой массив разделить на две части(фигура и служебные)
На счет правильности оригинальных суффиксов не уверен.

var
...
  arrSX : Array[0..9] of string = ['_TL','_TR','_BL','_BR','_HR','_VR','_TP','_BT','_LF','_RG'];
  arrParam: Array[0..89] of integer = [5,1,2,0,0,0,0,RP_SIZE,RP_SIZE,
                                     5,0,2,4,0,AMemo.Width-RP_SIZE,0,RP_SIZE,RP_SIZE,
                                     5,1,0,0,8,0,AMemo.Height-RP_SIZE,RP_SIZE,RP_SIZE,
                                     5,0,0,4,8,AMemo.Width-RP_SIZE,AMemo.Height-RP_SIZE,RP_SIZE,RP_SIZE,
                                     0,1,2,4,8,0,RP_SIZE div 2,AMemo.Width,AMemo.Height-RP_SIZE,
                                     0,1,2,4,8,RP_SIZE div 2,0,AMemo.Width-RP_SIZE,AMemo.Height,
                                     0,1,2,4,0,RP_SIZE div 2,0,AMemo.Width-RP_SIZE,1,
                                     0,1,0,4,8,RP_SIZE div 2,AMemo.Height-1,AMemo.Width-RP_SIZE,1,
                                     0,1,2,0,8,0,RP_SIZE div 2,1,AMemo.Height-RP_SIZE,
                                     0,0,2,4,8,AMemo.Width-1,RP_SIZE div 2,1,AMemo.Height-RP_SIZE];
        //(Shape,akLeft,akTop,akRight,akBottom,Left,Top,Width,Height)
begin
...
  while i <= 89 do
  begin
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + arrSX[i div 9];
    s.Parent := tmpPanel;
    s.Shape := arrParam[i];
    s.SetBounds(arrParam[i+5],arrParam[i+6],arrParam[i+7],arrParam[i+8]);
    s.Anchors := arrParam[i+1]+arrParam[i+2]+arrParam[i+3]+arrParam[i+4];
    i := i + 9;
  end;
...

17 (edited by Godless 2024-01-24 09:20:34)

Re: Запутался в связях

И еще момент. Можно ли обновить версию ФастРепорта ?
Эта 3, при выгрузке в эксель, залазит за "ширину листа" и нужно при печати ставить "по ширине". Что бы не делал, гадина, все равно лезет шире. В новой версии ФР есть описание, что это пофиксили.

И еще - а чего картинка не печатается в ФР? Просто набор букв

Re: Запутался в связях

sparrow wrote:
k245 wrote:

Вот пример создания Мемо с закруглениями:
...

2d массив не пошел. Было бы понятнее.
Можно большой массив разделить на две части(фигура и служебные)
На счет правильности оригинальных суффиксов не уверен.

var
...
  arrSX : Array[0..9] of string = ['_TL','_TR','_BL','_BR','_HR','_VR','_TP','_BT','_LF','_RG'];
  arrParam: Array[0..89] of integer = [5,1,2,0,0,0,0,RP_SIZE,RP_SIZE,
                                     5,0,2,4,0,AMemo.Width-RP_SIZE,0,RP_SIZE,RP_SIZE,
                                     5,1,0,0,8,0,AMemo.Height-RP_SIZE,RP_SIZE,RP_SIZE,
                                     5,0,0,4,8,AMemo.Width-RP_SIZE,AMemo.Height-RP_SIZE,RP_SIZE,RP_SIZE,
                                     0,1,2,4,8,0,RP_SIZE div 2,AMemo.Width,AMemo.Height-RP_SIZE,
                                     0,1,2,4,8,RP_SIZE div 2,0,AMemo.Width-RP_SIZE,AMemo.Height,
                                     0,1,2,4,0,RP_SIZE div 2,0,AMemo.Width-RP_SIZE,1,
                                     0,1,0,4,8,RP_SIZE div 2,AMemo.Height-1,AMemo.Width-RP_SIZE,1,
                                     0,1,2,0,8,0,RP_SIZE div 2,1,AMemo.Height-RP_SIZE,
                                     0,0,2,4,8,AMemo.Width-1,RP_SIZE div 2,1,AMemo.Height-RP_SIZE];
        //(Shape,akLeft,akTop,akRight,akBottom,Left,Top,Width,Height)
begin
...
  while i <= 89 do
  begin
    s := TShape.Create(tmpForm);
    s.Name := T_SHAPE + tmpName + arrSX[i div 9];
    s.Parent := tmpPanel;
    s.Shape := arrParam[i];
    s.SetBounds(arrParam[i+5],arrParam[i+6],arrParam[i+7],arrParam[i+8]);
    s.Anchors := arrParam[i+1]+arrParam[i+2]+arrParam[i+3]+arrParam[i+4];
    i := i + 9;
  end;
...

Да вы знаете, как проводить тихие зимние вечера )))
Отличный пример борьбы с копипастом. А вот я всё время забываю, что в MVDB можно объявлять переменные сразу со значениями.

Визуальное программирование: блог и телеграм-канал.

Re: Запутался в связях

Godless wrote:

И еще момент. Можно ли обновить версию ФастРепорта ?
Эта 3, при выгрузке в эксель, залазит за "ширину листа" и нужно при печати ставить "по ширине". Что бы не делал, гадина, все равно лезет шире. В новой версии ФР есть описание, что это пофиксили.

И еще - а чего картинка не печатается в ФР? Просто набор букв

Пофиксить не получится, все зашито в экзешник. Насчет картинок - вроде не было проблем, кроме как с прозрачностью при экспорте в PDF.

Визуальное программирование: блог и телеграм-канал.

Re: Запутался в связях

Имею ввиду печать картинки с бд. Там какая то хитрость? Если просто вытянуть в фр репор.форма.картинка - то получаем набор букв

Re: Запутался в связях

Godless wrote:

Имею ввиду печать картинки с бд. Там какая то хитрость? Если просто вытянуть в фр репор.форма.картинка - то получаем набор букв

Приложите проект, не совсем понимаю, о чем речь. Обычно картинки в отчете или из базы, или из файла на диске гружу.

Визуальное программирование: блог и телеграм-канал.

Re: Запутался в связях

k245 wrote:
Godless wrote:

Имею ввиду печать картинки с бд. Там какая то хитрость? Если просто вытянуть в фр репор.форма.картинка - то получаем набор букв

Приложите проект, не совсем понимаю, о чем речь. Обычно картинки в отчете или из базы, или из файла на диске гружу.

В отчет что бы печаталась картинка штрихкода, сохраненная в записи.  ( отчет Rep.fr3)
Генерация ШК - все круто, но при экспорте в  .ods он его конвертит в картинку и сильно жмет качество. Выбор в пользу .ods, т.к. он , в отличии от экселя, сразу формирует настрокий печати "Вписать в ширину листа". А почему нужен редактируемый  - надо править часто что-то единичное в файле. Хотел предложить пдф с примечаниями, но человек-женщина посмотрела на на меня, как будто я ее обозвал хД

Post's attachments

Attachment icon Alko.7z 447.08 kb, 38 downloads since 2024-01-25 

23 (edited by k245 2024-01-25 10:37:18)

Re: Запутался в связях

У меня ошибку выдает при запуске печати

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=10232&amp;download=0

Post's attachments

Attachment icon изображение_2024-01-25_133649065.png 33.17 kb, 6 downloads since 2024-01-25 

Визуальное программирование: блог и телеграм-канал.

24 (edited by k245 2024-01-25 10:38:36)

Re: Запутался в связях

а потом вторую

https://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=10233&amp;download=0

Post's attachments

Attachment icon изображение_2024-01-25_133758177.png 27.04 kb, 6 downloads since 2024-01-25 

Визуальное программирование: блог и телеграм-канал.

Re: Запутался в связях

В любом случае, если проблемы при экспорте, то пофиксить это не получится. В таких случаях обычно приходится идти каким-то обходным путём...

Визуальное программирование: блог и телеграм-канал.