| Author |
Topic |
|
tommyboy
Starting Member
4 Posts |
Posted - 2007-04-19 : 11:12:14
|
| Hi there, could someone tell me what is the wrong with the below SP's CURSOR.I exec this sp through a table when update a filed value like this :EXECUTE THROUGH TRIGGERexec SP_ALOCATE_PAT_CREDIT @patid, @creditno, @totalamount, @userid, @sdesc ,@creDate,'C'When i run execute this sp, I got this error :ERROR:Another user has modified the contents of this table or view;the database row you are modifying no longer exists in the database.Databse error: '[Microsoft][ODBC SQL Server Driver][SQL Server]A cursor with the name 'INVOICE_LIST' does not exist.[Microsoft][ODBC SQL Server driver][SQL Server]The statement has terminated.'--===========STORED PROCEDURE=================CREATE PROCEDURE SP_ALOCATE_PAT_CREDIT (@patid as varchar(25),@recno as varchar(25), @recamt as float, @userid as varchar(25), @sdesc as varchar(60), @recDate as datetime, @ledTxnType as char)ASdeclare --@postingmode char(1), @count integer,@Extracount integer, @Depcount integer, @invoiceno varchar(25), -- @refundno varchar(25), @totalamount float, @amountreceived float, @send_led_date datetime, --@sdesc varchar(60), --@userid varchar(25), @islno integer, @highSNO integer, @led_txn_no integer, @ledtype char(1), @billstatus char(1), --@refundamt float, @invamtRec float, @invDepRef float,@extraAllocated float,@extraBalance float,@bstatus as char,@invoiceFlag as char,@ledCnt as integer,@turn as integer,@ledE as float,@Fsdesc as varchar(20) select @ledCnt=count(*) from CLN_PATIENT_LEDGER where TXN_NO=@recno if @ledTxnType='C' set @Fsdesc='Fully Credited Against ' else set @Fsdesc='Fully Receipted Against ' if @ledCnt=0BeGiNset @turn=0 select @Extracount=count(*) from CLN_EXTRA_AMT where TXN_NO=@recno if @Extracount=0 INSERT INTO CLN_EXTRA_AMT (TXN_NO,TOTAL_AMT,ALLOCATED_AMT,STATUS,BALANCE,PATIENT_ID,LED_TYPE) VALUES(@recno,@recamt,0,'O',0,@patid,'E') DECLARE INVOICE_LIST CURSOR GLOBAL SCROLL FOR SELECT INVOICE_NO,TOTAL_AMT,AMT_RECEIVED,BILL_STATUS,POST_FLAG FROM CLN_INVOICE_NOTE WHERE BILL_STATUS='O' and TXN_TYPE <>'S' and PATIENT_ID = @patid AND POST_FLAG='Y' ORDER BY BILL_DATE OPEN INVOICE_LIST FETCH FROM INVOICE_LIST INTO @invoiceno,@totalamount,@amountreceived,@bstatus,@invoiceFlag WHILE (@@FETCH_STATUS<>0) BEGIN if @recamt<>0 Begin if (@recamt = @totalamount) --and (@bstatus<>'C') and (@invoiceFlag='Y') begin update CLN_INVOICE_NOTE set AMT_RECEIVED=AMT_RECEIVED+@recamt where INVOICE_NO=@invoiceno --begin select @islno=isnull(MAX(CLN_PAT_LED_ID),0)+1 from CLN_PATIENT_LEDGER where PATIENT_ID=@patid -- set @send_led_date = convert(datetime, convert(varchar(10) , getdate(),103),103) insert into CLN_PATIENT_LEDGER(PATIENT_ID, CLN_PAT_LED_ID, TXN_NO, LED_DATE, DEBIT_AMT, CREDIT_AMT , PAT_LED_DESC, ENTRY_BY, LED_TYPE) VALUES(@patid, @islno, @recno, @recDate,0, @recamt, @Fsdesc + @invoiceno + ' - ' + @sdesc , @userid,@ledTxnType ) --end set @recamt = 0 end ELSE if (@recamt < @totalamount) --and (@bstatus<>'C') and (@invoiceFlag='Y') begin update CLN_INVOICE_NOTE set AMT_RECEIVED=AMT_RECEIVED+@recamt where INVOICE_NO=@invoiceno --begin select @islno=isnull(MAX(CLN_PAT_LED_ID),0)+1 from CLN_PATIENT_LEDGER where PATIENT_ID=@patid --set @send_led_date = convert(datetime, convert(varchar(10) , getdate(),103),103) insert into CLN_PATIENT_LEDGER(PATIENT_ID, CLN_PAT_LED_ID, TXN_NO, LED_DATE, DEBIT_AMT, CREDIT_AMT , PAT_LED_DESC, ENTRY_BY, LED_TYPE) VALUES(@patid, @islno, @recno, @recDate,0, @recamt, @Fsdesc + @invoiceno + ' - '+ @sdesc , @userid,@ledTxnType ) --end set @recamt = 0 end else if (@recamt > @totalamount) --and (@totalamount>0) and (@bstatus<>'C') and (@invoiceFlag='Y') begin select @invamtRec=(TOTAL_AMT-AMT_RECEIVED) from CLN_INVOICE_NOTE where INVOICE_NO=@invoiceno update CLN_INVOICE_NOTE set AMT_RECEIVED=AMT_RECEIVED+@invamtRec where INVOICE_NO=@invoiceno select @islno=isnull(MAX(CLN_PAT_LED_ID),0)+1 from CLN_PATIENT_LEDGER where PATIENT_ID=@patid -- set @send_led_date = convert(datetime, convert(varchar(10) , getdate(),103),103) insert into CLN_PATIENT_LEDGER(PATIENT_ID, CLN_PAT_LED_ID, TXN_NO, LED_DATE, DEBIT_AMT, CREDIT_AMT , PAT_LED_DESC, ENTRY_BY, LED_TYPE) VALUES(@patid, @islno, @recno, @recDate, 0,@invamtRec, @Fsdesc + @invoiceno + ' - ' +@sdesc , @userid,@ledTxnType) set @recamt = @recamt- @invamtRec end --else if (@recamt > 0) --and (@bstatus='C') and (@invoiceFlag='Y') else if @recamt=0 select @extraAllocated=ALLOCATED_AMT,@extraBalance=BALANCE from CLN_EXTRA_AMT where TXN_NO=@recno if @extraAllocated=0 and @extraBalance=0 begin update CLN_EXTRA_AMT set ALLOCATED_AMT=TOTAL_AMT,BALANCE=0 where TXN_NO=@recno --set @recamt = 0 end End if (@recamt > 0) begin set @turn=@turn+1 update CLN_EXTRA_AMT set ALLOCATED_AMT=TOTAL_AMT-@recamt,BALANCE=@recamt where TXN_NO=@recno select @turn=count(*) from CLN_PATIENT_LEDGER where TXN_NO=@recno and LED_TYPE='E' if @turn=0 begin select @islno=isnull(MAX(CLN_PAT_LED_ID),0)+1 from CLN_PATIENT_LEDGER where PATIENT_ID=@patid insert into CLN_PATIENT_LEDGER(PATIENT_ID, CLN_PAT_LED_ID, TXN_NO, LED_DATE, DEBIT_AMT, CREDIT_AMT , PAT_LED_DESC, ENTRY_BY, LED_TYPE) VALUES(@patid, @islno, @recno, @recDate, 0,@recamt, 'Extra Amount Received ' + ' - ' +@sdesc , @userid,'E' ) end else BEGIN select @ledE=BALANCE from CLN_EXTRA_AMT where TXN_NO=@recno update CLN_PATIENT_LEDGER set CREDIT_AMT=@ledE where TXN_NO=@recno and LED_TYPE='E' -- set @recamt = 0@recDate END end FETCH INVOICE_LIST INTO @invoiceno,@totalamount,@amountreceived,@bstatus,@invoiceFlag ENDEnD --CLOSE INVOICE_LIST --PRINT 'All user-defined tables have been dropped from the database.' DEALLOCATE INVOICE_LISTGO--=====================END OF SP============= |
|
|
sshelper
Posting Yak Master
216 Posts |
Posted - 2007-04-19 : 11:18:48
|
| Since you are modifying the table used by your cursor, try making your cursor STATIC as follows:DECLARE INVOICE_LIST CURSOR GLOBAL SCROLL STATIC FOR SELECT INVOICE_NO,TOTAL_AMT,AMT_RECEIVED,BILL_STATUS,POST_FLAG FROM CLN_INVOICE_NOTE WHERE BILL_STATUS='O' and TXN_TYPE <>'S' and PATIENT_ID = @patid AND POST_FLAG='Y' ORDER BY BILL_DATESQL Server Helperhttp://www.sql-server-helper.com |
 |
|
|
tommyboy
Starting Member
4 Posts |
Posted - 2007-04-19 : 11:30:04
|
quote: Originally posted by sshelper Since you are modifying the table used by your cursor, try making your cursor STATIC as follows:DECLARE INVOICE_LIST CURSOR GLOBAL SCROLL STATIC FOR SELECT INVOICE_NO,TOTAL_AMT,AMT_RECEIVED,BILL_STATUS,POST_FLAG FROM CLN_INVOICE_NOTE WHERE BILL_STATUS='O' and TXN_TYPE <>'S' and PATIENT_ID = @patid AND POST_FLAG='Y' ORDER BY BILL_DATE========================================Hi ,Thanx sshelper for your suggestion but i tried that too and still had problem :( SQL Server Helperhttp://www.sql-server-helper.com
|
 |
|
|
sshelper
Posting Yak Master
216 Posts |
Posted - 2007-04-19 : 11:41:43
|
| How about adding the READ_ONLY option to it and see if it works. Also, do you really need it to be GLOBAL? Try making it LOCAL and see if it makes a difference.SQL Server Helperhttp://www.sql-server-helper.com |
 |
|
|
|
|
|