BOF, EOF, and Bookmark properties example (VJ++)

Applies to: Access 2013, Office 2013

This example uses the BOF and EOF properties to display a message if a user tries to move past the first or last record of a Recordset. It uses the Bookmark property to let the user flag a record in a Recordset and return to it later.

 
// BeginBOFEOFJ 
import com.ms.wfc.data.*; 
import java.io.*; 
import com.ms.com.*; 
 
public class BOFEOFBookmark 
{ 
 Variant varBookmark; 
 BufferedReader in = 
 new BufferedReader(new InputStreamReader(System.in)); 
 String line = null; 
 
 // The main entry point for the application. 
 
 public static void main (String[] args) 
 { 
 BOFEOFBookmark b1 = new BOFEOFBookmark (); 
 b1.BOFX(); 
 b1.BOFX2(); 
 System.exit(0); 
 try 
 { 
 b1.finalize(); 
 } 
 catch(Throwable te) 
 { 
 System.out.println("Exception: " + te.getMessage()); 
 } 
 } 
 
 // The main entry point for the application. 
 
 public void BOFX() 
 { 
 // Declarations. 
 Recordset rstPublishers = null; 
 String strCnn; 
 String strMessage; 
 int intCommand = 0; 
 
 strCnn = "Provider='sqloledb';Data Source='MySqlServer';" 
 + "Initial Catalog='Pubs';Integrated Security='SSPI';"; 
 try 
 { 
 // Open a recordset with data from Publishers table. 
 rstPublishers = new Recordset(); 
 rstPublishers.setCursorType(AdoEnums.CursorType.STATIC ); 
 rstPublishers.setCursorLocation( 
 AdoEnums.CursorLocation.CLIENT); 
 
 // Use client cursor to enable AbsolutePosition property. 
 
 rstPublishers.open(new String( 
 "SELECT pub_id,pub_name FROM Publishers ORDER BY pub_name"), 
 strCnn, AdoEnums.CursorType.STATIC , 
 AdoEnums.LockType.BATCHOPTIMISTIC, 
 AdoEnums.CommandType.TEXT ); 
 rstPublishers.moveFirst(); 
 
 //Display information about current record and get user input. 
 while ( true) 
 { 
 strMessage = "\nPublisher :" + 
 rstPublishers.getField("pub_name").getString() + "\n" 
 + " (Record " + rstPublishers.getAbsolutePosition() 
 + " of " + rstPublishers.getRecordCount() + ")" + "\n\n" 
 + "Enter command : " + "\n" 
 + "[1 - next / 2 - previous /" + "\n" 
 + "3 - set bookmark / 4 - go to bookmark] / 5 - quit]" ; 
 System.out.println (strMessage); 
 line = in.readLine(); 
 //No entry exits loop. 
 if (line.length() == 0) 
 break; 
 //convert string entry to int. 
 intCommand = Integer.parseInt(line); 
 //out of range entry exits loop. 
 if ((intCommand < 1) || (intCommand > 4)) break ; 
 
 //Call method based on user's validated selection. 
 MoveAny(intCommand, rstPublishers); 
 } 
 } 
 catch( AdoException ae ) 
 { 
 // Notify user of any errors that result from ADO. 
 
 // As passing a Recordset, check for null pointer first. 
 if (rstPublishers != null) 
 { 
 PrintProviderError(rstPublishers.getActiveConnection()); 
 } 
 else 
 { 
 System.out.println("Exception: " + ae.getMessage()); 
 } 
 } 
 
 // This catch is required if input string cannot be converted to 
 // Integer data type. "TCS[VSD]" 
 
 catch ( java.lang.NumberFormatException ne) 
 { 
 System.out.println("\nException: Integer Input required." ); 
 } 
 
 // System Read requires this catch. 
 catch( java.io.IOException je ) 
 { 
 PrintIOError(je); 
 } 
 finally 
 { 
 // Cleanup objects before exit. 
 if (rstPublishers != null) 
 if (rstPublishers.getState() == 1) 
 rstPublishers.close(); 
 } 
 } 
 
 // MoveAny Function 
 
 public void MoveAny(int intChoice, Recordset rsTemp) 
 { 
 // Move Forward or backword per selection from user, 
 // trapping for BOF and EOF. 
 try 
 { 
 switch(intChoice) 
 { 
 case 1: // Equals char of 1. 
 rsTemp.moveNext(); 
 if (rsTemp.getEOF()) 
 { 
 System.out.println ( 
 "\nMoving past the last record \nTry again." ); 
 rsTemp.moveLast(); 
 } 
 break; 
 case 2: // Equals char of 2. 
 rsTemp.movePrevious(); 
 if (rsTemp.getBOF()) 
 { 
 System.out.println ( 
 "\nMoving past the first record \nTry again." ); 
 rsTemp.moveFirst(); 
 } 
 break; 
 case 3: // Equals char of 3. 
 // Store the bookmark of the current record. 
 varBookmark = (Variant)rsTemp.getBookmark(); 
 break; 
 case 4: // Equals char of 4. 
 // Go to the record indicated by the stored bookmark. 
 if (varBookmark == null) 
 System.out.println ("\nNo bookmark set!"); 
 else 
 rsTemp.setBookmark((Object)varBookmark); 
 break; 
 default: 
 break; 
 } 
 } 
 catch( AdoException ae ) 
 { 
 // Notify user of any errors that result from ADO. 
 
 // As passing a Recordset, check for null pointer first. 
 if (rsTemp != null) 
 { 
 PrintProviderError(rsTemp.getActiveConnection()); 
 } 
 else 
 { 
 System.out.println("Exception: " + ae.getMessage()); 
 } 
 } 
 } 
 
 // PrintProviderError Function 
 
 static void PrintProviderError( Connection Cnn1 ) 
 { 
 // Print Provider errors from Connection object. 
 // ErrItem is an item object in the Connections Errors collection. 
 com.ms.wfc.data.Error ErrItem = null; 
 long nCount = 0; 
 int i = 0; 
 
 nCount = Cnn1.getErrors().getCount(); 
 
 // If there are any errors in the collection, print them. 
 if( nCount > 0); 
 { 
 // Collection ranges from 0 to nCount - 1 
 for (i = 0; i< nCount; i++) 
 { 
 ErrItem = Cnn1.getErrors().getItem(i); 
 System.out.println("\t Error number: " + ErrItem.getNumber() 
 + "\t" + ErrItem.getDescription() ); 
 } 
 } 
 
 } 
 
 //.PrintIOError Function 
 
 static void PrintIOError( java.io.IOException je) 
 { 
 System.out.println("Error \n"); 
 System.out.println("\tSource = " + je.getClass() + "\n"); 
 System.out.println("\tDescription = " + je.getMessage() + "\n"); 
 } 
 
 //////////////////////////////////////////// 
 // BOFX2() Function. // 
 //////////////////////////////////////////// 
 
 public void BOFX2() 
 { 
 Recordset rs = null ; 
 
 try 
 { 
 // Declarations. 
 rs = new Recordset(); 
 Variant[] arrbmk = new Variant[11]; 
 rs.setCursorLocation( AdoEnums.CursorLocation.CLIENT); 
 String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" 
 + "Initial Catalog='Pubs';Integrated Security='SSPI';"; 
 rs.setActiveConnection (strCnn); 
 // Open recorset with data from authors table. 
 rs.open((new String("SELECT * FROM authors")),strCnn,AdoEnums.CursorType.STATIC ,AdoEnums.LockType.BATCHOPTIMISTIC,AdoEnums.CommandType.TEXT ); 
 System.out.println ("\nNumber of records before filtering : " + rs.getRecordCount() ); 
 int ii = 0; 
 
 // Create array of bookmarks. 
 while (rs.getEOF() != true && ii < 11) 
 { 
 arrbmk[ii] = (Variant)rs.getBookmark(); 
 ii++; 
 rs.move (2); 
 } 
 
 // set Filter to recordset. 
 Variant bmk=new Variant(); 
 bmk.putVariantArray(arrbmk); 
 rs.setFilter(bmk); 
 System.out.println ("\nNumber of records after filtering : " + rs.getRecordCount() ); 
 
 // Dislay the records after filtering. 
 rs.moveFirst(); 
 while (!rs.getEOF()) 
 { 
 System.out.println ("\t" +rs.getAbsolutePosition() + " " +rs.getField("au_lname").getString()); 
 rs.moveNext(); 
 } 
 rs.close(); 
 System.out.println ("\n\nPress <Enter> key to continue."); 
 in.readLine(); 
 
 } 
 catch( AdoException ae ) 
 { 
 // Notify user of any errors that result from ADO. 
 
 // As passing a Recordset, check for null pointer first. 
 if (rs != null) 
 { 
 PrintProviderError(rs.getActiveConnection()); 
 System.out.println("Exception: " + ae.getMessage()); 
 } 
 else 
 { 
 System.out.println("Exception: " + ae.getMessage()); 
 } 
 } 
 // System Read requires this catch. 
 catch( java.io.IOException je ) 
 { 
 PrintIOError(je); 
 } 
 } 
} 
 
 
// EndBOFEOFJ