void Ctsample2Dlg::OnBnClickedButton8() { //一括読込(Extended)処理 char strbuf[128]; int stat;//Btrieve API 戻り値 char posb[128];//ポジションブロック char buf[1024];//データバッファ unsigned short buflen;//データバッファ長 unsigned int buflenex;//データバッファ長 char kbuf[256];//キーバッファ unsigned int kbuflenex; char work[20] = ""; LONGLONG rcnt = 0; LONGLONG dcnt = 0; LONGLONG start, addcnt; //int lcnt; char timestr[32]; char msg[10000]; //データバッファはBTRVEX関数に渡す入力バッファと //BTRVEX関数からの結果を受け取る出力バッファを //共有して利用するため、共用体にしています。 //BTRVEX関数のデータバッファサイズの上限が 256Kbyte で //1件につき約820 Byte の出力バッファが必要であるため //300件ほど一括で削除が可能となります。 //820byte は取得するtest1.MKDの 1レコードのサイズです。 union unibuf_tmp { struct //BTRVEX関数への入力バッファ { short int blen; //ヘッダ1 入力バッファの正確な長さ char sp[2]; //ヘッダ2 ポジショニングされているレコードから short int rc; //フィルター1 リジェクトカウント最大値 short int fn; //フィルター2 フィルター条件 unsigned short int recc; //ディスクリプタ(固定) 取得するレコード数 short int fc; //ディスクリプタ(固定) フィールド数 short int df; //ディスクリプタ(繰返) フィールド長 short int ds; //ディスクリプタ(繰返) オフセット } exbuf; struct //BTRVEX関数からの結果出力バッファ { short int cnt; //取得したレコード数 struct { short int len; //取得したレコードの長さ long long pos; //取得したレコードのポジション struct //取得したレコードが格納される。テーブルの構成にあわせてください。 { ULONGLONG tstamp; ULONGLONG item[100]; } record; } data[300]; } recbuf; } unibuf; //listbox をクリア m_list1.ResetContent(); while (1) { m_start.GetWindowTextA(work, 16); start = atoi(work); m_addcnt.GetWindowTextA(work, 16); addcnt = atoi(work); Ctsample2Dlg::Gtimemsec(timestr); sprintf(msg, "開始時間:%s", timestr); m_list1.AddString(msg); buflen = 0; m_bfile.GetWindowTextA(kbuf, 255); //OPEN(オペレーションコード:0) stat = BTRV(0, posb, buf, &buflen, kbuf, 0); if (stat == 0) { m_list1.AddString("Btrieve API : OPEN OK"); } else { sprintf(strbuf, "Btrieve API : OPEN 失敗(%d)", stat); m_list1.AddString(strbuf); break; } buflen = sizeof(bfile); //Get First(オペレーションコード:12) stat = BTRV(12, posb, &bfile, &buflen, kbuf, 0); if (stat != 0) { sprintf(strbuf, "Btrieve API : Get First 失敗(%d)", stat); m_list1.AddString(strbuf); break; } rcnt = addcnt; while (addcnt > dcnt) { //入力データバッファに値をセット unibuf.exbuf.blen = sizeof(unibuf.exbuf); sprintf(&unibuf.exbuf.sp[0], "UC"); unibuf.exbuf.rc = 0; unibuf.exbuf.fn = 0; if (rcnt > 300) unibuf.exbuf.recc = 300; else unibuf.exbuf.recc = rcnt; unibuf.exbuf.fc = 1; unibuf.exbuf.df = sizeof(unibuf.recbuf.data[0].record); //レコード長 unibuf.exbuf.ds = 0; //入力より出力データバッファのサイズが大きいので出力サイズをセット buflenex = sizeof(unibuf.recbuf); kbuflenex = 255; //Get Next Extended オペレーションコード:36 stat = BTRVEX(36, posb, &unibuf.exbuf, &buflenex, kbuf, kbuflenex, 0); if (stat != 0) { sprintf(strbuf, "Btrieve API : Delete Extended失敗(%d)", stat); m_list1.AddString(strbuf); break; } dcnt = dcnt + unibuf.recbuf.cnt; rcnt = rcnt - unibuf.recbuf.cnt; sprintf(msg, "読込レコード数:%lld", dcnt); m_prog.SetWindowTextA(msg); { MSG msg; if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } sprintf(msg, "読込データ:%lld", unibuf.recbuf.data[unibuf.recbuf.cnt-1].record.item[1]); m_list1.AddString(msg); } sprintf(msg, "読込レコード数:%lld", dcnt); m_prog.SetWindowTextA(msg); sprintf(msg, "読込データ:%lld", unibuf.recbuf.data[unibuf.recbuf.cnt -1].record.item[1]); m_list1.AddString(msg); buflen = 0; //Close (オペレーションコード:1) stat = BTRV(1, posb, buf, &buflen, kbuf, 0); if (stat == 0) { m_list1.AddString("Btrieve API : CLOSE OK"); } else { sprintf(strbuf, "Btrieve API : CLOSE 失敗(%d)", stat); m_list1.AddString(strbuf); break; } buflen = 0; //Reset オペレーションコード:28 stat = BTRV(28, posb, buf, &buflen, kbuf, 0); if (stat == 0) { m_list1.AddString("Btrieve API : Reset OK"); } else { sprintf(strbuf, "Btrieve API : Reset 失敗(%d)", stat); m_list1.AddString(strbuf); break; } break; } Ctsample2Dlg::Gtimemsec(timestr); sprintf(msg, "終了時間:%s", timestr); m_list1.AddString(msg); }