Допоможіть розібратися в такій ситуації. Я для себе зробив шаблон тех. документації, робив сам, тому думаю, що маю багато помилок. Я вам трошки опишу а ви підскажіть що потрібно виправити.
"Технічна документація із землеустрою щодо складання документів, що посвідчують право власності на [Count1] земельні ділянки, загальною площею [FORMATFLOAT('0.0000', SumArea /10000)]"
[FORMATFLOAT('0.0000', SumArea /10000)] - цю площу воно прощитує після того як я откриваю репорт "Решение про передачу земельних учасков в собственость"
[Count1] бере з "Экспликация по маркировке"
Тобто я спочатку відкриваю ці репорти а потім уже репорт технічної документації.
Чи можливо замінити це [FORMATFLOAT('0.0000', SumArea /10000)] на якийсь другий? Справа в тому що прощитує воно в м. кв., коли воно сумує площу декількох ділянок (приклад 1227,6+1322,89=2550, а потрібно 2549 бо площа йде в га. ) то вилазить 1 метр кв. при заокругленні.
Питання по змінним в звітових формах
Модератор: NickS
Re: Вопросы по переменным в отчётных формах
Отже так. По-порядку. SumArea, Count1 - це так званні значення змінних. Змінні ви можете створювати свої. І вони можуть мати будь-яке ім'я латинськими буквами і цифрами (першою має бути обов'язково буква, а потім уже можуть бути цифри). Щоб створити змінну потрібно просто присвоїти їй якесь значення. Наприклад:
SumArea := 12
Коли створюється якась змінна, то вона буде мати це значення доти поки ви не закриєте программу, або поки не присвоїте для неї інше значення. От тому, щоб працював ваш репорт ви спочатку відкриваєте ті репорти, де присвоюється значення змінним, а потім вже в своєму репорті використовуєте це значення. Взагаліто це не правильно. Вам потрібно навчитись разом із змінною копіювати в свій репорт ще і код (скрипт), який формує цю змінну. Його ви можете подивитись до любого обєкта в якому він є, виділивши цей об'єкт і натиснувши Alt+Enter. Об'єкти зі скриптом позначаються маленькою книжечкою в лівому верхньому куті. А ще самий основний код може бути, якщо клацнути мишкою в пустому полі і в інспекторі натиснути кнопочку "..." вибравши "OnBeforePrint". (Щоб показати Інспектора: Сервіс/Панели инструментов/Инспектор)
Якщо детально вивчити алгоритм потрібного репорта, де формується змінна (іноді це не так і просто), то можна виділити код формування і записати його у свій репорт. І не потрібно буде відкривати якісь інші репорти. Для цих двох змінних я Вам сам виділю. Якщо будуть складнощі з іншими змінними - пишіть - допоможу.
Для SumArea:
SumArea := 0; //Очищаєм змінну
[QUERYSQL('Select * From SubGis G, Gis P Where P.Poligon = G.Code And G.Ok = ''ю''')];
DATAFIRST('DataModule1.QuerySQL');
While Not DATAEOF( 'DataModule1.QuerySQL') Do
Begin
SumArea := SumArea +[DataModule1.QuerySQL."Ixp1"];
DATANEXT('DataModule1.QuerySQL');
End;
Для Count1:
Count1 := 0; //Очищаєм змінну
[QUERYSQL( 'Select O.Bring_Y Color, O.House, P.Family, O.Ixp1 Area From SubGis O, Gis P Where P.Poligon = O.Code And O.Ok = ''ю'' And
(O.Bring_Y = 0 Or O.Bring_Y IS NULL) Order By O.Bring_Y')];
Count1 := RECORDCOUNT('DataModule1.QuerySQL');
Проще кажучи. Зайдіть в основний скрипт репорта (Клацніть лівою кнопочкою мишки по чистому полю репорта, в інспекторі виберіть "OnBeforePrint" і натисни кнопочку "..."). Зявиться віконечко яке буде виглядати так:
Begin
End
От між між цими словами поставте курсор і вставте оцей код:
Count1 := 0; //Очищаєм змінну
[QUERYSQL( 'Select O.Bring_Y Color, O.House, P.Family, O.Ixp1 Area From SubGis O, Gis P Where P.Poligon = O.Code And O.Ok = ''ю'' And
(O.Bring_Y = 0 Or O.Bring_Y IS NULL) Order By O.Bring_Y')];
Count1 := RECORDCOUNT('DataModule1.QuerySQL');
//----------------
SumArea := 0; //Очищаєм змінну
[QUERYSQL('Select * From SubGis G, Gis P Where P.Poligon = G.Code And G.Ok = ''ю''')];
DATAFIRST('DataModule1.QuerySQL');
While Not DATAEOF( 'DataModule1.QuerySQL') Do
Begin
SumArea := SumArea +[DataModule1.QuerySQL."Ixp1"];
DATANEXT('DataModule1.QuerySQL');
End;
Повторю ще раз. Саме поставити потрібно між словами Begin i End. В результаті вийде таке:
Begin
Count1 := 0; //Очищаєм змінну
[QUERYSQL( 'Select O.Bring_Y Color, O.House, P.Family, O.Ixp1 Area From SubGis O, Gis P Where P.Poligon = O.Code And O.Ok = ''ю'' And
(O.Bring_Y = 0 Or O.Bring_Y IS NULL) Order By O.Bring_Y')];
Count1 := RECORDCOUNT('DataModule1.QuerySQL');
//----------------
SumArea := 0; //Очищаєм змінну
[QUERYSQL('Select * From SubGis G, Gis P Where P.Poligon = G.Code And G.Ok = ''ю''')];
DATAFIRST('DataModule1.QuerySQL');
While Not DATAEOF( 'DataModule1.QuerySQL') Do
Begin
SumArea := SumArea +[DataModule1.QuerySQL."Ixp1"];
DATANEXT('DataModule1.QuerySQL');
End;
End.
От тепер змінні будуть автоматично формуватись при відкритті вашого репорта. А тепер перейдем до слідуючого вашого запитання. Як діє ось цей рідок?
[FORMATFLOAT('0.0000', SumArea /10000)]
Він бере значення змінної SumArea (в ній знаходиться сумарна площа в кв.м.). Потім ділить на 10000 - в результаті отримуєм в гектарах і потім округляє до четвертого знака після коми. Це вказано тут:
'0.0000'
Щоб округлити до шостого знака, виправте ось так:
[FORMATFLOAT('0.000000', SumArea /10000)]
Отже скільки нулів після крапочки, до такого розряду і буде округляти число. Якщо вам не потрібно в гектарах, а потрібно в кв.м., то просто приберіть ділення на 10000, щоб вийшло так:
[FORMATFLOAT('0.0000', SumArea)]
Але це якщо вам потрібно в репорті специфічно округлити значення. А якщо ви хочете для своїх репортів стандартне значення округлення ставити і потім змінивши його в налаштуваннях программи, щоб відповядно змінювалось і в шаблонах, то тоді вам потрібно скоректувати цей рядок так:
для гектарів:
[FORMATFLOAT([fdLandAreaG], SumArea /10000)]
для кв.м.:
[FORMATFLOAT([fdLandAreaM], SumArea)]
fdLandAreaG, fdLandAreaM - це змінні відповідно для гектарів і кв.м., які формуються при запуску програми (їх не потрібно створювати) і в них заноситься значення яке ви задали в налаштуваннях программи (Сервис/Установки системы/Расчёты/Площадь участка)
fdLandAreaM - "округление до знака после запятой, м.кв"
fdLandAreaG - "округление до знака после запятой, га"
Отже, якщо ви в своїх шаблонах будете використовувати ці змінні (fdLandAreaG, fdLandAreaM), то ви зможете міняти розряд округлення один раз для всих шалонів. Це зручно.
SumArea := 12
Коли створюється якась змінна, то вона буде мати це значення доти поки ви не закриєте программу, або поки не присвоїте для неї інше значення. От тому, щоб працював ваш репорт ви спочатку відкриваєте ті репорти, де присвоюється значення змінним, а потім вже в своєму репорті використовуєте це значення. Взагаліто це не правильно. Вам потрібно навчитись разом із змінною копіювати в свій репорт ще і код (скрипт), який формує цю змінну. Його ви можете подивитись до любого обєкта в якому він є, виділивши цей об'єкт і натиснувши Alt+Enter. Об'єкти зі скриптом позначаються маленькою книжечкою в лівому верхньому куті. А ще самий основний код може бути, якщо клацнути мишкою в пустому полі і в інспекторі натиснути кнопочку "..." вибравши "OnBeforePrint". (Щоб показати Інспектора: Сервіс/Панели инструментов/Инспектор)
Якщо детально вивчити алгоритм потрібного репорта, де формується змінна (іноді це не так і просто), то можна виділити код формування і записати його у свій репорт. І не потрібно буде відкривати якісь інші репорти. Для цих двох змінних я Вам сам виділю. Якщо будуть складнощі з іншими змінними - пишіть - допоможу.
Для SumArea:
SumArea := 0; //Очищаєм змінну
[QUERYSQL('Select * From SubGis G, Gis P Where P.Poligon = G.Code And G.Ok = ''ю''')];
DATAFIRST('DataModule1.QuerySQL');
While Not DATAEOF( 'DataModule1.QuerySQL') Do
Begin
SumArea := SumArea +[DataModule1.QuerySQL."Ixp1"];
DATANEXT('DataModule1.QuerySQL');
End;
Для Count1:
Count1 := 0; //Очищаєм змінну
[QUERYSQL( 'Select O.Bring_Y Color, O.House, P.Family, O.Ixp1 Area From SubGis O, Gis P Where P.Poligon = O.Code And O.Ok = ''ю'' And
(O.Bring_Y = 0 Or O.Bring_Y IS NULL) Order By O.Bring_Y')];
Count1 := RECORDCOUNT('DataModule1.QuerySQL');
Проще кажучи. Зайдіть в основний скрипт репорта (Клацніть лівою кнопочкою мишки по чистому полю репорта, в інспекторі виберіть "OnBeforePrint" і натисни кнопочку "..."). Зявиться віконечко яке буде виглядати так:
Begin
End
От між між цими словами поставте курсор і вставте оцей код:
Count1 := 0; //Очищаєм змінну
[QUERYSQL( 'Select O.Bring_Y Color, O.House, P.Family, O.Ixp1 Area From SubGis O, Gis P Where P.Poligon = O.Code And O.Ok = ''ю'' And
(O.Bring_Y = 0 Or O.Bring_Y IS NULL) Order By O.Bring_Y')];
Count1 := RECORDCOUNT('DataModule1.QuerySQL');
//----------------
SumArea := 0; //Очищаєм змінну
[QUERYSQL('Select * From SubGis G, Gis P Where P.Poligon = G.Code And G.Ok = ''ю''')];
DATAFIRST('DataModule1.QuerySQL');
While Not DATAEOF( 'DataModule1.QuerySQL') Do
Begin
SumArea := SumArea +[DataModule1.QuerySQL."Ixp1"];
DATANEXT('DataModule1.QuerySQL');
End;
Повторю ще раз. Саме поставити потрібно між словами Begin i End. В результаті вийде таке:
Begin
Count1 := 0; //Очищаєм змінну
[QUERYSQL( 'Select O.Bring_Y Color, O.House, P.Family, O.Ixp1 Area From SubGis O, Gis P Where P.Poligon = O.Code And O.Ok = ''ю'' And
(O.Bring_Y = 0 Or O.Bring_Y IS NULL) Order By O.Bring_Y')];
Count1 := RECORDCOUNT('DataModule1.QuerySQL');
//----------------
SumArea := 0; //Очищаєм змінну
[QUERYSQL('Select * From SubGis G, Gis P Where P.Poligon = G.Code And G.Ok = ''ю''')];
DATAFIRST('DataModule1.QuerySQL');
While Not DATAEOF( 'DataModule1.QuerySQL') Do
Begin
SumArea := SumArea +[DataModule1.QuerySQL."Ixp1"];
DATANEXT('DataModule1.QuerySQL');
End;
End.
От тепер змінні будуть автоматично формуватись при відкритті вашого репорта. А тепер перейдем до слідуючого вашого запитання. Як діє ось цей рідок?
[FORMATFLOAT('0.0000', SumArea /10000)]
Він бере значення змінної SumArea (в ній знаходиться сумарна площа в кв.м.). Потім ділить на 10000 - в результаті отримуєм в гектарах і потім округляє до четвертого знака після коми. Це вказано тут:
'0.0000'
Щоб округлити до шостого знака, виправте ось так:
[FORMATFLOAT('0.000000', SumArea /10000)]
Отже скільки нулів після крапочки, до такого розряду і буде округляти число. Якщо вам не потрібно в гектарах, а потрібно в кв.м., то просто приберіть ділення на 10000, щоб вийшло так:
[FORMATFLOAT('0.0000', SumArea)]
Але це якщо вам потрібно в репорті специфічно округлити значення. А якщо ви хочете для своїх репортів стандартне значення округлення ставити і потім змінивши його в налаштуваннях программи, щоб відповядно змінювалось і в шаблонах, то тоді вам потрібно скоректувати цей рядок так:
для гектарів:
[FORMATFLOAT([fdLandAreaG], SumArea /10000)]
для кв.м.:
[FORMATFLOAT([fdLandAreaM], SumArea)]
fdLandAreaG, fdLandAreaM - це змінні відповідно для гектарів і кв.м., які формуються при запуску програми (їх не потрібно створювати) і в них заноситься значення яке ви задали в налаштуваннях программи (Сервис/Установки системы/Расчёты/Площадь участка)
fdLandAreaM - "округление до знака после запятой, м.кв"
fdLandAreaG - "округление до знака после запятой, га"
Отже, якщо ви в своїх шаблонах будете використовувати ці змінні (fdLandAreaG, fdLandAreaM), то ви зможете міняти розряд округлення один раз для всих шалонів. Це зручно.