以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]fill中的表问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=107266)

--  作者:blsu33
--  发布时间:2017/9/24 17:46:00
--  [求助]fill中的表问题
老师,
  FILL产生表D来自ABC三个表,如何做能增加D表一行数据,更新ABC三个表三个表呢?思路是什么

--  作者:有点甜
--  发布时间:2017/9/24 21:30:00
--  
 datacolchanged事件,判断表D的列,根据表D主键的值,在abc表查找对应的行,然后新增或者修改或者删除。
--  作者:blsu33
--  发布时间:2017/9/25 9:27:00
--  
 .NET Framework 版本:2.0.50727.3053
Foxtable 版本:2017.8.19.1
错误所在事件:
详细错误信息:
对于多个基表不支持动态 SQL 生成。


Tables("窗口1_Table1").Fill("Select  部门,姓名,密码,好友,{用户}.[_Identify],{用户}.[_Locked],{用户}.[_SortKey],{用户表}.[_Locked],{用户表}.[_SortKey],权限ID,用户名,{用户表}.[_Identify] F rom {用户} Inner JOIN {用户表} ON {用户表}.[用户名] = {用户}.[姓名]","test",False)

那是不是 只能这么写了

Tables("窗口1_Table1").Fill("Select  部门,姓名,密码,好友,{用户}.[_Identify],{用户}.[_Locked],{用户}.[_SortKey],{用户表}.[_Locked],{用户表}.[_SortKey],权限ID,用户名,{用户表}.[_Identify] F rom {用户} Inner JOIN {用户表} ON {用户表}.[用户名] = {用户}.[姓名]","test",true)
--  作者:有点甜
--  发布时间:2017/9/25 9:29:00
--  
 只能用查询表。
--  作者:blsu33
--  发布时间:2017/9/25 9:45:00
--  
datacolchanged 怎么写呢 都不会了
以下代码 都不行 ?

\'Dim dt As DataTable=e.Form.Controls("Table1").DataTable
\'MessageBox.Show(dt.name)


\'MessageBox.Show(E.DataRow("_Identify"))

\'If E.DataRow.RowState=DataRowState.Added Then
\'MessageBox.Show(E.DataRow("_Identify"))
\'End If

\'Dim t As Table=Tables("窗口1_table1")
\'Dim r As Row=T.Current
\'MessageBox.Show(r("_Identify"))

[此贴子已经被作者于2017/9/25 9:45:27编辑过]

--  作者:有点甜
--  发布时间:2017/9/25 9:51:00
--  

DataColChanged事件直接判断列名。

 

比如有 表Aid、表A第一列、表A第二列、表Bid、表B第三列

 

你修改了【表A第一列】,那么就根据【表Aid】查找表A的行,如果找到,就直接改值;如果没找到,那就给表A新增一行。


--  作者:blsu33
--  发布时间:2017/9/25 10:16:00
--  
 老师,
5楼的意思是怎么引用这个_Identify 列呢
Select Case E.DataRow.RowState
    Case DataRowState.Added
    Case DataRowState.Modified
        MessageBox.Show(E.DataRow("_Identify"))
    Case DataRowState.Unchanged
End Select

.NET Framework 版本:2.0.50727.3053
Foxtable 版本:2017.8.19.1
错误所在事件:表,窗口1_Table1,DataColChanged
详细错误信息:
调用的目标发生了异常。
列“_Identify”不属于表 窗口1_Table1。

--  作者:有点甜
--  发布时间:2017/9/25 10:19:00
--  

 你fill的表里面,请把各个表的主键加进来,改一个别名,如

 

select {表A}.[_Identify] As 表AId, {表B}.[_Identify] As 表BId


--  作者:blsu33
--  发布时间:2017/9/25 11:43:00
--  
老师
 看到效果了,把代码放到了保存按钮中,统一完成。
不知是否这样操作?
绿色部分的代码,是列名,但是,FT的类型不好判定,还要弄一个表来记录?

Dim flt As String
Dim drnames() As String={"部门","姓名","密码"}
Dim tb As Table =Tables("窗口1_Table1")
Select Case tb.Current.DataRow.RowState
    Case DataRowState.Added
    Case DataRowState.Modified
        Dim r As Row=tb.Current
        For Each drname As String In  drnames
            flt &=drname & "=\'" & r(drname) & "\',"
        Next
        Dim cmd2 As New SQLCommand
        cmd2.C
        cmd2.CommandText ="UPDATE {用户} S ET " & flt.TrimEnd(",") & " where" & " [_Identify]=" & r("zbid")
        MessageBox.Show(cmd2.CommandText )
        cmd2.ExecuteNonQuery()
        tb.DataTable.Save()
    Case DataRowState.Unchanged
        e.Form.Close
End Select


--  作者:有点甜
--  发布时间:2017/9/25 11:51:00
--  

1、sqlQuery表无法判断 rowState 的值的,你要多加一个辅助列,在datacolchanged事件标记是新增还是修改;

 

2、绿色的代码,没问题,不需要判断类型,sql语句任何类型的值都可以用单引号括起来。