【问题标题】:How To Delete Extra Columns in PowerBuilder's DataWindow如何在 PowerBuilder 的 DataWindow 中删除多余的列
【发布时间】:2013-06-01 22:53:37
【问题描述】:

我有 2 个 DataStore、lds_header 和 lds_detail 的组合,它们在 1 个 DataWindow 中获取数据。我已经根据标题的列设置了 DataWindow 的列。

lds_header has 10 columns to export for header segment - holds in first row only
lds_detail has 5 columns to export for detail segment - holds in second row and so on.
DataWindow has 10 columns.

何时生成 .TXT(制表符分隔)文件。详细信息段继承了另外 5 列。现在我的问题是,如何在使用 DataWindow Save AS 方法时删除详细信息段的不必要列?

实际上,我能够使用 FileOpen 方法传递预期的输出,然后使用字符串连接,但 FileOpen 方法在保存字符串值方面存在限制,这就是我想在 DataWindow SaveAs 方法中进行导出的原因。

【问题讨论】:

  • 假设您指的是 FileOpen 和 FileWrite,FileWrite 仅接受字符串的约束不应该是约束,因为您可以 String() 任何列的值,甚至是字符串数据类型的列.

标签: powerbuilder datawindow


【解决方案1】:

我正在尝试弄清楚如何解决上述问题。这行脚本 dw_Outbound.Modify("DESTROY i") 返回错误的语法。如何在不删除数据的情况下删除列?

FOR ll_outbound = 2 TO dw_Outbound.RowCount()
            IF dw_Outbound.Object.A[ll_outbound] = 'D' THEN 
                ls_column = dw_Outbound.Object.DataWindow.Column.Count
                FOR li_column = 9 TO Integer(ls_Column)
                    dw_Outbound.Modify("DESTROY i")                 
                    dw_Outbound.Modify("DESTROY j") 
                    dw_Outbound.Modify("DESTROY k") 
                    dw_Outbound.Modify("DESTROY l") 
                    dw_Outbound.Modify("DESTROY m") 
                    dw_Outbound.Modify("DESTROY n") 
                    dw_Outbound.Modify("DESTROY o") 
                    dw_Outbound.Modify("DESTROY p") 
                    dw_Outbound.Modify("DESTROY q") 
                    dw_Outbound.Modify("DESTROY r") 
                    dw_Outbound.Modify("DESTROY s") 
                    dw_Outbound.Modify("DESTROY t") 
                NEXT
            END IF
        NEXT

【讨论】:

  • 语法为destroy column #n(带尖号)或destroy column_name
  • @Seki,我正在使用语法 destroy column_name。 column_name 是 i 但它不起作用。 DataWindow.Modify("destroy i"),这样对吗?
  • 我错过了这样一个事实,即您 destroy 行上的循环内的列...该列存在于所有行中,一旦您在第一行中销毁它,destroy第二行中的同一列将失败,因为该列已经消失了。这就是incorrect syntax的由来:删除不存在的列(不再存在)
  • 不幸的是,第一条评论中有多种语法。语法为:DESTROY [COLUMN] 控件,如果添加关键字COLUMN,则数据集列和列控件一样被销毁;跳过该关键字只会破坏控件。由于 SaveAs() 对数据集起作用,因此您需要“DESTROY COLUMN 控件”语法。正如 Seki 所说,在循环内部这样做是没有意义的:这会同时影响所有行,不会逐行破坏列,如果那是你所追求的。
  • @Terry,感谢您添加的输入。我真正想要的是删除 Detail 段中第 9 到 20 列中的剩余选项卡。
【解决方案2】:

仅导出 DataWindow 中的某些列的最简单方法是设置数据源,以便您想要的列是前 N 列。我将使用所有列 dw_all 调用 DataWindow。接下来将 dw_all 保存为 dw_some,然后从数据源中删除 N 之后的列。然后,假设 dw_all 在 ds_all 中并且有你的数据,而 dw_some 在 ds_some 中并且为空:

ll_rows = ds_all.rowcount()
ds_some.object.data[1, 1,ll_rows,N] = ds_all.object.data[1,1,ll_rows,N]

您可以更改 ds_all 的开始和结束列以从中间复制一个列块,或最后 N 列,但是当您制作 dw_some 时,您必须注意列的类型和大小,而在 N 之后保存并删除列几乎是万无一失的。

最后,您可以使用不匹配的 DataWindows 并一次复制第一列的列和块。我希望下面的示例说明了为什么按照我推荐的方式制作 DataWindows 会更好。判断这是否正确的唯一方法是仔细检查两个 DataWindows 中的数据源:

dw_excel.Object.Data[1,1,il_rows,1]     = dw_report.Object.Data[1,1,il_rows,1] 
dw_excel.Object.Data[1,2,il_rows,3]     = dw_report.Object.Data[1,3,il_rows,4] 
dw_excel.Object.Data[1,4,il_rows,12]    = dw_report.Object.Data[1,5,il_rows,13] 
dw_excel.Object.Data[1,13,il_rows,13]   = dw_report.Object.Data[1,15,il_rows,15]
dw_excel.Object.Data[1,14,il_rows,14]   = dw_report.Object.Data[1,25,il_rows,25]
dw_excel.Object.Data[1,15,il_rows,20]   = dw_report.Object.Data[1,17,il_rows,22]

注意:在尝试使用此类数据表达式之前,请确保行数 > 0。

【讨论】:

    【解决方案3】:

    我认为,如果您使用 SaveAs 方法,则将导出所有列,即选择列表中的列。不管它是否可见。使用销毁和创建,您只需为选择列表中的列创建一个控件。如果您不想导出多列或想要重命名列的“标签”,我认为您需要一个单独的数据窗口,其中包含要导出的列,并且您需要将数据从原始数据窗口复制到“导出“数据窗口。这是你的问题吗?

    兄弟。加博尔

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2012-09-27
      • 1970-01-01
      相关资源
      最近更新 更多