0

コンソール ユーザー インターフェイスでページネーションを行うことは可能ですか? 30 人の従業員レコードがあり、10 件だけを表示したいとします。ユーザーが矢印ボタンを押すと、次の 10 件のリストが表示されます。出来ますか?

EXEC SQL DECLARE EmployeeReportCursorJawatan CURSOR FOR
        SELECT EMP_ID, NAMA, IC, JAWATAN, GAJI_ASAS, TEL_RUMAH, TEL_BIMBIT, ALAMAT FROM PEKERJA WHERE upper(JAWATAN) LIKE upper(:str);

    EXEC SQL OPEN EmployeeReportCursorJawatan;
    /* loop through the cursor and break the loop when end*/
    EXEC SQL WHENEVER NOT FOUND DO break;
    while (1)
    {
        /* fetch the data from cursor and display*/
        EXEC SQL FETCH EmployeeReportCursorJawatan INTO :emp_idSearch, :namaSearch, :icSearch, :jawatanSearch, :gajiSearch, :homeSearch, :mobileSearch, :alamatSearch;

    cout<<"\nID\t\t: " << emp_idSearch;
    cout<<"\nName\t\t: " << namaSearch;
    cout<<"\nIC\t\t: " << icSearch;
    cout<<"\nPost\t\t: " << jawatanSearch;
    cout<<"\nSalary\t\t: RM " << gajiSearch;
    cout<<"\nPhone number (H): " << homeSearch;
    cout<<"\nPhone number (M): " << mobileSearch;
    cout<<"\nAddress\t: " << alamatSearch;
    cout<<"\n---------------------------------------------------------\n";

        totalCustomer++;
    }
4

2 に答える 2

0

論理的な解決策はmore、マシンにインストールし、ユーザーにこれを介して出力をパイプさせることです。しかし、実装するのはそれほど難しくありません。基本的に、1 ページに配置する行数またはエントリ数を決定し、現在のページのトップのインデックスを追跡します。次に、次のようなものを出力します。

int currentTop = 0;
bool finished = false;
while ( !finished ) {
    clearScreen();
    for ( int i = 0; i < maxOnPage && i + currentTop < entryCount; ++ i ) {
        displayEntry( i + currentTop );
    }
    std::cout << "Continue: ";
    std::string command;
    std::cin >> command;
    switch ( parseCommand( command ) ) {
    case advanceOneLine:
        ++ currentTop;
        break;

    case advanceOnePage:
        currentTop += maxOnPage;
        break;

    case finish:
        finished = true;
        break;

    default:
        //  ???
        break;
    }
}
于 2012-12-28T15:00:29.097 に答える
0

はい、実際には思ったよりずっと簡単です。これは、まさにこれを行うプログラムからのコードの一部です。大きなことは、ユーザーがいる「ページ」を表す静的変数を作成するだけです。概要

  • ページ番号を表す静的変数を使用する
  • イテレータと std::advance を使用して、イテレータを現在のページ番号にプッシュします
  • ページの最初の要素から最後の要素までループします (このプログラムでは、各ページに lsit の 10 個の要素を表示させました)

void ExList::Display()
{
    using std::setw; //save time
    //begin iter starts at page number * 10 since each page has 10 elements
    list<Workout>::iterator PageNum = wrkout.begin(); std::advance(PageNum, AdvanceVar * 10);
    //advance the iter 10 places past PageNum so the loop will run 10 times
    list<Workout>::iterator iterEnd = PageNum; std::advance(iterEnd, 10);
    //formatting for my 'exercise tracker' program
    std::cout << setw(20) << "Page: " << AdvanceVar + 1 << "/" << (((int) wrkout.size()) /  10) + 1
     << std::endl << std::endl;
    std::cout << std::left          //left justified
    << setw(TAB) << "Date"          //print titles
    << setw(TAB) << "Type"
    << setw(TAB) << "Distance"
    << setw(TAB) << "Units"
    << setw(TAB) << "Additional Comments\n"
    << "---------------------------------------------------------------------\n";
    //loop through 10 times displaying the proper elements
    for(PageNum; PageNum != iterEnd && PageNum != wrkout.end(); PageNum++)
    {
        std::cout << std::left
        << setw(TAB) << PageNum->Date
        << setw(TAB) << ConvertEnum(PageNum->TYPE)
        << setw(TAB) << PageNum->distance
        << setw(TAB) << PageNum->units
        << setw(TAB) << "Select to review\n";
    }

    std::cout << "---------------------------------------------------------------------\n";


}

より詳細なプログラムについてプログラム全体を見たい場合は、私に電子メールを送ってください

于 2012-12-25T21:23:51.607 に答える