关于数据上报的问题 (300分)

  • 主题发起人 主题发起人 xiaocai
  • 开始时间 开始时间
X

xiaocai

Unregistered / Unconfirmed
GUEST, unregistred user!
请帮忙!要求每个月下级向上级上报一次数据,每个数据是30个字段40条记录,也就是一张
40X30的二维表,存为TXT用电子邮件附件的形式发送,上下级的邮件地址固定,用什么方
法?什么EMAIL控件好用又不算大(只完成上述功能就行)?从库里怎么把数据读出来存进
TXT中?上级如何接收?接到TXT后又怎样读入库中?每个上级有大约100个下级,下级的数据在上级处
汇总,我想用TREEVIEW控件把他们显示出来,如何做?留个思路,抛玉引砖..:)
附:字段a0,a1...a30 a0为行号,a1..a30为字段
 
提一脚

关注!
 
from dubao
ADO支持txt格式文件
加一个ADOConnection,
1、对应的连接串的引擎设为 Jet OLEDB 4.0;
2、数据库名那里选上你的*.txt文件;
3、在最后一页(“所有”页)中的“Extended Properties”一项设为Text
那么一个完整的连接串就是:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:/Text{改成你的目录} ;
Extended Properties=Text;
Persist Security Info=False

再加上一个ADOTable,把它的Connection
设为上面的ADOConnection,设好它的TableName属性(就是文本文件名了)
Active设为True,再加上DataSource,DBGrid等控件操作就行了。
 
不行不行!决不用ADO,个人喜好问题!
 
不行就用delphi的文件读写

高级一点的用dataset的savetofile,功能

至于email控件则那几个都可以,
 
//分数多的是,要求大虾写比较完整的源程序
你以为大家都是为了分才来这里的吗?你以为你有分大家就会给你写完整的程序吗?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=658649
到这里看看吧!动不动就让别人写程序,很可恶![:(!]
 
邮件里写数据也可以,只要上级能接收到就行!
Delphi里自带的fastnet里的pop3、smtp控件能实现我要求的功能吗?
来个思路
 
谢谢bubble的思路,但是我不喜欢用ADO,真抱歉,我想是不是可以写一个循环
用QUERY把数据库中的数据读出,写入外部的TXT或直接写入EMAIL中呢?主要是
怎样把一个一个的字段写到TXT中,是这样吗?
line1#a1#a2....#a30
line2#a1#a2....#a30
....
line40#........#a30
每个字段与字段中间用特殊符号比如#分割,用来方便接受数据时候再读回到库中!对吗?
我想是这么想的,但是不大会编程实现,来个思路!
还有,上级接收到100个下级的EMAIL后,例如txt000001.txt,txt000002.txt....txt000100.txt
怎么才能从接收数据的目录里(比如/jssj))把它们列入一个TREEVIEW中,让TREEVIEW
显示这个样子:
+ 2002年01月
-000001
-000002
.....
-000100
 
谢谢荷塘新月的留言,我已经把问题中对DFW们多有冒犯的词删除掉了;我知道大家来这里
是为了技术交流,而不是为了分数,但是我认为在BBS中分数可以代表别人的尊重和自己的
荣誉,因为工程时间太紧才出此下策,我诚心接受你的批评!对你lid=658649的帖子表示
认同,并且希望你不要认为我是一个吃白食的DELPHI程序员。为了这个程序我从月初就开始
每天只睡3个小时,剩下几个难点我无法解决而我的脑子已经非常疲惫了(相信接过工程
的程序员都有这种经历),到这里来提问一是为交流,二是为了能放松一下。再次SORRY!
 
对不起,我误解你了!
 
何必一定要保存在TXT文件中呢,直接把要上报的数据保存在一个相同结构的库中,
上报后再由上级将其导入不就行了?
 
Ok
来一段。
  例如,有一段人事档案资料archive.txt,内容如下:
  小许男21工程师
  小吴女23助理工程师
  小蔡男22助理工程师
  小牟女22工程师
  要将它转入数据库archive.dbf中,archive.dbf结构如下:
  姓名,性别,年龄,职称
  (1)functionLength(S:String):Integer
  //返回串的长度
  (2)functionCopy(S:String;Index,Count:Integer):String
  //给出一个字符串中串的拷贝
  (3)functionPos(Substr:String;S:String);Integer
  //查找子串在字符串中的位置
  (4)ProcedureDelete(VarS:String;Index,Count:Inte?ger);
  //从一个字符串中去除子串
  利用Delphi提供的已有函数和过程基础上编制自己的三个函数,实现了纯文本格式资料转入数据库功能。只要Delphi支持的数据库都可以支持。
  archive.txt中每行数据为一个字符串,字符串中每个被分割的数据为一个字段,分割每个字段的字符为分割符,这里是空格,也可以是,、;、#等符号。具体思想
是:先将字符串进行调整,然后把串中每个字符同分割符比较,将不是分割符的字符追加到MyStr串中,最后得到一个字段的内容。通过一个循环,就可以将一个字符串分
成几个字段。
  FunctionRegulate(aString,Sepchar:string):string
  //去掉多余的分割符,规范字符串
  FunctionGetSubStr(varsString:string;SepChar:String):String;
  //得到字符串中一个子串
  //因要改变参数aString的值,所以将它用var定义。
  FunctionGetSubStrNum(aString,SepChar:String):Integer;
  //计算一个字符串要被分割成几个字段。
  参数:aString是所需分割的一个字符串,SepChar是分割符。
  FunctionRegulateStr(aString:String;Sepchar:String):String;
  var
  i,Num:Integer;
  Flag:Boolean;
  MyStr,TempStr:String;
  begin
  Flag:=False;//进行标志,去除多余的分割符
  Num:=Length(aString);//计算aString串的长度
  fori:=1toNumdo
  begin
  TempStr:=Copy(aString,i,1);//取aString串中的一字符
  if TempSt>=SepChar then
  begin
  MyStr:=MyStr+TempDtr;
  Flag:=True;
  end
  else
  if(Flag=True)then
  begin
  Mystr:=Mystr+TempSrt;
  Flag:=False;
  end;
  end;
  if MyStr[Length(MyStr)]>=SepChar then
  MyStr:=MyStr+SepChar;
  RegulateSrt:=MyStr;
  end;
  FunctionGetSubStr(varaString:String,SepChar:Strign):String;
  var
  Mysrt:String;
  StrLen:Integer;
  SepCharPso:Integer;
  begin
  StrLen:=Length(aString);
  SepCharPos:=Pos(SepChar,aString);//计算分割符在子串中的位置
  MyStr:=Copy(aString,1,SepCharPos-1);//将分割符前所有字符放到mystr串中
  Delete(aString,1,SepCharPos);//除去分割符和分割符前的子串
  GetSubStr:=MyStr;//返回一个字段
  end;
  FunctionTforml.GetSubStrNum(aString:String;SepChar:String):Integer;
  var
  i:Integer;
  StrLen:Integer;
  Num:Integer;
  begin
  StrLen:=Length(aString);
  Num:=0;
  for i:=1 to StrLen do
  if Copy(aString,i,1)=SepChar then
  Num:=Num+1;
  GetSubSrtNum:=Num;
  end:
  有了上面三个函数,现在介绍一下具体的应用:
  1.首先建立一个窗体Forml,加入一个RichEditl(或Menol),一个按钮Buttonl和一个Tablel,设置Tablel的属性:
  Tablell.DataBase=′c:/Archivs′
  Tablell.TableName=′Archive.dbf′
  2.分别加入以下程序:
  ConstSpace:=′′
  ProcedureTForml.FormCreate(Sender:Tobject);
  begin
  RichRditl.Lines.LoadFromFile(′Archive.txt′);
  end;
  ProcedureTForml.Button1Click(Sender:T object);
  var
  i,j:Integer;
  MyLine:String;
  begin
  with Tablel do
  begin
  Open;
  for i:=0 to RichEditl.Lines.Count-1 do
  begin
  MyLine:=RegulateStr(Richeditl.Lines[i],Space);
  for j:=1 to Num To ken(MyLIne,Space) do
  begin
  Append;
  fileds[j-1].aString:=GetSubSrt(MyLine,Space));
  post;
  end;
  end;
  end;
  end;
  然后就可以进行编译,运行了。

看你怎么用了,反着也一样。
第二个问题,
TreeView很容易就办到。
把目录下的文件名存到一个StringList,
分析字符串(这是最主要的),
然后先加上根节点,根据分析结果添加子节点。

 
我做过这样的东西,给你几点建议:
1、如果数据量大,文件多,请不要用电子邮件。
2、由于通讯线路问题,请务必在确认以下载完全后才删除邮件。
3、领导端程序先察看邮件列表,只下载需要的数据。
4、电子邮件要设为拒绝垃圾邮件。
5、时间允许,你改为ftp吧。
 
不喜欢Ado,不知道Odbc对不对你胃口? :-)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1000337
 
如果用空格或别的什么字符做为分隔符可能会出现问题,即你的字段值可能包含有这些字符,
这样你生成的TXT就会有问题。

我觉得你没有必要生成TXT格式,为什么不能生成EXCEL或DBF格式呢?或者直接把你的数据库
做为附件发送得了。

你可以在程序里生成文件前调用SaveDialog1,将SaveDialog1.filename设为"2002年01月"
接收时程序调用OpenDialog1,将OpenDialog1.filename做为一个节点加入到TreeView
 
真诚的语言可以换来大家的理解和支持,看来大家都是性情中人!:)
TO HunterTeam:我也想这么办,可是我做这个工程的时候是一个不懂装懂的人作好了系统规划,
连什么屏幕分辨率这种东西都写出来了,可是对于程序的结构分析,却一塌糊涂!
对于咱们这种没有TEAM SOURCE的DFW来说,这种东西做起来真是头大,因为我们都是可怜的
小程序员;我讨厌这种工程,可我又没有钱:(
 
ftp也好,怎么做呢。我的工程是这样的分四级,一级一级向上报
1级=20X2级 2级=3级X100 3级=30X4级,就是说,四级给三级FTP,三级给二级FTP,....
那么比如服务器在一级,只有一个,234FTP都用它,怎么让不同的3级只能接受它所管的4级;
依次类推,有点绕:),用FTP能实现吗,有好控件吗?
 
有意思,关注。
 
能实现,我现在要出去,有空给你写。
 
后退
顶部