~~NOTRANS~~ ~~Title: Record iteration~~ It's possible to iterate all records of a databook with different techniques. It's a performance decission what's best. Just reading is fastest. You decide if you iterate for reading or for changing records. An iteration ==Iterate with optional record change (Solution 1)== int masterRow = mdbMaster.getSelectedRow(); int detailRow = mdbDetail.getSelectedRow(); boolean resetSelection = false; try { for (int i = 0; i < mdbMaster.getRowCount(); i++) { for (int j = 0; j < mdbDetail.getDataPage(mdbMaster.getDataRow(i)).getRowCount(); j++) { if (changeData) { mdbMaster.setSelectedRow(i); mdbDetail.setSelectedRow(j); resetSelection = true; } } } } finally { if (resetSelection) { mdbMaster.setSelectedRow(masterRow); mdbDetail.setSelectedRow(detailRow); } } ==Iterate with optional record change (Solution 2)== int masterRow = mdbMaster.getSelectedRow(); int detailRow = mdbDetail.getSelectedRow(); boolean resetSelection = false; try { for (IDataRow mRow : mdbMaster) { for (IDataRow dRow : mdbDetail.getDataPage(mRow)) { if (changeData) { mdbMaster.setSelectedRow(mRow.getRowIndex()); mdbDetail.setSelectedRow(dRow.getRowIndex()); resetSelection = true; } } } } finally { if (resetSelection) { mdbMaster.setSelectedRow(masterRow); mdbDetail.setSelectedRow(detailRow); } } ==Iterate with record change== int masterRow = mdbMaster.getSelectedRow(); int detailRow = mdbDetail.getSelectedRow(); try { for (int i = 0; i < mdbMaster.getRowCount(); i++) { mdbMaster.setSelectedRow(i); for (int j = 0; j < mdbDetail.getRowCount(j); j++) { mdbDetail.setSelectedRow(j); } } } finally { mdbMaster.setSelectedRow(masterRow); mdbDetail.setSelectedRow(detailRow); }