我用程序建了一交叉查询,程序每次加载时都要重新建立此交叉查询,删除之前建的查询。问题是我用程序代码发现不了这个查询,无法删除。也就是当我遍历时无法发现交叉表的存在,直接删如果不存在又会出现异常。源码:
procedure TFrm_BOMDataGrid.CreateDynamic(ViewName: string);
var
  FCatalog:_catalog;
  Sqlstr2:String;
  ADOCommand:TADOCommand;
begin
{如果发现有交叉表,删除此交叉表}
  if TestDynamicView(ViewName) then   
  begin
      DeleteDynamicView(Viewname);
  end;  FCatalog:=coCatalog.Create;
  FCatalog.Set_ActiveConnection(dm.ADOCONN.ConnectionObject);
  Sqlstr2:='TRANSFORM SUM((销售用料.用料)*(销售用料.数量)) AS 用料 ';
  Sqlstr2:=Sqlstr2+'SELECT MRPMain.材料编码, MRPMain.材料名称, MRPMain.规格, MRPMain.采购周期, MRPMain.单价, MRPMain.产品供应商, MRPMain.材料分类, MRPMain.最低库存 ';
  Sqlstr2:=Sqlstr2+', MRPMain.结存, Avg(MRPMain.在途) AS 在途数,MRPMain.采购系数 ';
  Sqlstr2:=Sqlstr2+'FROM MRPMain LEFT JOIN 销售用料 ON MRPMain.材料编码=销售用料.材料编码 ';
  Sqlstr2:=Sqlstr2+'GROUP BY MRPMain.材料编码, MRPMain.材料名称, MRPMain.规格, MRPMain.采购周期, MRPMain.单价, MRPMain.产品供应商, MRPMain.材料分类, MRPMain.最低库存, MRPMain.结存,MRPMain.采购系数 ';
  Sqlstr2:=Sqlstr2+'PIVOT 销售用料.型号 & 销售用料.规格 & "  " & 销售用料.数量 & "台"';  ADOcommand:=TADOcommand.Create(self);
  ADOcommand.Connection:=dm.ADOCONN;
  adocommand.Commandtext:=Sqlstr2;  try
    try
    FCatalog.Views.Append(ViewName,adocommand.CommandObject); //创建成功
    except
    raise exception.create('创建视图失败!');
    end;
  finally
    Adocommand.Free;
  end;end;{删除交叉表的代码}
{用 Drop Table 交叉表名 可直接删除,但必须先发现此交叉表}
procedure TFrm_BOMDataGrid.DeleteDynamicView(ViewName: string);
var
  Fcatalog:_Catalog;
begin
  Fcatalog:=coCatalog.Create;
  FCatalog.Set_ActiveConnection(dm.ADOCONN.ConnectionObject);
  Fcatalog.Views.Delete(ViewName);end;{寻找交叉表,这里我无论用Tables还是Views都发现不了交叉表,高人指点迷津}
function TFrm_BOMDataGrid.TestDynamicView(ViewName: string):boolean;
var
  Fcatalog:_Catalog;
  i:Integer;
begin
  Result:=false;
  Fcatalog:=coCatalog.Create;
  FCatalog.Set_ActiveConnection(dm.ADOCONN.ConnectionObject);
  for i:=0 to FCatalog.Tables.Count-1 do
   begin
     if Fcatalog.Tables.Item[i].Name=ViewName then
      Result:=true;
   end;
end;
分数有限,望见谅。

解决方案 »

  1.   

    不知道为什么没人回复。我的解决方法是在程序启动时建一个与ViewName相同的View,以后每次程序运行都会删掉以前的VIENAME,并新建一个VIEWNAME,这样我的程序可以检测到这个VIEWNAME,给删除掉然后用程序代码新建一个VIEWNAME,基本可用,但是这样有性能问题真让人感到难受。
      

  2.   

    >>直接删如果不存在又会出现异常
    用try包一下就好了,这是最简单的处理办法。