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

01.05.2018 00:00:00 заметки

01.04.2018 00:00:00 другие заметки

01.03.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
32snl 8 Май 2018 в 17:41

1 ответ

Лучший ответ

Причина ошибки предположительно связана с тем, что проверка на ноль происходит после 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}

ИЗМЕНИТЬ

Чтобы получить и вторую строку, вам нужно выполнить 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}
1
MatSnow 8 Май 2018 в 15:36