void Ctsample2Dlg::OnBnClickedButton7() { // 一括削除(Extended)処理 char strbuf[128]; RETCODE status = SQL_SUCCESS; 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件につき10 Byte の出力バッファが必要であるため //25000件ほど一括で削除が可能となります。 union unibuf_tmp { struct exbuf_tmp //BTRVEX関数への入力データバッファ { short int blen; //ヘッダ1 入力データバッファの正確な長さ char sp[2]; //ヘッダ2 ポジショニングされているレコードから short int rc; //フィルター1 リジェクトカウント最大値 short int fn; //フィルター2 フィルター条件 unsigned short int recc; //ディスクリプタ1 削除するレコード数 short int fc; //ディスクリプタ2 抽出するフィールド数 } exbuf; struct //BTRVEX関数からの結果出力データバッファの構造体 { short int cnt; //削除されたレコード数 struct { short int len; //0固定 long long pos; //削除されたレコードのポジション } data[25000]; //25000件分の削除結果を格納します } 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 > 25000) unibuf.exbuf.recc = 25000; else unibuf.exbuf.recc = rcnt; unibuf.exbuf.fc = 0; //入力より出力データバッファのサイズが大きいので出力サイズをセット buflenex = sizeof(unibuf.recbuf); kbuflenex = 255; //Get Next Delete Extended オペレーションコード:85 stat = BTRVEX(85, 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", dcnt); m_prog.SetWindowTextA(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); }