protected abstract void buildReport(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData data);
protected override void buildReport(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData data) { IDictionary f = null; IDataReader r = data.DataProvider.GetDataReader("dsMain", data.CustomData); if (r.Read()) { f = _GetDataFromDataRow(r); } if (null == f) { // Сотрудник не найден writeEmptyBody(data.RepGen, "Сотрудник не найден"); return; } data.RepGen.WriteLayoutMaster(); data.RepGen.StartPageSequence(); data.RepGen.StartPageBody(); StringBuilder sb = new StringBuilder(""); sb.AppendFormat("<fo:block font-weight='bold' font-size='18px'> {0}</fo:block>", f["EmpName"]); sb.Append("<fo:block/>"); sb.Append("<fo:table color='#FFFFFF' text-align='left' font-size='12px' font-family='MS Sans-serif'>"); sb.Append("<fo:table-column/>"); sb.Append("<fo:table-column/>"); sb.Append("<fo:table-column/>"); sb.Append("<fo:table-body>"); sb.Append("<fo:table-row>"); sb.AppendFormat("<fo:table-cell width='25%'><fo:block><fo:external-graphic src=\"x-get-image.aspx?OT=Employee&PN=Picture&ID={0}\" height=\"240\" width=\"240\" /> </fo:block></fo:table-cell>", xmlEncode(f["ObjectID"])); sb.Append("<fo:table-cell width='35%'>"); sb.AppendFormat("<fo:block> {0} </fo:block>", xmlEncode(f["DepName"])); sb.AppendFormat("<fo:block padding-top='10px'> Дата выхода на работу: {0} </fo:block>", r.GetDateTime(2).ToShortDateString()); sb.Append("</fo:table-cell>"); sb.Append("</fo:table-row>"); sb.Append("<fo:table-row>"); //sb.AppendFormat("<fo:table-cell width='35%'><fo:block> Дата выхода на работу: {0} </fo:block></fo:table-cell>",xmlEncode(f["WorkBeginDate"])); sb.Append("<fo:table-cell><fo:block> </fo:block></fo:table-cell>"); sb.Append("</fo:table-row>"); sb.Append("</fo:table-body>"); sb.Append("</fo:table>"); sb.Append("<fo:table color='#FFFFFF' text-align='left' font-size='12px' font-family='MS Sans-serif'>"); sb.Append("<fo:table-column/>"); sb.Append("<fo:table-column/>"); sb.Append("<fo:table-body>"); sb.Append("<fo:table-row>"); sb.Append("<fo:table-cell width='50%'>"); sb.Append("<fo:block font-weight='bold' text-align='left' padding-top='10px'> Место работы: </fo:block>"); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'> Адрес: {0} </fo:block>", xmlEncode(f["Address"])); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'> Тел.: {0} </fo:block>", xmlEncode(f["APhone"])); sb.AppendFormat("</fo:table-cell>"); sb.Append("<fo:table-cell width='50%'>"); sb.Append("<fo:block font-weight='bold' text-align='left' padding-top='10px'> Номера телефонов: </fo:block>"); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'> Рабочие: {0} </fo:block>", xmlEncode(f["PhoneExt"])); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'> Мобильный: {0} </fo:block>", xmlEncode(f["MobilePhone"])); sb.AppendFormat("</fo:table-cell>"); sb.Append("</fo:table-row>"); sb.Append("<fo:table-row>"); sb.Append("<fo:table-cell width='50%'>"); sb.Append("<fo:block font-weight='bold' text-align='left' padding-top='10px'> E-Mail: </fo:block>"); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'> {0} </fo:block>", xmlEncode(f["Email"])); sb.AppendFormat("</fo:table-cell>"); sb.Append("<fo:table-cell width='50%'>"); sb.Append("<fo:block font-weight='bold' text-align='left' padding-top='10px'>Мгновенные сообщения </fo:block>"); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'>CROC Messenger: {0} </fo:block>", xmlEncode(f["Email"])); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'>SMS: {0} </fo:block>", xmlEncode(f["MobilePhone"])); sb.AppendFormat("</fo:table-cell>"); sb.Append("</fo:table-row>"); sb.Append("</fo:table-body>"); sb.Append("</fo:table>"); sb.AppendFormat("<fo:block font-weight='bold' font-size='14px' padding-top='15px'>Участие в проектах </fo:block>"); // Проекты сотрудника if (r.NextResult()) { sb.Append("<fo:table color='#FFFFFF' text-align='left' font-size='12px' font-family='MS Sans-serif'>"); sb.Append("<fo:table-column/>"); sb.Append("<fo:table-column/>"); sb.Append("<fo:table-body>"); while (r.Read()) { f = _GetDataFromDataRow(r); sb.Append("<fo:table-row>"); sb.Append("<fo:table-cell width='50%'>"); sb.Append("<fo:block font-weight='bold' text-align='left' padding-top='10px'>Проект: </fo:block>"); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'> {0} </fo:block>", xmlEncode(f["Project"])); sb.AppendFormat("</fo:table-cell>"); sb.Append("<fo:table-cell width='50%'>"); sb.Append("<fo:block font-weight='bold' text-align='left' padding-top='10px'>Роль в Проекте: </fo:block>"); sb.AppendFormat("<fo:block padding-left='15px' padding-top='10px'> {0} </fo:block>", xmlEncode(f["ProjectRole"])); sb.AppendFormat("</fo:table-cell>"); sb.Append("</fo:table-row>"); } sb.Append("</fo:table-body>"); sb.Append("</fo:table>"); } data.RepGen.Header(sb.ToString()); data.RepGen.EndPageBody(); data.RepGen.EndPageSequence(); }
protected override void WriteReport(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData data) { buildReport(data); }
private void insertAdditionalProperties(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData data, IDictionary inc) { //Полный путь виртуального каталога приложения треккера - пока получаем через System.Web. //Он нужен для корректного экспорта отчета инцидента с картинкой в excel. //В проекте XFW 2.0 есть заявка на соотвествующую доработку - чтобы в ReportService также можно было использовать виртуальные относительные пути. //Когда это будет сделано,через System.Web полный путь получать уже не нужно будет. string virtualPath = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpContext.Current.Request.ApplicationPath; using (IDataReader r = data.DataProvider.GetDataReader("dsAdditional", inc["ObjectID"])) { Guid prev = Guid.Empty; StringBuilder str = new StringBuilder(); while (r.Read()) { Guid cur = r.GetGuid(0); if (cur != prev) { prev = cur; if (str.Length != 0) { data.RepGen.TRAddCell(str.ToString(), null, 5, 1); data.RepGen.TREnd(); str.Length = 0; } data.RepGen.TRStart(); data.RepGen.TRAddCell(xmlEncode(r.GetString(1)) + ":", null, 1, 1, "BOLD"); } // Соберём строчку switch ((IPROP_TYPE)r.GetInt32(2)) { case IPROP_TYPE.IPROP_TYPE_BOOLEAN: str.AppendFormat("<fo:block>{0}</fo:block>", (0 == r.GetDecimal(3))?"Ложь":"Истина"); break; case IPROP_TYPE.IPROP_TYPE_DATE: str.AppendFormat("<fo:block>{0}</fo:block>", xmlEncode(r.GetDateTime(4).ToLongDateString())); break; case IPROP_TYPE.IPROP_TYPE_DATEANDTIME: str.AppendFormat("<fo:block>{0}</fo:block>", xmlEncode(r.GetDateTime(4))); break; case IPROP_TYPE.IPROP_TYPE_DOUBLE: str.AppendFormat("<fo:block>{0}</fo:block>", xmlEncode(r.GetDecimal(3))); break; case IPROP_TYPE.IPROP_TYPE_LONG: str.AppendFormat("<fo:block>{0}</fo:block>", xmlEncode(Convert.ToInt32(r.GetDecimal(3)))); break; case IPROP_TYPE.IPROP_TYPE_TIME: str.AppendFormat("<fo:block>{0}</fo:block>", xmlEncode(r.GetDateTime(4).ToLongTimeString())); break; case IPROP_TYPE.IPROP_TYPE_STRING: str.Append(_LongText(r.GetString(5))); break; case IPROP_TYPE.IPROP_TYPE_TEXT: str.Append(_LongText(r.GetString(6))); break; case IPROP_TYPE.IPROP_TYPE_PICTURE: str.AppendFormat("<fo:block><fo:external-graphic src=\"" + virtualPath + "/x-get-image.aspx?OT=IncidentPropValue&PN=FileData&ID={0}\"/></fo:block>", r.GetGuid(8)); break; case IPROP_TYPE.IPROP_TYPE_FILE: int sizeInBytes = r.GetInt32(7); str.AppendFormat("<fo:block><fo:basic-link external-destination=\"x-get-image.aspx?OT=IncidentPropValue&PN=FileData&ID={0}\">{1}</fo:basic-link></fo:block>", r.GetGuid(8), xmlEncode((r.IsDBNull(5)?"Безымянный":r.GetString(5)) + " (" + sizeInBytes + " " + Utils.GetNumericEnding(sizeInBytes, "байт", "байтa", "байт") + ")")); break; } } if (str.Length != 0) { data.RepGen.TRAddCell(str.ToString(), null, 5, 1); data.RepGen.TREnd(); str.Length = 0; } } }
private void insertTasks(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData data, IDictionary inc) { OneTask[] tasks = OneTask.LoadIncidentTasks((Guid)inc["ObjectID"], data); if (0 == tasks.Length) { return; } int nTasksWithTimeS = 0; foreach (OneTask t in tasks) { if (t.Spents.Count != 0) { ++nTasksWithTimeS; } } //' выводим описания задач data.RepGen.TRStart(); //'Формула 2*nTasks + nTasksWithTimeS показывает, на сколько подстрок будет разбита строка "Задание" //'Для каждого задания требуется две строки (названия колонок+информация по заданию) => 2*nTasks //'+nTasksWithTimeS - добавляется столько подстрок, сколько существует списаний времени data.RepGen.TRAddCell("Задания:", null, 1, 2 * tasks.Length + nTasksWithTimeS, "BOLD"); bool notFirst = false; foreach (OneTask t in tasks) { if (notFirst) { data.RepGen.TRStart(); } else { notFirst = true; } //' юзер, связанный с задачей //'2 + nHasTimeS - показывает, сколько строк объединяет ячейка "Ответственный за задание" //'Для вывода информации по заданию необходимо всегда две строки - наименование колонок+сама информация //'+nHasTimeS - также нужно прибавить строки для вывода списаний по задаче data.RepGen.TRAddCell(_GetUserMailAnchor(t.WorkerString, t.WorkerMail, t.WorkerID, (Guid)inc["ObjectID"], (Guid)inc["Folder"]), null, 1, 2 + (t.Spents.Count == 0?0:1)); data.RepGen.TRAddCell("Роль", null, 1, 1, "BOLD"); data.RepGen.TRAddCell("Запланировано", null, 1, 1, "BOLD"); data.RepGen.TRAddCell("Затрачено", null, 1, 1, "BOLD"); data.RepGen.TRAddCell("Осталось", null, 1, 1, "BOLD"); data.RepGen.TREnd(); //' выводим информацию о запланированном и рельно потраченном времени data.RepGen.TRStart(); data.RepGen.TRAddCell(xmlEncode(t.Role), null); //' при превышении времени используем красный цвет int nSpentTime = t.GetTotalSpent(); if (t.PlannedTime < nSpentTime) { data.RepGen.TRAddCell(_FormatTimeStringAtServer(t.PlannedTime, t.Duration), null, 1, 1, "BOLD-RED"); data.RepGen.TRAddCell(_FormatTimeStringAtServer(nSpentTime, t.Duration), null, 1, 1, "BOLD-RED"); } else { data.RepGen.TRAddCell(_FormatTimeStringAtServer(t.PlannedTime, t.Duration), null); data.RepGen.TRAddCell(_FormatTimeStringAtServer(nSpentTime, t.Duration), null); } //' оставшееся время data.RepGen.TRAddCell(_FormatTimeStringAtServer(t.LeftTime, t.Duration), null); data.RepGen.TREnd(); //' если есть списания, то выводим их if (t.Spents.Count != 0) { data.RepGen.TRStart(); data.RepGen.TRAddCell(getTaskSpents(t, t.Duration), null, 4, 1); data.RepGen.TREnd(); } } }
// Процедура вставляет в отчет основные свойства инцидента: // какому проекту принадлежит, кто и когда его зарегистрировал, класс, состояние, // крайний срок, описание, приоритет, задания по инциденту и кто виновный private void insertMainProperties(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData data, IDictionary inc) { //'----------------------------------------------------- //' добавляем в таблицу необходимое количество колонок data.RepGen.TAddColumn(); data.RepGen.TAddColumn(); data.RepGen.TAddColumn(); data.RepGen.TAddColumn(); data.RepGen.TAddColumn(); data.RepGen.TAddColumn(); //' информация о проекте data.RepGen.TRStart(); data.RepGen.TRAddCell("Проект:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(_GetFolderAnchor(inc["FolderPath"], ((Guid)inc["Folder"]), true), null, 5, 1); data.RepGen.TREnd(); //' информация о сотруднике, зарегистрировавшем инцидент data.RepGen.TRStart(); data.RepGen.TRAddCell("Зарегистрировал:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(_GetUserMailAnchor(inc["InitiatorString"], inc["InitiatorMail"], (Guid)inc["InitiatorID"], (Guid)inc["ObjectID"], (Guid)inc["Folder"]), null, 5, 1); data.RepGen.TREnd(); //' дата регистрации data.RepGen.TRStart(); data.RepGen.TRAddCell("Дата:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(xmlEncode(((DateTime)inc["InputDate"]).ToLongDateString()), null, 5, 1); data.RepGen.TREnd(); // ' класс инцидента data.RepGen.TRStart(); data.RepGen.TRAddCell("Тип:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(xmlEncode(inc["IncidentType"]), null, 5, 1); data.RepGen.TREnd(); // ' состояние инцидента data.RepGen.TRStart(); data.RepGen.TRAddCell("Состояние:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(xmlEncode(inc["IncidentState"]), null, 5, 1); data.RepGen.TREnd(); // ' крайний срок инцидента if (inc["Deadline"] != null) { data.RepGen.TRStart(); data.RepGen.TRAddCell("Крайний срок:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(xmlEncode(((DateTime)inc["Deadline"]).ToLongDateString()), null, 5, 1); data.RepGen.TREnd(); } //' описание инцидента if (inc["Descr"] != null) { data.RepGen.TRStart(); data.RepGen.TRAddCell("Описание:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(_LongText((string)inc["Descr"]), null, 5, 1); data.RepGen.TREnd(); } data.RepGen.TRStart(); data.RepGen.TRAddCell("Приоритет:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell((string)inc["IncidentPriority"], null, 5, 1); data.RepGen.TREnd(); insertTasks(data, inc); if (inc["Solution"] != null) { data.RepGen.TRStart(); data.RepGen.TRAddCell("Решение:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(_LongText((string)inc["Solution"]), null, 5, 1); data.RepGen.TREnd(); } if (inc["IncidentCategory"] != null) { data.RepGen.TRStart(); data.RepGen.TRAddCell("Категория:", null, 1, 1, "BOLD"); data.RepGen.TRAddCell(xmlEncode((string)inc["IncidentCategory"]), null, 5, 1); data.RepGen.TREnd(); } insertHistory(data, inc); insertIncidentLinks(data, inc); }
/// <summary> /// Инициализирует финансовые данные по проекту из БД /// </summary> /// <param name="data">Параметры отчета</param> protected abstract void InitializeFinanceData(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData data);
public ArrayList ProjectsSumFinData = null; //Таблица суммарных показателей проектов группы public ThisReportData(Croc.XmlFramework.ReportService.Layouts.ReportLayoutData reportData) { //Данные по интервалам и проектам using (IDataReader reader = reportData.DataProvider.GetDataReader("IntervalSaldoDS", reportData.CustomData)) { if (reader.Read()) { MainDateRatio = _GetDataFromDataRow(reader); } if (reader.NextResult()) { DateRatio = _GetDataAsArrayList(reader); } } using (IDataReader reader = reportData.DataProvider.GetDataReader("PrjGroupDS", reportData.CustomData)) { if (reader.Read()) { MainPrjGroup = _GetDataFromDataRow(reader); } if (reader.NextResult()) { PrjGroup = _GetDataAsArrayList(reader); } } //Общие расходы, расходы по АО и займам using (IDataReader reader = reportData.DataProvider.GetDataReader("GenSumOutDS", reportData.CustomData)) { GenOutSum = _GetDataAsArrayList(reader); if (reader.NextResult()) { AOSum = _GetDataAsArrayList(reader); } if (reader.NextResult()) { LoansSumFinData = _GetDataAsArrayList(reader); } } //Финансовые показатели по проектам using (IDataReader reader = reportData.DataProvider.GetDataReader("PrjGroupPreFinDataDS", reportData.CustomData)) { GroupPreFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("PrjGroupAfterFinDataDS", reportData.CustomData)) { GroupAfterFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("PrjGroupAllFinDataDS", reportData.CustomData)) { GroupAllFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("PrjGroupFinDataDS", reportData.CustomData)) { GroupFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectsPreFinDataDS", reportData.CustomData)) { ProjectsPreFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectsAfterFinDataDS", reportData.CustomData)) { ProjectsAfterFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectsAllFinDataDS", reportData.CustomData)) { ProjectsAllFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectsFinDataDS", reportData.CustomData)) { ProjectsFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("PrjGroupSumFinDataDS", reportData.CustomData)) { GroupSumFinData = _GetDataAsArrayList(reader); } using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectsSumFinDataDS", reportData.CustomData)) { ProjectsSumFinData = _GetDataAsArrayList(reader); } }