首页 > 解决方案 > Delphi - 检查数据库中是否已存在记录

问题描述

我试图将一个 cxGrid 的产品与已经注册到基地的产品进行比较,但我有疑问。

我有以下表格:

产品:id (pk)、描述、参考

items_note:产品(pk)、描述、单位

试图在事件 cxGridProdutoCustomDrawCell 上做,但它不起作用

procedure TFrmCompra.cxGridProdutoCustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
  var ADone: Boolean);
begin
  if QryItemNota.fieldByName('PRODUTO').asString <> QryProduto.fieldByName('REFERENCIA').asString then
  begin
     ACanvas.Font.Color := clRed
  end
  else
     ACanvas.Font.Color := clBlack;
end;

使用 Delphi RIO 10.3,带有 Firedac 组件的 Firebird 数据库

标签: delphigridfiredac

解决方案


很遗憾,您实际上并没有说明单元格中的文本是使用设置为红色还是黑色的字体绘制的。它应该可以正常工作,所以如果它只为您使用黑色或红色,那么您的if测试就会出错。首先,暂时将您的代码更改为

procedure TFrmCompra.cxGridProdutoCustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
  var ADone: Boolean);
begin
  ACanvas.Font.Color := clRed
end;

并让自己确信文本确实是红色的。然后,暂时将您的代码更改为

procedure TFrmCompra.cxGridProdutoCustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
  var ADone: Boolean);
var
  S1, 
  S2 : String;
begin
  S1 := QryItemNota.fieldByName('PRODUTO').asString;
  S2 := QryProduto.fieldByName('REFERENCIA').asString;
  if S1 <> S2 then
  begin
     ACanvas.Font.Color := clRed
  end
  else
     ACanvas.Font.Color := clBlack;
end;

然后,在行上放置一个断点if S1 <> S2 then并运行程序,直到断点命中。使用 F7 评估 S1 和 S2,您应该立即明白为什么没有得到您期望的结果。很可能 S1 和 S2总是相等或永远不相等。

您未包含的另一条信息是两个查询中的哪一个提供了网格视图,而您正在检查哪个查询。除非您知道另一个查询与显示的查询正确同步,否则您应该执行类似的操作

if QueryB.Locate({query B field name}, QueryA.FieldByName({query A field name}).AsString, []) then
   //  take record found action
else
   //  take record not found action

这将检查 QueryA 中当前行的值(在 CustomDraw 事件中正在处理)是否可以在 QueryB 中找到。


推荐阅读