Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Sobre COM+, WIN 2000 y Transacciones
Message
De
14/08/2003 18:40:21
 
 
À
14/08/2003 14:33:49
Information générale
Forum:
Visual FoxPro
Catégorie:
COM/DCOM et OLE Automation
Divers
Thread ID:
00820277
Message ID:
00820361
Vues:
20
Hola Mario

Te adjunto este código que utilizo para actualizar vistas remotas de SQLServer utilizando transacciones, lo importante es que este código me sirve tanto para arquitectura cliente servidor como para multiples capas, y además con multiples conecciones, es decir puedo tener vistas ya sea de dos o más conecciones en un mismo DBC, así como muchos DBCs con muchas conecciones, el único requisito es tener ajustado el parametro de comparttir de cada vista como (share = .T.).


Actualiza Transacción (Cliente Servidor)

TRY
m.llRetorno=.F.

***********/cursor que almacena las conecciones /******************
CREATE CURSOR c_conecciones (DATABASE c(100), coneccion c(100), handle N(4),ODBCH N(10), SOURCETYPE N(2))
=CURSORSETPROP("Buffering", 3, "c_conecciones")
FOR i= 1 TO 100
x="THISFORM.DATAENVIRONMENT.cursor"+ALLT(STR(i))
Y="THISFORM.DATAENVIRONMENT.cursor"+ALLT(STR(i)+".BufferModeOverride"
z=x+".alias"
IF TYPE("&x")="O"
m.lcTable=&z
SELEC &lcTable
m.lnSourceType=CURSORGETPROP('SourceType',lcTable)
IF m.lnSourceType=2 OR m.lnSourceType=4
m.lcDataBase=CURSORGETPROP('Database',lcTable)
m.lcConeccion=CURSORGETPROP('ConnectName',lcTable)
m.lnHandle=CURSORGETPROP('ConnectHandle',lcTable)
m.lnODBCH=SQLGETPROP(m.lnHandle,"ODBChdbc")
SELECT c_conecciones
IF ALLTRIM(m.lcConeccion) <> ALLTRIM(c_conecciones.coneccion)
APPEND BLANK
REPLACE c_conecciones.DATABASE WITH ALLTRIM(m.lcDataBase)
REPLACE c_conecciones.coneccion WITH ALLTRIM(m.lcConeccion)
REPLACE c_conecciones.handle WITH m.lnHandle
REPLACE c_conecciones.ODBCH WITH m.lnODBCH
REPLACE c_conecciones.SOURCETYPE WITH m.lnSourceType
ENDIF
ENDIF
ENDIF
ENDFOR
SELECT c_conecciones
******************************/ /******************
SCAN
SQLSETPROP(c_conecciones.handle, 'Transactions', 2)
IF THISFORM.Tipo_vista='SQL'
SQLExec(c_conecciones.handle, 'BEGIN TRANSACTION' )
ENDIF
ENDSCAN

******************************/ Actualizar tablas /*******************************
m.lcNombreTablas=''
m.lnModified=0
FOR i= 1 TO 100
x="THISFORM.DATAENVIRONMENT.cursor"+ALLT(STR(i))
Y="THISFORM.DATAENVIRONMENT.cursor"+ALLT(STR(i))+".BufferModeOverride"
z=x+".alias"
IF TYPE("&x")="O"
m.lcTable=&z
SELEC &lcTable
IF &Y=5
IF NOT TABLEUPDATE(1,.T.,m.lcTable)
= AERROR(aErrorArray)
IF aErrorArray[1]=1526
THROW aErrorArray[3]+"(1) El error se originó actualizando: "+m.lcTable
ELSE
THROW aErrorArray[2]+"(1) El error se originó actualizando: "+m.lcTable
ENDIF
ENDIF
ENDIF
ENDIF
SELECT &lcTable
ENDFOR


SELECT c_conecciones
SCAN
IF THISFORM.Tipo_vista='SQL'
m.lnCommit=SQLExec( c_conecciones.handle, 'IF @@TRANCOUNT > 0 COMMIT' )
ELSE
m.lnCommit=SQLCOMMIT(c_conecciones.handle)
ENDIF
IF m.lnCommit=-1
THROW "Transacción no se pudo actualizar"
ENDIF
ENDSCAN

m.llRetorno = .T.


CATCH TO loException
SELECT c_conecciones
SCAN
IF THISFORM.Tipo_vista='SQL'
=SQLExec( c_conecciones.handle, 'IF @@TRANCOUNT > 0 ROLLBACK' )
ELSE
=SQLROLLBACK(c_conecciones.handle)
ENDIF
ENDSCAN
MESSAGEBOX(Exception_Error(loException),0+16,THISFORM.CAPTION)
m.llRetorno = .F.

FINALLY
SELECT c_conecciones
SCAN
=SQLSETPROP(c_conecciones.handle, 'Transactions', 1)
ENDSCAN
ENDTRY

RETURN m.llRetorno

Este otro código es parecido, pero lo utilizo en las capas intermedias de los COM+ tanto para Webservices, como para COM+ puro.

Recibo los datos de la capa superior en una variable lcXML y cuando tengo las vistas remotas con los datos que necesito, inico la transacción.

PROCEDURE create_solid_box (lcXML AS STRING ) AS STRING

LOCAL m.lcXMLRecive,m.lcUnico
lcMessage=' '
m.lcXMLRecive=lcXML
m.lcUnico=' '
TRY

XMLTOCURSOR(lcXMLRecive,"c_box_product",0)
SELECT c_box_product
DO CASE
CASE EMPTY(NVL(box_qty,' '))
THROW 'Cantidad no puede ser 0 '
CASE EMPTY(NVL(box_uq,' '))
THROW 'Tiene que escoger un tipo de caja '
CASE EMPTY(NVL(packing_uq,' '))
THROW 'Tiene que escoger un packing '
CASE EMPTY(NVL(pro_qty,' '))
THROW 'Cantidad no puede ser 0 '
CASE EMPTY(NVL(product_uq,' '))
THROW 'Tiene que escoger un producto '
CASE EMPTY(NVL(pk_box_uq,' '))
THROW 'Tiene que escoger una caja '
ENDCASE

SELECT packing_uq,unico,box_uq,box_qty AS qty ;
FROM c_box_product ;
INTO CURSOR c_box

SELECT packing_uq,pk_box_uq,unico,product_uq,;
pro_qty AS qty, INT(pro_qty / box_qty) u_x_box ;
FROM c_box_product ;
INTO CURSOR c_product

SELECT 0
USE vr_packings_boxes
=CURSORSETPROP("Buffering", 5, "vr_packings_boxes")
APPEND FROM DBF('c_box')
REPLACE vr_packings_boxes.boxdate WITH DATETIME()
REPLACE vr_packings_boxes.TIMESTAMP WITH DATETIME()

SELECT 0
USE vr_packings_boxes_products
=CURSORSETPROP("Buffering", 5, "vr_packings_boxes_products")
APPEND FROM DBF('c_product')
REPLACE vr_packings_boxes_products.TIMESTAMP WITH DATETIME()

BEGIN TRANSACTION
m.lnHandle=SQLCONNECT('coneccion_vr_flower',.T.)
m.lnODBCH=SQLGETPROP(m.lnHandle,"ODBChdbc")
SQLSETPROP(m.lnHandle, 'Transactions', 2)
SQLExec(m.lnHandle, 'BEGIN TRANSACTION' )
SELECT vr_packings_boxes
IF NOT TABLEUPDATE(.T.)
IF laError[1]=1526
THROW laError[3]
ELSE
THROW laError[2]
ENDIF
ENDIF

SELECT vr_packings_boxes_products
IF NOT TABLEUPDATE(.T.)
IF laError[1]=1526
THROW laError[3]
ELSE
THROW laError[2]
ENDIF
ENDIF
END TRANSACTION
m.lnCommit=SQLExec( m.lnHandle, 'IF @@TRANCOUNT > 0 COMMIT' )
IF m.lnCommit=-1
THROW "Transacción no se pudo actualizar"
ENDIF
lcMessage='Caja Solida ingresada correctamente'
CATCH TO loException
IF TXNLEVEL() > 0
ROLLBACK
ENDIF
=SQLExec( m.lnHandle, 'IF @@TRANCOUNT > 0 ROLLBACK' )
IF loException.ErrorNo=2071
lcMessage='Error:'+' '+loException.UserValue
ELSE
lcMessage='Error:'+' '+loException.MESSAGE
ENDIF
FINALLY
=SQLSETPROP(m.lnHandle, 'Transactions', 1)
USE IN SELECT ('vr_packings_boxes')
USE IN SELECT ('c_box')
USE IN SELECT ('vr_packings_boxes_products')
USE IN SELECT ('c_product')
ENDTRY

RETURN lcMessage
ENDPROC

Espero que esto te sirva tanto para cliente servidor como para cualquier capa intermedia.

Saludos

Carlos Miranda
Carlos A. Miranda
E.I.S.lnc
President
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform