一括表示

dbf_create で作成したDBFにデータを追加したいのですが

dbf_open でOpenし ここまでは エラーなく動作します。
データ追加は Append系の様な気がして探すのですがよくわかりません。 DB_append はHamlog本体のアクセスみたいだし。そこで dbf_write dbf_write2 でやってみますが x0a Or x0b 等のエラーで書き込めません(当たり前でしょうが)。

#define DBFEOF 10 //TDBFhの終わり
#define DBFBOF 11 //TDBFhのはじめ

VS2013 VC++ でやっています。何かアドバイスいただけませんか。

2014/11/13(Thu) 19:01:49  [No.602]


> dbf_create で作成したDBFにデータを追加したいのですが
>
> dbf_open でOpenし ここまでは エラーなく動作します。
> データ追加は Append系の様な気がして探すのですがよくわかりません。 DB_append はHamlog本体のアクセスみたいだし。そこで dbf_write dbf_write2 でやってみますが x0a Or x0b 等のエラーで書き込めません(当たり前でしょうが)。

DLL内に dbf_append()というローカル関数があり、まさにデータ追加
用に使用しているのですが、API関数としてDLL外から呼び出すことは
できません。

もちろん、HAMLOG本体からも呼び出していませんし、呼び出すことは
できません。

なんでかな? と思いだしたのですが、必要が無かったことと、多くの
APIを公開すると、アマチュア無線とは関係のないアプリでも使用できて
しまうので、やめたような記憶があります。

2014/11/14(Fri) 18:44:03  [No.604]


> DLL内に dbf_append()というローカル関数があり、まさにデータ追加
> 用に使用しているのですが、API関数としてDLL外から呼び出すことは
> できません。
>
> もちろん、HAMLOG本体からも呼び出していませんし、呼び出すことは
> できません。
>
> なんでかな? と思いだしたのですが、必要が無かったことと、多くの
> APIを公開すると、アマチュア無線とは関係のないアプリでも使用できて
> しまうので、やめたような記憶があります。

RR やはりそうでしたか。ローカル関数では手の出し様がありません。
JAIA発行のJCA用のテーブルを作成して、これを参照してスピードを上げようと思ったのですが、その都度、データを検索して Cfm Wkd New等を判定せざるを得ないわけですね。
重そうだがこちらでやってみます。

2014/11/15(Sat) 09:33:48  [No.605]


> RR やはりそうでしたか。ローカル関数では手の出し様がありません。

簡単なルーチンですので、そのまま掲載します。
使ってみてください。

int __fastcall dbf_append(TDBFh *db, void *fbuf) 
{ 
int rcd;
char Buff[2048];
CopyMemory(Buff + 1, fbuf, db->rsize);
db->rcount++;
Buff[0] = ' ';
rcd = dbf_write2(db, db->rcount, Buff, 0, db->rsize);
if (rcd == SUCCESS)
db->update = 3;
else
db->rcount--; // 書き込み失敗
return (rcd); }
  

htmlにそのままペーストなので、インデントがめちゃくちゃになって
いるかと思いますけど。

2014/11/15(Sat) 17:24:14  [No.607]


> 使ってみてください。
>
> int __fastcall dbf_append(TDBFh *db, void *fbuf) 
> { 
> int rcd;
> char Buff[2048];
> CopyMemory(Buff + 1, fbuf, db->rsize);
> db->rcount++;
> Buff[0] = ' ';
> rcd = dbf_write2(db, db->rcount, Buff, 0, db->rsize);
> if (rcd == SUCCESS)
> db->update = 3;
> else
> db->rcount--; // 書き込み失敗
> return (rcd); }
>  
有難うございました 
db->rcount++;
がみそですね。了解です。

2014/11/15(Sat) 17:36:16  [No.608]


> > db->rcount++;
> > Buff[0] = ' ';
> > rcd = dbf_write2(db, db->rcount, Buff, 0, db->rsize);
何とか書き込めるようになりました。 Tks
またまた、???です。
書き込んだ、データを参照して、登録済でないものを登録しようと、検索するためとりあえず次様にしてみました(インデックス・ファイルを使用したかったのですが、次の課題として)。
long lIx= 1;
for (; lIx <= dbf_rcount(&hJca); lIx++)
{  
  if (dbf_read(&hJca, lIx, &fbufJca) != SUCCESS)
    continue;
if (strncmp(fbufJca.SaFix, cSaFix, 3) == 0)
    break;
}


if (lIx >= dbf_rcount(&hJca))
  lIx=0;

これで、cSaFixがKeyで lIxは同じKeyがあればそのレコード合致なければ 0を返すつもりですが、常に0にしかなりません。
調べますと dbf_read(&hJca, lIx, &fbufJca) をlIx=1で実行すると dbf_rcount(&hJca) が0 に変化していました。hJca.rcount がなぜかdbf_read() で変化しているようです。無理やりhJca.rcountをもとに書き戻す戻すようにすれば、思うように動作いたしました。教えて頂いたdbf_append()と組み合わせるとうまくマスターが出来上がりそうです。dbf_read() の動作に疑問があるのですが使用方法に問題があるのでしょうか。
  

2014/11/17(Mon) 08:38:17  [No.614]


> 調べますと dbf_read(&hJca, lIx, &fbufJca) をlIx=1で実行すると dbf_rcount(&hJca) が0 に変化していました。hJca.rcount がなぜかdbf_read() で変化しているようです。無理やりhJca.rcountをもとに書き戻す戻すようにすれば、思うように動作いたしました。教えて頂いたdbf_append()と組み合わせるとうまくマスターが出来上がりそうです。dbf_read() の動作に疑問があるのですが使用方法に問題があるのでしょうか。


変数の宣言部分全体が見えないので、何とも言えませんが、構造体は
バイトアライメントになってますか?

レコード件数をあらかじめ変数にコピーしておくとか・・・
long RecMax, lIx= 1;
RecMax = dbf_rcount(&hJca);
for (; lIx <= RecMax; lIx++)
{  
・・・

2014/11/17(Mon) 09:50:55  [No.615]


> 変数の宣言部分全体が見えないので、何とも言えませんが、構造体は
> バイトアライメントになってますか?
>
> レコード件数をあらかじめ変数にコピーしておくとか・・・
> long RecMax, lIx= 1;
> RecMax = dbf_rcount(&hJca);
> for (; lIx <= RecMax; lIx++)
> {  
> ・・・
どうも、何かまだ設定に不足があるようです。まさに、例示の様にコピーしておいて戻す方法で動作しているのですが、出来たファイルを無理やりメモ帳で見ると、HamlogのHDB配置に無理やり、乗っかったデータ配置構造になっています。
dbf_create(const char *, void *)なのか 2番目の引数 NULL 指定の説明になっていますが?。
dbf_open(const char *, TDBFh *);なのか、2番目の引数
単に TDBFh hJca; と定義して 渡している為なのか。

感じからすると、
dbf_create(const char *, void *) でDBの割り付けを指定した構造体のアドレスを記入しなくてはいけないような気がするのですが、 HAMLOG50.hにはその気配がないので、これもローカル定義???。
このために インデックスファイルもうまく作成できないのかも(Key定義が??)。
書き込みたいデータの構造体は
   typedef struct { 
        char SaFix[5];
        char Calls[21],
           Date[9];
           WORD cfm,
              wkd;
        char dummy;
    } TJcaMas;
///// ずれて見難いかも
Key にしたいのは SaFix 部分のみです
よろしくお願いいたします。

2014/11/17(Mon) 12:12:56  [No.616]


dbf_create()のソースをよく見たら、HAMLOG.hdb形式のデータしか作成
できないことがわかりました。

第2引数にNULL以外を使うときは、幅の広いQTHやRemarksのデータを
生成するときです。

2014/11/17(Mon) 16:15:44  [No.617]


> dbf_create()のソースをよく見たら、HAMLOG.hdb形式のデータしか作成
> できないことがわかりました。
>
> 第2引数にNULL以外を使うときは、幅の広いQTHやRemarksのデータを
> 生成するときです。

了解です、ここに他用途では使用できないようにとの細工でしたか。create出来なきゃ使えないですよね。無理やり使えば簡単なものは使えそうな気もしましたが。また教えてください。

 

2014/11/17(Mon) 19:27:14  [No.619]