im试图用txtfile中的信息替换phc表,但没有在屏幕上获得信息。
re是我要替换值的表txtcabecalho是人们必须选择的导入文件reciboc是我创建的光标,用于存储txt文件中的值,这样我就可以在re上替换它们并将它们显示在屏幕上sre是关于的表格的屏幕
Local txtcabecalho
Use re
Delete all
txtcabecalho=getfile("txt")
Create cursor reciboc(rno n(10), rdata d(10), moeda c(3), no n(10), nome c(2), ccusto c(20), intid c(10), clbanco c(20), total float(19), totalmoeda float(19), ndoc n(3))
append from (txtcabecalho) delimited with tab
select reciboc
goto top
scan for !empty(reciboc.rno)
select re
append blank
replace re.rno with reciboc.rno
replace re.rdata with reciboc.rdata
replace re.moeda with reciboc.moeda
replace re.no with reciboc.no
replace re.nome with reciboc.nome
replace re.ccusto with reciboc.ccusto
replace re.intid with reciboc.intid
replace re.clbanco with reciboc.clbanco
replace re.total with reciboc.total
replace re.totalmoeda with reciboc.totalmoeda
replace re.ndoc with reciboc.ndoc
select re
endscan
sre.refresh()
谢谢!
更新
因此,如果我用我选择的分隔符(例如制表符)来装箱我自己的文件,这实际上是有效的。问题是,我需要导入的文件就像使用空格作为空格持有者一样,彼此之间没有分隔符。让我解释得更好。例如前3个字段rno和rdata以及moeda。
txt文件类似于22014-12-23EUR
其中2是rno,但后面有9个空格,就像占位符一样,用于较大的数字,使rno(10)下一个是2014-12-23,它就在rno旁边,没有划界,rdata也是(10)下一个是moeda,它是欧元,同样没有划界,是moeda(3)
许多字段将是空白的,而这些txt文件带有空格,用于复制字段的全部长度。基本上,字段长度被用作定界,当为空时,它会填充空格。
你明白了吗?对不起,我不是土生土长的英国人。
更新
这是一些txt文件22014-11-27EUR 208 799,00 799,00 00
请记住,在第一个数字2之前,有9个空格。谢谢
将于2014-11-27填补的rdata领域是rdata d(10)
编辑
当前代码:
Local txtcabecalho, fileconvert
Use re
zap
txtcabecalho=getfile("txt")
Create cursor reciboc(rno n(10), rdata d(10), moeda c(3), no n(10), nome c(2), ccusto c(20), intid c(10), gg c(20), chq c(20), clbanco c(20), total float(19), totalmoeda float(19), ndoc n(3))
fileconvert = filetostr(txtcabecalho)
chrtran(fileconvert,'-','')
strtofile(fileconvert, txtcabecalho)
append from (txtcabecalho) type sdf
scan
select re
append blank
replace rno with reciboc.rno
replace rdata with reciboc.rdata
replace moeda with reciboc.moeda
replace no with reciboc.no
replace nome with reciboc.nome
replace ccusto with reciboc.ccusto
replace intid with reciboc.intid
replace clbanco with reciboc.clbanco
replace total with reciboc.total
replace totalmoeda with reciboc.totalmoeda
replace ndoc with reciboc.ndoc
select re
endscan
select reciboc
browse title "resultado"
reindex
sre.refresh()
我得到的是这就是我得到的
我还想弄清楚我真的不知道
例如:第一行应该是:
RNO 2RDATA 2014-11-27208号
已编辑
事实上,这让它成为了一个AH
fileconvert = filetostr(txtcabecalho)
fileconvert2 = strtran(fileconvert,'-','')
strtofile(fileconvert2, txtcabecalho)
如果我需要进一步的帮助,我会更新我的问题!非常感谢你们!
已编辑
你们知道从txt文件的浮点数转换为游标是否有问题吗?
例如,我得到了799,20,但我只是显示为799。数据类型设置为totamoeda f(19)。这一定很简单,但我找不到!
您正在执行SCAN循环,这意味着reciboc表中有许多行。然而,在您的"re"表中,您只需要不断地用相同的值覆盖同一行,如果文件中没有记录,您将什么都没有。如果你想添加它们,你需要附加到"RE"表中。
现在,另一个考虑因素是"rno"列。这应该是一个"ID"列吗?比如你的外部文本文件可能为每个给定的"RNO"都有更新的值,如果它还不存在,你想更新,或者如果它不存在于"re"表中,你想添加?
使用标签和额外澄清的元素更新您的问题。。。
如果你在"RNO"列的"RE"表上有一个索引,那就太好了。如果不是,并且这是你想要更新的关键列,我建议在它上创建一个索引…
从VFP命令窗口,构建索引,使其始终可用
use RE exclusive
index on RNO tag RNO
use
现在,在您的代码中,AFTER your Append from delimited,您的光标就准备好了。。。我会设置活动表和临时光标之间的关系,并像。。。
选择recibocRNO标签RNO&;所以光标也有一个索引。
selece RE将与RNO的关系设置为RECIBOC
现在,对于每个表中匹配的任何记录,这两个表都指向彼此。现在,替换FOR[scope]。由于这种关系,当记录在"RE"表中循环时,它将指向"RECIBOC"表中的相同RNO记录(如果存在)。所以FOR条件是测试NOT EOF()(文件结尾=在RECIBOC中找不到匹配项。所以NOT EOF)意味着找到了一条记录。
replace rdata with reciboc.rdata,;
moeda with reciboc.moeda,;
no with reciboc.no,;
nome with reciboc.nome,;
ccusto with reciboc.ccusto,;
intid with reciboc.intid,;
clbanco with reciboc.clbanco,;
total with reciboc.total,;
totalmoeda with reciboc.totalmoeda,;
ndoc with reciboc.ndoc ;
FOR NOT EOF( "RECIBOC" )
最后,将任何新的"RNO"记录放入您的"RE"表中。根据匹配的"RNO"列获取不在现有RE表中的所有记录。
select * ;
from RECIBOC ;
WHERE RNO NOT IN ( select RNO from RE );
into cursor NewRecordsToAdd readwrite
现在,将它们添加到"RE"表中。由于列的名称相同,因此它们将直接出现,而不需要从/到引用的显式列名。
select RE
append from dbf( "NewRecordsToAd" )
use in select( "NewRecordsToAdd" )
Create Cursor reciboc(rno N(10), rdata d(10), moeda c(3), no N(10), ;
Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
Total Float(19), totalmoeda Float(19), ndoc N(3))
Append From (m.txtcabecalho) Type Delimited With Blank
Select re
Append from (Dbf('reciboc'))
以上是你正在尝试做的事情的较短版本。
在更新中,您所描述的是固定宽度数据格式或系统数据格式(SDF)。然后不要使用分隔符,而是使用SDF作为类型:
Create Cursor reciboc(rno C(10), rdata C(10), moeda c(3), no C(10), ;
Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
Total C(19), totalmoeda C(19), ndoc C(3))
Append From (m.txtcabecalho) Type SDF
alter table reciboc alter column rdata d && convert rdata column to date
* do other needed column type conversions
Select re
Append from (Dbf('reciboc'))
创建光标时使用的大小应与文本文件中数据列的大小相匹配。在将整个数据作为文本获取后,更改列以匹配数据类型(我认为您的大小是正确的)-d(10)是没有意义的,float从来都不是建议的类型。
附言:如果你能找到FoxyClasses,那么它确实有一个导入程序类,可以为你处理大部分工作(不幸的是,我丢失了提供下载的服务器)。如果可以找到,可以在其chm文件中读取详细信息。
2前面正好有9个空格,对我来说很管用:
Create Cursor reciboc(rno C(10), rdata C(10), moeda c(3), no C(10), ;
Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
Total C(19), totalmoeda C(19), ndoc C(3))
Append From (m.txtcabecalho) Type SDF
browse title "Before data type change"
Set Date YMD
Set Century ON
alter table reciboc alter column rdata d && convert rdata column to date
browse title "After date type change"
如果是SDF,请记住文本文件中的位置指定字段宽度。