关于数据集的问题(50)

  • 主题发起人 主题发起人 victor9871
  • 开始时间 开始时间
V

victor9871

Unregistered / Unconfirmed
GUEST, unregistred user!
我这边已经从excel 导入到access 一组数据 客户电话 业务员 111111 小周222222 小李 等等 这是今天导入的数据,如果第二天导入数据的话 ,又出现客户电话 111111,那就自动分配给这个客户 给小周业务员,如果又出现222222,就自动分配给小李,一次类推,如果以前出现这个客户 分配给某个业务员,以后导入的数据就自动分配给这个业务员.客户电话字段是 tel 业务员是 ywy,通过数据集实现即可
 
没法实现~
 
  正常来说,这个分配应当在你导入的时候就去实现,而不是导入之后才实现。比较好的方式是建两张表,一张是 客户电话-业务员 关系表(假定为tCus),另一张才是你现在这个记录业务发生明细的表格(假定为tTrad)。  非sql的实现方式:数据由excel逐条导入时,对于每一条记录,首先判断其中的客户电话是否存在于tCus之中,用locate()查找,如果不存在,则在tCus中添加一条新记录,并正常导入excel记录。如果存在,则在导入时把 业务员 字段改为tCus中对应的记录。 逐条导入循环体 if tCus.locate('客户电话',excel.客户电话,[]) then begin tTrad.业务员:=tCus.业务员; end else begin tTrad.业务员:=excel.业务员; tCus.append; ... //tCus中添加关系记录 end; 导入业务员以外的字段 .....如果实在是不想多建一张表,也可以实现,每次导入之前先查找tTrad里面是否有相同的客户电话就行了,实现方法同上,就是把表名从tCus改为tTrad。不过我还是建议多建一张,这样结构比较清晰。
 
with Qry_Info do begin Edit; Post; end; with Qry_Field do begin Close; SQL.Clear; SQL.Add('select * from T_Import where F_Field<>'''+' '+''' and tablename='''+tablename+''''); Open; end; for i:=1 to Qry_Field.RecordCount do begin F_Field:=Qry_Field.FieldByName('F_Field').AsString; //源字段 S_Field:=Qry_Field.FieldByName('S_Field').AsString; //映谢字段 Qry_Field.Next; end; if tablename='custom' then begin Btn_Start.Enabled:=False; Screen.Cursor:=crHourglass; Frm_Data.OpenDataSet(Qry_Import,'Select * from custom'); o:=0; p:=0; for i:=1 to Frm_Main.b_row-1 do begin ProgressBar1.Max:=Frm_Main.b_row-1; Frm_Data.ADOConnection1.BeginTrans; try with Qry_Import do begin Append; For k:=1 to Qry_Field.RecordCount do begin m:=Frm_Main.ImportFields.IndexOf(F_Field[k])+1; for l:=1 to Qry_Field.RecordCount do begin FieldByname(S_Field[k]).AsString:=Frm_Main.eclApp.activesheet.cells.item[i+1,m].Text; end; end; Post; end; inc(o); Frm_Data.ADOConnection1.CommitTrans; except Frm_Data.ADOConnection1.RollbackTrans; Inc(p); end; ProgressBar1.Position:=i; end; MessageDlg(Pchar('导入数据完成,导入成功 '+inttostr(o)+' 条,导入失败 '+inttostr(p)+' 条'),mtConfirmation, [mbOK], 0); Screen.Cursor:=crDefault;我这边导入代码是这样的 对你的代码还不是很理解 希望可以指导一下
 
为啥会写得这么复杂......而且为啥不用sql呢,sql快很多呀,代码也简单得多。啊,发现了,你不是用ado连接的excel,而是用ExcelApplication.....怪不得这么复杂。'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Excel表格文件名;Extended Properties=Excel 8.0;'用这段连接字符串,可以用ADO连接excel文件,然后就是两个dateset之间的数据复制了,具体参考我在3楼写的内容。如果你有兴趣用sql的话,我再告诉你sql的写法。
 
sql的写法: //1、将excel表的内容导入到临时表中以便于修改业务员,如果你不在乎修改原表的话,可以跳过 ADOConnection.Execute('select 字段1,字段2,反正就是表格中你需要导入的字段 into table_Temp from [Excel 8.0:Database=你的excel表格文件名含路径].[''工作表名$'']'); //注意工作表名前面是两个单引号,不是双引号,另外,工作表名后面要加一个$,必须的。table_Temp为临时表名 //2、更新临时表中的业务员,假定你存放业务明细的表叫做table_Info,存放客户电话、业务员关系的表叫做table_Relation ADOConnection.Execute('update table_Temp as t, table_Relation as r set t.业务员=r.业务员 where t.客户电话=r.客户电话'); //3、向关系表中追加新客户的信息 ADOConnection.Execute('insert into table_Relation (客户电话,业务员) select 客户电话,业务员 from table_Temp where not exists (select ''1'' from table_Relation where 客户电话=table_Temp.客户电话) '); //4、向明细表中导入已更新的明细 ADOConnection.Execute('insert into table_Info (字段1,字段2) select 字段1,字段2 from table_Temp'); //5、删除临时表 ADOConnection.Execute('drop table table_Temp' ); 完了,一共就5行,比你那个简单得多吧,而且速度会快N倍,记录越多速度优势越明显。
 
目前还不是很懂 谢谢sherlockye
 
晕,写了这么多,怎么积分给了2楼,我倒
 
后退
顶部