我用程序建了一交叉查询,程序每次加载时都要重新建立此交叉查询,删除之前建的查询。问题是我用程序代码发现不了这个查询,无法删除。也就是当我遍历时无法发现交叉表的存在,直接删如果不存在又会出现异常。源码:
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;
分数有限,望见谅。
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;
分数有限,望见谅。
用try包一下就好了,这是最简单的处理办法。