Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Auto Refresh Key fields after insert with CA
Message
De
09/04/2006 22:46:08
 
 
À
02/03/2006 15:16:01
Information générale
Forum:
Visual FoxPro
Catégorie:
Client/serveur
Versions des environnements
Visual FoxPro:
VFP 9
OS:
Windows XP SP2
Network:
Windows XP
Database:
Visual FoxPro
Divers
Thread ID:
01100805
Message ID:
01111814
Vues:
52
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.
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform