powered by simpleCommunicator - 2.0.46     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Программное копирование отчета
13 сообщений из 13, страница 1 из 1
Программное копирование отчета
    #39791849
Valeri395
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть отчет формата А4 но заполненный на половину. Нужно получить вторую копию на этом же листе. Делаю это через функцию RowsCopy. Пример кода:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
gnv_app.of_GetFrame().SetMicrohelp('Чтение данных...')

IF Not IsNull(inv_rep) and IsValid(inv_rep) THEN

	CHOOSE CASE inv_rep.of_GetMethod()
	CASE inv_rep.Retrieve

		dw_report.Reset()
		dw_report.SetFilter('')
		dw_report.Filter()

		this.event lfc_menustate('retrieveok')

		SQLCA.DBParm = 'Async = 1'
		gnv_app.of_getframe().SetMicroHelp('0')

		ll_rc = dw_report.of_SetTransObject(SQLCA)
		ll_rc = dw_report.Retrieve( &
				inv_rep.ia_Arg[ 1], inv_rep.ia_Arg[ 2], inv_rep.ia_Arg[ 3], inv_rep.ia_Arg[ 4], & 
				inv_rep.ia_Arg[ 5], inv_rep.ia_Arg[ 6], inv_rep.ia_Arg[ 7], inv_rep.ia_Arg[ 8], &
				inv_rep.ia_Arg[13], inv_rep.ia_Arg[14], inv_rep.ia_Arg[15], inv_rep.ia_Arg[16], &
				inv_rep.ia_Arg[17], inv_rep.ia_Arg[18], inv_rep.ia_Arg[19], inv_rep.ia_Arg[20])
//		if ll_rc > 0 then
//			COMMIT USING SQLCA ;
//		end if

		if ll_rc > 0 then
			COMMIT USING SQLCA ;
		end if

		SQLCA.DBParm = 'Async = 0'
		
		
		// Refresh rich text
		if long(dw_report.object.datawindow.processing)=7 then
			gnv_app.of_getframe().SetMicroHelp('1')
			dw_report.event pfc_firstpage()
			gnv_app.of_getframe().SetMicroHelp('2')
		end if
		
	CASE inv_rep.CopyAny, inv_rep.CopyBlob
		inv_rep.of_SetData(dw_report)

		this.event lfc_menustate('noretrieve')

	CASE inv_rep.Nothing

		this.event lfc_menustate('noretrieve')
		
		if long(dw_report.object.datawindow.processing)=7 then	//02.10.2001
			if dw_report.RowCount()=0 then
				dw_report.InsertRow(0)
			end if
		end if
		
	CASE ELSE
	END CHOOSE
	
	ll_RowCount=dw_report.RowCount()

	// Count copy support
	if dw_report.RowCount() > 0 and inv_rep.ii_CountCopy > 1 then
		dw_report.RowsCopy(1, dw_report.RowCount(), primary!, dw_report, &
								dw_report.RowCount()+1,	primary! )
	end if
//ll_RowCount=dw_report.RowCount()

END IF

gnv_app.of_GetFrame().SetMicrohelp('Готово')



Как сместить второй скопированный отчет относительно конца первого. Нужно увеличить расстояние между этими "отчетами".
Изменение параметра detail отчета не подходит, так как он тоже копируется и выносит копию на второй лист.
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39792183
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeri395,
1. Можно тупо прописать Y для всех объектов в зависимости от номера строки.
2. Можно сделать новое DW. В него добавить 2 Nesteda: один пустой, второй - наш DataObject.
Играться с видимостью пустого. Нижний Nested с данными будет прыгать вверх-вниз сам.
3. Можно в скрипте (или в дизайнере) добавить поле, пройтись по всем объектам и дописать Y= Y+число из этого поля.
В первой строке там будет 0, во второй - кол-во пикселей сдвига.
4. Да как угодно! Любой другой способ! Для этого нет никакой надобности приводить кусок кода.
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39792633
Valeri395
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Riska,

Я не профи в РВ и поэтому задал здесь этот вопрос. Отчет сам по себе сложный. В зависимости от состояния документа, который надо печатать, печатается или одна или две копии. Так же может печаться в бланк или на чистый лист. Из за этого не подходит пример с Nested. Так же не подходит тупое копирование всех строк в отчете.
dw_report - это полученная строка отчета. После копирования создается вторая строка. Как обратиться к свойству отчета?
Код: sql
1.
detail(height=13731 color="553648127" ) 

И как работать отдельно с первой и второй строкой?

Свойство dw_report:
Код: sql
1.
2.
3.
4.
5.
global type lfc_w_report_base from w_sheet

type dw_report from u_dw_report within lfc_w_report_base

global type lfc_u_dw_report from u_dw  
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39792798
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K какому свойству обратиться?
Если к detail, то так:
Код: sql
1.
dw_report.Object.DataWindow.Detail.Height


И как работать отдельно с первой и второй строкой?
Если сложно сделать это из скрипта, то можно в Expression каждого объекта (в Y) прописать такое:
Код: sql
1.
if(getrow() > 1, новое_значение, значение_для_первой_строки)


P.S. на всякий случай: Expression - см. картинку
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39792803
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не забыть еще поставить галочку в Autosize Height для Detail
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39792891
Valeri395
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Riska,

Спасибо за наводку с позицией объекта по Y. Но это то же не подходит. Во первых в отчете более 500 объектов. Объекты все мелкие.
Самое главное, что в этом случае позиция по Y будет в абсолютных цифрах. А надо в относительных: надо считать размер текущего Y у объекта и прибавить величину смещения(она для всех объектах отчета одинакова относительно своего положения). Это нужно для подстройки печати отчета в бланк ( у типографии может "гулять" напечатанный бланк от нового заказа). Как перебрать все объекты отчета и заменить во второй строке свойство по Y в скрипте? Или есть возможность в Expression программно получить значение текущего объекта Y.
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39793085
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeri395,
Как перебрать все объекты отчета
Код: sql
1.
describe("datawindow.objects")


Парсить по
Код: sql
1.
~t
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39793478
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто сделайте для печати как вам советовали 2 Nested report и копируйте туда данные
Если один из них будет пустой, то и виден он не будет
Можете программно сделать destroy
Это гораздо проще
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39793600
Valeri395
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На отчете еще есть кнопки, которые задают что печатать. От кнопки зависит печатаются отчет с копией или нет. Еще nest отчет нельзя редактировать в программе ( у пользователей есть простейший редактор отчетов).
Там то же надо мудрить.

Теоретически можно пойти по такому алгоритму:

создать копию строки 2 через RowsCopy. Обратиться к созданной строке по номеру (2). Удалить данные из этой строки. Записать туда прямоугольник определенного размера. Создать копию 3 из строки 1. Размерами прямоугольника можно двигать копию на листе.

На сколько я понял при RowsCopy копируется только Detal отчета с height.
Практически не знаю как обращаться к строке по номеру и как с ней работать.

Прошу не особо ругаться, если написал чушь.
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39793728
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чушь конечно
Пусть отредактируют все что нужно, а потом вложенным отчетам передать все что есть в этом перед печатью
Ну то есть присвоить тот же dataobject и скопировать строки или попробвать через blob - GetFullState/SetFullState
а вы что-то страшное пишите, чуть ли не создание с нуля))
Допускаю что так можно, но просто почитайте про вложенные отчеты хотя бы тут на форуме
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39793953
Valeri395
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
spas2001,

Nested не подходит. В нем перестают отрабатывать "расширенные" функции такая как скрыть перед печатью. Работает так: при нажатии кнопки принтер на экран выводится превью отчета. Он показывается полностью. При повторном нажатии на печать появляется окно выбора принтера и скрывается не печатный текст.

А можно ограничить отчет только одной страницей, что не "влезает" обрезать?
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39794189
Valeri395
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Профи на форуме не остались или они проходят мимо. Ну решаем сами.

Решение очень простое:
используем метод
Код: sql
1.
 dwcontrol.SetDetailHeight ( long startrow, long endrow , long height )


Сделан специально для DW у которых более одной строки.

Ну а реализация очень простая:
в программе уже был механизм модификации отчета с помощью команд из ini файла
в ini файле прописывает
Код: sql
1.
2.
expr19 = SetDetailHeight(1, 1,14772 )
expr20= SetDetailHeight(2, 2, 13772 )



В скрипте тривиально:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CHOOSE CASE as_functionname
CASE 'setdetailheight'
	ll_Row1 = long(trim(ls_Args[1]))	// start row
	ll_Row2 = long(trim(ls_Args[2]))	// end row
	ls_value= trim(ls_Args[3])			// height
	li_height=long(ls_value)
	if ll_Row2<=0 then ll_Row2=ll_RowCount
	li_rc = idw_requestor.SetDetailHeight(ll_Row1,ll_Row2,li_height)
	return li_rc



Если кому то интересно можно подробнее. Но идея понятна.
...
Рейтинг: 0 / 0
Программное копирование отчета
    #39794285
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически можно пойти по такому алгоритму:
создать копию строки 2 через RowsCopy. Обратиться к созданной строке по номеру (2). Удалить данные из этой строки. Записать туда прямоугольник определенного размера. Создать копию 3 из строки 1. Размерами прямоугольника можно двигать копию на листе.

Практически это не пройдет.
Данные во второй строке удалятся, а размеры Detail остануться.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Программное копирование отчета
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]