Sí gracias!!! todo suma. Hasta el momento estoy viendo y haciendo algunas pruebas. Con CA tadavia no logro hacer lo que quiero, con TA todavia me falta leer un poco mas y madurarlo. Si hay otras alternativas, bienvenido sea.
saldudos -----Original Message----- From: "Alejandro Paciotti Iacchelli" <alejandro.pacio...@gmail.com> To: "GUFA List Member" <GUFA@mug.org.ar> Date: Thu, 26 Jul 2012 10:22:10 -0300 Subject: [GUFA] CursorAdapter > Nunca he utilizado un framework de tercero, quizá esto haya > perjudicado mis > tiempos de desarrollo, algo que no podré evaluar nunca (que hubiera > pasado > si). > > Lo que sí puedo afirmar es que los sistemas que realizo los hago todos > contra SQL SERVER definiendo CLASES que acceden a los datos y > actualizan y > borran sin necesidad de ningún framework. > > Pablo Oviedo, tu pregunta original era: > > "Hola, necesito hacer una aplicación vfox 9 + sqlserver. > > Pensé usar cursoradapter. No se como hacer un abm maestro-detalle > usando > cursor adapter, sí pude armar un abm para tablas simples usando > cursorAdapter builder. > > Me puede dar algun ejemplo o algun link para ver? > > Como seria el manejo de transacciones con CA? > > saludos, muchas gracias." > > Seguís necesitando un ejemplo, algo podría pasarte. > > Saludos. > > -----Mensaje original----- > De: GUFA@mug.org.ar [mailto:GUFA@mug.org.ar] En nombre de pablo.oviedo > Enviado el: miércoles, 25 de julio de 2012 07:50 p.m. > Para: GUFA List Member > Asunto: [GUFA] CursorAdapter > > Gracias, empece con cursoradapter y me trabe. Se pueden usar un > cursoadapter > que incluya columnas de distintas tablas? me tira error cuando quiero > refrescar algunos campos del cursor luego de una inserción. > > También estoy viendo TierAdapter. Los link que me pasaron, es posible > que > esta información este en español? > > Existe alguna documentación sobre TierAdapter que describa todas las > clases, > metodos y propiedades del frameworks a parte del diagrama de UML que > esta en > el sitio de Martin? > > saludos > > > -----Original Message----- > From: Rafael Copquin <rcopq...@fibertel.com.ar> > To: "GUFA List Member" <GUFA@mug.org.ar> > Date: Tue, 24 Jul 2012 16:32:07 -0300 > Subject: [GUFA] CursorAdapter > > > Te paso un ejemplo bien completo de cómo lo hago yo: > > > > ** creacion de las tablas en sqlserver > > ** en la vida real tienen más campos, pero estos son los mínimos > que > > deberían tener > > > > CREATE TABLE [dbo].[DETALLE]( > > [FECHA] [date] NOT NULL, > > [TIPODOC] [char](3) NOT NULL, > > [DOCNUM] [char](8) NOT NULL, > > [CODIGO] [char](30) NOT NULL, > > [CANTIDAD] [int] NOT NULL, > > [PRECIO] [numeric](10, 4) NOT NULL, > > [DT] [datetime] NOT NULL, > > [IDETALLE] [int] IDENTITY(1,1) NOT NULL, > > [IDCABECERA] [int] NOT NULL, > > CONSTRAINT [PK_DETALLE] PRIMARY KEY CLUSTERED ( > > [IDDETALLE] ASC > > )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, > IGNORE_DUP_KEY > > = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], > > CONSTRAINT [CN_IDDETALLE] UNIQUE NONCLUSTERED ( > > [IDDETALLE] ASC > > )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, > IGNORE_DUP_KEY > > = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] > > ) ON [PRIMARY] > > > > CREATE TABLE [dbo].[CABECERA]( > > [FECHA] [date] NOT NULL, > > [CUENTA] [char](4) NOT NULL, > > [TIPODOC] [char](3) NOT NULL, > > [DOCNUM] [char](8) NOT NULL, > > [IVA] [numeric](10, 2) NOT NULL, > > [TOTAL] [numeric](10, 2) NOT NULL, > > [IDCABECERA] [int] IDENTITY(1,1) NOT NULL, > > [DT] [datetime] NOT NULL, > > CONSTRAINT [PK_IDCABECERA] PRIMARY KEY CLUSTERED ( > > [IDCABECERA] ASC > > )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, > IGNORE_DUP_KEY > > = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] > > ) ON [PRIMARY] > > > > > > ** lo siguiente se hace en Visual FoxPro > > > > ** generación de un cursor adapter para la tabla CABECERA > > > > Local cCmd,cSch,cUFL,cUNL,lOK > > > > Text to cCmd noshow pretext 15 > > SELECT > > FECHA , > > CUENTA , > > TIPODOC , > > DOCNUM , > > IVA , > > TOTAL , > > IDCABECERA , > > DT > > FROM CABECERA WHERE 1=0 > > EndText > > > > Text to cSch noshow pretext 15 > > FECHA D, > > CUENTA C(4), > > TIPODOC C(3), > > DOCNUM C(8), > > IVA N(10,2), > > TOTAL N(10,2), > > IDCABECERA I, > > DT T > > EndText > > > > > > Text to cUFL noshow pretext 15 > > FECHA , > > CUENTA , > > TIPODOC , > > DOCNUM , > > IVA , > > TOTAL , > > IDCABECERA , > > DT > > EndText > > > > Text to cUNL noshow pretext 15 > > FECHA CABECERA.FECHA, > > CUENTA CABECERA.CUENTA, > > TIPODOC CABECERA.TIPODOC, > > DOCNUM CABECERA.DOCNUM, > > IVA CABECERA.IVA, > > TOTAL CABECERA.TOTAL, > > IDCABECERA CABECERA.IDCABECERA, > > DT CABECERA.DT > > EndText > > > > cUFL = Chrtran( cUFL, Chr(13) + Chr(10), " " ) > > cUNL = Chrtran( cUNL, Chr(13) + Chr(10), " " ) > > cSch = Chrtran( cSch, Chr(13) + Chr(10), " " ) > > cCmd = Chrtran( cCmd, Chr(13) + Chr(10), " " ) > > > > Use in Select("") > > > > lOK = .t. > > > > If !PemStatus(thisform,'oCA',5) > > thisform.AddProperty('oCA') > > EndIf > > > > Try > > > > Thisform.oCA = Createobject("CursorAdapter") > > > > lOK = .t. > > > > Catch to oErrores > > > > MessageBox("No se pudo generar el objeto CursorAdapter"+; > > Chr(13)+oErrores.message,16,"Atención",2000) > > > > lOK = .f. > > > > Finally > > EndTry > > > > > > If lOK = .t. > > try > > With thisform.oCA > > .DataSourceType = "ODBC" > > .DataSource = thisform.nHandle > > .alias = "curCabecera" > > .tables = "cabecera" > > .BufferModeOverride = 5 > > .keyfieldlist = "idcabecera" > > .sendupdates = .T. > > .usetransactions = .f. && si están en falso, no > usa > > transacciones y funciona entonces ponerlas en manual en SQL Server > > .selectcmd = cCmd > > .updatablefieldlist = cUFL > > .updatenamelist = cUNL > > .cursorschema = cSch > > .cursorfill() > > EndWith > > > > Select curCabecera > > > > Catch to oErrores > > > > MessageBox("No se pudo generar el Cursor > > "+Chr(13)+oErrores.message; > > ,16,"Atención",2000) > > > > lOK = .f. > > > > endtry > > endif > > > > Return lOK > > > > **(hacer otro cursor adapter para la tabla DETALLE y obtener el > cursor > > curDetalle) > > > > ** la sentencia where 1=0 genera un cursor vacío. Esto es para que > > llenes el cursor adapter con los datos necesarios antes de > > ** grabar. Estos datos salen de textboxes, grillas, cálculos, etc. > > > > ** rutina de grabación > > > > Local lOK,nPK,cCmd,nResults,lBatchMode > > > > SQLExec(thisform.nHandle,'BEGIN TRANSACTION') > > SQLSetProp(thisform.nHandle, "TRANSACTIONS", 2 ) && pone las > > transacciones en manuales > > > > Select curCabecera > > Scatter name oCab blank fields except idcabecera With oCab > > .fecha = Date() > > .cuenta = '1234' > > .tipodoc = 'FRA' > > .docnum = '12345678' > > .iva = 210.00 > > .total = 1210.00 > > .dt = Datetime() > > EndWith > > > > ** grabación de la cabecera y obtención de la clave primaria > generada > > ** el campo idcabecera es autoincremental > > > > Insert into curCabecera from name oCab > > > > lOK = TableUpdate(.t.,.t.,'curCabecera') > > > > If lOK = .t. > > > > nPK = 0 > > nResults = 0 > > cCmd = [select @@IDENTITY as pk ] > > > > lBatchMode = SQLGetProp(thisform.nHandle,"BatchMode" ) > > > > SQLSetProp(thisform.nHandle,"BatchMode" ,.f.) > > > > SQLExec(thisform.nHandle,cCmd,'curPK') > > > > Do while nResults <> 2 > > nResults = SQLMoreResults(thisform.nHandle) > > enddo > > > > SQLSetProp(thisform.nHandle,"BatchMode" ,lBatchMode) > > > > nPK = curPK.pk > > Use in Select('curPK') > > > > Select curFactura && cursor auxiliar usado en el form para > > insertar las lineas de detalle de la factura > > && tiene la misma estructura > > que la tabla detalle del sql server > > > > Scan all > > Scatter name oDet fields except iddetalle > > With oDet > > .fecha = Date() > > .tipodoc = 'FRA' > > .docnum = '12345678' > > .idcabecera = nPK && aqui pasa a ser la clave > > foránea > > .dt = Datetime() > > *** los campos codigo, cantidad y precio ya están en el > > objeto, obtenidos con SCATTER NAME > > endwith > > Insert into curDetalle from name oDet > > EndScan > > lOK = TableUpdate(.t.,.t.,'curDetalle') > > > > endif > > > > If lOK = .t. > > > > SQLCommit(thisform.nHandle) > > > > Else > > > > SQLRollback(thisform.nHandle) > > > > endif > > > > SQLSetProp(thisform.nHandle,'Transactions',1 ) && transacciones > > automáticas > > > > A los cursor adapters les ponés la propiedad usetransactions en > falso, > > para que no maneje las transacciones directamente. Acordate que en > SQL > > Server, las transacciones son automáticas a menos que las pongas en > > manual. Esto hace que cada vez que insertás,borrás o modificás un > > registro, se abra y cierre una transacción automáticamente. No te > > sirve para el caso de una factura, porque si te da error alguna de > las > > tablas, no podés cancelar una transacción completa. En cambio, si > las > > transacciones las ponés en manual, solamente se completa la > > transacción cuando le mandás un SQLCommit (o SQLRollback si falla) > > Tenés que poner las transacciones del SQLServer en manual antes de > > comenzar a grabar y luego de cerrar la transacción las ponés > > nuevamente en automáticas,para que el SQL Server siga funcionando > > normalmente > > > > Fijate en estos artículos > > > > http://www.universalthread.com/ViewPageArticle.aspx?ID=667 > > > > http://www.universalthread.com/ViewPageArticle.aspx?ID=817 > > > > Rafael Copquin > > > >