窗口Open事件问题求助:DataWindow无法显示上传文件结构数据
PowerBuilder窗口Open事件问题:第二个DataWindow无法显示结构体中的已上传文件数据
问题描述
选择单元打开窗口后,第一个DataWindow可正常加载单元样本数据,但第二个DataWindow无法通过结构体展示已上传的文件信息。窗口Open事件代码如下:
st_structure st String ls_usuario, ls_clave, ls_sql, ls_param, ls_codveh, ls_ruta Integer li_SQLCode, li_resultado Long ll_cant ls_param = Message.StringParm il_cod_veh = Long(Mid(ls_param,2,8)) title dw_2.DataObject="dw_consult" dw_2.SetTransObject(SQLCA) ii_veh=dw_2.Retrieve(il_veh) // 此处问题:无法展示上传文件的结构体对象 st = Message.PowerObjectParm il_veh = st.numero[1] ls_codveh = String(il_veh) is_extension_archivo = "PDF" ll_max_megabyte_size_file = 2 il_max_largo_titulo_file = 150 il_conversor_megabyte_byte = 1048576 is_path_file_download = "c:\tmp" If not DirectoryExists (is_path_file_download) Then li_resultado = CreateDirectory(is_path_file_download) End If if_recuperar()
窗口需实现:展示选中单元信息、支持文件上传、显示已上传文件,但第二个DW无法正常加载结构体中的文件数据。
排查与解决方案
1. 变量顺序与覆盖问题
- 代码中
dw_2.Retrieve(il_veh)执行时,il_veh尚未通过结构体赋值,此时变量值可能未初始化或错误,导致第一个DW检索逻辑存在隐患,同时后续结构体赋值后未同步关联第二个DW的加载逻辑。 - 修复:调整代码执行顺序,先获取并验证结构体参数,再处理DW检索:
// 先处理结构体参数 st = Message.PowerObjectParm il_veh = st.numero[1] ls_codveh = String(il_veh) // 再处理第一个DW的检索 ls_param = Message.StringParm il_cod_veh = Long(Mid(ls_param,2,8)) title dw_2.DataObject="dw_consult" dw_2.SetTransObject(SQLCA) ii_veh=dw_2.Retrieve(il_veh)
2. 结构体参数传递验证
- 确认打开窗口时,是否正确将
st_structure类型结构体作为PowerObjectParm传入,打开窗口的代码需类似:st_structure st_upload // 给结构体赋值已上传文件的相关数据 st_upload.numero[1] = 目标单元ID // 假设结构体包含文件列表数组,赋值文件信息 st_upload.file_list[1].name = "示例文件.pdf" st_upload.file_list[1].size = 102400 Open(w_目标窗口, "", st_upload) - 在Open事件开头添加调试代码,验证结构体是否正常接收:
If IsNull(Message.PowerObjectParm) Or Not IsValid(Message.PowerObjectParm) Then MessageBox("错误", "未接收到文件信息结构体") Return End If st = Message.PowerObjectParm If st.numero[1] <= 0 Then MessageBox("错误", "结构体中单元ID无效") Return End If
3. 第二个DataWindow配置与数据加载检查
- 确认第二个DW(假设为
dw_uploaded_files)的数据源是否绑定st_structure:- 在DW设计界面,数据源选择“结构体”并指定
st_structure,确保DW列与结构体字段一一对应
- 在DW设计界面,数据源选择“结构体”并指定
- 检查
if_recuperar()函数,需包含将结构体数据加载到第二个DW的逻辑:dw_uploaded_files.Reset() // 假设结构体包含file_list数组存储文件信息 For i = 1 To UpperBound(st.file_list) dw_uploaded_files.InsertRow(0) dw_uploaded_files.SetItem(dw_uploaded_files.RowCount(), "file_name", st.file_list[i].name) dw_uploaded_files.SetItem(dw_uploaded_files.RowCount(), "file_size", st.file_list[i].size) // 其他文件字段赋值 Next
4. 文件路径权限检查
- 代码中
c:\tmp路径需确保当前用户有读写权限,否则文件上传后无法保存,导致结构体无数据。可修改为应用程序目录或用户可访问路径:is_path_file_download = GetCurrentDirectory() + "\tmp"
内容的提问来源于stack exchange,提问作者Pedro Paiz
相关产品推荐
相关产品推荐

