Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Auto Refresh Key fields after insert with CA
Message
From
09/04/2006 22:46:08
 
 
To
02/03/2006 15:16:01
General information
Forum:
Visual FoxPro
Category:
Client/server
Environment versions
Visual FoxPro:
VFP 9
OS:
Windows XP SP2
Network:
Windows XP
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01100805
Message ID:
01111814
Views:
50
This message has been marked as the solution to the initial question of the thread.
>>Am I missing something?
>>
>
>Message #956056 and message #1007757.

Here is another way of retrieving IDENTITY value by using SCOPE_IDENTITY(), I believe it hasn't been posted on UT yet.
 **************************************      
    CLOSE DATABASES all      
    SQLDISCONNECT(0)      
    CLEAR      
    SET MULTILOCKS ON      
        
    LOCAL nAutoRefreshConn as Integer      
        
  * Change connection string to connect to any available SQL Server      
    nAutoRefreshConn=SQLSTRINGCONNECT("DRIVER=SQL Server;SERVER=(local);Trusted_Connection=Yes;")      
    IF (nAutoRefreshConn <1)      
     	? "Failed to connect!"      
       AERROR(aerrs)      
       DISPLAY MEMORY LIKE aerrs      
       return      
    ENDIF      
        
    TEXT TO cSQL NOSHOW      
       CREATE TABLE #CAAutoRefreshDemo      
       (      
        f_IDENTITY int NOT NULL IDENTITY PRIMARY KEY,      
        f1 int NOT NULL UNIQUE,      
        f_TIMESTAMP timestamp      
       )      
    ENDTEXT      
        
    IF SQLEXEC(nAutoRefreshConn ,cSQL)!=1      
       ? "Failed to create demo table!"      
       AERROR(aerrs)      
       DISPLAY MEMORY LIKE aerrs      
    ENDIF      
        
    LOCAL oCA as CursorAdapter    
        
    oCA=CREATEOBJECT("CA_SCOPE_IDENTITY")    
        
    oCA.Alias = "CATest"      
    oCA.BufferModeOverride= 5     
    oCA.DataSource= nAutoRefreshConn      
    oCA.DataSourceType="ODBC"      
    oCA.SelectCmd="select * from #CAAutoRefreshDemo"      
    oCA.CursorSchema="f_IDENTITY I, f1 I, f_TIMESTAMP Q(8)"        
    oCA.UseCursorSchema= .T.    
    oCA.Tables="#CAAutoRefreshDemo"      
    oCA.UpdatableFieldList="f1"      
    oCA.UpdateNameList="f1 #CAAutoRefreshDemo.f1, f_TIMESTAMP #CAAutoRefreshDemo.f_TIMESTAMP, f_IDENTITY #CAAutoRefreshDemo.f_IDENTITY"      
    oCA.KeyFieldList="f_IDENTITY"  
        
    oCA.CursorFill()    
        
    oCA.IDENTITY_Field="f_IDENTITY"    
    oCA.RefreshTimestamp= .F. && just for demo purposes will include f_TIMESTAMP into InsertCmdRefreshFieldList    
    oCA.InsertCmdRefreshFieldList="f_TIMESTAMP "    
        
    INSERT INTO CATest (f1) VALUES (100)    
    INSERT INTO CATest (f1) VALUES (200)    
    INSERT INTO CATest (f1) VALUES (300)    
    INSERT INTO CATest (f1) VALUES (400)    
    INSERT INTO CATest (f1) VALUES (500)    
    INSERT INTO CATest (f1) VALUES (600)    
    INSERT INTO CATest (f1) VALUES (700)    
    INSERT INTO CATest (f1) VALUES (800)    
    INSERT INTO CATest (f1) VALUES (900)    
        
    IF !TABLEUPDATE(.T.)    
     	? "TABLEUPDATE is failed!"      
       AERROR(aerrs)      
       DISPLAY MEMORY LIKE aerrs      
    ELSE    
    	LIST     
    ENDIF    
        
        
    TABLEREVERT(.T.)    
    SQLDISCONNECT(0)    
    RETURN     
    
    
    DEFINE CLASS CA_SCOPE_IDENTITY AS CursorAdapter    
      IDENTITY_Field=""  
        
     PROCEDURE DataSource_ASSIGN   
        LPARAMETERS tAssign    
        this.DataSource = tAssign      
        TRY  
        SQLEXEC(this.DataSource, ;  
        		"create procedure #Get_ValHelper @in Int, @out int OUTPUT " + ;  
        		"AS SET NOCOUNT ON " + ;  
        		"SELECT @out=@in")   
  	  CATCH  
  	  ENDTRY  
     ENDPROC  
        
    	PROCEDURE BeforeInsert     
    		LPARAMETERS cFldState, lForce, cInsertCmd    
    		IF LEN(ALLTRIM(this.IDENTITY_Field))>0  
    			cInsertCmd = cInsertCmd + ;  
    				"; DECLARE @id int; SELECT @id = SCOPE_IDENTITY()" + ;  
    				"; EXEC #Get_ValHelper @id, ?@" + ;  
    				this.Alias + "." + ALLTRIM(this.IDENTITY_Field)  
    		ENDIF  
    		?    
    		? PROGRAM()    
    		? "cInsertCmd=",cInsertCmd    
    	ENDPROC     
        
    ENDDEFINE    
  ******************************** 
Thanks,
Aleksey.
Previous
Reply
Map
View

Click here to load this message in the networking platform