Страница 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: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")'}).  
  
Придётся второй if not писать. Если не хотите в переменную загонять результат. Либо прописывать реакцию на null в репорте (костыль/не костыль???).