home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 February / CHIP_2_98.iso / software / pelne / optionp / mts4.cab / Account.VJ_Account_Account.java < prev    next >
Text File  |  1997-11-14  |  4KB  |  140 lines

  1. // Filename: Account.java
  2. //
  3. // Description: Declaration of Account
  4. //
  5. // This file is provided as part of the Microsoft Transaction Server
  6. // Software Development Kit
  7. //
  8. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT 
  9. // WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
  10. // INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES 
  11. // OF MERCHANTABILITY AND/OR FITNESS FOR A  PARTICULAR 
  12. // PURPOSE.
  13. //
  14. // Copyright (C) 1997 Microsoft Corporation, All rights reserved
  15.  
  16. package Account;
  17.  
  18. import com.ms.mtx.*;
  19. import com.ms.com.*;
  20. import msado15.*;
  21.  
  22. import accountlib.*;
  23.  
  24.  
  25. public class Account implements IAccount {
  26.     
  27.     private static final String CLSID = "9faf8612-e902-11d0-b5be-00c04fb957d8";
  28.  
  29.     // Post() performs error handling for TruePost().  If Truepost() throws an exception,
  30.     // then Post() will call SetAbort() and pass the exception up to the caller.  Otherwise,
  31.     // Post() will simply call SetComplete() and return.
  32.  
  33.     public String Post (int lngAccountNo, int lngAmount) throws ComFailException {
  34.  
  35.         String result;
  36.         boolean bSuccess = false;
  37.  
  38.  
  39.         // First of all, get the object context
  40.         IObjectContext ctxObject = MTx.GetObjectContext();
  41.  
  42.         try {
  43.  
  44.             // Check for security
  45.             if ((lngAmount > 500 || lngAmount < -500) && !ctxObject.IsCallerInRole ("Managers"))
  46.                 throw new ComFailException ("Need 'Managers' role for amounts over $500");
  47.  
  48.             // Call the true function
  49.             result = truePost (lngAccountNo, lngAmount);
  50.  
  51.             bSuccess = true;
  52.             return result;
  53.         }
  54.  
  55.         // Upon exit, always call SetComplete if happy, or SetAbort if unhappy.
  56.         // We do this because we never save state across method calls.
  57.         finally {
  58.             if (bSuccess)
  59.                 ctxObject.SetComplete();
  60.             else
  61.                 ctxObject.SetAbort();
  62.         }
  63.     }
  64.  
  65.  
  66.     // TruePost() is the function that performs the actual work for the Account class.
  67.     // If an error occurs during execution, it will throw a ComFailException for Post() to
  68.     // handle.
  69.  
  70.     private String truePost (int lngAccountNo, int lngAmount) throws ComFailException {
  71.  
  72.         _Recordset adoRsBalance  = null;
  73.         _Connection adoConn = null;
  74.         Field pField = null;
  75.         Fields pFields = null;
  76.         String result;
  77.         
  78.         try {
  79.             // Create ADOConnection object and initialize the connection
  80.             adoConn = (_Connection) new Connection();
  81.             String vDSN = "FILEDSN=MTSSamples";
  82.             adoConn.Open (vDSN, null, null, CommandTypeEnum.adCmdUnspecified);
  83.  
  84.             // Obtain the desired recordset with an SQL query
  85.             Variant    vRowCount = new Variant();
  86.  
  87.             String strSQL = "UPDATE Account SET Balance = Balance + " + lngAmount + 
  88.                 " WHERE AccountNo = " + lngAccountNo;
  89.             adoConn.Execute (strSQL, vRowCount, - 1);
  90.  
  91.             // See whether the record is present.
  92.             if (vRowCount.getInt() == 0)
  93.                 throw new ComFailException ("Error. Account " + lngAccountNo + " not on file.");
  94.  
  95.             strSQL = "SELECT Balance FROM Account WHERE AccountNo = " + lngAccountNo;
  96.             adoRsBalance = adoConn.Execute (strSQL, new Variant(), - 1);
  97.             
  98.             // Get the appropriate fields
  99.             pFields = adoRsBalance.getFields();
  100.             
  101.             // Get the appropriate field
  102.             Variant vField = new Variant();
  103.             Variant vBalance = new Variant();
  104.             vField.putString ("Balance");
  105.             
  106.             pField = pFields.getItem (vField);
  107.             vBalance = pField.getValue ();
  108.             int lngBalance = vBalance.getInt();
  109.             
  110.             // Check if account is overdrawn, then prepare return string
  111.             if ((lngBalance) < 0)
  112.                 throw new ComFailException("Error. Account " + lngAccountNo + " would be overdrawn by "
  113.                         + (-lngBalance) + ". Balance is still " + (lngBalance - lngAmount) + ".");
  114.  
  115.             if (lngAmount > 0)
  116.                 result = "Credit to";
  117.             else
  118.                 result = "Debit from";
  119.             result += " account " + lngAccountNo + ", balance is $" + lngBalance + ".  (VJ++)";
  120.  
  121.             return result;
  122.         }
  123.  
  124.         finally {
  125.             // cleanup that needs to occur whether we leave via a return or an exception.
  126.             if (adoRsBalance != null) {
  127.                 if (adoRsBalance.getState() == ObjectStateEnum.adStateOpen)
  128.                     adoRsBalance.Close();
  129.                 ComLib.release (adoRsBalance);
  130.             }
  131.  
  132.             if (adoConn != null) {
  133.                 if (adoConn.getState() == ObjectStateEnum.adStateOpen)
  134.                     adoConn.Close();
  135.                 ComLib.release (adoConn);
  136.             }
  137.         }
  138.     }
  139. }
  140.