Как я могу сложить поля вертикально в Crystal Reports 2008 - PullRequest
3 голосов
/ 19 января 2012

Я использую Crystal Reports 2008 для разработки некоторых отчетов (в базе данных Oracle).

В моем дизайне / макете есть несколько текстовых полей, которые я хочу разместить в вертикальном стеке без пробелов.

Используя отчеты Oracle, я могу выбрать поля и выполнить выравнивание-> стек по вертикали, но в CR2008, похоже, нет подобной опции

Опция «Выровнять» имеет вершины, середины, основания, базовые линии, левые, центры, права на сетку. ни один из которых не делает то, что я хочу.

Есть ли простой способ сделать это? или мне просто нужно расположить их вручную? (возможно, используя привязку к сетке)

Ответы [ 5 ]

2 голосов
/ 30 мая 2013

I уже описал , как вручную выровнять поля с помощью диалога Размер объекта и положение. Теперь я написал скрипт Sikuli для автоматизации этого использования диалога. Я успешно использовал скрипт, чтобы сложить около 70 новых полей под уже сложенными.

Чтобы использовать этот скрипт, скопируйте и вставьте его содержимое в Sikuli IDE. Откройте Crystal Reports и найдите поле внизу существующего стека. Убедитесь, что новое поле, которое вы хотите добавить в конец стека, существует и отображается на экране. Выберите поле внизу стека. Затем переключитесь на Sikuli и нажмите Ctrl R , чтобы запустить скрипт. Он переключится на Crystal Reports и откроет диалоговое окно «Размер и положение», прочитает существующие значения для поля в нижней части стека и закроет диалоговое окно. Теперь у вас есть 1,5 секунды (настраивается), чтобы выбрать новое поле, нажав на него. Теперь скрипт снова откроет диалоговое окно «Размер и положение» и установит X, Y, Ширина и Высота так, чтобы выбранное поле было расположено под предыдущим. В частности, X, Width и Height установлены на то же поле, что и поле выше, а Y установлен так, как я описал в мой другой ответ . Вы можете изменить конфигурационную переменную VERTICAL_SPACE_BETWEEN_FIELDS, чтобы добавить пробел между каждым полем или заставить их перекрываться, если хотите.

Сценарию требуется около 5 секунд, чтобы выровнять одно поле. Если это слишком медленно, вы можете попробовать уменьшить время или удалить некоторые из вызовов wait(). Я добавил вызовы wait(), потому что сценарий иногда копировал или вставлял неправильное значение, если оно выполнялось слишком быстро.

Одна приятная особенность этого скрипта в том, что он цепной. Сразу после его завершения вновь выровненное поле все равно будет выделено. Поэтому, если у вас есть другое поле, которое вы хотите добавить под этим полем, вы можете просто запустить сценарий снова с помощью Ctrl R и подготовиться к щелчку на следующем поле в середине. Если вы планируете многократную цепочку, вы можете увеличить 1 в range(1) и добавить wait(<num_of_seconds>) ниже mainAction(), чтобы скрипт автоматически повторялся. Просто помните, что создание цепочки требует, чтобы следующее поле для добавления было видно на экране, поэтому вы можете выбрать его с помощью мыши.

Я сохранил файл сценария как «Выравнивание полей в Crystal Reports.sikuli».

# Crystal Reports: stack prompt-selected field under start-selected field

VERTICAL_SPACE_BETWEEN_FIELDS = 0.000
WAIT_TIME_FOR_USER_SELECT_NEW_FIELD = 1.5

def mainAction():
    # read size and position of bottom of stack
    above = dict()
    openSizeAndPositionDialog()
    above['x'] = copySelectedText()
    moveToNextField(2)
    above['y'] = copySelectedText()
    moveToNextField()
    above['width'] = copySelectedText()
    moveToNextField(2)
    above['height'] = copySelectedText()
    print("above", above)
    wait(0.05)
    type(Key.ESC)

    # calculate size and position of next field in stack
    new_field = dict()
    new_field['x'] = above['x']
    new_field['y'] = str(float(above['y']) + float(above['height']) + VERTICAL_SPACE_BETWEEN_FIELDS)
    new_field['width'] = above['width']
    new_field['height'] = above['height']
    print("new field", new_field)

    waitForUserToSelectNewField()

    # set size and position of next field
    openSizeAndPositionDialog()
    paste(new_field['x'])
    moveToNextField(2)
    paste(new_field['y'])
    moveToNextField()
    paste(new_field['width'])
    moveToNextField(2)
    paste(new_field['height'])
    wait(0.1)
    type(Key.ENTER)

def openSizeAndPositionDialog():
    type(Key.ALT + "a" + "z")
    wait(0.05)

def copySelectedText():
    type("c", KeyModifier.CTRL)
    wait(0.05)
    return Env.getClipboard()

def moveToNextField(numTimes=1):
    for i in range(numTimes):
        type(Key.TAB)
        wait(0.05)

def waitForUserToSelectNewField():
    # I'll do it without the popup, because switching to the popup and then closing it is a pain
    wait(WAIT_TIME_FOR_USER_SELECT_NEW_FIELD)

    #popup("select the new field to align under the old one, then press OK")
    #wait(0.2)

App.focus("Crystal Reports")
wait(0.2) # give you time to release CTRL, which would interfere with the script
for i in range(1):
    mainAction()
1 голос
/ 29 мая 2013

В качестве альтернативного метода ручного выравнивания полей, чтобы их границы касались, вы можете использовать диалог Размер объекта и положение. Вы можете получить к нему доступ, открыв меню «Формат» или контекстное меню поля, затем выбрав пункт меню «Размер и положение ...».

Object Size and Position dialog in Crystal Reports

Выполните эту процедуру, чтобы добавить новое поле в конец столбца вертикально сложенных полей:

  1. Выберите текущее нижнее поле в столбце.
  2. Открыть диалоговое окно «Размер и положение».
  3. Скопируйте значение Х вниз.
  4. Добавьте значение Y к высоте и скопируйте его вниз.
  5. Закройте диалоговое окно.
  6. Выберите новое поле, которое вы хотите переместить в конец столбца.
  7. Открытие диалогового окна «Размер и положение».
  8. Введите скопированное значение X в качестве значения X и скопированную сумму в качестве значения Y.
  9. Закройте диалоговое окно.

Если это проще, вы можете заменить шаги для значения X командой «Формат»> «Выровнять»> «Левые» (или «Центры», или «Права»).

Этот метод проще автоматизировать, чем перетаскивание полей мышью. Если вам нужно выровнять много полей, вы можете автоматизировать большую часть этой процедуры, используя AutoHotkey или Sikuli . Я действительно закончил автоматизировать это - я написал этот скрипт Sikuli .

1 голос
/ 19 января 2012

Ручной подход будет работать лучше всего.В дополнение к привязке к сетке и вертикальным направляющим, как предлагает Марк, следует также использовать несколько разделов Сведения и Заголовок группы.Множество разделов помогают лучше организовать работу.

Я избегаю «волшебников» Crystal Reports, когда могу - это после 15 лет работы с продуктом (начиная с версии 4).

1 голос
/ 19 января 2012

Если вы создаете отчет с нуля, вы сможете использовать мастер метки почты, который будет складывать выбранные поля по вертикали.

Кроме этого, единственный вариант - сделать это вручную.Я считаю, что включение Snap To Grid в меню «Параметры» помогает в этом, равно как и вставка одной вертикальной направляющей для каждого столбца, а затем перетаскивание полей для их привязки к нему.

0 голосов
/ 25 апреля 2013

Open Crystal Report Выберите поле, для которого вы хотите отобразить данные по вертикали, перейдите в поле «Формат» -> «Поворот текста» установите 90 (если вам нужны данные снизу вверх), установите 270 (если вы хотите данные сверху вниз),: -)

...