Sql 我将SELECT查询更改为包含JOIN,现在无法在DataGridView中编辑单元格

Sql 我将SELECT查询更改为包含JOIN,现在无法在DataGridView中编辑单元格,sql,vb.net,winforms,datagridview,visual-studio-2012,Sql,Vb.net,Winforms,Datagridview,Visual Studio 2012,好吧,我在这里玩了一段时间,现在我被卡住了。我编写了一个查询来为我的DataGridView获取一些数据,然后用一个更短的查询来替换它。由于某些原因,在更改select查询后,我无法再编辑datagridview控件中的单元格。唯一的区别是,我不需要选择列的整个表,而是选择一个不同的表并将项目表连接到其中 ITEM.Amount[付款]是我需要编辑的列。我可以在第一个查询中编辑它,但不能在第二个查询中编辑它 工作查询: select ct.[Employee] , cT.[Employee ID

好吧,我在这里玩了一段时间,现在我被卡住了。我编写了一个查询来为我的DataGridView获取一些数据,然后用一个更短的查询来替换它。由于某些原因,在更改select查询后,我无法再编辑datagridview控件中的单元格。唯一的区别是,我不需要选择列的整个表,而是选择一个不同的表并将项目表连接到其中

ITEM.Amount[付款]是我需要编辑的列。我可以在第一个查询中编辑它,但不能在第二个查询中编辑它

工作查询:

select ct.[Employee]
, cT.[Employee ID]
, cT.[Case Number]
, cT.[Usual Payment]
, cT.[Scheduled Ded.]
, i.amount [Payment]
, i.Paycard_Date [Paycard Date]
, i.ID [item_id]
, i.modified [iMod]
from dbo.Item i
right join

(select 
    case(ISNULL(e.middle_name,'99'))
    when '99' then e.First_Name + ' ' + e.Last_Name
    else (e.First_Name + ' ' + e.Middle_Name + ' ' + e.Last_Name)
    end as Employee
, e.Number [Employee ID]
, c.number [Case Number]
, c.weekly_payment [Usual Payment]
, c.payment_balance [Scheduled Ded.]
, s.Agency [Source]
, c.modified [cMod]
, e.modified [eMod]
, s.modified [sMod]
, c.ID
from tCase c
inner join Employee e
on e.ID = c.ID_Employee
inner join Source s
on s.ID = c.ID_Source) as cT
on cT.ID = i.ID_Case
declare @paycard_date datetime
set @paycard_date = '1/10/2013'

select (isnull(e.First_Name,'') + ' ' + ISNULL(e.Middle_Name,'') + ' ' + ISNULL(e.Last_Name, '')) [Employee]
, e.Number
, c.Number
, c.Weekly_Payment
, c.Payment_Balance
, ISNULL(i.amount,'') [Payment]
, s.Agency
, isnull(i.Created,'') [created]
, isnull(i.Modified,'') [modified]
, ISNULL(i.ID,'') [Item ID]
from tcase c
inner join Employee e
on e.ID = c.ID_Employee
inner join Source s
on s.ID = c.ID_Source
left join 
(select * 
from item i
where paycard_date = @paycard_date) as i
on i.id_case = c.ID
非工作查询:

select ct.[Employee]
, cT.[Employee ID]
, cT.[Case Number]
, cT.[Usual Payment]
, cT.[Scheduled Ded.]
, i.amount [Payment]
, i.Paycard_Date [Paycard Date]
, i.ID [item_id]
, i.modified [iMod]
from dbo.Item i
right join

(select 
    case(ISNULL(e.middle_name,'99'))
    when '99' then e.First_Name + ' ' + e.Last_Name
    else (e.First_Name + ' ' + e.Middle_Name + ' ' + e.Last_Name)
    end as Employee
, e.Number [Employee ID]
, c.number [Case Number]
, c.weekly_payment [Usual Payment]
, c.payment_balance [Scheduled Ded.]
, s.Agency [Source]
, c.modified [cMod]
, e.modified [eMod]
, s.modified [sMod]
, c.ID
from tCase c
inner join Employee e
on e.ID = c.ID_Employee
inner join Source s
on s.ID = c.ID_Source) as cT
on cT.ID = i.ID_Case
declare @paycard_date datetime
set @paycard_date = '1/10/2013'

select (isnull(e.First_Name,'') + ' ' + ISNULL(e.Middle_Name,'') + ' ' + ISNULL(e.Last_Name, '')) [Employee]
, e.Number
, c.Number
, c.Weekly_Payment
, c.Payment_Balance
, ISNULL(i.amount,'') [Payment]
, s.Agency
, isnull(i.Created,'') [created]
, isnull(i.Modified,'') [modified]
, ISNULL(i.ID,'') [Item ID]
from tcase c
inner join Employee e
on e.ID = c.ID_Employee
inner join Source s
on s.ID = c.ID_Source
left join 
(select * 
from item i
where paycard_date = @paycard_date) as i
on i.id_case = c.ID
再次重申,这两个查询都有效,但非有效查询不允许我编辑ITEM.Amount[Payment]列。我假设这是因为不能通过DGV控件编辑联接的表/列,但我不确定。我添加了VB.net代码,以在用户退出编辑单元格模式后更新数据,但如果用户不能首先进入编辑单元格模式,则没有多大用处

编辑: 我将试着解释一下我想要实现的目标。为了举例,假设我有100个案例文件。它们存储在tCase表中。这些案例记录了员工工资支票的扣款情况。实际装饰扣减额存储在项目表中。每周,对于每种情况,用户都需要在列表中添加或编辑该周的项目。在创建一个项目之前,即,在它不再是$0金额之前,该项目的行显然不存在于项目表中。这意味着查看新一周的数据实际上不会显示任何内容,而编辑旧一周的数据将忽略零数量

因此,我编写的查询通过拉动每个案例条目并左键连接以下子表来解决问题:

(select * 
from item i
where paycard_date = @paycard_date) as i

因此,我的新问题是……我是否应该重新思考我提取这些数据的方法,或者即使将列作为子表提取,是否可以在DataGridView中编辑列?

我很久没有使用VB了。从内存中,当VB构建数据集时,它会尝试确定查询是否无法转换为更新和删除。然后确定在第一次查询中可更新的主表。表项直接突出,因此VB可以使网格可更新。在第二种情况下,它混淆了。如果进行调试,您将看到它如何在幕后为您生成更新和删除查询。尝试更改第二个查询,使表项位于第一位。另外,去掉i的ISNULL。amount@cha我喜欢这个解决方案,但有一个问题。我将编辑我的问题,让您更好地了解我正在尝试做什么。