2014-01-10 3 views
0

Ниже приведен скрипт функции PB, который в основном создает ссылочный номер. Этот скрипт работает в рабочей среде, но есть случаи, когда строковая переменная (ls_ivno) возвращает пустое значение, и я подозреваю, что во время этого процесса происходит тупик.Строковая переменная возвращает пустое значение

Ищет помощь для отслеживания, если это возможная проблема в этом скрипте.

String ls_branch, ls_gcode1, ls_ivprint, ls_ivno, ls_keyname 
long ll_kcount 

Select remarks11, remarks12, remarks13 
Into :ls_branch, :ls_gcode1, :ls_ivprint 
From ordersext 
Where orderkey = :arg_orderkey; 

ls_branch = trim(ls_branch) 
ls_gcode1 = trim(ls_gcode1) 
ls_ivprint = trim(ls_ivprint) 

choose case ls_ivprint 
    case 'SIV' //format1 
     ls_ivno = ls_branch + right(string(today(),"YY"),1) + "U" + ls_gcode1 
    case 'IIV' //format2 
     ls_ivno = ls_branch + "Q" + string(today(),"YY") 
    case else //blank 
     ls_ivno = ' ' 
end choose 

if ls_ivno <> ' ' then 
     if ls_ivprint = 'SIV' THEN 
      declare ncounter_invprn cursor for 
      select keyname, keycount 
      from ncounter 
      where filler01 = 'invprn' 
      order by keyname; 

      open ncounter_invprn; 
       fetch ncounter_invprn into :ls_keyname, :ll_kcount; 
       do while sqlca.sqlcode = 0 
        setpointer(hourglass!) 
        if ll_kcount <> 9999 then 
         ls_ivno += right(trim(ls_keyname),1) + f_get_ncounter(ls_keyname, 4) 
         close ncounter_invprn; 
        end if 
       fetch ncounter_invprn into :ls_keyname, :ll_kcount; 
       loop 
      close ncounter_invprn ; 

     ELSE //IIV 
      declare ncounter_invprn_iiv cursor for 
      select keyname, keycount 
      from ncounter 
      where filler01 = 'invprn_iiv' 
      order by keyname; 

      open ncounter_invprn_iiv; 
       fetch ncounter_invprn_iiv into :ls_keyname, :ll_kcount; 
       do while sqlca.sqlcode = 0 
        setpointer(hourglass!) 
        if ll_kcount <> 9999 then 
         ls_ivno += right(trim(ls_keyname),1) + f_get_ncounter(ls_keyname, 4) 
         close ncounter_invprn_iiv; 
        end if 
       fetch ncounter_invprn_iiv into :ls_keyname, :ll_kcount; 
       loop 
      close ncounter_invprn_iiv; 

     END IF 
end if  

return ls_ivno 
+0

- переменная, фактически пустая или нуль? это не то же самое ... – Seki

+0

переменная пуста. – Alex

ответ

0

Он вернется строка действительно пуст или это строка с одним пробелом вы положили в ls_ivno во ELSE вас «выбрать окно ls_ivprint».

Какова ценность примечаний13 в базе данных для линий, для которых у вас есть пустой возврат?

Вы можете поместить «с ур» в конце своих запросов. Это предотвратит блокировку таблицы. Но проблема, похоже, не здесь, вы не можете выйти за рамки запроса, если таблица заблокирована. Ваше приложение просто замораживает в этом случае.

0

Вы должны попытаться проверить, не является ли значение не пустым, а isnull(ls_ivno).

Пустое значение предполагает, что вы получаете нулевое значение из того, что вы выбрали в базе данных.

Остерегайтесь того, что нуль всегда будет переопределять назначение или конкатенацию, если какое-либо из условий равно null. Поскольку тест if всегда терпит неудачу, если какой-либо из аргументов имеет значение null и не обрабатывается должным образом с помощью isnull(). В некотором роде значение null является заразным.

+0

У меня была большая модификация в скрипте ранее сегодня, и isnull() был включен как часть проверки. – Alex

+0

Кстати, я знаю, что использование курсора в скриптах PB работает, но я хотел бы знать, лучше ли использовать курсор в PB? – Alex

+0

Курсор верен, но я считаю, что гораздо удобнее использовать хранилище данных, которое легко перебирать и требует меньше изменений кода, когда вам нужно изменить список выбранных значений (нет необходимости объявлять переменные хранилища и изменять утверждения выборки). У меня есть улучшенный унаследованный хранилище данных с помощью метода CreateFromSql() ', чтобы облегчить создание из простого выбора sql. – Seki

Смежные вопросы