Неверный параметр Crystal Reports.Net - строка на сегодняшний день - PullRequest
0 голосов
/ 17 февраля 2012

Я использую crsytal отчеты в VS2008. Я хочу иметь возможность фильтровать даты в моем кристалле просмотра отчетов в зависимости от ввода пользователя через средство выбора даты и времени. Моя проблема - само поле даты в моей базе данных в формате STRING . -_- Всякий раз, когда я сравниваю значения через код, я анализирую его по дате и времени.

Как мне это исправить? Можно ли как-то разобрать поле отчета? Я не хочу / не могу изменить поле моей базы данных на datetime, потому что это повлечет за собой изменение всей моей системы.

~ EDIT ~

После нажатия кнопки фильтра у меня появляется указатель даты и времени с именем FromCreated_DTime. Я анализирую его значение в короткую строку даты (например, 01.01.2011), а затем назначаю его в поле моего параметра строки. Используя формулу Select Expert, я применил ваш код. Мое поле параметров называется actualStart:

Date (ToNumber (Right ({Projects.Actual_StartDate}, 4)),
  ToNumber (Left ({Projects.Actual_StartDate}, InStr ({Projects.Actual_StartDate}, "/")-1)),
  ToNumber (Mid ({Projects.Actual_StartDate}, 
                 InStr ({Projects.Actual_StartDate}, "/")+1, 
                 InStrRev({Projects.Actual_StartDate},"/")-InStr({Projects.Actual_StartDate}, "/")-1))
 ) 

 >= 

Date (ToNumber (Right ({?actualStart}, 4)),
  ToNumber (Left ({?actualStart}, InStr ({?actualStart}, "/")-1)),
  ToNumber (Mid ({?actualStart}, 
                 InStr ({?actualStart}, "/")+1, 
                 InStrRev({?actualStart},"/")-InStr({?actualStart}, "/")-1))
 )

это мой код после нажатия кнопки фильтра

    private void Filter_Btn_Click(object sender, EventArgs e)
    {
        ReportDocument cryRpt = new ReportDocument();
        TableLogOnInfos crtableLogoninfos = new TableLogOnInfos();
        TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
        ConnectionInfo crConnectionInfo = new ConnectionInfo();

        cryRpt.Load("D:\\MY_THESIS\\WORKING FILES\\WindowsFormsApplication2\\WindowsFormsApplication2\\Reports\\Crystal Reports\\UsersReport.rpt");
        crConnectionInfo.ServerName = "RITZEL-PC\\SQLEXPRESS";
        crConnectionInfo.UserID = "NNIT-Admin";
        crConnectionInfo.Password = "password";
        crConnectionInfo.DatabaseName = "NNIT DB";

        Tables CrTables = cryRpt.Database.Tables;
        foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
        {
            crtableLogoninfo = CrTable.LogOnInfo;
            crtableLogoninfo.ConnectionInfo = crConnectionInfo;
            CrTable.ApplyLogOnInfo(crtableLogoninfo);
        }

        // Create parameter objects
        ParameterFields myParams = new ParameterFields();

        //PARAMETER NAME
        ParameterField myParam = new ParameterField();
        ParameterDiscreteValue myDiscreteValue = new ParameterDiscreteValue();
        myParam.ParameterFieldName = "actualStart";

        myDiscreteValue = new ParameterDiscreteValue();
        myDiscreteValue.Value = FromCreated_DTime.Value.ToShortDateString();
        myParam.CurrentValues.Add(myDiscreteValue);
        myParams.Add(myParam);

        crystalReportViewer1.ParameterFieldInfo = myParams;
        crystalReportViewer1.ReportSource = cryRpt;
    }

Ответы [ 4 ]

1 голос
/ 17 февраля 2012

Зависит от формата вашего поля даты в базе данных. Вот пример:

stringvar yyear; 
stringvar mmonth; 
stringvar dday; 

dday := {ORDERS.ORDER_DATE}[5 to 6]; 
mmonth := {ORDERS.ORDER_DATE}[3 to 4]; 
yyear := {ORDERS.ORDER_DATE}[1 to 2]; 

if yyear < "50" then 
    date(tonumber(yyear)+2000,tonumber(mmonth),tonumber(dday)) 
else 
    date(tonumber(yyear)+1900,tonumber(mmonth),tonumber(dday)) 

Код выше: Преобразование даты из формата в строку

0 голосов
/ 16 марта 2012

Пример использования выражений SQL в Crystal - зависит от источника данных, для которого включено SQL Exp.

Я собираюсь предположить, что даты в полях по 10 часов, то есть "мм / дд / гггг" Я собираюсь предположить, что ваш параметр является строкой. Использование Date Picker более удобно. Вы можете конвертировать даты DP в строки. Используя {? ActualStart}, {Projects.Actual_StartDate}

@ SQLMonth

Left( {?actualStart}, 2 )  > 
   Left( {Projects.Actual_StartDate}, 2 )

@ SQLDay

-- You can use SUBSTRING, but I'm being lazy.  
-- Time results for both and then decide

Right( Left( {?actualStart}, 5 ) , 2 )  > 
   Right( Left( {Projects.Actual_StartDate}, 5 ) , 2 )

@ SQLYear

Right( {?actualStart}, 4 )  >
   Right( {Projects.Actual_StartDate}, 4 )

Затем в Select Expert вы можете включить:

(The REST of your selection code)  
AND
( {@SQLYear} AND {@SQLMonth} AND {@SQLDay} )

Это приведет к удалению на сервер, уменьшит время обработки и вернет ТОЛЬКО нужные записи. **

** В теории ... Я не проверял это, я сделал это по памяти. :-)

Как ни странно, это также будет код, который вы будете использовать, если будете использовать команду SQL (= "Создание SQL" программно. *)

* ОК, я пробовал несколько разных (неправильных) написаний Programatics, и проверка орфографии FF не понравилась n'aer a-one.

0 голосов
/ 29 февраля 2012

ОБНОВЛЕНО: Учитывая строку символов с именем Projects.Actual_StartDate, отформатированную как / -разделенные поля в порядке месяц-день-год, с четырьмя цифрами года и одно- или двузначными значениями дня и месяца,следующая формула должна преобразовать строку в дату и сравнить ее с параметром даты Crystal, называемым {? actualStart}:

Date (ToNumber (Right (TrimRight ({Projects.Actual_StartDate}), 4)),
      ToNumber (Left ({Projects.Actual_StartDate}, InStr ({Projects.Actual_StartDate}, "/")-1)),
      ToNumber (Mid ({Projects.Actual_StartDate}, 
                     InStr ({Projects.Actual_StartDate}, "/")+1, 
                     InStrRev({Projects.Actual_StartDate},"/")-InStr({Projects.Actual_StartDate}, "/")-1))
     )
 >= {?actualStart}
0 голосов
/ 21 февраля 2012

Одно очко ... если вы планируете использовать дату в качестве параметра выбора (то, что вы описываете), если вы используете описанный метод, вы будете бить свою базу данных очень недоброжелательно. Не большая проблема в небольших базах данных (меньше записей, меньший размер и т. Д.), Но в больших базах данных вы столкнетесь с проблемами. Метод, описанный в основном, ТЯНЕТСЯ НАЗАД КАЖДЫЙ (квалифицирующий) ЗАПИСЬ, ДЕЛАЕТ ПРЕОБРАЗОВАНИЕ, ПОТОМ РЕШАЕТ, ЧТО ОН ДОЛЖЕН БЫТЬ УДАЛЕН ИЛИ ОТКАЗАН Эти первые 4 (5) слова должны вызвать ужас в вашей душе. Это все еще хороший метод для отображения дат, если это необходимо, но не для использования строковых дат для выбора записей.

Что вы МОЖЕТЕ сделать ( должен ) - создать параметры даты, затем преобразовать их в подходящее строковое выражение и использовать его для поиска в базе данных. Вы устанавливаете параметры один раз за прогон отчета. Вы бы возвращали каждую запись, конвертировали, сравнивали, отбрасывали и т. Д. Это заставляло меня ломать голову, просто печатая ее. : -D

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

...