是什么导致我的 PowerBuilder C0031 语法错误?
What is causing my PowerBuilder C0031 Synax error?
我对 Powerbuilder 和编程还是很陌生。尝试保存此代码时出现两个语法错误,我无法弄清楚。第一个错误显示为代码“//*****”中的第一件事,第二个错误出现在 "END CHOOSE"。任何帮助将不胜感激。
//*************************************************** *********************************
// 事件:ue_run_script
//
// 描述:两部分脚本的第一部分将允许关闭使用外部 SF 252、SF 1442、SF 33 或 SF 26 表格创建的外部交货订单。
// 脚本的第一部分创建了一个临时 table 来插入只有 obj_type 的 '52D'、'42D'、'26D'、'33D' 的文档。
// 然后相应地将 obj_type 更新为 'DEL' 或 'B5M'。然后用新的 obj_type 更新 dsk_obj & proc_object 以便它们可以关闭
//
// 第二部分是 ue_run_script2,它恢复了原来的 obj_types 并降低了温度 table。
//
// 参数:None
//
// Returns: 1
//
// 程序员日期注释
// ---------- ----- ----------
// N.Liappis 1/15/18 初始开发 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
很难远程解决这个问题,但目测一下,我敢打赌这是你的评论。 PowerBuilder 有两种注释分隔符:
- //到行尾,并且
- /* 到 */。
我猜你的 //**** 被解释为 /* 集的开始。也许尝试使用 space 将其拆分,例如 // ****,以避免误解。
您似乎缺少 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
嵌入 SQL 字符串文字上的双引号?也许。
尝试注释代码块并更好地缩小错误位置。我不相信现在给你的位置。
唯一让我感到奇怪的是(除了缺少 end if 或其他语法错误)是您的第一个数据库操作,您使用双引号而不是单引号作为字符串文字。
我猜 PB 可能会将 "U" 解释为数据库 table 或列名,而不是您所期望的字符串文字。
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 只能针对最后使用的单个数据库进行验证,而不是针对应用程序实际使用的数据库进行验证。此外,如果无法建立数据库连接,无人值守的构建(例如漫长的通宵重建)可能会停止。
要避免这些问题,您可以select“系统选项”对话框的常规页面上的“编译和构建时禁用数据库连接”复选框。
替换为:
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
我对 Powerbuilder 和编程还是很陌生。尝试保存此代码时出现两个语法错误,我无法弄清楚。第一个错误显示为代码“//*****”中的第一件事,第二个错误出现在 "END CHOOSE"。任何帮助将不胜感激。
//*************************************************** *********************************
// 事件:ue_run_script
//
// 描述:两部分脚本的第一部分将允许关闭使用外部 SF 252、SF 1442、SF 33 或 SF 26 表格创建的外部交货订单。
// 脚本的第一部分创建了一个临时 table 来插入只有 obj_type 的 '52D'、'42D'、'26D'、'33D' 的文档。
// 然后相应地将 obj_type 更新为 'DEL' 或 'B5M'。然后用新的 obj_type 更新 dsk_obj & proc_object 以便它们可以关闭
//
// 第二部分是 ue_run_script2,它恢复了原来的 obj_types 并降低了温度 table。
//
// 参数:None
//
// Returns: 1
//
// 程序员日期注释
// ---------- ----- ----------
// N.Liappis 1/15/18 初始开发 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
很难远程解决这个问题,但目测一下,我敢打赌这是你的评论。 PowerBuilder 有两种注释分隔符:
- //到行尾,并且
- /* 到 */。
我猜你的 //**** 被解释为 /* 集的开始。也许尝试使用 space 将其拆分,例如 // ****,以避免误解。
您似乎缺少 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
嵌入 SQL 字符串文字上的双引号?也许。
尝试注释代码块并更好地缩小错误位置。我不相信现在给你的位置。
唯一让我感到奇怪的是(除了缺少 end if 或其他语法错误)是您的第一个数据库操作,您使用双引号而不是单引号作为字符串文字。
我猜 PB 可能会将 "U" 解释为数据库 table 或列名,而不是您所期望的字符串文字。
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 只能针对最后使用的单个数据库进行验证,而不是针对应用程序实际使用的数据库进行验证。此外,如果无法建立数据库连接,无人值守的构建(例如漫长的通宵重建)可能会停止。
要避免这些问题,您可以select“系统选项”对话框的常规页面上的“编译和构建时禁用数据库连接”复选框。
替换为:
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