Wrapper methods

I need some clarification for something i just came across:
I would understand that the native keyword signals to the Java compiler that the function is a native language function.
Is it possible to call method which does not exits in the native dll but in turn this method calls for certain native methods in the wrapper dll?
for example lets say I declare a method:
native int dummymethod();
...and there isn't a method which maps to this in the native DLL,
but could I in the wrapper file call a native method inside this:
JNIEXPORT jint JNICALL Java_myClass_dummymethod
(JNIEnv *env, jobject obj)
jint myimgHeight;
myimgHeight=Height();// height is the native method of the DLL
myimgHeight=myimgHeight*2;
//perform other actions here
return myimgHeight;
.....is this possible?!
I have also seen these statements for some example file:
JNIEXPORT jint JNICALL Java_exampleJNI_get_1MaxTime(JNIEnv *jenv, jclass jcls)
I wonder what the "1MaxTime" stands for as it does not map any native method with a "1" perfix.
thanks

bschauwe, let me explain my situation a little better, I am here debugging a code written by someone else, where I came across:
native byte[] ImageData();
Now expecting to see a ImageData() function defined in the .h of the third party DLL, I ran into a dead end! There was no such declaration for this method in the header. So i was left wondering if a different method was called under ImageData() in the native method implementation.
Take a look at this thread, maybe this is how it works as well,
http://forum.java.sun.com/thread.jsp?forum=52&thread=416532
davidnjclarke, calls
public native void MyDLLfunction();
but goes on to say,
JNIEXPORT void JNICALL
Java_MyDLL_myDLLfunction(JNIEnv *env, jobject obj)
MyRealFunction();
return;
there is a discrepancy between the method names called(MyDLLfunction and MyRealFunction)....is this valid?

Similar Messages

  • Wrapper method

    What exactly is the difference between wrapper method and normal method?
    I need to write a wrapper method for a private method but i don't what exactly the wrapper method does?

    Normal Method:
    private boolean remove(Node < E > head, Node < E > pred, E outData) {
        if (head == null) // Base case ? empty list.
          return false;
        else if (head.data.equals(outData)) { // 2nd base case.
          pred.next = head.next; // Remove head.
          return true;
        else
          return remove(head.next, head, outData);
      }Wrapper Method:
    public boolean remove(E outData) {
        if (head == null)
          return false;
        else if (head.data.equals(outData)) {
          head = head.next;
          return true;
        else
          return remove(head.next, head, outData);
      }Above is example of a normal method and of its wrapper method. I need to write a same kind of normal method and wrapper method.

  • Calling a document style web service using a pl/sql wrapper method

    Just wanted to find out if anybody has a working example of invoking a document style web service from Oracle 10g database on a Unix environment.
    We have java test class that invokes the web service, and we are trying to use a pl/sql wrapper to invoke a Java Web Service client. So far, we are encountering an End of File Communication error from Oracle which essentially terminates the session with the database.
    On the Oracle application server side we are able to see a successful HTTP request made to the application server via server log, which is hosting the web service, since we are registering HTTP 200 success codes. However, we do not see any other errors from the application in the server logs. Most likely since the client side fails, before actually getting a chance to invoke the web service. This has been verified by commenting the client code leaving the print statements. The first call to the Service Factory method (XFire) to look up the service is where the PL/SQL procedure fails with an End of File communication error.

    Remove the when others section and see the actual error and post that.
    http://tkyte.blogspot.com/2008/06/when-others-then-null-redux.html
    http://tkyte.blogspot.com/2007/03/dreaded-others-then-null-strikes-again.html

  • Using a static wrapper method to access session

    Hello,
    I'm attempting to develop a utility class comprised of static convenience methods that will access the different scopes. Given the fact that the methods are static, will this pose any risk in a multi-threaded environment? See example below. Thanks.
    public static void setSessionObject(HttpServletRequest req, String attrName,
                   Object object) {
              HttpSession session = req.getSession(false);
              if (session != null) {
                   session.setAttribute(attrName, object);
         }

    What happens if two instances call this method simultaneously? Would it be possible to set the wrong attribute in the wrong session?

  • No Method Signature - initQuery error after VO Substitution

    Hi All,
    I have done a VO Substitution for "NewBankAccountVOImpl". Below is the exact Requirement,
    iReceivables -> Query for a given Customer -> Go to accounts Tab -> Try to Pay off an invoice -> You get an option choose Payment Method as "New Bank Account" ->
    Now there are three field Routing Number, Account Number and Account Holder
    I need to restrict Account Number to minimum three characters. In 11.5.10 Oracle do not have this validation.
    So I checked out the place where the Routing Number and Account Number Validation happen i.e "NewBankAccountVOImpl" and extended the same to custom VOImpl and copied all the standard code to my custom code as below,
    package mercury.oracle.apps.ar.irec.accountDetails.pay.server;
    import oracle.apps.ar.irec.accountDetails.pay.server.NewBankAccountVOImpl;
    import oracle.apps.ar.irec.accountDetails.pay.server.NewBankAccountVORowImpl;
    import java.sql.Types;
    import java.lang.String;
    import oracle.apps.ar.irec.accountDetails.pay.utilities.PaymentUtilities;
    import oracle.apps.ar.irec.framework.IROAViewObjectImpl;
    import oracle.apps.fnd.common.VersionInfo;
    import oracle.apps.fnd.framework.OAException;
    import oracle.apps.fnd.framework.server.*;
    import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
    import oracle.jbo.RowIterator;
    import oracle.jbo.RowSetIterator;
    import oracle.jbo.domain.Number;
    import oracle.jbo.server.DBTransaction;
    import oracle.jdbc.driver.OracleCallableStatement;
    import oracle.jdbc.driver.OraclePreparedStatement;
    // --- File generated by Oracle Business Components for Java.
    // --------------- Modification History --------------------------
    // Date Created By Description
    // 04/01/2011 Veerendra K Account Number Validation to raise
    // error if Account Number entered is
    // less than 3 Digits
    public class MMARNewBankAccountVOImpl extends NewBankAccountVOImpl
    * This is the default constructor (do not remove)
    public MMARNewBankAccountVOImpl()
    public void initQuery()
    if(!isExecuted())
    executeQuery();
    reset();
    // Wrapper Method to validate Routing Number and Account Number
    public void validateNewBankAccount()
    OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
    RowSetIterator rowsetiterator = createRowSetIterator("iter");
    rowsetiterator.reset();
    NewBankAccountVORowImpl newbankaccountvorowimpl = (NewBankAccountVORowImpl)rowsetiterator.next();
    rowsetiterator.closeRowSetIterator();
    OAException oaexception = null;
    //object obj = null;
    int i = validateRoutingNumber(newbankaccountvorowimpl.getStrippedRoutingNumber());
    if(i == 0)
    OAException oaexception1 = new OAException("AR", "ARI_INVALID_ROUTING_NUMBER");
    if(oaexception == null)
    oaexception = oaexception1;
    else
    oaexception.setNextException(oaexception1);
    } else
    if(i == 2)
    OAException oaexception2 = new OAException("AR", "ARI_CREATE_BANK_ACCOUNT");
    if(oaexception == null)
    oaexception = oaexception2;
    else
    oaexception.setNextException(oaexception2);
    // Added by VEERENDRA KODALLI to limit addition of New Bank Account with Minimum 3 Digits
    if(validateBankAccountNumber(newbankaccountvorowimpl.getStrippedBankAccountNumber()))
    // Define Exception with FND Message MMARI_INVALID_BA_NUMBER
    OAException oaexception4 = new OAException("AR", "MMARI_INVALID_BA_NUMBER");
    if(oaexception == null)
    oaexception = oaexception4;
    else
    oaexception.setNextException(oaexception4);
    // Method to Validate if Entered Account Number and Routing Number Combination already exist
    if(validateDuplicateBankAccountNumber(newbankaccountvorowimpl.getStrippedBankAccountNumber(), newbankaccountvorowimpl.getStrippedRoutingNumber(), newbankaccountvorowimpl.getAccountHolderName()))
    OAException oaexception3 = new OAException("AR", "ARI_DUPLICATE_BA_NUMBER");
    if(oaexception == null)
    oaexception = oaexception3;
    else
    oaexception.setNextException(oaexception3);
    if(oaexception != null)
    oaexception.setApplicationModule(oaapplicationmoduleimpl);
    throw oaexception;
    } else
    return;
    // Method to Validate Routing Number
    public int validateRoutingNumber(String s)
    boolean flag = PaymentUtilities.checkDigits(s);
    if(!flag)
    return 0;
    OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
    OADBTransaction oadbtransaction = (OADBTransaction)oaapplicationmoduleimpl.getDBTransaction();
    if(oadbtransaction.isLoggingEnabled(2))
    oadbtransaction.writeDiagnostics(this, "Start validateRoutingNumber", 2);
    String s1 = "BEGIN :1 := ARP_BANK_DIRECTORY.is_routing_number_valid(:2,:3); END;";
    OracleCallableStatement oraclecallablestatement = (OracleCallableStatement)oadbtransaction.createCallableStatement(s1, 1);
    int i = 0;
    try
    oraclecallablestatement.registerOutParameter(1, -5, 38, 38);
    oraclecallablestatement.setString(2, s);
    oraclecallablestatement.setString(3, "ABA");
    oraclecallablestatement.execute();
    i = oraclecallablestatement.getInt(1);
    catch(Exception exception1)
    exception1.printStackTrace();
    throw OAException.wrapperException(exception1);
    finally
    try
    oraclecallablestatement.close();
    catch(Exception exception2)
    throw OAException.wrapperException(exception2);
    // Debug Message
    if(oadbtransaction.isLoggingEnabled(2))
    oadbtransaction.writeDiagnostics(this, "End validateRoutingNumber", 2);
    return i;
    // Method to Validate Duplicate Account Number
    public boolean validateDuplicateBankAccountNumber(String s, String s1, String s2)
    OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
    OADBTransaction oadbtransaction = (OADBTransaction)oaapplicationmoduleimpl.getDBTransaction();
    if(oadbtransaction.isLoggingEnabled(2))
    // Debug Message
    oadbtransaction.writeDiagnostics(this, "Start validateDuplicateBankAccountNumber", 2);
    String s3 = "BEGIN :1 := AR_IREC_PAYMENTS.is_bank_account_duplicate(:2,:3,:4); END;";
    OracleCallableStatement oraclecallablestatement = (OracleCallableStatement)oadbtransaction.createCallableStatement(s3, 1);
    boolean flag = true;
    try
    oraclecallablestatement.registerOutParameter(1, -5, 38, 38);
    oraclecallablestatement.setString(2, s);
    oraclecallablestatement.setString(3, s1);
    oraclecallablestatement.setString(4, s2);
    oraclecallablestatement.execute();
    Number number = new Number(oraclecallablestatement.getLong(1));
    if(number.equals(new Number("0")))
    flag = false;
    else
    flag = true;
    catch(Exception exception1)
    exception1.printStackTrace();
    throw OAException.wrapperException(exception1);
    finally
    try
    oraclecallablestatement.close();
    catch(Exception exception2)
    throw OAException.wrapperException(exception2);
    // Debug Message
    if(oadbtransaction.isLoggingEnabled(2))
    oadbtransaction.writeDiagnostics(this, "End validateDuplicateBankAccountNumber", 2);
    return flag;
    public boolean validateBankAccountNumber(String s)
    OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
    OADBTransaction oadbtransaction = (OADBTransaction)oaapplicationmoduleimpl.getDBTransaction();
    // Debug Message
    if(oadbtransaction.isLoggingEnabled(2))
    oadbtransaction.writeDiagnostics(this, "Start validateBankAccountNumber", 2);
    boolean flag = true;
    try
    // Check if the Account Number Length is less than 3 Digits
    if(s.length() < 3)
    flag = true;
    // Debug Message
    if(oadbtransaction.isLoggingEnabled(2))
    oadbtransaction.writeDiagnostics(this, "Account Number Less than 3 Digits!", 2);
    else
    // Debug Message
    if(oadbtransaction.isLoggingEnabled(2))
    oadbtransaction.writeDiagnostics(this, "Account Number greater than 3 Digits!", 2);
    flag = false;
    //return PaymentUtilities.checkDigits(s);
    catch (Exception exception4)
    //if(oadbtransaction.isLoggingEnabled(2))
    //oadbtransaction.writeDiagnostics(this, "Entered Catch", 2);
    throw OAException.wrapperException(exception4);
    if(oadbtransaction.isLoggingEnabled(2))
    // Debug Message
    oadbtransaction.writeDiagnostics(this, "End validateBankAccountNumber", 2);
    return flag;
    public static final String RCS_ID = "$Header: NewBankAccountVOImpl.java 115.8 2008/07/21 13:49:37 nkanchan noship $";
    public static final boolean RCS_ID_RECORDED = VersionInfo.recordClassVersion("$Header: NewBankAccountVOImpl.java 115.8 2008/07/21 13:49:37 nkanchan noship $", "oracle.apps.ar.irec.accountDetails.pay.server");
    I did compile the Java File and also the JPX import. It was all successful. I tested the code and it worked as expected. Now I see an exception on the page when I click the Pay button stating "No Method Signature No Method Signature - initQuery".
    The error do not come when I take out my substitution. Any one know what might be the reason for above issue. I have no idea why all of a sudden it stopped working and checked all standard filles but none got changed.
    Any pointers towards to resolve the same would be appreciable.
    Thanks in Advance,
    Veerendra

    Uma,
    try to delete all class files, recompile and run! Also, check if any CO is not extended other than from OAControllerImpl, although it would not be generally.
    --Mukul                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • Best practice for method calling on objects within a collection.

    Hi guys
    As you may be aware, based on my other thread here. I'm designing a card game in Java. I was hoping for some advice on the best practise on how methods should be called on a custom Object contained within a custom Collection.
    I have an instance variable for the Deck class as follows: List<Card> deckWhen creating an instance of the class I use deck = new ArrayList<Card>();So I have a Deck which only holds Card objects. My question is, for the Card methods, should I call them on the Card objects after 'getting' the Cards from the Deck or should I write methods within the Deck class which handles this method calling. Code explanation is as follows:
    Deck standardDeck = new Deck();I want to retrieve the suit value of a card within the deck. Is this the best way to do it this way:
    standardDeck.getCardAt(50).getSuit();
    //getCardAt is a method within the Deck class, getSuit() is a method within the Card classor this way:
    standardDeck.getSuitForCardAt(50);
    //getSuitForCardAt() is a method within the Deck class. This method calls the getSuit() method within its method body.Cheers for any help guys.
    Edited by: Faz_86 on Jul 10, 2010 9:53 AM

    Hey Saish
    Thanks for the response.
    My Card class does indeed override hashCode(), equals() and toString().
    The reason I am asking a card from the deck for its Suit is simply because of the rules of the game being played. The game I made is a 'Card Shredding' game where a player attempts to remove as many cards from their hand during each turn. The first to remove all their cards is the winner.
    When the game starts, two decks are created. A standard 52 card deck and an empty deck. Then 8 cards are dealt to each player and one card is dealt into the empty deck. The suit and value of the card on the empty deck called the 'shredding deck' dictates which moves are valid during each turn; The played card must match the Suit or the Value of the current card on the 'shredding deck'
    For example:
    Card on the empty deck = 8 of Spades
    The only card from a players hand which can be removed are any Spade or an Eight of any suit.
    Going back to the Deck.getSuitOfCardAtIndex(int index) , this method is needed because both the AI player and human player need to have the ability to take a look at the cards which have been added to the 'shredding deck'. Again this is because of the rules of the game. Therefore I need a method to take a look at the Suit and Value for any card in the 'shredding deck'.
    Taking all this into account, so far I have the following in my Deck class. Please comment on my design so far. As you can see I've tried to follow the Law Of Demter by creating many little wrapper methods. I understand totally wh getters and setters are bad but I cannot come up with a design solution to achieve what I need to based on the rules of the game without users getters. - Any tips on this would be great.
         public Card dealCard()
              Card cardToDeal = deck.remove(0);
              return cardToDeal;
         public void addCard(Card usedCard) //This method is used to add 'used' cards to the deck.
              deck.add(usedCard);
         public Card getFaceCard() //Returns the current face up playing card
              Card faceCard = deck.get(deck.size()-1);
              return faceCard;
         public int getFaceCardValue()
              int faceCardValue = deck.get(deck.size()-1).getValue();
              return faceCardValue;
         public int getFaceCardSuit()
              int faceCardSuit = deck.get(deck.size()-1).getSuit();
              return faceCardSuit;
         public String getFaceCardName()
              String faceCardName = deck.get(deck.size()-1).toString();
              return faceCardName;
         public Card getCardAt(int position) //Returns the current face up playing card
              Card card = deck.get(position);
              return card;
         public int getFaceCardValueAt(int position)
              int cardValue = deck.get(position).getValue();
              return cardValue;
         public int getFaceCardSuitAt(int position)
              int cardSuit = deck.get(position).getSuit();
              return cardSuit;
         public String getFaceCardNameAt(int position)
              String cardName = deck.get(position).toString();
              return cardName;
         public int getDeckSize() //When recycling cards, the size of the deck is needed to determine the best time to add more cards.
              return deck.size();
         }

  • A way to set a flag in java layer when native method has been called?

    Hi,
    I'm calling a native method from the java layer through to a native c function. Is there a way I can set a flag in the java layer when this native method has been called?
    Thanks!

    1. Create a wrapper method. The wrapper method is the only exposed method. It calls the native method. It sets the flag.
    2. Set the flag in the native method itself.
    3. You might be able to use the debugging API to do this however it is going to require quite a bit of work. And it injects itself at runtime.
    Is there a reason for this request? There might be other solutions if a general problem was posed.

  • How can we call methods of one web dynpro component in another one

    Hello Team,
    How do I call  one Web Dynpro component methods in another Web Dynpro component.
    How do we use public parts.
    thanks

    Hi,
    You want to use Comp2's getData() method in Comp1
    If both the WebDynpro components are in the same DC:
    1. Create a wrapper method (with the same signature) in the Comp2's Interface controller. And invoke the Component contorller's getData() method in this method using the below code.
    wdThis.wdGetComp2Controller.getData()
    2. Now Go to the Comp1 and right click on UsedWebDynproComps and add this Comp2 as a UsedWebDypro component.
    3. Now go to the Component Controller of Comp1 and in properties tab add the usage declaration of Interface controller of Comp2.
    4. Now using this below code you can access the method of InterfaceController of Comp2.
    wdThis.wdGetComp2Interface().getData();
    If both the WebDynpro components are in different DCs:
    1. Right click on Comp2 and select Add to public part on Comp2 in DC2.
    2. Now Add this public part in DC1 UsedDCs.
    Now repeat the above stpes 1...to..4. of  "If both the WebDynpro components are in the same DC" same.
    Regards,
    Charan

  • Exposing ViewImp methods to AppModule

    Hi
    I am using JDeveloper Studio Edition Version 11.1.2.2.0 and ADF.
    Just simple question.
    I created custom method inside EmployeesImpl class. In order to call it from my AppModule, do I need to expose it through Object Client Interface, or is there other way to enable this?
    Thx

    Is this EmployeesImpl a VO? If yes then exposing it to the client interface is the way to go.
    Only other thing you can do e.g. if you don't want the VO to be exposed in the data model, is to write a wrapper method in the application module (where you can access the ViewImpl) and expose this method in the application module client interface. This way external users can only see your wrapper method but not the whole VO.
    Timo

  • Problem with ClassCastException in web application

    Hello,
              I'm trying to deploy a web application in WLS 5.1 and I'm getting the
              "dreaded" ClassCastException every time when JSP tries to read a bean
              from the request or session. Under my architecture (actually it's just
              the regular "model 2" ) bean is populated by a servlet, set on the
              request and then retrieved by JSP (servlet forwards to JSP). Everything
              work fine when I register servlets in weblogic.properties, but
              ClassCastException is thrown on any attempt to read from the request if
              the same JSPs and servlets are deployed as web application.
              Has anybody come across the same problem?
              Thanks in advance for help.
              Alexander
              

    Hello,
              This is all well and good as a temporary bug, but it's totally unrealistic for
              the future. Two points:
              * The ClassLoader doesn't need to be discarded, it just needs to be cleared.
              * Other servlet engines seem to be able to handle this.
              Hope it's on its way to resolution!
              TDoan wrote:
              > Alexander:
              >
              > I had some problem with ClassCastException, and recently I found out what it
              > was that causing it. I'm sure if this is the same problem you are having,
              > but please read the following paragraph.
              >
              > I cutted this from http://www.weblogic.com/docs51/classdocs/API_servlet.html
              > ClassCastException and HTTP Sessions
              >
              > You might encounter a ClassCastException while developing servlets that use
              > HTTP sessions. This could happen as a result of the following set of events:
              >
              > a.. You store a reference to a custom class, myFoo, in an HTTP session.
              >
              > b.. While in mid-session, you change your servlet (or JSP or JHTML),
              > causing it to be reloaded. In fact, it is necessary for it to be reloaded by
              > a completely new class loader, and the old class loader that had previously
              > loaded it must be discarded.
              >
              > c.. Because your custom class myFoo is also located under the servlet
              > classpath, it too is reloaded by the new class loader.
              >
              > d.. Now, when you retrieve myFoo from the HTTP session, you cast it to the
              > expected type, but you recieve a ClassCastException. The exception is thrown
              > even if class myFoo has not changed. Because it has been loaded by a
              > different class loader, it is regarded by the JVM as incompatible.
              > Note: If you are using session persistence, the class contents must be
              > serialized, and you will not encounter this exception.
              >
              > Here are some suggested work-arounds to this problem:
              >
              > a.. Do not place your class myFoo in the servlet classpath. Instead, place
              > it in the system classpath or the weblogic.class.path, which are accessible
              > by WebLogic Server. The class will not be reloaded when the servlet is
              > modified. This drawback to this solution is that you cannot prototype the
              > myFoo class, because you must restart the server in order to reload the
              > class after it is modified.
              >
              > b.. If you need to prototype the class, you can write a wrapper method
              > within it to store and retrieve its contents to and from the session. You do
              > not access the class directly from the session, but instead call it is
              > wrapper methods to store or populate it is contents from the session. As
              > long as you use standard Java class types to store the class contents, they
              > will not be reloaded when the servlet is reloaded. This approach has
              > performance drawbacks because your wrapper methods would need to set or get
              > multiple name=value pairs for each class's attributes.
              >
              > c.. Another work-around is to catch the ClassCastException, and replace
              > the old class that is stored in the session with a newly instantiated class,
              > or remove it from the session. Unfortunately, you lose the session data that
              > was previously stored in the class, so you must write your application to
              > handle this scenario. This is the easiest solution to the problem-remember
              > that you should not be storing critical information in an HTTP session, but
              > rather storing it in a database.
              > Note: The ClassCastException generally occurs while you are developing
              > your servlets, and should not be an issue in a stable production system. If
              > you are upgrading your system online, you might wish to warn your customer
              > base.
              >
              > Hope it helps,
              > Tin
              >
              > "Alexander Ananiev" <[email protected]> wrote in message
              > news:[email protected]...
              > > Hello,
              > >
              > > I'm trying to deploy a web application in WLS 5.1 and I'm getting the
              > > "dreaded" ClassCastException every time when JSP tries to read a bean
              > > from the request or session. Under my architecture (actually it's just
              > > the regular "model 2" ) bean is populated by a servlet, set on the
              > > request and then retrieved by JSP (servlet forwards to JSP). Everything
              > > work fine when I register servlets in weblogic.properties, but
              > > ClassCastException is thrown on any attempt to read from the request if
              > > the same JSPs and servlets are deployed as web application.
              > > Has anybody come across the same problem?
              > >
              > > Thanks in advance for help.
              > > Alexander
              > >
              

  • I made a new Date object

    See, here's the thing with dates in java, the way i see it. We used to have Date, but Date wasn't international so we got Calendar. But some things, like SimpleDateFormat, still expect java.util.Date. java.sql.Date is out there somewhere, too. None of them have direct support for date differences (i.e. dateA - dateB = 8 days, or whatever). Now you're probably reading this thinking "Java supports all of this" and you're right. Calendar has a getTime method that returns a Date, and i can just pass THAT to SimpleDateFormat. With a little math, getTimeInMillis can be used to find the difference in two Calendars. But i got to thinking, "There should only be one Date object i need to think about," and since i don't ever have enough to do at work i put one together. I don't know if any of you are going to care enough to use it, mostly i'm just looking for advice on features i should add to it, inefficiencies in the design, stuff that's hard to understand, or whatever.
    This is it:
    *This catastrophe brought to you by SrA Meyerin.
    *Proximo Satis pro administatio.
    package awesomedate;
    //The following are imported for the toFormattedString(), toUtilDate(), toSQLDate, and toCalendar() methods, respectively.
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.sql.*;
    import java.util.TimeZone;
    *This class is designed to be the ultimate date object. It stores dates accurate to the millisecond, has the ability to do date
    *arithmetic (adding/subtracting days/months/whatever), date comparison, and date formatting. Also it can, at will, be used as any
    *of the other date objects in the standard java API.
    public class AwesomeDate
         *Milliseconds from the epoch. This field is where everything starts.
        private long millis;
         * The current year. This is the only aspect of the current date that is stored in addition to the milliseconds. Everything else
         * is calculated as needed.
        private int year;
        //The following six variables are fairly self explanatory. I'll explain them anyway.
         *Milliseconds in one non-leap year. This can be passed to the "adjustDate()" method
         * but mostly it is used to make my code more readable.
        public final static long MILLIS_IN_YEAR = 31536000000L;
         *Milliseconds in one leap year. This can be passed to the "adjustDate()" method
         * but mostly it is used to make my code more readable.
        public static final long MILLIS_IN_LEAP_YEAR = 31622400000L;
         *Milliseconds in one day. This can be passed to the "adjustDate()" method
         * but mostly it is used to make my code more readable.
        public static final long MILLIS_IN_DAY = 86400000;
         *Milliseconds in one hour. This can be passed to the "adjustDate()" method
         * but mostly it is used to make my code more readable.
        public static final long MILLIS_IN_HOUR = 3600000;
         *Milliseconds in one minute. This can be passed to the "adjustDate()" method
         * but mostly it is used to make my code more readable.
        public static final long MILLIS_IN_MINUTE = 60000;
         *Milliseconds in one second. This can be passed to the "adjustDate()" method
         * but mostly it is used to make my code more readable.
        public static final long MILLIS_IN_SECOND = 1000;
         *The number of days in each month.
        private int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
         *The timezone offset. GMT is 0, and the default, however, CST (where i live), is -6.
        private int timeZoneOffset = -6;
         *As the name would indicate, this is the number of milliseconds beyond 00:00 of jan 1 of the current year.
        private long millisAfterYear;
         *Basic constructor. Defaults to the current date and time. Works on Greenwich Mean Time, so it may seem off. To avoid this, multiply
         *add your time zone offset * MILLIS_IN_HOUR to the time in milliseconds.
        public AwesomeDate()
            setTimeInMillis(System.currentTimeMillis());
         *Fairly simple constructor. Sets time to the the number of milliseconds passed past the epoch.
        public AwesomeDate(long millis)
            setTimeInMillis(millis);
         *This constructor sets the date to the year/month/day passed.
        public AwesomeDate(int year, int month, int day)
            setDate(year, month, day);
         *This constructor sets the date time to the year/month/day/minute/hour/second passed.
        public AwesomeDate(int year, int month, int day, int hour, int minute, int second)
            setDate(year, month, day, hour, minute, second);
         *When you have the number of milliseconds, the first thing you must calculate is year. Because the number of milliseconds in a
         *year may vary, this is also the most difficult to calculate. This is the method that does it, though.
        private void setYearAfter1970()
            //I don't want to alter the actual number of milliseconds, so i make this variable and perform calculations on it.
            long theseMillis = this.millis;
            //Start at 1970 (the epoch) and work from there.
            year = 1970;
            long nextYear = MILLIS_IN_YEAR;
            //In this loop i subtract the number of millis in whatever year. The condition is if i have enough millis to make it through
                //another year.
            while (theseMillis >= nextYear)
                if (isLeapYear(year))
                    theseMillis = theseMillis - MILLIS_IN_LEAP_YEAR;
                    nextYear = MILLIS_IN_YEAR;
                else
                    theseMillis = theseMillis - MILLIS_IN_YEAR;
                    if (isLeapYear(year + 1))
                        nextYear = MILLIS_IN_LEAP_YEAR;
                year++;
            millisAfterYear = theseMillis;
            this.year = year;
         *Calculating the year from before 1970 must be done differently. It's pretty much just inverted.
        private void setYearBefore1970()
            long theseMillis = this.millis;
            year = 1970;
            long nextYear = MILLIS_IN_YEAR;
            while (theseMillis <= 0)
                if (isLeapYear(year))
                    theseMillis = theseMillis + MILLIS_IN_LEAP_YEAR;
                    nextYear = MILLIS_IN_YEAR;
                else
                    theseMillis = theseMillis + MILLIS_IN_YEAR;
                    if (isLeapYear(year - 1))
                        nextYear = MILLIS_IN_LEAP_YEAR;
                year--;
            millisAfterYear = theseMillis * -1;
            this.year = year;
         *Just what it sounds like. Pass it the number of milliseconds past the epoch and it will calculate the date based on that.
        public void setTimeInMillis(long millis)
            this.millis = millis;
            if (millis >= 0)
                setYearAfter1970();
            else
                setYearBefore1970();
         *Returns the number of milliseconds from the epoch.
        public long getTimeInMillis()
            return this.millis;
         *Returns the current year.
        public int getYear()
            return this.year;
         *Sets the date to 00:00 of Jan 1 of the passed year.
        public void setYear(int year)
            this.year = year;
            long theseMillis = 0;
            if (year > 1970)
                //Kind of like setYearAfter1970 method, except it's adding instead of subtracting. So actually it's the opposite.
                for (int cntr = 1970; cntr < this.year; cntr++)
                    if (isLeapYear(cntr))
                        theseMillis = theseMillis + MILLIS_IN_LEAP_YEAR;
                    else
                        theseMillis = theseMillis + MILLIS_IN_YEAR;
            else
                for (int cntr = 1970; cntr > this.year; cntr--)
                    if (isLeapYear(cntr))
                        theseMillis = theseMillis - MILLIS_IN_LEAP_YEAR;
                    else
                        theseMillis = theseMillis - MILLIS_IN_YEAR;
            //On a leap year there are 29 days in February. If not, there's 28.
            if (isLeapYear(year))
                daysInMonth[1] = 29;
            else
                daysInMonth[1] = 28;
            //This variable helps me calculate denominations of time that are below year.
            millisAfterYear = 0;
            setTimeInMillis(theseMillis);
         *Sets the month to the one that you passed, 0 being January and 11 being December.
        public void setMonth(int month)
            if (month < 0 || month > 11)
                throw new ArrayIndexOutOfBoundsException(month);
            long theseMillis = getTimeInMillis();
            int days = 0;
            setYear(this.year);
            if (getTimeInMillis() > 0)
                theseMillis = theseMillis - getTimeInMillis();
            else
                theseMillis = theseMillis + getTimeInMillis();
            for (int cntr = 0; cntr < month; cntr++)
                days = days + daysInMonth[cntr];
            millisAfterYear = days * MILLIS_IN_DAY + 1;
            setTimeInMillis(getTimeInMillis() + millisAfterYear);
         *Returns the month stored in this object. With this object 0 represents January and 11 represents December.
        public int getMonth()
            long theseMillis = millisAfterYear;
            int cntr = 0;
            while (theseMillis > (MILLIS_IN_DAY * daysInMonth[cntr]))
                theseMillis = theseMillis - MILLIS_IN_DAY * daysInMonth[cntr];
                cntr++;
            return cntr;
         *Set the day of month to the one passed.
        public void setDayOfMonth(int day)
            if (day < 1 || day > daysInMonth[getMonth()])
                throw new ArrayIndexOutOfBoundsException(day);
            setMonth(getMonth());
            //Internally, this actually works starting at zero, however to anyone using this class it appears to start at 1. Therefore
                //i must subtract one here.
            long addMillis = MILLIS_IN_DAY * (day - 1);
            millisAfterYear = millisAfterYear + addMillis;
            setTimeInMillis(getTimeInMillis() + addMillis + 1);
         *Returns the day of month.
        public int getDayOfMonth()
            int days = (int)(millisAfterYear / MILLIS_IN_DAY);
            int cntr = 0;
            while (days >= daysInMonth[cntr])
                days = days - daysInMonth[cntr];
                cntr++;
            //Internally this class stores dates starting at zero, but i want it to look like it starts at 1.
            return days + 1;
         *Sets the time to the currently selected day at the passed hour on the hour. uses 24 hour clock.
        public void setHour(int hour)
            if (hour < 0 || hour > 23)
                throw new ArrayIndexOutOfBoundsException(hour);
            setDayOfMonth(getDayOfMonth());
            long addMillis = MILLIS_IN_HOUR * hour;
            millisAfterYear = millisAfterYear + addMillis;
            setTimeInMillis(getTimeInMillis() + addMillis);
         *Returns the hour (but not how many minutes past the hour).
        public int getHour()
            long millisAfterDay = millisAfterYear % MILLIS_IN_DAY;
            return (int)(millisAfterDay / MILLIS_IN_HOUR);
         *Set the minutes past the hour. Works 0-59.
        public void setMinute(int minute)
            if (minute < 0 || minute > 59)
                throw new ArrayIndexOutOfBoundsException(minute);
            setHour(getHour());
            long addMillis = MILLIS_IN_MINUTE * minute;
            millisAfterYear = millisAfterYear + addMillis;
            setTimeInMillis(getTimeInMillis() + addMillis);
         *Returns the minutes past the hour, 0-59.
        public int getMinute()
            long millisAfterHour = millisAfterYear % MILLIS_IN_HOUR;
            return (int)(millisAfterHour / MILLIS_IN_MINUTE);
         *Sets the seconds past the minute, 0-59.
        public void setSecond(int second)
            if (second < 0 || second > 59)
                throw new ArrayIndexOutOfBoundsException(second);
            setMinute(getMinute());
            long addMillis = MILLIS_IN_SECOND * second;
            millisAfterYear = millisAfterYear + addMillis;
            setTimeInMillis(getTimeInMillis() + addMillis);
         *Returns the seconds past the minute, 0-59.
        public int getSecond()
            long millisAfterMinute = millisAfterYear % MILLIS_IN_MINUTE;
            return (int)(millisAfterMinute / MILLIS_IN_SECOND);
         *The more commonly seen set method of other date objects. Sets the date/time to 00:00 of the year/month/day passed. Convenience method
         *for setDate(int year, int month, int day, int hour, int minute, int second).
        public void setDate(int year, int month, int day)
            setDate(year, month, day, 0 , 0 , 0);
         *Sets every date/time field.
        public void setDate(int year, int month, int day, int hour, int minute, int second)
            setYear(year);
            setMonth(month);
            setDayOfMonth(day);
            setHour(hour);
            setMinute(minute);
            setSecond(second);
         *Returns yes if the stored date is a leap year. A leap year is every year that is divisible by four unless it is divisible by 100
         *unless it is also divisible by 400.
        public boolean isLeapYear()
            return isLeapYear(this.year);
         *For internal use. Returns if the passed year meets the criteria for a leap year.
        private boolean isLeapYear(int year)
            boolean leapYear = false;
            if (year % 4 == 0)
                if (year % 100 != 0)
                    leapYear = true;
                else if (year % 400 == 0)
                    leapYear = true;
            return leapYear;
         *Returns the difference in milliseconds between the time stored in this object and the millis passed to this method.
        public long getDifferenceInMillis(long millis)
            return getTimeInMillis() - millis;
         *Returns the difference in milliseconds between this date and the date passed to this method.
        public long getDifferenceInMillis(AwesomeDate otherDate)
            return getDifferenceInMillis(otherDate.getTimeInMillis());
         *Designed to be a wrapper method for the getDifferenceInMillis method. This method changes millis into years/days/whatever. Pass
         *the number of milliseconds you have to convert in the first parameter. The second parameter should be the type of denomination you
         *want (year, day, whatever). Use the MILLIS_IN_* fields associated with this object. Also bear in mind when workin with years that
         *some years are leap years, so in extreme cases of differences of 365+ years you may gain/lose a year.
        public static int toGreaterDenom(long millis, long denom)
            return (int)(millis / denom);
         * The first argument is how many of whatever (days, months, years, etc.) to add (use negative numbers to subtract). For the second
         * argument pass one of the MILLIS_IN_* fields. Thus, to add two hours would be
         * <code>
         *      AwesomeDate.adjustDate(2, AwesomeDate.MILLIS_IN_HOUR);
         * </code>
        public void adjustDate(int amount, long typeMillis)
            setTimeInMillis(this.millis + amount * typeMillis);
         *Returns an object of type java.util.Date set to the date/time stored here.
        public java.util.Date toUtilDate()
            long offset = TimeZone.getDefault().getRawOffset();
            return new java.util.Date(getTimeInMillis() +  -1 * offset);
    //        return new java.util.Date(getTimeInMillis());
         *Returns an object of type GregorianCalendar set to the date/time stored here.
        public GregorianCalendar toGregorianCalendar()
            long offset = TimeZone.getDefault().getRawOffset();
            GregorianCalendar cal = new GregorianCalendar();
            cal.setTimeInMillis(getTimeInMillis() - offset);
            return cal;
         *Returns an object of type java.sql.Date set to the date/time stored here.
        public java.sql.Date toSQLDate()
            long offset = TimeZone.getDefault().getRawOffset();
            return new java.sql.Date(getTimeInMillis() - offset);
        /** Format the date  using the string that you pass. Works just like the SimpleDateFormat object. Infact, it uses one! Heres
         *how it works:
         *Letter  Date or Time Component  Presentation  Examples  <br>
         *G  Era designator  Text  AD  <br>
         *y  Year  Year  1996; 96  <br>
         *M  Month in year  Month  July; Jul; 07<br> 
         *w  Week in year  Number  27  <br>
         *W  Week in month  Number  2  <br>
         *D  Day in year  Number  189  <br>
         *d  Day in month  Number  10  <br>
         *F  Day of week in month  Number  2<br> 
         *E  Day in week  Text  Tuesday; Tue  <br>
         *a  Am/pm marker  Text  PM  <br>
         *H  Hour in day (0-23)  Number  0<br> 
         *k  Hour in day (1-24)  Number  24  <br>
         *K  Hour in am/pm (0-11)  Number  0  <br>
         *h  Hour in am/pm (1-12)  Number  12  <br>
         *m  Minute in hour  Number  30  <br>
         *s  Second in minute  Number  55  <br>
         *S  Millisecond  Number  978  <br>
         *z  Time zone  General time zone  Pacific Standard Time; PST; GMT-08:00<br> 
         *Z  Time zone  RFC 822 time zone  -0800  <br>
        public String toFormattedString(String format)
            SimpleDateFormat formattage = new SimpleDateFormat(format);
            return formattage.format(toUtilDate());
         *I overrode the toString method. Now it tells everyone how awesome my AwesomeDate is.
        public String toString()
            String output = "John's Awesome Date!";
            output = output + " Millis: " + getTimeInMillis();
            output = output + " Year: " + getYear();
            output = output + " Month: " + getMonth();
            output = output + " Date: " + getDayOfMonth();
            output = output + " Time: ";
            if (getHour() < 10)
                output = output + "0" + getHour();
            else
                output = output + getHour();
            if (getMinute() < 10)
                output = output + "0" + getMinute();
            else
                output = output + getMinute();
            output = output + " Seconds: " + getSecond();
            return output;
        public static void main(String[] psvm)
            AwesomeDate blah = new AwesomeDate();
            GregorianCalendar blah1 = new GregorianCalendar();
            GregorianCalendar blah2 = new GregorianCalendar();
    }

    The reason Callendar is so complicated is that it is trying to solve a very complicated problem.
    You don't appear to support leap seconds (of which there can be upto 2 in any time interval)
    http://www.timeanddate.com/time/leapseconds.html
    Some of your code will not work for large dates very well (seems to iterate over the years). Try using your date class for astronomical or geological calculations. them big numbers will make your code slow at the moment.
    You don't seem to support timezones or transitory offsets (BST vs GMT). You most definately don't handle changes to timezone offsets that have occured in the past or historical daylight savings time offsets (they have not always been the same)
    The difference between two calendars is a "duration" a duration means nothing unless it is applied to a caledar/date (although you may be able to get away with it if the duration is always stored in millis)

  • Re: Sorting in ArrayField widget.

    Hi,
    If you need a little sample about sorting Arrays or Listviews you can find
    one on http://perso.club-internet.fr/dnguyen/
    It shows how to use a QuickSort generic class (the source code of that class
    is not delivered, but you can find a quicksort sample class at forte.com) :
    - Sub-class the class
    - Overwrite DoSortExpLow and DoSortExpSup
    - In your user class, call QuickSort(Self.SortArray, 1,
    Self.SortArray.Items, pcol, Self.SortListMode) where SortArray is the Array
    to sort, pCol is a parameter that defines the column and SortListMode
    defines if you want an ascending or descending sort.
    Hope this helps,
    Daniel Nguyen
    Freelance Forte Consultant
    Url : http://perso.club-internet.fr/dnguyen/
    David Foote a &eacute;crit:
    There is a more flexible solution with less code duplication that has
    worked well for us.
    Create a class SortService with a method with the following signature:
    Sort(list:Array of Object, stategy:ComparisonStrategy):Array of Object
    create a class called ComparisonStrategy with a method with the
    following signature:
    Compare(a:Object,b:Object):integer
    For each class that needs to be sorted, define a new
    ComparisonStrategy sub-class that overrides the Compare()
    method. Inside the overridden Compare() method, cast a and b to the
    correct class and compare them by whatever criteria is appropriate.
    If a>b return 1, if a=b return zero, if a<b return -1. Inside the
    SortService.Sort() method, call strategy.Compare(a=object1,b=object2)
    each time you need to compare two objects.
    This is quite similar to the C-library's implementation of the qsort
    function:
    void qsort( void *base, size_t num, size_t width, int (__cdecl
    compare )(const void elem1, const void *elem2 ) );
    compare( (void *) elem1, (void *) elem2 );
    It is also a good use of the Strategy design pattern. The one method,
    Sort(), will now sort any list of objects for which you pass in an
    appropriate ComparisonStrategy sub-class. The objects to be sorted do
    not have to implement any extra interface or inherit from any
    particular class. If you are interested and need more help I can
    probably lay my hands on some source.
    P.S. This sort should be applied to the data array not the
    arrayfield.
    David N. Foote
    ----Original Message Follows----
    What you need is a set of sort methods, one for each basic data type
    and a wrapper method which discovers the data type of the column to be
    sorted and calls the appropriate Sort method.
    Create a group of sort methods depending on the data type
    e.g..
    sortInt( p_Arr : Array of Object, Col : integer ),
    SortString( p_Arr : Array of Object, Col : integer ) ,
    SortYour4GLObject( p_Arr : Array of Object, Col : integer ) etc.
    Then create a wrapper method called Sort( p_Arr : Array of Object,
    Col :
    integer ).
    In this method, look at p_Arr[Col].ClassName to find out the datatype
    and appropriately call the method which sorts that data type
    i.e..,
    SortInt() if ClassName is qqsp_integer,
    SortString() if ClassName is qqsp_string
    SortYour4GLObject() if ClassName is Your4GLClass etc.
    In each of the sort method, implement the sort algorithm on the
    p_Arr[ Col ] values.
    Good luck,
    Ajith Kallambella. M
    Fort&eacute; Systems Engineer,
    International Business Corporation.
    -----Original Message-----
    From: Savory, Mark [mailto:[email protected]]
    Sent: Thursday, March 11, 1999 9:54 AM
    To: 'Kapil Tyagi'; '[email protected]'
    Subject: RE: Sorting in ArrayField widget.
    Kapil,
    Since you can't inherit from Array, you can create a helper for
    sorting
    arrays in general. Some helper class would have a method called:
    SomeHelperClass.Sort(list: Array of SomeInterface, column : int):Array
    of
    SomeInterface. The SomeInterface interface would have a virtual
    method
    called:
    SomeInterface.GetColumn(col:int):DataValue. All your classes that
    would be
    in an array to sort would have to implement the SomeInterface
    interface.
    Implementing the GetColumn method would require that your class
    attributes
    inherit from DataValue(TextData, DoubleData, IntegerData, etc.) or the
    GetColumn method could do a conversion. The SomeHelperClass.Sort
    method
    could then sort the appropriate column of the array.
    Mark Savory
    GTE Gov. Sys.
    -----Original Message-----
    From: Kapil Tyagi [mailto:[email protected]]
    Sent: Thursday, March 11, 1999 4:02 AM
    To: '[email protected]'
    Subject: Sorting in ArrayField widget.
    Hi,
    We are using ArrayField widget. Forte does not provide any in-built
    sorting
    facility
    in ArrayField as it does in ListView.
    Is there an easy way to do that?
    If we implement our own sorting algorithm then how do we make it
    generic
    method
    for different arrays.
    We can use GetChildInCell to fetch the values generically, but it
    works only
    for
    visible rows.
    Any pointers in this direction are appreciated.
    Kapil Tyagi
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive
    <URL:http://pinehurst.sageit.com/listarchive/>
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive
    <URL:http://pinehurst.sageit.com/listarchive/>
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive
    <URL:http://pinehurst.sageit.com/listarchive/>
    Get Free Email and Do More On The Web. Visit http://www.msn.com
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>-
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>

    Hi,
    If you need a little sample about sorting Arrays or Listviews you can find
    one on http://perso.club-internet.fr/dnguyen/
    It shows how to use a QuickSort generic class (the source code of that class
    is not delivered, but you can find a quicksort sample class at forte.com) :
    - Sub-class the class
    - Overwrite DoSortExpLow and DoSortExpSup
    - In your user class, call QuickSort(Self.SortArray, 1,
    Self.SortArray.Items, pcol, Self.SortListMode) where SortArray is the Array
    to sort, pCol is a parameter that defines the column and SortListMode
    defines if you want an ascending or descending sort.
    Hope this helps,
    Daniel Nguyen
    Freelance Forte Consultant
    Url : http://perso.club-internet.fr/dnguyen/
    David Foote a &eacute;crit:
    There is a more flexible solution with less code duplication that has
    worked well for us.
    Create a class SortService with a method with the following signature:
    Sort(list:Array of Object, stategy:ComparisonStrategy):Array of Object
    create a class called ComparisonStrategy with a method with the
    following signature:
    Compare(a:Object,b:Object):integer
    For each class that needs to be sorted, define a new
    ComparisonStrategy sub-class that overrides the Compare()
    method. Inside the overridden Compare() method, cast a and b to the
    correct class and compare them by whatever criteria is appropriate.
    If a>b return 1, if a=b return zero, if a<b return -1. Inside the
    SortService.Sort() method, call strategy.Compare(a=object1,b=object2)
    each time you need to compare two objects.
    This is quite similar to the C-library's implementation of the qsort
    function:
    void qsort( void *base, size_t num, size_t width, int (__cdecl
    compare )(const void elem1, const void *elem2 ) );
    compare( (void *) elem1, (void *) elem2 );
    It is also a good use of the Strategy design pattern. The one method,
    Sort(), will now sort any list of objects for which you pass in an
    appropriate ComparisonStrategy sub-class. The objects to be sorted do
    not have to implement any extra interface or inherit from any
    particular class. If you are interested and need more help I can
    probably lay my hands on some source.
    P.S. This sort should be applied to the data array not the
    arrayfield.
    David N. Foote
    ----Original Message Follows----
    What you need is a set of sort methods, one for each basic data type
    and a wrapper method which discovers the data type of the column to be
    sorted and calls the appropriate Sort method.
    Create a group of sort methods depending on the data type
    e.g..
    sortInt( p_Arr : Array of Object, Col : integer ),
    SortString( p_Arr : Array of Object, Col : integer ) ,
    SortYour4GLObject( p_Arr : Array of Object, Col : integer ) etc.
    Then create a wrapper method called Sort( p_Arr : Array of Object,
    Col :
    integer ).
    In this method, look at p_Arr[Col].ClassName to find out the datatype
    and appropriately call the method which sorts that data type
    i.e..,
    SortInt() if ClassName is qqsp_integer,
    SortString() if ClassName is qqsp_string
    SortYour4GLObject() if ClassName is Your4GLClass etc.
    In each of the sort method, implement the sort algorithm on the
    p_Arr[ Col ] values.
    Good luck,
    Ajith Kallambella. M
    Fort&eacute; Systems Engineer,
    International Business Corporation.
    -----Original Message-----
    From: Savory, Mark [mailto:[email protected]]
    Sent: Thursday, March 11, 1999 9:54 AM
    To: 'Kapil Tyagi'; '[email protected]'
    Subject: RE: Sorting in ArrayField widget.
    Kapil,
    Since you can't inherit from Array, you can create a helper for
    sorting
    arrays in general. Some helper class would have a method called:
    SomeHelperClass.Sort(list: Array of SomeInterface, column : int):Array
    of
    SomeInterface. The SomeInterface interface would have a virtual
    method
    called:
    SomeInterface.GetColumn(col:int):DataValue. All your classes that
    would be
    in an array to sort would have to implement the SomeInterface
    interface.
    Implementing the GetColumn method would require that your class
    attributes
    inherit from DataValue(TextData, DoubleData, IntegerData, etc.) or the
    GetColumn method could do a conversion. The SomeHelperClass.Sort
    method
    could then sort the appropriate column of the array.
    Mark Savory
    GTE Gov. Sys.
    -----Original Message-----
    From: Kapil Tyagi [mailto:[email protected]]
    Sent: Thursday, March 11, 1999 4:02 AM
    To: '[email protected]'
    Subject: Sorting in ArrayField widget.
    Hi,
    We are using ArrayField widget. Forte does not provide any in-built
    sorting
    facility
    in ArrayField as it does in ListView.
    Is there an easy way to do that?
    If we implement our own sorting algorithm then how do we make it
    generic
    method
    for different arrays.
    We can use GetChildInCell to fetch the values generically, but it
    works only
    for
    visible rows.
    Any pointers in this direction are appreciated.
    Kapil Tyagi
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive
    <URL:http://pinehurst.sageit.com/listarchive/>
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive
    <URL:http://pinehurst.sageit.com/listarchive/>
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive
    <URL:http://pinehurst.sageit.com/listarchive/>
    Get Free Email and Do More On The Web. Visit http://www.msn.com
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>-
    To unsubscribe, email '[email protected]' with
    'unsubscribe forte-users' as the body of the message.
    Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>

  • Invalid column type error while calling db function.

    We are getting an exception while calling the database function which returns a Varray of objects. We are using jpub to generate the wrapper method, ran sqlj to generate the JDBC code. The environment is weblogic 5.1 EJB container with ORacle 8.1.6.0.0 database. The JDBC driver is 8.1.7 thin, sqlj version is 8.1.7. I am giving below the exception.
    When the sqlj option profile=false is not set, the error is Classcast exception. Appraently the weblogic connection object can not be used to do oracle specific calls. If somebody has done similar things(creating a bean which calls the stored function with weblogic which returns the oracle object types) or know what the issue is, please let me know.
    Thanks,
    Vijay.
    stackTrace:
    java.sql.SQLException: Invalid column type
    at java.lang.Throwable.fillInStackTrace(Native Method)
    at java.lang.Throwable.fillInStackTrace(Compiled Code)
    at java.lang.Throwable.<init>(Compiled Code)
    at java.lang.Exception.<init>(Compiled Code)
    at java.sql.SQLException.<init>(SQLException.java:43)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:273)
    at oracle.jdbc.driver.OracleStatement.get_internal_type(OracleStatement.java:4560)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:225)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:350)
    at weblogic.jdbcbase.pool.Statement.registerOutParameter(Statement.java:438)
    at sqlj.runtime.profile.ref.RTStatementJDBCCallable.registerOutParameter(RTStatementJDBCCallable.java:135)
    at sqlj.runtime.profile.ref.ParamRegProfile$ParamRegCachedStatement.registerParameters(Compiled Code)
    at sqlj.runtime.profile.ref.ParamRegProfile$ParamRegCachedStatement.getStatement(ParamRegProfile.java:101)
    at sqlj.runtime.profile.ref.CachedStatementProfileWrapper.getStatement(CachedStatementProfileWrapper.java:134)
    at sqlj.runtime.ExecutionContext$StatementStack.setStatement(ExecutionContext.java:995)
    at sqlj.runtime.ExecutionContext.registerStatement(ExecutionContext.java:523)
    at com.xpede.calculator.processor.jdbc.NewPrdGroupPkg.maincalculator(NewPrdGroupPkg.java:341)
    ----------------------

    Weblogic essentially wrappers the Oracle JDBC driver - as you can see from the stack trace, it does not just wrapper the connection object, but also the statement object.
    The SQLJ runtime does not recognize the JDBC layer anymore as an Oracle JDBC driver.
    What is happening at runtime may be the following:
    (1) The invalid column type likely results from SQLJ attempting to register the type as Types.OTHER (code 1111). This typecode is not supported by Oracle JDBC.
    (2) The class cast exception when using Oracle objects may result from a getObject() call which returns the value in default format (such as oracle.sql.ARRAY) rather than the JPublisher-generated wrapper object.
    Are you using JDK 1.2 / runtime12.zip?
    In that case you can try the standard (java.sql.)SQLData interface (in JPub: -usertypes=jdbc). However, this interface will not support wrappers for VARRAYs.

  • How to find out the name of a table?

    Hi
    How can I find out the name of a table which doesn't have a record history?
    Regards
    Rahman

    No direct way to know the tables. What you will find on the ABout this page link are the View Object (similar to record sets), Entity objects, controller and Application module. Generally EO is based on a table or the VO can be based on the query which you can find the corresponding xml file. But a button action might be calling a method in AM or CO which in turn call some wrapper method to interact with database. So nothing straight forward. You will have to analyze the all page related code objects.
    They are specific to OA framework and if you are not aware about them, better go through the initial chapters of OAF dev guide.
    --Shiv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • Locking issue in workflow with conseutive database update

    Dear Workflowers,
    We are in ECC 5.0 and release 6.40. We went live for SAP in February and we are currently using workflow in PLM module for DMS and ECM.
    We have been facing this locking issue randomly happened in our production and quality system. The error from workflow log is "Document XXXX is locked by WF-BATCH". I have two steps in workflow one is to update the document user( from originator to editor with custom BO "zdraw" new method "setuser") and the next step is to update the document status( BO "zdraw" "setstatus" method which inherited form standard BO "draw").  
    I have tried to use "wait" (1st try) , statements  "BAPI_DOCUMENT_ENQUEUE", "BAPI_DOCUMENT_DEQUEUE" (2nd try) and  "Commit work and wait" (3rd try) to add one step in between, however the issue remains.
    The other question I had was we need to write "commit work" when we use BAPI to perform database update in the ABAP program. But I don't see "commit work" in the method of BO(for example "setstatus" in "draw" object) which performs database update. How does workflow perform DB update properly without "commit work" by referencing standard method?
    Could anyone please share your expertise with the issue I am facing?
    Thank you in advance,
    Merta

    Hi Merta,
    Regarding COMMITs: theoretically you should never use COMMIT statements because the Workflow runtime handles that - the transaction of executing the task is the LUW, not your method. By adding COMMIT WORK you are also committing the workflow task execution.
    In practice however there are the occasional exceptions where something just won't work without an explicit commit - but the theory remains that you should always try it without.
    Regarding your problem, the one way to be certain that a DB update is complete is to use a terminating event - either through change documents or status management.
    Failing that, you can write a wrapper method for SETSTATUS that does something like:
    do 10 times.
      try to lock it.
      if success.
        unlock.
        swc_call_method self 'SetStatus' container.
        set success flag.
      else.
        wait up to 3 seconds.
      endif.
    enddo.
    if no success, raise exception.
    Cheers,
    Mike

Maybe you are looking for