Crystal - Разделенная строка на основе возврата каретки - PullRequest
0 голосов
/ 08 мая 2018

У меня есть такое поле, где я хочу, чтобы только первая / последняя запись отображалась в отчете Crystal:

05/01/2018 00:00:00 PM Notes

04/01/2018 00:00:00 вечера больше заметок

03/01/2018 00:00:00 вечера еще больше заметок

Вот код, с которым я пытался работать, но я получаю сообщение об ошибке: «индекс должен быть между 1 и размером массива». Может кто-нибудь, пожалуйста, помогите указать мне правильное направление?

stringvar array csl;
stringvar return;
csl:=split({table.field},chr(13));
//csl[1]
if isnull({table.field}) then return:= ""
else return:=csl[1];
return;

1 Ответ

0 голосов
/ 08 мая 2018

Причина ошибки, вероятно, заключается в том, что проверка на нулевое значение происходит после split.

Я обычно стараюсь избегать использования массивов / переменных в Crystal Reports. Главным образом потому, что вы не можете группировать или использовать агрегатные функции в формулах, которые содержат переменные.

Итак, вот решение, которое работает со строковыми функциями:

Первый вход

If InStr({table.field}, chr(13)) > 0 Then
    Left({table.field}, InStr({table.field}, chr(13)))
Else
    {table.field}

Последняя запись

If InStrRev({table.field}, chr(13)) > 0 Then
    Right({table.field}, Len({table.field}) - InStrRev({table.field}, chr(13)))
Else
    {table.field}

EDIT

Чтобы получить вторую строку, вы должны выполнить InStr / InStrRev два раза:

Первый вход

If InStr(InStr({@table.field}, chr(13))+1,{@table.field}, chr(13)) > 0 Then
    Left({@table.field}, InStr(InStr({@table.field}, chr(13))+1, {@table.field}, chr(13)))
Else
    {@table.field}

Последний вход

If InStrRev({@table.field}, chr(13), InStrRev({@table.field}, chr(13))+1) > 0 Then
    Right({@table.field}, Len({@table.field}) - InStrRev({@table.field}, chr(13),InStrRev({@table.field}, chr(13))-1))
Else
    {@table.field}
...