Непонятный пустой отчёт

Обсуждение извечных проблем кларионовских (и не только) отчетов

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Непонятный пустой отчёт

Сообщение Игорь Столяров »

Привет всем ! :)

Есть в 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 с крахом приложения :(
Почему оно так ? :(
За теми кто отстал - не возвращаться. (С) Кодекс
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

Непонятный пустой отчёт

Сообщение gromov »

Не предусмотрели Велосипеды, что кто-нибудь когда-нибудь захочет напечатать НИЧТО ))))
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Непонятный пустой отчёт

Сообщение Игорь Столяров »

gromov писал(а): 18 Октябрь 2018, 11:31что кто-нибудь когда-нибудь захочет напечатать НИЧТО
Немного по другому. Есть варианты, когда запрос данных для печати возвращает пустую строку - и тут сюрприз.
Ну напечатайте Вы пустую строку … но не GPF же ! :(
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Непонятный пустой отчёт

Сообщение kreator »

А в какой момент gpf? Может проблема при передаче в процедуру. Две кавычки интерпретируются как ничто. Да куча всего может быть. Проблема только с контролом TEXT. Или со String тоже?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Непонятный пустой отчёт

Сообщение Игорь Столяров »

kreator писал(а): 18 Октябрь 2018, 12:34Проблема только с контролом TEXT. Или со String тоже?
Фиг его знает. Это я формализованную проблему описал.
А что бы понять что абсолютно адекватные действия приводят в Clarion к GPF - пришлось покопаться.
Поэтому влепил костыль и далее не разбирался.
Смысла нет. Следующая перекраска шаблонов только в C12 через пару лет. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Непонятный пустой отчёт

Сообщение Дед Пахом »

Адекватное действие - передача в процедуру пустой строки. Неадекватное - размещение в репорте поля типа @s0.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Непонятный пустой отчёт

Сообщение Игорь Столяров »

Дед Пахом писал(а): 18 Октябрь 2018, 13:25Неадекватное - размещение в репорте поля типа @s0
Так, а нет в отчёте поля @s0 ... Есть TEXT - это совсем другое. Он ведь может быть пустым. Почему нет ?
Я бы ещё понял, если бы в качестве переменной с текстом подсовывался неинициализированный указатель на строку …
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Непонятный пустой отчёт

Сообщение Дед Пахом »

Игорь Столяров писал(а): 18 Октябрь 2018, 13:39Так, а нет в отчёте поля @s0
Явно нет, а неявно есть. На мой взгляд, правильно делать как-то так:

Код: Выделить всё

TEXT,AT(,,7760,),USE(?txtField),TRN,LEFT,RESIZE
?txtField{prop:text} = xText_
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Непонятный пустой отчёт

Сообщение Игорь Столяров »

Дед Пахом писал(а): 18 Октябрь 2018, 13:48?txtField{prop:text} = xText_
Скорее всего сработает ограничение на 255 символов (не проверял) ...
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Непонятный пустой отчёт

Сообщение 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, похоже, в момент присвоения элементу репорта. Потому что прогрессбар уже открывается.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Непонятный пустой отчёт

Сообщение Игорь Столяров »

В том-то и фишка ! :) Данные - как параметр передаются в отчёт, потому что не известен их размер.
Если бы я знал их размер, то конечно, объявил строку этого размера и её передал в отчёт … :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Непонятный пустой отчёт

Сообщение kreator »

Игорь Столяров писал(а): 18 Октябрь 2018, 14:43 В том-то и фишка ! :) Данные - как параметр передаются в отчёт, потому что не известен их размер.
Если бы я знал их размер, то конечно, объявил строку этого размера и её передал в отчёт … :)
Просто для развития. Покажите реальный вызов процедуры. Что-то не могу представить себе.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Непонятный пустой отчёт

Сообщение Игорь Столяров »

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")'}).  
  
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Непонятный пустой отчёт

Сообщение Дед Пахом »

Когда в процедуру передаётся пустая строка нулевой длины, по факту переданный параметр аналогичен NULL, и его адрес в памяти 00000000. Когда такой параметр является USE-переменной, идёт обращение к нулевому адресу, и естественный gpf.
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Непонятный пустой отчёт

Сообщение 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 в репорте (костыль/не костыль???).
We are hard at work… for you. :)
Ответить