ACME Bird Seed order entry - Eleven source code

options
{
  app_name       = "ACME Bird Seed order entry";
  package_name   = "birdseed";
  display_header = "no";
}

/*------------------------------------------------------------
  Define global variables (main menu launcher and livetable
  variables for accessing external database tables)
  ------------------------------------------------------------*/

statesafe launcher menu;  

statesafe livetable
{
  db_table = "demo_catalog";

  var catalog_num  "Catalog number" [id];
  var seed_type    "Seed type";
  var price        "Price";
} catalog;

statesafe livetable
{
  db_table = "demo_customer";

  var customer_id "Customer id" [auto];
  var name        "Name";
  var address     "Address";
} customers;

statesafe livetable
{
  db_table = "demo_order";

  var order_date   "Order date";
  var customer_id  "Customer id";
  var catalog_num  "Seed catalog number";
  var quantity     "Quantity";
} orders;

statesafe livetable
{
  db_table =
      "demo_order",
      "demo_customer" ("demo_customer.customer_id = demo_order.customer_id"),
      "demo_catalog" ("demo_catalog.catalog_num = demo_order.catalog_num");

  var order_date                  "Order date";
  var name ("demo_customer.name") "Customer";
  var seed_type                   "Seed type";
  var quantity                    "Quantity";
} report;

/*------------------------------------------------------------
  Define subroutines
  ------------------------------------------------------------*/

sub welcome ()
{
  display no_continue
    {
      object [position="header" class="birdseedHeader" element="img" src="http://eleven.sourceforge.net/image/birdseed-header.gif" alt="ACME Bird Seed order entry" width="250" height="64"] ("");
      print [position="left"] ("Menu", menu);
      print ("Welcome to the ACME Bird Seed order entry application."); 
      print ("Choose one of the options on the left side of the display.");
    }
}

sub updateCatalog ()
{
  display no_continue
    {
      object [position="header" class="birdseedHeader" element="img" src="http://eleven.sourceforge.net/image/birdseed-header.gif" alt="ACME Bird Seed order entry" width="250" height="64"] ("");
      print [position="left"] ("Menu", menu);
      edit ("Update seed catalog:", catalog);
    }
}

sub updateCustomers ()
{
  display no_continue
    {
      object [position="header" class="birdseedHeader" element="img" src="http://eleven.sourceforge.net/image/birdseed-header.gif" alt="ACME Bird Seed order entry" width="250" height="64"] ("");
      print [position="left"] ("Menu", menu);
      edit ("Update customer list:", customers);
    }
}

sub enterOrders ()
{
  statesafe enum customer;    /* dynamic enum */
  statesafe enum product;     /* dynamic enum */
  statesafe var quantity;

  /* load dynamic enums with current table values */
  customer.setvalues (customers, "customer_id", "name");
  product.setvalues (catalog, "catalog_num", "seed_type");

  while (1)
    {
      customer = "";
      product = "";
      quantity = "";

      display
	{
	  object [position="header" class="birdseedHeader" element="img" src="http://eleven.sourceforge.net/image/birdseed-header.gif" alt="ACME Bird Seed order entry" width="250" height="64"] ("");
	  print [position="left"] ("Menu", menu);
	  print ("Enter order:");
	  edit ("Customer: ",  customer);
	  edit ("Seed type: ", product);
	  edit ("Quantity: ",  quantity);
	}

      transient array order;
      order {'order_date'}  = now ();
      order {'customer_id'} = customer;
      order {'catalog_num'} = product;
      order {'quantity'}    = quantity;
      statesafe var status = orders.insert (order);

      display
	{
	  object [position="header" class="birdseedHeader" element="img" src="http://eleven.sourceforge.net/image/birdseed-header.gif" alt="ACME Bird Seed order entry" width="250" height="64"] ("");
	  print [position="left"] ("Menu", menu);
	  if (status eq "ok")
	    {
	      print ("Order saved.");
	    }
	  else
	    {
	      print ("Error: ", status);
	    }
	}
    }
}

sub viewOrders ()
{
  statesafe launcher pager;
  statesafe var currentPage = 0;

  while (1)
    {
      prepare pager
	{
	  "Prev page" { currentPage = currentPage - 1; }
	  "Next page" { currentPage = currentPage + 1; }
	}
      mission
	{
	  statesafe var numPages = report.pagecount ();

	  if (currentPage < 0)         { currentPage = 0;          }
	  if (currentPage >= numPages) { currentPage = numPages-1; }

	  report.page (currentPage);

	  display no_continue
	    {
   	      object [position="header" class="birdseedHeader" element="img" src="http://eleven.sourceforge.net/image/birdseed-header.gif" alt="ACME Bird Seed order entry" width="250" height="64"] ("");
	      print [position="left"] ("Menu", menu);

	      print ("Orders on file (5 per page):", report);

	      if (numPages == 1)
		{
		  print ("Page 1 of 1.");
		}
	      else if (numPages >= 2)
		{
		  print ("Page ", currentPage+1, " of ", numPages, ".", pager);
		}
	    }
	}
    }
}

/*------------------------------------------------------------
  Start program
  ------------------------------------------------------------*/

catalog.sort ("catalog_num");
customers.sort ("customer_id");
report.sort ("order_date", "name");

report.pagesize (5);
report.page (0);

while (1)
{
  prepare menu
    {
      "Welcome"      { welcome         (); }
      "Catalog"      { updateCatalog   (); }
      "Customers"    { updateCustomers (); }
      "Enter orders" { enterOrders     (); }
      "View orders"  { viewOrders      (); }
    }
  mission
    {
      welcome ();
    }
}