Страница 1 из 2
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 8:56
Игорь Столяров
Привет всем !
Есть в Clarion места, в которых просто выключается мозг и не понятно, почему так всё как всегда …
Делаем стандарный, элементарный отчёт для печати текстового файла (конкретно слип-чека эквайринга) на принтер.
Код: Выделить всё
Report_Slip PROCEDURE (String xText_)
…
report REPORT('Текстовый файл'),AT(200,200,7760,11031),PAPER(PAPER:A4), PRE(RPT),FONT('Consolas',10,,FONT:regular,CHARSET:CYRILLIC),THOUS
detail DETAIL,USE(?detail)
TEXT,AT(,,7760,),USE(xText_),TRN,LEFT,RESIZE
END
END
...
Далее вызываем отчёт для печати текста:
Код: Выделить всё
Report_Slip('Какой-то там текст') ! Работает
Report_Slip(' ') ! Работает
Report_Slip('') ! GPF с крахом приложения :(
Почему оно так ?
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 11:31
gromov
Не предусмотрели Велосипеды, что кто-нибудь когда-нибудь захочет напечатать НИЧТО ))))
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 11:50
Игорь Столяров
gromov писал(а): ↑18 Октябрь 2018, 11:31что кто-нибудь когда-нибудь захочет напечатать НИЧТО
Немного по другому. Есть варианты, когда запрос данных для печати возвращает пустую строку - и тут сюрприз.
Ну напечатайте Вы пустую строку … но не GPF же !
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 12:34
kreator
А в какой момент gpf? Может проблема при передаче в процедуру. Две кавычки интерпретируются как ничто. Да куча всего может быть. Проблема только с контролом TEXT. Или со String тоже?
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 13:20
Игорь Столяров
kreator писал(а): ↑18 Октябрь 2018, 12:34Проблема только с контролом TEXT. Или со String тоже?
Фиг его знает. Это я формализованную проблему описал.
А что бы понять что абсолютно адекватные действия приводят в Clarion к GPF - пришлось покопаться.
Поэтому влепил костыль и далее не разбирался.
Смысла нет. Следующая перекраска шаблонов только в C12 через пару лет.
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 13:25
Дед Пахом
Адекватное действие - передача в процедуру пустой строки. Неадекватное - размещение в репорте поля типа @s0.
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 13:39
Игорь Столяров
Дед Пахом писал(а): ↑18 Октябрь 2018, 13:25Неадекватное - размещение в репорте поля типа @s0
Так, а нет в отчёте поля @s0 ... Есть TEXT - это совсем другое. Он ведь может быть пустым. Почему нет ?
Я бы ещё понял, если бы в качестве переменной с текстом подсовывался неинициализированный указатель на строку …
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 13:48
Дед Пахом
Игорь Столяров писал(а): ↑18 Октябрь 2018, 13:39Так, а нет в отчёте поля @s0
Явно нет, а неявно есть. На мой взгляд, правильно делать как-то так:
Код: Выделить всё
TEXT,AT(,,7760,),USE(?txtField),TRN,LEFT,RESIZE
?txtField{prop:text} = xText_
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 13:57
Игорь Столяров
Дед Пахом писал(а): ↑18 Октябрь 2018, 13:48?txtField{prop:text} = xText_
Скорее всего сработает ограничение на 255 символов (не проверял) ...
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 14:31
kreator
Провёл эксперимент. Вот так gpf:
Код: Выделить всё
LOC:TempString = 'Оценка по качеству за период с ' & format(LOC:Date1,@d06b) & ' по ' & format(LOC:Date2,@d06b)
ReportQualityEvaluation(LOC:ReportQueue, '')
Вот так работает:
Код: Выделить всё
!LOC:TempString = 'Оценка по качеству за период с ' & format(LOC:Date1,@d06b) & ' по ' & format(LOC:Date2,@d06b)
LOC:TempString = ''
ReportQualityEvaluation(LOC:ReportQueue, LOC:TempString)
Text или String - без разницы. Gpf, похоже, в момент присвоения элементу репорта. Потому что прогрессбар уже открывается.
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 14:43
Игорь Столяров
В том-то и фишка !
Данные - как параметр передаются в отчёт, потому что не известен их размер.
Если бы я знал их размер, то конечно, объявил строку этого размера и её передал в отчёт …
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 14:58
kreator
Игорь Столяров писал(а): ↑18 Октябрь 2018, 14:43
В том-то и фишка !
Данные - как параметр передаются в отчёт, потому что не известен их размер.
Если бы я знал их размер, то конечно, объявил строку этого размера и её передал в отчёт …
Просто для развития. Покажите реальный вызов процедуры. Что-то не могу представить себе.
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 15:52
Игорь Столяров
kreator писал(а): ↑18 Октябрь 2018, 14:58Что-то не могу представить себе.
Я же в первом посте написал, где юзается … Было вот так:
Код: Выделить всё
Report_Slip(Loc:Sber{'GParamString("Cheque")'}) ! Получить и распечать слип-чек эквайринга сбера ...
! X-Отчёт по операциям с платёжными картами
If Not Loc:Sber{'NFun(6002)'} then Report_Slip(Loc:Sber{'GParamString("Cheque")'}).
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 16:24
Дед Пахом
Когда в процедуру передаётся пустая строка нулевой длины, по факту переданный параметр аналогичен NULL, и его адрес в памяти 00000000. Когда такой параметр является USE-переменной, идёт обращение к нулевому адресу, и естественный gpf.
Непонятный пустой отчёт
Добавлено: 18 Октябрь 2018, 16:41
kreator
Игорь Столяров писал(а): ↑18 Октябрь 2018, 15:52kreator писал(а): ↑18 Октябрь 2018, 14:58Что-то не могу представить себе.
Я же в первом посте написал, где юзается … Было вот так:
Код: Выделить всё
Report_Slip(Loc:Sber{'GParamString("Cheque")'}) ! Получить и распечать слип-чек эквайринга сбера ...
! X-Отчёт по операциям с платёжными картами
If Not Loc:Sber{'NFun(6002)'} then Report_Slip(Loc:Sber{'GParamString("Cheque")'}).
Придётся второй if not писать. Если не хотите в переменную загонять результат. Либо прописывать реакцию на null в репорте (костыль/не костыль???).