You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

窗口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列与结构体字段一一对应
  • 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:15:03