在我的Delphi应用程序中,我使用查找字段,但是以不寻常的方式。实际上,我想更新底层数据集中的字段,就像它在同一张表中一样。
现有指南说没有问题,只需加入表格,就可以了...如果他们真的用这么简单的方法成功完成了这个任务,我会很羡慕。但我并没有。顺便说一下,我认为我已经接近达到我的目标了。我还有一个问题:我怎么才能得到我刚输入到DBGrid单元格中的值?
我尝试了
希望这能更清晰地解释我的任务。如果您需要mcve,我可以扩展此内容,但我认为这并不重要。
我的数据库是Oracle,通过ADO连接。我希望解决方案尽可能简单。
现有指南说没有问题,只需加入表格,就可以了...如果他们真的用这么简单的方法成功完成了这个任务,我会很羡慕。但我并没有。顺便说一下,我认为我已经接近达到我的目标了。我还有一个问题:我怎么才能得到我刚输入到DBGrid单元格中的值?
我尝试了
DBGrid[FieldName].EditValue
和.DisplayText
,但它们显示的值与Field.Value
相同,在退出列后不会改变,因为它是查找字段。 Sender.NewValue
为空。我正在使用此函数来更新查找表:procedure TKDGridForm.LookupFieldChange(Sender: TField);
begin
if not Assigned(Sender) then
Exit;
Sender.OnChange := nil;
if not Assigned(Sender.LookupDataSet) then
Exit;
if Sender.LookupDataSet.Locate(Sender.LookupKeyFields, Sender.DataSet[Sender.KeyFields], []) then
Sender.LookupDataSet.Edit
else
Sender.LookupDataSet.Append;
// how do I get the value I just entered?
Sender.Value := KDGrid3[Sender.FieldName].DisplayText;
Sender.LookupDataSet.FieldValues[Sender.LookupResultField] := Sender.Value;
Sender.LookupDataSet.Post;
Sender.OnChange := LookupFieldChange;
end;
以下是我在使用查找字段之前使用的SQL:
select det.*,
od1.T_EQ T_SHABLON_EQ,
od1.T_NV T_SHABLON_NV,
od1.T_PRIM T_SHABLON_PRIM,
od2.T_EQ T_PRAVKA_EQ,
od2.T_NV T_PRAVKA_NV,
od2.T_PRIM T_PRAVKA_PRIM,
od3.T_EQ T_VALCOV_EQ,
od3.T_NV T_VALCOV_NV,
od3.T_PRIM T_VALCOV_PRIM,
od4.T_EQ T_REZKA2_EQ,
od4.T_NV T_REZKA2_NV,
od4.T_PRIM T_REZKA2_PRIM
from CMKNEW.details det
left join CMKNEW.OperDetails od1
ON det.nrec = od1.cdetail
and 81 = od1.coper
left join CMKNEW.OperDetails od2
ON det.nrec = od2.cdetail
and 82 = od2.coper
left join CMKNEW.OperDetails od3
ON det.nrec = od3.cdetail
and 83 = od3.coper
left join CMKNEW.OperDetails od4
ON det.nrec = od4.cdetail
and 84 = od4.coper
where det.ckd=:CKD order by det.NREC
希望这能更清晰地解释我的任务。如果您需要mcve,我可以扩展此内容,但我认为这并不重要。
我的数据库是Oracle,通过ADO连接。我希望解决方案尽可能简单。