過去ログ

                                Page     276
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼GETステートメント レコード長エラー  かもねぎ 03/5/19(月) 13:04
   ┗Re:GETステートメント レコード長エラー  Hirofumi 03/5/21(水) 21:21
      ┗Re:GETステートメント レコード長エラー  かもねぎ 03/5/21(水) 23:46

 ───────────────────────────────────────
 ■題名 : GETステートメント レコード長エラー
 ■名前 : かもねぎ
 ■日付 : 03/5/19(月) 13:04
 -------------------------------------------------------------------------
   初めて投稿させていただきます。
他の人がaccess95で作成したシステムを、初心者なりに
四苦八苦しながらaccess2002へ変換しています。
環境は、OS=XP access=2000と2002の共存です。

ランダムファイルからデータを取得してる(と思う)のですが、
2002で実行すると、実行時エラーが発生します。
■エラーコード59:レコード長が一致しません。
もともと取得したいレコードは700バイトなのですが,
(名前や電話番号や数字データが混在してますが固定長です)
Dim REC  As String * 700  ⇒ 300(ぐらい)にすると
エラーにはかからず、データを取得します。
取得したデータを調べると253バイトしか取得できていない
のですが、ちゃんと700バイト取得するにはどのようにすれば
いいのでしょうか。
いろいろ調べた結果,unicodeの関係など疑っていますが
解決策が思い浮かびません。

access95時でのソースをそのまま書きます。

Private Sub PCCOPY()
  DoCmd.Hourglass True
   
  On Error GoTo Bgin_Err
  I_ERR_SW = 0
   
  Dim FPATH As String      '*
  Dim FNAME As String      '*
  Dim REC  As String * 700   '* ⇒300位だと動く
  Dim I   As Integer     '*
  Dim MAX  As Integer     '*
'*
'** ファィル名 設定
'*
   FPATH = JhtdataPath     ' パス名 読み込み
   FNAME = FPATH & "TK"
     
   Close
   Open FNAME For Random As #1 Len = 700
   Close #1
   Open FNAME For Random As #1 Len = 700
   MAX = (LOF(1) / 700)    '* TRX 件数
   
  Open "C:\HAICHI\HT\TK.WK" For Random As #2
  Close #2
  Kill "C:\HAICHI\HT\TK.WK"
  Open "C:\HAICHI\HT\TK.WK" For Random As #2 Len = 700
   
   For I = 1 To MAX
      Get #1, I, REC  ⇒ここでエラー    
      Put #2, I, REC
   Next I

初心者な為、とんちんかんな質問になっていたらすいません。
足りない情報などございましたら、教えてください

 ───────────────────────────────────────  ■題名 : Re:GETステートメント レコード長エラー  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 03/5/21(水) 21:21  -------------------------------------------------------------------------
   私も余り詳しくないので、間違っていたらゴメンナサイ
プロシージャの全文が書かれていないのではきりしませんが

1、Upされたコードでは、「エラーコード59: レコード長が一致しません。」
 は出ない様な気がします、実際にエラーを起こしているコードは別のものでは?
 理由、上記のエラーは、Len節のバイト数(読み込みバファサイズ)より、
 取り込む変数のバイト数が大きい場合に起きると思います
 Len = 700
 Dim REC  As String * 700
 なのでこの点は無理がないと思います
 ただ、通常は以下のような書き方をします

   Open FNAME For Random As #1 Len = Len(REC)

2、Upされたコードは、

>ランダムファイルからデータを取得してる(と思う)のですが

 データを取得しているのでは無く、データを別のファイルにコピーしている
 と思われます(なんか非常に大時代な書き方の様な気がします)
 VBAにFileCopyステートメントとDir関数が有りますのでその方が簡単でしょう

3、あと気に成る点は、
 Dim MAX  As Integer
 と有りますが、MAXがVBAの予約語で有る可能性が有りますので買えた方が善いかも?
 あと
 MAX = (LOF(1) / 700)
 と有りますが、これは
 MAX = (LOF(1) \ 700)
 とした方が善いでしょう

 ───────────────────────────────────────  ■題名 : Re:GETステートメント レコード長エラー  ■名前 : かもねぎ  ■日付 : 03/5/21(水) 23:46  -------------------------------------------------------------------------
   ▼Hirofumi さん:回答ありがとうございます。助かりました。

>>ランダムファイルからデータを取得してる(と思う)のですが
>
> データを取得しているのでは無く、データを別のファイルにコピーしている
> と思われます(なんか非常に大時代な書き方の様な気がします)
> VBAにFileCopyステートメントとDir関数が有りますのでその方が簡単でしょう
そうでした!ただファイルがコピーしてあるだけでした!
なにしろ、初心者な上、作成者がいないので不可解な記述に
とまどっています。(AC95時にはその書き方しかできなかったのでしょうか)
いろいろ試してみたところ、
漢字が入るフィールドが怪しかったので、モジュールでユーザー定義を
宣言して、フィールドを分けて試したら一応うまくいきました。
1データは700バイトなんですが、
Open FNAME For Random As #1 Len = Len(REC)
で、取得しているlenは720でした。やはり漢字のフィールドが混ざってるのが
原因でしょうか。string型は 255バイトまでとか?
しかし、この問題はfilecopyでうまくいきそうです。
ヒントとアドバイス ありがとうございました!!!

>3について。
アドバイスありがとうございます。
アドバイスどおり、変更しました!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 276