I see in the code that the transaction is begin before the call to
CSpTransction.execute().
The documentation for CSpTransaction.execute() says that it "automatically
begins a transaction" which makes the below message obvious - you are trying
to begin a transaction that has already been began.
Either remove the CSpTransaction.begin() at the beginning or call the
CSpTransaction.execute(CSpDataObject) version of the method.
> -----Original Message-----
> From: Aby Mathew [SMTP:[EMAIL PROTECTED]]
> Sent: Tuesday, August 24, 1999 6:51 AM
> To: '[EMAIL PROTECTED]';
> [EMAIL PROTECTED]
> Subject: Re: [ND] Transaction for Repeated's SAVE button
>
> Hi Janet,
>
> I am not very familiar with this message:
> "spider.database.CSpTransaction.execute(): Called when database
> transaction is
> still 'active'. The current active one is
> automatically 'rolledback'"
>
> But remember seeing it in the forum recently. Somebody must have an
> answer for you.
>
> The other thing I noticed is that variables like sTask,hSubTask, which
> form the Where clause are being used without being set to a value. Is
> there something missing?
>
>
> Aby
>
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Sent: Monday, August 23, 1999 3:23 PM
> To: [EMAIL PROTECTED]
> Subject: Re: [ND] Transaction for Repeated's SAVE button
>
> Hi Aby,
> 1. I tried setSqlTextFullUpdate (instead of INSERT) to agree with my
> flavor of
> DML, but it didn't work,
>
> 2. my WHERE clause that I build manually in my code is specific enough.
> i.e. it
> included the full key ( I construct it from hidden values). And it has
> so syntax
> errors (I copy/ paste it from the log into a SQL editor)
>
> Hmm, do you know if the setSqlTextFullUpdate doesn't work nicely with
> this type
> of transction logic?
>
> More info about what i'm doing, maybe you can suggest a better way:
>
> I have a DO that is bound to my repeated. it's a MULTISQL DO, but when I
> hit the
> SAVE button, I'm not using ND's built-in UPDATE button cause I need to
> do too
> much manual validating.
>
> so I just want a way to walk thru (in a FOR loop say) each row in my DO
> and
> specify the WHERE clause as well as the value of the columns I am
> updating.
>
> i thought just doing a FULL_TEXT_OVERRIDE and specify a SQl string then
> addDO
> with these command would do it:
>
> doUpdate.setSqlTextFullUpdate(sSQL);
> trx.addDataObject(doUpdate);
>
> but darn, in then doesn't like this when I get out of the FOR loop and
> try to
> execute it:
>
> trx.execute();
>
> it says:
> "spider.database.CSpTransaction.execute(): Called when database
> transaction is
> still 'active'. The current active one is
> automatically 'rolledback'"
>
> Do that error give you any ideas about what could be going wrong?
>
> Can you suggest a better way to do this?
>
> Thanks!
> Janet
>
>
>
>
> (Embedded
> image moved Aby Mathew <[EMAIL PROTECTED]>
> to file: 08/23/99 06:10 PM
> pic09588.pcx)
>
>
>
>
> To: Janet Traub/IS/SSC/THD,
> [EMAIL PROTECTED]
> cc:
> Subject: RE: [ND] Transaction for Repeated's SAVE button
>
>
>
>
> Hi Janet,
>
> A quick look at your code told me a couple of things:
>
> 1. You are doing
> >> setSqlTextFullInsert and
> setSqlTextOverrideInsert
> <<
> instead of
> >>setSqlTextFullUpdate and
> setSqlTextOverrideUpdate.
> <<
> (ND needs much less of a reason to be terribly upset!)
>
> 2.
> >>I would try that but my only problem (a very basic embarrassing one!)
> how do I
> specifiy what ROW (i.e the WHERE clause) I'm setting those values for?
> NOTE: I'm
> doing UPDATE not an INSERT on each row, so would I have to do
> "setDynCriteria"
> on the DO in each row (i.e inside the FOR loop) before I then do a
> setValue?
> <<<
>
> When you are doing FullOverride, DynamicCriteria has no role to play.
> What you need to do is add one more AND clause to the 'where' string you
> are already constructing, which is row specific. Normally the key field
> will not be given to the user for update, but will be kept in the form
> as a hidden field. getDisplayFieldValue() for that field will give you a
> CSpVector or a CSpString depending whether you have more than one row or
> not (you need to check this). From this vector you get the key value for
> each row.
>
> If you still have problems we'll see.
>
> Regards,
>
> Aby
>
>
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Sent: Monday, August 23, 1999 2:33 PM
> To: [EMAIL PROTECTED]
> Subject: [ND] Transaction for Repeated's SAVE button
>
>
>
>
>
> **Help! This one needs a speedy reply, please!**
>
> I'm trying to make my Save button UPDATE all rows in my Repeated in one
> nice
> Transaction. But alas, I'm getting an error right after I call trx.
> execute():
> that says:
>
> "right after I call the trx. execute()....I get this error:
>
> "spider.database.CSpTransaction.execute(): Called when database
> transaction is
> still 'active'. The current active one is
> automatically 'rolledback"
>
> This is my first time doing a "Trx on a Repeated" stuff, so likely I've
> got
> something messed up.
>
> Way down below is my code. (I've also attached it in case that's easier
> to read)
>
> You'll notice I'm doing this with my DO:
>
> DO.setSqlTextOverrideInsert(CSpSQLObject.FULL_TEXT_OVERRIDE);
>
> for (int i=numOfRows-1; i>=0; i--) {
> sSQL = new String(...);
> DO.setSqlTextFullInsert(sSQL);
> trx.addDataObject(DO);
> }
> if ((trx != null) && (trx.isActive ()) )
> {
> trx.execute();
> }
>
> I wonder if maybe i have to do this kind of thing instead:
>
> int numOfRows = _questionIndex.size();
> for (int i=numOfRows-1; i>=0; i--) {
> DO.clearAllValues();
> DO.setValue(0,name);
> DO.setValue(1,address.get(i));
> DO.addDataObjec(tDOt);
> }
> insertTrans.execute();
> if (!insertTrans.succeeded()) {
> returnValue = false;
> }
> ...
> I would try that but my only problem (a very basic embarrassing one!)
> how do I
> specifiy what ROW (i.e the WHERE clause) I'm setting those values for?
> NOTE: I'm
> doing UPDATE not an INSERT on each row, so would I have to do
> "setDynCriteria"
> on the DO in each row (i.e inside the FOR loop) before I then do a
> setValue?
>
> Any pseuodocode, snippets are appreciated!
> Thanks....below is my code.....Janet
> =====================================================
> //[[SPIDER_EVENT<BtnSave_onWebEvent>
> public int BtnSave_onWebEvent(CSpWebEvent event)
> {
> int command = PROCEED;
> CSpTransaction trx = null;
>
> CSpMultiSQL doMulti;
> int update = 0;
> int nNumRows;
>
> try {
> trx = new CSpTransaction();
>
> if (trx.begin ("dsProjMgmtDB"))
> {
> // determine number of displayed rows
> doMulti = (CSpMultiSQL)
> CSpider.getDataObject("doWPBdgtLevel");
> doMulti.execute();
> nNumRows = doMulti.getNumOfRows();
>
> //get a handle to the dummy DO to use in the UPDATE
> transaction
> CSpMultiSQL doUpdate = (CSpMultiSQL)
> CSpider.getDataObject("doDummy");
>
> //this is cheap trick we need to do to get around a ND bug.
> //must do a dummy setValue on one of the fields to get the
> insert to
> work
> doUpdate.setValue ("informix_iproj_wp_bdgt_iproj_id", new
> CSpInteger(0));
>
> //NOTE: it doesn't seem to matter if I use
> setSqlTextOverrideInsert
> //or setSqlTextOverrideUpdate
>
> doUpdate.setSqlTextOverrideInsert(CSpSQLObject.FULL_TEXT_OVERRIDE);
>
> for(int i = 0; i < nNumRows; i++){
>
> //here I get the hidden fields & current values
>
> //next I call this method to see if anything has been
> changed
>
> update = isUpdate(hStart, sStart, hFinish, sFinish,
> hHrs, sHrs, hStatus, sStatus);
>
> // if row is being updated
> if (update > 0){
>
> //next I build up the SQL syntax, and it's perfectly
> correct!
>
> //Build the SQL for the update of the current table
> sSQL = new String("UPDATE iproj_wp_bdgt SET " +
> "plnd_bgn_dt = '" + sStart + "', plnd_end_dt = '" +
> sFinish +
> "', iproj_wp_stat_cd = " + sStatus + ", wp_task_bdgt_hrs
> = " +
> sHrs + ", last_upd_user_id = '" + sUserID + "',
> last_upd_ts =
> CURRENT " +
> "WHERE iproj_id = '" + sProjID + "' AND iproj_wp_nm = '"
>
> + sWP +
> "' AND wp_phs_cd = " + sPhs + " AND wp_seg_cd = " + sSeg
> +
> " AND wp_step_cd = " + sStep + " AND wp_task_cd = " +
> sTask +
> " AND wp_sub_task_id = '" + hSubtask + "'");
>
>
> doUpdate.setSqlTextFullInsert(sSQL);
>
> //clone the DO to make an identical copy of it to hold
> until
> execution
> trx.addDataObject(doUpdate);
>
> }//end of if row is being updated.
> else
> {//nothing to update
>
> CSpHtml.sendMessage ("nothing to update <BR>");
> //do something here
>
> }//end of if (update > 0)
>
> }//for loop end.
>
> //if something has been added to the trx, execute the
> transaction
> if ((trx != null) && (trx.isActive ()) )
> {
> trx.execute();
> }
> }
> } //end of the try
> catch (Exception ex)
> {
> /// JT later fix or remove, or maybe OK. chk how this exception
> affects
> trx.
> CSpHtml.sendMessage ("An error occurred while saving the " +
> "budgeting information for this segment. Please notify a " +
> "ProjTrac Administrator. Details: "+ ex + " <BR>");
>
> }
> finally
> {
> //NOTE: this code is executed regardless if an exception
> //occurred or not.
>
>
> //HELP!!! Here's where it dies. . it hits this IF test:
>
> //It says there's no active TRX.
> //this gets written to Software messages:
> // if ((trx != null) && (trx.isActive ()) )
> //and that is FALSE, so it won't go further. if I remove that if
> //and force it to go furhter, sure enough I get this error:
> //"spider.database.CSpTransaction.commit: Called when database
> transaction
> //is NOT 'active'. Call has been ignored"
>
>
> if ((trx != null) && (trx.isActive ()) )
> {
> if (trx.succeeded ())
> {
> trx.commit();
>
> CSpHtml.sendMessage("commit the trx <BR>");
>
> //load the same page
> command = load("PgBudgetLevel");
> }
> else
> {
> trx.rollback();
>
> //failure, display error page
> CSpString sErrMsg = new CSpString
> ("An error occurred while saving the budgeting
> information "
> +
> "for this segment.<BR>Please notify a ProjTrac
> Administrator.");
>
> CSpider.putUserSessionObject("soErrMsg",sErrMsg);
>
> command = load("PgErrorPage");
> }
> } //if active transaction
> else
> {//no active transaction. load same page...though really do
> nothing! return
> (SKIP)?
>
> //load the same page
> command = load("PgBudgetLevel");
>
> }
>
> } //end of the try-catch-finally
>
> return(command);
>
> }
> //]]SPIDER_EVENT<BtnSave_onWebEvent>
>
> //]]SPIDER_EVENTS END
> }
> ============================================
> THX!
> Janet
>
>
> ________________________________________________________________________
> _
>
> For help in using, subscribing, and unsubscribing to the discussion
> forums, please go to:
> http://www.netdynamics.com/support/visitdevfor.html
>
> For dire need help, email: [EMAIL PROTECTED]
>
>
> _________________________________________________________________________
>
> For help in using, subscribing, and unsubscribing to the discussion
> forums, please go to: http://www.netdynamics.com/support/visitdevfor.html
>
> For dire need help, email: [EMAIL PROTECTED]
_________________________________________________________________________
For help in using, subscribing, and unsubscribing to the discussion
forums, please go to: http://www.netdynamics.com/support/visitdevfor.html
For dire need help, email: [EMAIL PROTECTED]