Страница 1 из 1

Экранирование имён колонок

Добавлено: 08 ноя 2013, 13:25
Ptomaine
Здравствуйте,

Столкнулись вот с какой проблемой: отчёт составляется вручную, в коде.
Имеются вот такие строки:

Код: Выделить всё

   StiText dataText = new StiText(new RectangleD(pos, 0, columnWidth, 0.5));

   dataText.Text = "{"+tableName+"."+StiCodeDomSerializator.ReplaceSymbols(dataColumn.ColumnName)+"}";
Так вот, если имя колонки содержит символ "точка", например "Остаток (руб.)", то компонента отчёта не может найти данные для этой колонки и выводит в отчёте пустую колонку. Если точку убрать, то всё ОК. Возможно ли как-то экранировать имя колонки, чтобы точка воспринималась не как разделитель имён, а как целостное имя колонки.

Спасибо.

Re: Экранирование имён колонок

Добавлено: 11 ноя 2013, 09:55
Aleksey
Здравствуйте,

Пожалуйста, попробуйте использовать следующий код ([Источник Данных].[Имя Колонки]):

Код: Выделить всё

dataText.Text = "{["+tableName+"].["+StiCodeDomSerializator.ReplaceSymbols(dataColumn.ColumnName)+"]}";
Спасибо.

Re: Экранирование имён колонок

Добавлено: 11 ноя 2013, 12:05
Ptomaine
Здравствуйте,

Не помогло. Даже стало ещё хуже. После Ваших предложенных изменений все колонки пустые.

Re: Экранирование имён колонок

Добавлено: 11 ноя 2013, 17:21
Aleksey
Здравствуйте,

Не смогли воспроизвести проблему. Не могли бы вы прислать простой пример, который ее воспроизводит.
Следующий код работает корректно:

Код: Выделить всё

StiReport report = new StiReport();
DataTable dt = new DataTable("Tbl");
dt.Columns.Add("Остаток (руб.)", typeof(String));

DataRow row;
row = dt.NewRow();
row["Остаток (руб.)"] = "asdsd";
dt.Rows.Add(row);
report.RegData(dt);
report.Dictionary.Synchronize();
StiText txt = new StiText();
txt.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0.2, 0.2, 5.2, 0.8);
txt.Name = "DataTbl_Остаток";
txt.Text = new StiExpression("{Tbl." + StiCodeDomSerializator.ReplaceSymbols(dt.Columns[0].ColumnName) + "}");
txt.Page = report.Pages[0];
txt.Parent = report.Pages[0];
report.Pages[0].Components.Clear();
report.Pages[0].Components.AddRange(new Stimulsoft.Report.Components.StiComponent[] { txt });
report.Render();
report.Show();
Спасибо.

Re: Экранирование имён колонок

Добавлено: 12 ноя 2013, 13:18
Ptomaine
Вот такой код. Убрал лишнее, не связанное или очевидное.

Код: Выделить всё

            DataSet od = new DataSet();
            string tableName = "ReportTable" + CurrentThread.ManagedThreadId.ToString();
            ...
            oracleDataAdapter.Fill(od);
            ...
            DataTable dt = od.Tables[0];
            dt.TableName = tableName;

            report.RegData(od);
            report.Dictionary.Synchronize();
            ...
            foreach (DataColumn dataColumn in dt.Columns)
            {
                 ...
                dataText.Text = "{" + tableName + "." + StiCodeDomSerializator.ReplaceSymbols(dataColumn.ColumnName) + "}";
                 ...
            }
            ...

Re: Экранирование имён колонок

Добавлено: 12 ноя 2013, 16:19
Aleksey
Здравствуйте,

Пожалуйста, попробуйте использовать следующий код:

Код: Выделить всё

dataText.Text = new StiExpression("{" + tableName + "." + StiCodeDomSerializator.ReplaceSymbols(dataColumn.ColumnName) + "}");
Спасибо.

Re: Экранирование имён колонок

Добавлено: 13 ноя 2013, 13:26
Ptomaine
К сожалению, не помогло. Только эта колонка, как и раньше, остаётся пустой.

Re: Экранирование имён колонок

Добавлено: 13 ноя 2013, 14:28
Aleksey
Здравствуйте,

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

Спасибо.