Что вызывает мою ошибку PowerBuilder C0031 Synax?

Я все еще довольно плохо знаком с Powerbuilder и программированием. Я получаю две синтаксические ошибки при попытке сохранить этот код, и я не могу понять это. Первая ошибка отображается как первая вещь в коде "//*****", а вторая ошибка в "END CHOOSE". Любая помощь будет высоко ценится. //****************************************************************************** // Событие: ue_run_script // // Описание: первая часть сценария из двух частей, который будет разрешить закрытие внешних заказов на поставку, созданных с помощью форм внешних SF 252, SF 1442, SF 33 или SF 26. // Первая часть скрипта создает временную таблицу для вставки документов только с obj_type из '52D', '42D', '26D', '33D'. // и затем обновляет эти obj_types на "DEL" или "B5M" соответственно. Затем обновите dsk_obj & proc_object новым obj_type, чтобы их можно было закрыть //
// Вторая часть - это ue_run_script2, которая восстанавливает исходный obj_types и удаляет временную таблицу. // // Аргументы: нет //
// Возвращает: 1 // // Программист Дата Комментарии // ----------- ----- --------- // N.Liappis 1/15/18 Initial Разработка 080117-0057-LN //******************************************************************************

string s_doc_nmbr, s_doc_type, s_doc_lst_nmbr, s_drop
long l_proc_obj_id, l_rtn, l_table_exists, l_TMP_count
long l_origin_obj_id, l_err
int m_rtn


select obj_id, origin_obj_id
into :l_proc_obj_id, :l_origin_obj_id
from proc_object
where proc_object.obj_id = :gx_l_doc_obj_id
using SQLCA;



SELECT obj_usr_num, obj_type
INTO :s_doc_nmbr, :s_doc_type
FROM dsk_obj
Where obj_id = :gx_l_doc_obj_id
using SQLCA;


IF s_doc_type = '52D' or s_doc_type = '42D' or s_doc_type = '26D' or s_doc_type = '33D' THEN

    //Check for presence of the doc_list table
    select count(*)
    into :l_table_exists
    from dbo.sysobjects
    where dbo.sysobjects.type = "U"
    and name = "doc_list"
    using sqlca;


    CHOOSE CASE l_table_exists
    CASE 0
        //doc_list doesn't exist, so we can create it.
        l_rtn = This.Event ue_create_temp_table()
        IF l_rtn = -1 THEN
            gx_stop_run = "No"
            RETURN -1

        Else
            INSERT INTO doc_list(obj_id, obj_usr_num, orig_obj_type)
            VALUES (:l_proc_obj_id, :s_doc_nmbr, :s_doc_type)
            USING SQLCA;

            //Confirms that the table successfully got populated.
            select count (*)
            into :l_TMP_count
            from dbo.doc_list
            using sqlca;

                IF l_TMP_count = 0 then
                messagebox (gx_s_app_name, "The temp table was not populated correctly. Please contact SPS Help Desk for assistance", StopSign!)
                gx_stop_run = "No"
                return -1

                ELSE

                update doc_list
                set new_obj_type = 'DEL'
                where orig_obj_type like '__D'
                using sqlca;

                update doc_list
                set new_obj_type = 'B5M'
                where orig_obj_type like '__M'
                 or orig_obj_type like '__N'
                using sqlca;

                update dsk_obj
                set d.obj_type = dl.orig_obj_type
                from dsk_obj d, doc_list dl
                where d.obj_id = dl.obj_id
                using sqlca;                 

                update proc_object
                set p.obj_type = dl.orig_obj_type
                from proc_object p, doc_list dl
                where p.obj_id = dl.obj_id
                using sqlca;

                Return 1
            end if
        End IF

    CASE 1
        SELECT obj_usr_num
        INTO :s_doc_lst_nmbr
        FROM doc_list
        using SQLCA;

        //temp table exist.  Further investigation should be had.
        m_rtn = Messagebox(gx_s_app_name, s_doc_lst_nmbr + " was previously updated to allow closeout.  Please confirm document has been closed " +&
        "Once Confirmed, Please click OK to remove document from Temp Table", Information!, OKCancel!, 1)

        IF m_rtn = 1 THEN

                update dsk_obj
                set d.obj_type = dl.new_obj_type
                from dsk_obj d, doc_list dl
                where d.obj_id = dl.obj_id
                using sqlca;                 

                update proc_object
                set p.obj_type = dl.new_obj_type
                from proc_object p, doc_list dl
                where p.obj_id = dl.obj_id
                using sqlca;

                //drop doc_list
                s_drop = "drop table dbo.doc_list"
                EXECUTE IMMEDIATE :s_drop USING SQLCA;

                l_err = SQLCA.uf_sqlerrcheck("w_pdutl107_main", "ue_run_script", FALSE)
                IF l_err < 0 THEN 
                MessageBox("SQL Error", string(l_err)) 
                end if
                //doc_list doesn't exist, so we can create it.
                l_rtn = This.Event ue_create_temp_table()
                IF l_rtn = -1 THEN
                gx_stop_run = "No"
                RETURN -1

        Else
            INSERT INTO doc_list(obj_id, obj_usr_num, orig_obj_type)
            VALUES (:l_proc_obj_id, :s_doc_nmbr, :s_doc_type)
            USING SQLCA;

            //Confirms that the table successfully got populated.
            select count (*)
            into :l_TMP_count
            from dbo.doc_list
            using sqlca;

            IF l_TMP_count = 0 then
                messagebox (gx_s_app_name, "The temp table was not populated correctly. Please contact SPS Help Desk for assistance", StopSign!)
                gx_stop_run = "No"
                return -1

            ELSE

                update doc_list
                set new_obj_type = 'DEL'
                where orig_obj_type like '__D'
                using sqlca;

                update doc_list
                set new_obj_type = 'B5M'
                where orig_obj_type like '__M'
                 or orig_obj_type like '__N'
                using sqlca;

                update dsk_obj
                set d.obj_type = dl.orig_obj_type
                from dsk_obj d, doc_list dl
                where d.obj_id = dl.obj_id
                using sqlca;                 

                update proc_object
                set p.obj_type = dl.orig_obj_type
                from proc_object p, doc_list dl
                where p.obj_id = dl.obj_id
                using sqlca;

                Return 1
            end if
        End IF

        //This.EVENT ue_revert_back()
        //gx_stop_run = "No"
        //Return -1
    END CHOOSE  

Else
    MessageBox(gx_s_app_name, "This Document is not eligible for closeout conversion by this script, Please report this message to the SPS Help Desk.", Stopsign!, OK!)
    gx_stop_run = "No"
    Return -1
END IF

4 ответа

Решение

Заменить это:

        MessageBox("SQL Error", string(l_err)) 
        end if
        //doc_list doesn't exist, so we can create it.
        l_rtn = This.Event ue_create_temp_table()
        IF l_rtn = -1 THEN
        gx_stop_run = "No"
        RETURN -1

За это:

        MessageBox("SQL Error", string(l_err)) 
        end if
        //doc_list doesn't exist, so we can create it.
        l_rtn = This.Event ue_create_temp_table()
        IF l_rtn = -1 THEN
        gx_stop_run = "No"
        RETURN -1
        End If   // << This is what's new

Похоже, вам не хватает END IF. Увидеть ниже:

            //doc_list doesn't exist, so we can create it.
            l_rtn = This.Event ue_create_temp_table()
            **IF** l_rtn = -1 **THEN**
            gx_stop_run = "No"
            RETURN -1
            **THERE IS NO END IF HERE**
    Else

Трудно устранить эту проблему удаленно, но, пожалуй, поспорим, что это ваши комментарии. PowerBuilder имеет два типа разделителей комментариев:

  1. // до конца строки и
  2. / * к * /.

Я предполагаю, что ваш // **** интерпретируется как начало набора / *. Может быть, попробуйте пробел, чтобы разбить его, как // ****, чтобы избежать неправильной интерпретации.

Двойные кавычки на встроенном строковом литерале SQL? Может быть.

Попробуйте комментировать блоки кода и лучше сузить местоположение ошибки. Я не доверяю местам, которые вам дают сейчас.

Единственное, что заставляет меня задуматься (помимо пропуска end if или другой синтаксической ошибки) - это ваша первая операция с базой данных, в которой вы использовали двойные кавычки вместо одинарных кавычек для строкового литерала.

Я предполагаю, что PB может интерпретировать "U" как имя таблицы или столбца базы данных, а не строковый литерал, как вы ожидали.

select count(*)
into :l_table_exists
from dbo.sysobjects
where dbo.sysobjects.type = "U"  // PB probably interprets this as DB column
and name = "doc_list"  // use single quotes here
using sqlca;

Просто для удовольствия вы можете отключить опцию, которая указывает PB проверять операторы базы данных при компиляции и видеть, что происходит. Инструкции от PB помогают ниже.

Отключение соединения с базой данных при компиляции и сборке

Когда PowerBuilder компилирует приложение, содержащее встроенный SQL, оно подключается к профилю базы данных, который последний раз использовался для проверки ошибок доступа к базе данных в процессе сборки. Для приложений, которые используют несколько баз данных, это может привести к ложным предупреждениям во время сборки, поскольку встроенный SQL может быть проверен только в отношении этой единственной последней использованной базы данных, а не в отношении баз данных, фактически используемых приложением. Кроме того, автоматическая сборка, такая как длительное перестроение в течение ночи, может зависнуть, если невозможно установить соединение с базой данных.

Чтобы избежать этих проблем, вы можете установить флажок "Отключить соединение с базой данных при компиляции и сборке" на главной странице диалогового окна "Параметры системы".

Другие вопросы по тегам