0

我试图用来自 txtfile 的信息替换 phc 表,但我没有在屏幕上获得信息。

re 是我要替换值的表 txtcabecalho 是人们必须选择的导入文件 reciboc 是我为存储 txt 文件中的值而创建的光标,因此我可以在 re 上替换它们并将它们显示到屏幕上sre 是表 re 的屏幕。

    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 wich 是 EUR ,同样没有定界,是 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()

我得到的是这就是我得到的

仍然想弄清楚我真的不知道 aff

例如:第一行应该是:

RNO 2 RDATA 2014-11-27 NO 208

已编辑

实际上这成功了啊

fileconvert = filetostr(txtcabecalho)
fileconvert2 = strtran(fileconvert,'-','')
strtofile(fileconvert2, txtcabecalho)

如果我需要进一步的帮助,我会更新我的问题!十分感谢大家!

已编辑

你们知道从txt文件浮点数转换为游标是否有任何问题?

例如,我得到了 799,20,但我只是显示为 799。数据类型设置为 totalmoeda f(19) 。这一定很简单,但我找不到!

4

4 回答 4

0
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'))

以上是您要执行的操作的较短版本。

于 2016-05-23T15:47:16.050 回答
0

在您的更新中,您所描述的是固定宽度数据格式或所谓的系统数据格式 (SDF)。然后不要使用 delimited 而是 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 从来都不是建议的类型。

PS:如果你能找到 FoxyClasses,那么它里面确实有一个导入器类,它可以为你处理大部分工作(不幸的是,我丢失了用于下载的服务器)。如果可以找到,您可以阅读其 chm 文件中的详细信息。

于 2016-05-24T12:00:16.123 回答
0

您正在执行一个 SCAN 循环,这意味着来自 reciboc 表的许多行。但是,在您的“重新”表中,您只需使用相同的值覆盖同一行,如果文件中没有记录,您将一无所有。如果要添加它们,则需要附加到“RE”表中。

现在,另一个考虑因素是“rno”列。这应该是一个“ID”列吗,例如您的外部文本文件可能已经更新了每个给定“RNO”的值,如果它还不存在,您想要更新,或者如果它在“re”中不存在则添加桌子?

使用标签和额外澄清的元素更新您的问题......

如果您在“RNO”列的“RE”表上有索引,那就太好了。如果不是,那是您要更新的关键列,我建议在其上创建一个索引...

从 VFP 命令窗口构建索引,使其始终可用

use RE exclusive
index on RNO tag RNO
use

现在,在您的代码中,在您的 Append from delimited 之后,并且您的光标已准备好...我将设置实时表和您的临时光标之间的关系并进行更新,如...

在 RNO 标记 RNO && 上选择 reciboc 索引,因此光标也有索引。

选择 RE 将与 RNO 的关系设置为 RECIBOC

现在,对于每个表中匹配的任何记录,这两个表都相互指向。现在,替换 FOR [范围]。由于关系的原因,由于“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”表中。由于列是相同的名称,因此它们将直接出现,而无需显式的列名 from/to 引用。

select RE
append from dbf( "NewRecordsToAd" )
use in select( "NewRecordsToAdd" )   
于 2016-05-23T11:28:22.420 回答
0

在 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,请记住文本文件中的位置指定字段宽度。

于 2016-05-24T15:01:08.000 回答