以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助] Excel文件合并出错  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=100818)

--  作者:dj68301367
--  发布时间:2017/5/18 22:02:00
--  [求助] Excel文件合并出错


图片点击可在新窗口打开查看此主题相关图片如下:无标题.png
图片点击可在新窗口打开查看

问题如图片红色框所示。如果单元格中全是数值的就是会出错,这会不会跟表中的单元格是String格式有关。。。。。。

 

PCBA-BOM_But导入_Click

 

If e.Form.Controls("DropBox1").text > "" Then

    Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog

    dlg.Filter= "Excel文件|*.xls;*.xlsx" \'设置筛选器

    dlg.InitialDirectory =  "d:\\king\\"

   

    If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮

        e.Form.Controls("But生成表").performclick

       

        Dim mg As New Merger

        mg.SourcePath = dlg.FileName

        mg.Format = "excel" \'指定格式

        mg.SourceTableName =  "sheet1$" \'"采购订单序时簿$" \' & "$" \'指定要合并的表

        mg.DataTableName = Vars("TbName") \'指定接收数据的表

        mg.Merge() \'开始合并

       \' e.Form.Controls("But生成物料1").performclick

    Else

        Exit Sub

    End If

Else

    MessageBox.Show("请输入产品或半成品代码后再导入")

End If

 

 

PCBA-BOM_But生成表_Click

 

Vars("Str") = e.Form.Controls("DropBox1").text

 

Dim tx() As String = {"Comment","Footprint","子阶代码","物料名称","规格型号","Quantity","单位","车间","物料属性","仓库"}

Vars("TbName") = "PCBA-BOM _ " & Vars("Str")

Dim dtb As New DataTableBuilder(Vars("TbName"))

For i As Integer = 0 To tx.Length - 1

    dtb.AddDef(tx(i), Gettype(String), 200)

Next

dtb.Build()

\'Return

Dim tb As Table = Tables("PCBA-BOM_Table1")

Dim dt As DataTable = DataTables(Vars("TbName"))

Dim dt2 As DataTable = DataTables("物料表")

 

tb.DataSource = dt

tb.DataTable.DataRows.Clear

 

e.Form.text = Vars("TbName")

tb.AutoSizeCols

Dim cb As WinForm.ComboBox = e.Form.Controls("ComBOM类型")

Dim tab As WinForm.TabControl = e.Form.Controls("TabControl1")

tab.TabPages(2).Visible = False

cb.DataSource ="BOM组"

cb.DisplayMember = "BOM组名称"

cb.ValueMember = "代码"

cb.DataFilter = "代码 is not null"

\'cb.ComboList = DataTables("BOM组").GetComboListString("BOM组名称")


--  作者:wyz20130512
--  发布时间:2017/5/18 22:33:00
--  
http://www.foxtable.com/webhelp/scr/2629.htm
--  作者:有点色
--  发布时间:2017/5/18 22:39:00
--  

 merger有bug,你要换一种方法合并数据的。

 

http://www.foxtable.com/webhelp/scr/2334.htm

 


--  作者:dj68301367
--  发布时间:2017/5/19 10:05:00
--  

老师,按你的方法解决了,但又有另一个问题了,如下图,SQLFind与Find的结果不一致。。。我想直接从后台调数据,SQLfind应该怎么样修改。

    Dim dr As DataRow = dt3.SQLFind("规格=\'" & r("Comment") & "\' And 封装 =\'" & r("Footprint") & "\'")


图片点击可在新窗口打开查看此主题相关图片如下:无标题1.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2017/5/19 10:05:07编辑过]

--  作者:有点色
--  发布时间:2017/5/19 10:08:00
--  

sqlfind,是对于已经保存的数据进行查找的(你新增的数据没保存)

 

你可以先用find查找,如果找不到的话,再用sqlfind查找

 

Dim dr As DataRow = dt3.Find("规格=\'" & r("Comment") & "\' And 封装 =\'" & r("Footprint") & "\'")

If dr Is Nothing Then

    dr = dt3.SQLFind("规格=\'" & r("Comment") & "\' And 封装 =\'" & r("Footprint") & "\'")

End If

 

 

[此贴子已经被作者于2017/5/19 10:36:49编辑过]

--  作者:dj68301367
--  发布时间:2017/5/19 10:34:00
--  

老师,我在查找之前,已经对数据进行了保存,而且数据表中的DATAChange 增加了E.datarow.save

就是搞不懂为什么?

 

 

Dim tb As Table = Tables("PCBA-BOM_Table1")
Dim dt As DataTable = DataTables(Vars("TbName"))

Dim dt2 As DataTable = DataTables("物料表")
Dim dt3 As DataTable = DataTables("对应表")

 

DataTables("对应表").Save()
DataTables("对应表").Load()
\'保存对应表的数据

 

For i As Integer = 0 To tb.Rows.Count - 1
    Dim r As Row = tb.Rows(i)
   
    Dim dr As DataRow = dt3.sqlFind("规格=\'" & r("Comment") & "\' And 封装 =\'" & r("Footprint") & "\'")
    If dr IsNot Nothing Then
        If dr.IsNull("物料代码") = False Then
            r("子阶代码") = dr("物料代码")
            Dim dr1 As DataRow = dt2.SQLFind("代码 =\'" & r("子阶代码") & "\'")
            r("物料名称") = dr1("名称")
            r("规格型号") = dr1("规格型号")
            r("单位") = dr1("单位")
            r("车间") = dr1("车间")
            r("物料属性") = dr1("物料属性")
            r("仓库") = dr1("默认仓库名称")
        Else
\'MessageBox.Show("没有找到")
            r("子阶代码") = Nothing           
            r("物料名称") = Nothing
            r("规格型号") = Nothing
            r("单位") = Nothing
            r("车间") = Nothing
            r("物料属性") = Nothing
            r("仓库") = Nothing
        End If
    End If
Next
tb.AutoSizeCols()
MessageBox.Show("物料生成完成")


--  作者:有点色
--  发布时间:2017/5/19 10:36:00
--  
用5楼的方法,查两次。
--  作者:有点色
--  发布时间:2017/5/19 10:38:00
--  

Dim tb As Table = Tables("PCBA-BOM_Table1")
Dim dt As DataTable = DataTables(Vars("TbName"))

Dim dt2 As DataTable = DataTables("物料表")
Dim dt3 As DataTable = DataTables("对应表")

 

DataTables("对应表").Save()
DataTables("对应表").Load() \'保存对应表的数据

 

For i As Integer = 0 To tb.Rows.Count - 1
    Dim r As Row = tb.Rows(i)
    Dim dr As DataRow = dt3.Find("规格=\'" & r("Comment") & "\' And 封装 =\'" & r("Footprint") & "\'")
    If dr Is Nothing Then
        dr = dt3.SQLFind("规格=\'" & r("Comment") & "\' And 封装 =\'" & r("Footprint") & "\'")
    End If

    If dr IsNot Nothing Then
        If dr.IsNull("物料代码") = False Then
            r("子阶代码") = dr("物料代码")
            Dim dr1 As DataRow = dt2.SQLFind("代码 =\'" & r("子阶代码") & "\'")
            r("物料名称") = dr1("名称")
            r("规格型号") = dr1("规格型号")
            r("单位") = dr1("单位")
            r("车间") = dr1("车间")
            r("物料属性") = dr1("物料属性")
            r("仓库") = dr1("默认仓库名称")
        Else
            \'MessageBox.Show("没有找到")
            r("子阶代码") = Nothing
            r("物料名称") = Nothing
            r("规格型号") = Nothing
            r("单位") = Nothing
            r("车间") = Nothing
            r("物料属性") = Nothing
            r("仓库") = Nothing
        End If
    End If
Next
tb.AutoSizeCols()
MessageBox.Show("物料生成完成")


--  作者:dj68301367
--  发布时间:2017/5/19 10:47:00
--  

老师,你这个方法,自己保存的数据可以用Find查得出来,

 

如果是其它用户保存的,用Sql还是查不出来,必需要把对应表的数据再次加载才可以,对应表的数据越来越多了,加载时间太长。

 

DataTables("对应表").Load()   ‘这个我不想要

 

会不会因为规格和封装的数据都是数字的问题呀??

[此贴子已经被作者于2017/5/19 10:47:37编辑过]

--  作者:有点色
--  发布时间:2017/5/19 10:54:00
--  
认认真真看8楼代码。不需要load数据。