ibm-information-center/dist/eclipse/plugins/i5OS.ic.rzahh_5.4.0.1/microsamplerealestate.htm

582 lines
19 KiB
HTML
Raw Normal View History

2024-04-02 14:02:31 +00:00
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-us" xml:lang="en-us">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="security" content="public" />
<meta name="Robots" content="index,follow" />
<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
<meta name="DC.Type" content="reference" />
<meta name="DC.Title" content="Example: Using ToolboxME for iSeries, MIDP, and JDBC" />
<meta name="abstract" content="" />
<meta name="description" content="" />
<meta name="copyright" content="(C) Copyright IBM Corporation 2006" />
<meta name="DC.Rights.Owner" content="(C) Copyright IBM Corporation 2006" />
<meta name="DC.Format" content="XHTML" />
<meta name="DC.Identifier" content="microsamplerealestate" />
<meta name="DC.Language" content="en-us" />
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<link rel="stylesheet" type="text/css" href="./ibmdita.css" />
<link rel="stylesheet" type="text/css" href="./ic.css" />
<title>Example: Using ToolboxME for iSeries, MIDP, and JDBC</title>
</head>
<body id="microsamplerealestate"><a name="microsamplerealestate"><!-- --></a>
<!-- Java sync-link --><script language="Javascript" src="../rzahg/synch.js" type="text/javascript"></script>
<h1 class="topictitle1">Example: Using ToolboxME for iSeries, MIDP, and JDBC</h1>
<div><p></p>
<div class="section"><p>The following source illustrates one way that your ToolboxME for iSeries™ application
can use the <a href="microconcept.htm#microconcept__profiles">Mobile
Information Device Profile (MIDP)</a> and JDBC to access a database and
store information offline.</p>
<p>This example demonstrates how a real estate
agent might be able to view and bid on properties that are currently for
sale. The agent uses a <a href="microconcept.htm#microconcept__tier0">Tier0
device</a> to access information for the properties, which is stored in
the iSeries server
database.</p>
<p>When built as a working program, the example code below connects
to a database created for this purpose.</p>
<p>To create a working version
of the source code and to obtain the source for creating and populating the
required database, you must <a href="microexamplesdownload.htm#microexamplesdownload">download
the example</a>. You also may want to review the <a href="microfirstprog.htm#microfirstprog__createprogram">instructions
for creating and running the example program</a>.</p>
<div class="note"><span class="notetitle">Note:</span> Read the <a href="codedisclaimer.htm#codedisclaimer">Code example disclaimer</a> for
important legal information.</div>
<pre>//////////////////////////////////////////////////////////////////////////////////
//
// ToolboxME for iSeries example. This program is an example MIDlet that shows how
// you might code a JdbcMe application for the MIDP profile. Refer to the
// startApp, pauseApp, destroyApp and commandAction methods to see how it handles
// each requested transition.
//
//////////////////////////////////////////////////////////////////////////////////
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.sql.*;
import javax.microedition.rms.*;
import com.ibm.as400.micro.*;
public class JdbcMidpBid extends MIDlet implements CommandListener
{
private static int BID_PROPERTY = 0;
private Display display;
private TextField urlText = new TextField("urltext",
"jdbc:as400://mySystem;user=myUid;password=myPwd;",
65,
TextField.ANY);
private TextField jdbcmeText = new TextField("jdbcmetext", "meserver=myMEServer", 40, TextField.ANY);
private TextField jdbcmeTraceText = new TextField("jdbcmetracetext", "0", 10, TextField.ANY);
private final static String GETBIDS = "No bids are available, select here to download bids";
private List main = new List("JdbcMe Bid Demo", Choice.IMPLICIT);
private List listings = null;
private Form aboutBox;
private Form bidForm;
private Form settingsForm;
private int bidRow = 0;
private String bidTarget = null;
private String bidTargetKey = null;
private TextField bidText = new TextField("bidtext", "", 10, TextField.NUMERIC);
private Form errorForm = null;
private Command exitCommand = new Command("Exit", Command.SCREEN, 0);
private Command backCommand = new Command("Back", Command.SCREEN, 0);
private Command cancelCommand = new Command("Cancel", Command.SCREEN, 0);
private Command goCommand = new Command("Go", Command.SCREEN, 1);
private Displayable onErrorGoBackTo = null;
/*
* Construct a new JdbcMidpBid.
*/
public JdbcMidpBid()
{
display = Display.getDisplay(this);
}
/**
* Show the main screen
*/
public void startApp()
{
main.append("Show Bids", null);
main.append("Get New Bids", null);
main.append("Settings", null);
main.append("About", null);
main.addCommand(exitCommand);
main.setCommandListener(this);
display.setCurrent(main);
}
public void commandAction(Command c, Displayable s)
{
// All exitCommand processing is the same.
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
return;
}
if (s instanceof List)
{
List current = (List)s;
// An action occurred on the main page
if (current == main)
{
int idx = current.getSelectedIndex();
switch (idx)
{
case 0: // Show current bids
showBids();
break;
case 1: // Get New Bids
getNewBids();
break;
case 2: // Settings
doSettings();
break;
case 3: // About
aboutBox();
break;
default :
break;
}
return;
} // current == main
// An action occurred on the listings page
if (current == listings)
{
if (c == backCommand)
{
display.setCurrent(main);
return;
}
if (c == List.SELECT_COMMAND)
{
int idx = listings.getSelectedIndex();
String stext = listings.getString(idx);
if (stext.equals(GETBIDS))
{
getNewBids();
return;
}
int commaIdx = stext.indexOf(',');
bidTargetKey = stext.substring(0, commaIdx);
bidTarget = stext.substring(commaIdx+1) + "\n";
// Also keep track of which offline result set row
// This is. It happens to be the same as the index
// in the list.
bidRow = idx;
bidOnProperty();
}
} // current == listings
return;
} // instanceof List
if (s instanceof Form)
{
Form current = (Form)s;
if (current == errorForm)
{
if (c == backCommand)
display.setCurrent(onErrorGoBackTo);
return;
} // errorForm
if (current == settingsForm)
{
if (c == backCommand)
{
// Done with settings.
display.setCurrent(main);
settingsForm = null;
return;
}
} // settingsForm
if (current == aboutBox)
{
if (c == backCommand)
{
// Done with about box.
display.setCurrent(main);
aboutBox = null;
return;
}
}
if (current == bidForm)
{
if (c == cancelCommand)
{
display.setCurrent(listings);
bidForm = null;
return;
}
if (c == goCommand)
{
submitBid();
if (display.getCurrent() != bidForm)
{
// If we're no longer positioned at the
// bidForm, we will get rid of it.
bidForm = null;
}
return;
}
return;
} // current == bidForm
} // instanceof Form
}
public void aboutBox()
{
aboutBox = new Form("aboutbox");
aboutBox.setTitle("About");
aboutBox.append(new StringItem("", "Midp RealEstate example for JdbcMe "));
aboutBox.addCommand(backCommand);
aboutBox.setCommandListener(this);
display.setCurrent(aboutBox);
}
/**
* The settings form.
*/
public void doSettings()
{
settingsForm = new Form("settingsform");
settingsForm.setTitle("Settings");
settingsForm.append(new StringItem("", "DB URL"));
settingsForm.append(urlText);
settingsForm.append(new StringItem("", "JdbcMe server"));
settingsForm.append(jdbcmeText);
settingsForm.append(new StringItem("", "Trace"));
settingsForm.addCommand(backCommand);
settingsForm.setCommandListener(this);
display.setCurrent(settingsForm);
}
/**
* Show the bid screen for the bid target
* that we selected.
*/
public void bidOnProperty()
{
StringItem item = new StringItem("", bidTarget);
bidText = new TextField("bidtext", "", 10, TextField.NUMERIC);
bidText.setString("");
bidForm = new Form("bidform");
bidForm.setTitle("Submit a bid for:");
BID_PROPERTY = 0;
bidForm.append(item);
bidForm.append(new StringItem("", "Your bid:"));
bidForm.append(bidText);
bidForm.addCommand(cancelCommand);
bidForm.addCommand(goCommand);
bidForm.setCommandListener(this);
display.setCurrent(bidForm);
}
/**
* Update the listings card with the
* current list of bids that we are interested in.
*/
public void getNewBids()
{
// Reset the old listing
listings = null;
listings = new List("JdbcMe Bids", Choice.IMPLICIT);
java.sql.Connection conn = null;
Statement stmt = null;
try
{
conn = DriverManager.getConnection(urlText.getString() + ";" + jdbcmeText.getString());
stmt = conn.createStatement();
// Since we do not want the prepared statement to persist,
// a normal statement is really better in this environemnt.
String sql = "select mls, address, currentbid from qjdbcme.realestate where currentbid &lt;&gt; 0";
boolean results =((JdbcMeStatement)stmt).executeToOfflineData(sql,
"JdbcMidpBidListings",
0,
0);
if (results)
{
setupListingsFromOfflineData();
}
else
{
listings.append("No bids found", null);
listings.addCommand(backCommand);
listings.setCommandListener(this);
}
}
catch (Exception e)
{
// Currently no valid listings retrieved, so lets
// reset it to empty.
listings = new List("JdbcMe Bids", Choice.IMPLICIT);
listings.append(GETBIDS, null);
listings.addCommand(backCommand);
listings.setCommandListener(this);
// Return to main after showing the error.
showError(main, e);
return;
}
finally
{
if (conn != null)
{
try
{
conn.close();
}
catch (Exception e)
{
}
}
conn = null;
stmt = null;
}
showBids();
}
public void setupListingsFromOfflineData()
{
// Skip the first four rows in the record store
// (eyecatcher, version, num columns, sql column
// types)
// and each subsequent row in the record store is
// a single column. Our query returns 3 columns which
// we will return concatenated as a single string.
ResultSet rs = null;
listings.addCommand(backCommand);
listings.setCommandListener(this);
try
{
int i = 5;
int max = 0;
StringBuffer buf = new StringBuffer(20);
// Creator and dbtype unused in MIDP
rs = new JdbcMeOfflineResultSet("JdbcMidpBidListings", 0, 0);
if (rs == null)
{
// New listings...
listings = new List("JdbcMe Bids", Choice.IMPLICIT);
listings.append(GETBIDS, null);
listings.addCommand(backCommand);
listings.setCommandListener(this);
return;
}
i = 0;
String s = null;
while (rs.next())
{
++i;
s = rs.getString(1);
buf.append(s);
buf.append(",");
s = rs.getString(2);
buf.append(s);
buf.append(", $");
s = rs.getString(3);
buf.append(s);
listings.append(buf.toString(), null);
buf.setLength(0);
}
if (i == 0)
{
listings.append("No bids found", null);
return;
}
}
catch (Exception e)
{
// Currently no valid listings retrieved, so lets
// reset it to empty.
listings = new List("JdbcMe Bids", Choice.IMPLICIT);
listings.append(GETBIDS, null);
listings.addCommand(backCommand);
listings.setCommandListener(this);
// Return to main after showing the error.
showError(main, e);
return;
}
finally
{
if (rs != null)
{
try
{
rs.close();
}
catch (Exception e)
{
}
rs = null;
}
System.gc();
}
}
/**
* Update the listings card with the
* current list of bids that we are interested in.
*/
public void submitBid()
{
java.sql.Connection conn = null;
Statement stmt = null;
try
{
conn = DriverManager.getConnection(urlText.getString() + ";" + jdbcmeText.getString());
stmt = conn.createStatement();
// Since we do not want the prepared statement to persist,
// a normal statement is really better in this environemnt.
StringBuffer buf = new StringBuffer(100);
buf.append("Update QJdbcMe.RealEstate Set CurrentBid = ");
buf.append(bidText.getString());
buf.append(" Where MLS = '");
buf.append(bidTargetKey);
buf.append("' and CurrentBid &lt; ");
buf.append(bidText.getString());
String sql = buf.toString();
int updated = stmt.executeUpdate(sql);
if (updated == 1)
{
// BID Accepted.
String oldS = listings.getString(bidRow);
int commaIdx = bidTarget.indexOf(',');
String bidAddr = bidTarget.substring(0, commaIdx);
String newS = bidTargetKey + "," + bidAddr + ", $" + bidText.getString();
ResultSet rs = null;
try
{
// Creator and dbtype unused in MIDP
rs = new JdbcMeOfflineResultSet("JdbcMidpBidListings", 0, 0);
rs.absolute(bidRow+1);
rs.updateString(3, bidText.getString());
rs.close();
}
catch (Exception e)
{
if (rs != null)
rs.close();
}
// Also update our live list of that result set.
listings.set(bidRow, newS, null);
display.setCurrent(listings);
conn.commit();
}
else
{
conn.rollback();
throw new SQLException("Failed to bid, someone beat you to it");
}
}
catch (SQLException e)
{
// Return to the bid form after showing the error.
showError(bidForm, e);
return;
}
finally
{
if (conn != null)
{
try
{
conn.close();
}
catch (Exception e)
{
}
}
conn = null;
stmt = null;
}
// Exit without exception, then show the current bids
showBids();
}
/**
* Show an error condition.
*/
public void showError(Displayable d, Exception e)
{
String s = e.toString();
onErrorGoBackTo = d;
errorForm = new Form("Error");
errorForm.setTitle("SQL Error");
errorForm.append(new StringItem("", s));
errorForm.addCommand(backCommand);
errorForm.setCommandListener(this);
display.setCurrent(errorForm);
}
/**
* Show the current bids.
*/
public void showBids()
{
if (listings == null)
{
// If we have no current listings, lets set
// them up.
listings = new List("JdbcMe Bids", Choice.IMPLICIT);
setupListingsFromOfflineData();
}
display.setCurrent(listings);
}
/**
* Time to pause, free any space we do not need right now.
*/
public void pauseApp()
{
display.setCurrent(null);
}
/**
* Destroy must cleanup everything.
*/
public void destroyApp(boolean unconditional)
{
}
}</pre>
</div>
</div>
</body>
</html>