Как я могу создать диаграмму Ганта в окне данных (Powerbuilder) - PullRequest
4 голосов
/ 05 марта 2010

Я хочу довольно простое (и дешевое) решение, просто для целей презентации (и просто для отображения полос длительности задачи - между ними нет линий связи). Так что я не заинтересован в покупке какого-либо расширенного пользовательского элемента управления, например, this . Кто-нибудь из вас когда-либо использовал что-то подобное? Есть ли примеры кода?

Ответы [ 2 ]

4 голосов
/ 05 марта 2010

Я бы указал на сайт Бака Вулли на dwExtreme для примера того, как сделать Гант в собственном DataWindow. Тем не менее, «простой» я не думаю, что в вашем будущем, если вы хотите, чтобы бросить свой собственный. На самом деле, я буду приятно удивлен, если кто-то напишет сообщение, содержащее полное описание; Я думаю, что это заняло бы страницы. (Я был бы рад, если бы кто-то доказал, что я не прав.) А пока вот некоторые основы DataWindow, которые, я думаю, вам понадобятся:

  • Вы можете создать внешнее окно DataWindow, источник данных которого не привязан к таблице
  • Столбцы в наборе данных не должны отображаться в интерфейсе пользователя.
  • Столбцы в наборе данных могут использоваться в выражениях для оценки атрибутов, поэтому у вас может быть столбец для каждого из следующих атрибутов прямоугольника:
    • х
    • ширина
    • цвет

Я ожидаю, что это будет много работы и времени, и, скорее всего, будет стоить покупки компонента (если ваше время не оценивается практически в ничто, что в некоторых ИТ-магазинах близко к истине).

Удачи,

Terry

2 голосов
/ 10 марта 2010

Gantt chart in PowerBuilder
(источник: illudium.com )

Вы можете создать простую диаграмму Ганта со столбчатой ​​диаграммой с накоплением (BarStacked (5) в рисователе). Хитрость заключается в том, чтобы создать фиктивную серию, чтобы расположить панель там, где вы хотите, и сделать фиктивную панель того же цвета, что и фон графика (BackColor). Оказывается, вам также нужен еще один фиктивный ряд с небольшим значением, чтобы сидеть на оси. В противном случае, когда вы меняете цвет полосы, которая выполняет интервал, линия оси обрезается. Я обнаружил, что .04 хорошо работает для этого значения.

Создание окна данных

(Предполагается, что вы знакомы с мастером DataWindow. Подробнее о создании графиков в DataWindows см. В Руководстве пользователя PowerBuilder)

Щелкните значок мастера создания нового объекта. Создайте окно Data Graph с внешним источником данных. Создайте строку типа задачи столбцы (20), строку типа ser (1) и номер типа дней. Установите категорию в столбце задачи и значения в столбце дней. Нажмите кнопку «Серия» и выберите «ser» для серии. Не беспокойтесь о названии и выберите тип гистограммы с накоплением. Когда художник откроется, сохраните DataWindow. На вкладке «Основные» в Painter измените «Легенду» на «Нет» (0). На вкладке «Ось» выберите ось «Категория», затем установите для сортировки значение «Не отсортировано» (0). Выберите ось Value, затем установите сортировку на Unsorted (0). Выберите ось Серии и установите сортировку по возрастанию (1). Сохраните окно данных.

Создать окно

Создайте окно и поместите элемент управления DataWindow, dw_1. Установите объект данных для вашего графика DataWindow. Поместите следующее в событие open (или pfc_postopen при использовании PFC).

try

    dw_1.setRedraw(FALSE)

    // LOAD DATA HERE

    dw_1.object.gr_1.title = 'Project PBL Pusher'
    dw_1.object.gr_1.category.label = 'Phase'
    dw_1.object.gr_1.values.label = 'Project-Days'


catch (runtimeerror re)
    if isvalid(gnv_app.inv_debug) then gnv_app.inv_debug.of_message(re.text)    // could do better
finally
    dw_1.setRedraw(TRUE)
end try

Вы бы загрузили данные для своего графика, где комментарий говорит // LOAD DATA HERE

Скрипт графика создания события

Добавить новое событие в dw_1. Выберите pbm_dwngraphcreate для идентификатора события. Мне нравится называть эти события, удаляя префикс pbm_dwn, поэтому я использую graphcreate. Добавьте следующий код к событию.

string ls_series
long li_color

try


    li_color=long(dw_1.object.gr_1.backcolor)

    // note first series is a dummy with a small value (0.04 seems to work) to keep the line from being hidden
    ls_series = dw_1.seriesName("gr_1", 2)
    if 0 = len(ls_series) then return       // maybe show error message

    // will return -1 when you set color same as the graph's backcolor but it sets the color
    dw_1.setSeriesStyle("gr_1", ls_series, BackGround!, li_color)   // the box
    dw_1.setSeriesStyle("gr_1", ls_series, ForeGround!, li_color)   // the inside

catch (runtimeerror re)
    if isvalid(gnv_app.inv_debug) then gnv_app.inv_debug.of_message(re.text)    // could do better
end try

Данные для графика

Загрузка данных с категориями в порядке, обратном тому, что вы хотите. Для каждой задачи вставьте 3 строки и установите серии a, b и c соответственно. Для серии a в каждой задаче установите небольшое значение. Я использовал 0,04. Возможно, вам придется экспериментировать. Для серии b в каждой задаче установите количество дней до начала. Для серии c установите количество дней. Ниже приведены данные в примере DataWindow.

    Task    Ser Days
    ----    --- ----
    Test    a   0.04
    Test    b   24
    Test    c   10
    Develop a   0.04
    Develop b   10
    Develop c   14
    Design  a   0.04
    Design  b   0
    Design  c   10

Пример окна данных

Ниже приведен источник для примера DataWindow в формате экспорта. Вы должны иметь возможность импортировать в любую версию> = PB 10. Скопируйте код и вставьте его в файл с расширением SRD, а затем импортируйте его.

HA$PBExportHeader$d_graph.srd
release 10;
datawindow(units=0 timer_interval=0 color=1073741824 processing=3 HTMLDW=no print.printername="" print.documentname="" print.orientation = 1 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.canusedefaultprinter=yes print.prompt=no print.buttons=no print.preview.buttons=no print.cliptext=no print.overrideprintjob=no print.collate=yes hidegrayline=no )
summary(height=0 color="536870912" )
footer(height=0 color="536870912" )
detail(height=0 color="536870912" )
table(column=(type=char(10) updatewhereclause=yes name=task dbname="task" )
 column=(type=char(1) updatewhereclause=yes name=ser dbname="ser" )
 column=(type=number updatewhereclause=yes name=days dbname="days" )
 )
data("Test","a", 0.04,"Test","b", 24,"Test","c", 10,"Develop","a", 0.04,"Develop","b", 10,"Develop","c", 14,"Design","a", 0.04,"Design","b", 0,"Design","c", 10,) 
graph(band=background height="1232" width="2798" graphtype="5" perspective="2" rotation="-20" color="0" backcolor="16777215" shadecolor="8355711" range= 0 border="3" overlappercent="0" spacing="100" plotnulldata="0" elevation="20" depth="100"x="0" y="0" height="1232" width="2798"  name=gr_1 visible="1"  sizetodisplay=1  series="ser"  category="task"  values="days"  title="Title"  title.dispattr.backcolor="553648127"  title.dispattr.alignment="2"  title.dispattr.autosize="1"  title.dispattr.font.charset="0"  title.dispattr.font.escapement="0"  title.dispattr.font.face="Tahoma"  title.dispattr.font.family="2"  title.dispattr.font.height="0"  title.dispattr.font.italic="0"  title.dispattr.font.orientation="0"  title.dispattr.font.pitch="2"  title.dispattr.font.strikethrough="0"  title.dispattr.font.underline="0"  title.dispattr.font.weight="700"  title.dispattr.format="[general]"  title.dispattr.textcolor="0"  title.dispattr.displayexpression="title"  legend="0"  legend.dispattr.backcolor="536870912"  legend.dispattr.alignment="0"  legend.dispattr.autosize="1"  legend.dispattr.font.charset="0"  legend.dispattr.font.escapement="0"  legend.dispattr.font.face="Tahoma"  legend.dispattr.font.family="2"  legend.dispattr.font.height="0"  legend.dispattr.font.italic="0"  legend.dispattr.font.orientation="0"  legend.dispattr.font.pitch="2"  legend.dispattr.font.strikethrough="0"  legend.dispattr.font.underline="0"  legend.dispattr.font.weight="400"  legend.dispattr.format="[general]"  legend.dispattr.textcolor="553648127"  legend.dispattr.displayexpression="' '" 
    series.autoscale="1" 
    series.displayeverynlabels="0"  series.droplines="0"  series.frame="1"  series.label="(None)"  series.majordivisions="0"  series.majorgridline="0"  series.majortic="3"  series.maximumvalue="0"  series.minimumvalue="0"  series.minordivisions="0"  series.minorgridline="0"  series.minortic="1"  series.originline="1"  series.primaryline="1"  series.roundto="0"  series.roundtounit="0"  series.scaletype="1"  series.scalevalue="1"  series.secondaryline="0"  series.shadebackedge="0"  series.dispattr.backcolor="536870912"  series.dispattr.alignment="0"  series.dispattr.autosize="1"  series.dispattr.font.charset="0"  series.dispattr.font.escapement="0"  series.dispattr.font.face="Tahoma"  series.dispattr.font.family="2"  series.dispattr.font.height="0"  series.dispattr.font.italic="0"  series.dispattr.font.orientation="0"  series.dispattr.font.pitch="2"  series.dispattr.font.strikethrough="0"  series.dispattr.font.underline="0"  series.dispattr.font.weight="400"  series.dispattr.format="[general]"  series.dispattr.textcolor="0"  series.dispattr.displayexpression="series"  series.labeldispattr.backcolor="553648127"  series.labeldispattr.alignment="2"  series.labeldispattr.autosize="1"  series.labeldispattr.font.charset="0"  series.labeldispattr.font.escapement="0"  series.labeldispattr.font.face="Tahoma"  series.labeldispattr.font.family="2"  series.labeldispattr.font.height="0"  series.labeldispattr.font.italic="0"  series.labeldispattr.font.orientation="0"  series.labeldispattr.font.pitch="2"  series.labeldispattr.font.strikethrough="0"  series.labeldispattr.font.underline="0"  series.labeldispattr.font.weight="400"  series.labeldispattr.format="[general]"  series.labeldispattr.textcolor="0"  series.labeldispattr.displayexpression=" seriesaxislabel"  series.sort="1" 
    category.autoscale="1" 
    category.displayeverynlabels="0"  category.droplines="0"  category.frame="1"  category.label="(None)"  category.majordivisions="0"  category.majorgridline="0"  category.majortic="3"  category.maximumvalue="0"  category.minimumvalue="0"  category.minordivisions="0"  category.minorgridline="0"  category.minortic="1"  category.originline="0"  category.primaryline="1"  category.roundto="0"  category.roundtounit="0"  category.scaletype="1"  category.scalevalue="1"  category.secondaryline="0"  category.shadebackedge="1"  category.dispattr.backcolor="556870912"  category.dispattr.alignment="1"  category.dispattr.autosize="1"  category.dispattr.font.charset="0"  category.dispattr.font.escapement="0"  category.dispattr.font.face="Tahoma"  category.dispattr.font.family="2"  category.dispattr.font.height="0"  category.dispattr.font.italic="0"  category.dispattr.font.orientation="0"  category.dispattr.font.pitch="2"  category.dispattr.font.strikethrough="0"  category.dispattr.font.underline="0"  category.dispattr.font.weight="400"  category.dispattr.format="[general]"  category.dispattr.textcolor="0"  category.dispattr.displayexpression="category"  category.labeldispattr.backcolor="556870912"  category.labeldispattr.alignment="2"  category.labeldispattr.autosize="1"  category.labeldispattr.font.charset="0"  category.labeldispattr.font.escapement="900"  category.labeldispattr.font.face="Tahoma"  category.labeldispattr.font.family="2"  category.labeldispattr.font.height="0"  category.labeldispattr.font.italic="0"  category.labeldispattr.font.orientation="900"  category.labeldispattr.font.pitch="2"  category.labeldispattr.font.strikethrough="0"  category.labeldispattr.font.underline="0"  category.labeldispattr.font.weight="400"  category.labeldispattr.format="[general]"  category.labeldispattr.textcolor="0"  category.labeldispattr.displayexpression="categoryaxislabel"  category.sort="0" 
    values.autoscale="1" 
    values.displayeverynlabels="0"  values.droplines="0"  values.frame="1"  values.label="(None)"  values.majordivisions="0"  values.majorgridline="0"  values.majortic="3"  values.maximumvalue="1500"  values.minimumvalue="0"  values.minordivisions="0"  values.minorgridline="0"  values.minortic="1"  values.originline="1"  values.primaryline="1"  values.roundto="0"  values.roundtounit="0"  values.scaletype="1"  values.scalevalue="1"  values.secondaryline="0"  values.shadebackedge="0"  values.dispattr.backcolor="556870912"  values.dispattr.alignment="2"  values.dispattr.autosize="1"  values.dispattr.font.charset="0"  values.dispattr.font.escapement="0"  values.dispattr.font.face="Tahoma"  values.dispattr.font.family="2"  values.dispattr.font.height="0"  values.dispattr.font.italic="0"  values.dispattr.font.orientation="0"  values.dispattr.font.pitch="2"  values.dispattr.font.strikethrough="0"  values.dispattr.font.underline="0"  values.dispattr.font.weight="400"  values.dispattr.format="[General]"  values.dispattr.textcolor="0"  values.dispattr.displayexpression="value"  values.labeldispattr.backcolor="553648127"  values.labeldispattr.alignment="2"  values.labeldispattr.autosize="1"  values.labeldispattr.font.charset="0"  values.labeldispattr.font.escapement="0"  values.labeldispattr.font.face="Tahoma"  values.labeldispattr.font.family="2"  values.labeldispattr.font.height="0"  values.labeldispattr.font.italic="0"  values.labeldispattr.font.orientation="0"  values.labeldispattr.font.pitch="2"  values.labeldispattr.font.strikethrough="0"  values.labeldispattr.font.underline="0"  values.labeldispattr.font.weight="700"  values.labeldispattr.format="[general]"  values.labeldispattr.textcolor="0"  values.labeldispattr.displayexpression="valuesaxislabel" )
htmltable(border="1" )
htmlgen(clientevents="1" clientvalidation="1" clientcomputedfields="1" clientformatting="0" clientscriptable="0" generatejavascript="1" encodeselflinkargs="1" netscapelayers="0" )
xhtmlgen() cssgen(sessionspecific="0" )
xmlgen(inline="0" )
xsltgen()
jsgen()
export.xml(headgroups="1" includewhitespace="0" metadatatype=0 savemetadata=0 )
import.xml()
export.pdf(method=0 distill.custompostscript="0" xslfop.print="0" )
export.xhtml()
...