0

phc テーブルを txtfile の情報に置き換えようとしていますが、画面に情報が表示されません。

re は、値を置き換えたいテーブルです txtcabecalho は、人々が選択しなければならないインポートされたファイルです reciboc は、txt ファイルからの値を保存するために作成したカーソルです。 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) になります。 moeda wich は EUR で、ここでも区切りなしで、moeda(3) です。

多くのフィールドは空白になり、txt ファイルにはフィールド全体を占めるスペースが含まれています。基本的にはフィールドの長さで区切られ、空の場合はスペースで埋められます。

あなたは正しく理解しましたか?申し訳ありませんが、私は英語のネイティブではありません。

アップデート

heresは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 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

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 に答える
0

reciboc テーブルからの多くの行を意味する SCAN ループを実行しています。ただし、「re」テーブルでは、同じ行を同じ値で上書きし続けるだけで、ファイルにレコードがない場合は、とにかく何もありません。それらを追加したい場合は、「RE」テーブルに追加する必要があります。

ここで、もう 1 つの考慮事項は "rno" 列です。外部テキストファイルなどの「ID」列であると想定されている場合は、指定された「RNO」ごとに値が更新されている可能性があり、まだ存在しない場合は更新するか、「re」に存在しない場合は追加しますテーブル?

タグと追加の明確化された要素を使用して質問を更新します...

「RNO」列の「RE」テーブルにインデックスがある場合は、素晴らしいです。そうでない場合、それが更新するキー列である場合は、それに基づいてインデックスを作成することをお勧めします...

VFP コマンド ウィンドウから、常に使用できるようにインデックスを作成します。

use RE exclusive
index on RNO tag RNO
use

さて、あなたのコードでは、区切りから追加した後、カーソルが準備されます...ライブテーブルと一時カーソルの間に関係を設定し、次のように更新します...

RNO タグ RNO && で reciboc インデックスを選択すると、カーソルにもインデックスが付きます。

Selece RE は RNO との関係を RECIBOC に設定します

これで、2 つのテーブルは、各テーブルで一致するレコードについて相互にポイントします。ここで、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」テーブルに追加します。列は同じ名前であるため、明示的な列名から/への参照なしで直接取得されます。

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

あなたの更新で説明しているのは、固定幅データ形式またはシステム データ形式 (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 は推奨される型ではありません。

PS: FoxyClasses を見つけることができれば、多くの作業を処理するインポーター クラスが含まれています (残念ながら、ダウンロードを提供していたサーバーを失いました)。見つかった場合は、その chm ファイルで詳細を読むことができます。

于 2016-05-24T12:00:16.123 に答える