Roger
oCon=CreateObject("ADODB.Connection")
oCon.Open("Provider=SQLOLEDB.1;"+;
"Integrated Security=SSPI;"+;
"Persist Security Info=False;" +;
"Initial Catalog= mydata;"+;
"Data Source=(local)")
Local oCA As CursorAdapter
oCA=CreateObject("CursorAdapter")
oCA.DataSourceType="ADO"
* Para obtener Tablas o Vistas
oRst = oCon.Execute("Select * From mytabla")
* Para obtener Procedimientos Almacenados
oRst = oCon.Execute("exec myproc")
* Para Ejecutar Funciones
oRst = oCon.Execute("Select dbo.myfunc(20) as campo")
* Para llenar Cursor Adapter de cualquiera de los anteriores
oCA.CursorFill(,,,oRst)
BROWSE
un saludo
Susan Salas
Jose escribió:
Roger
Roger
**
* Programa : ADOAdapter2
* Author : Roger Rodríguez, El Salvador. roger...@yahoo.com
* Fecha : 1 de julio de 2005, última actualización
*
* Objetivo : Ejemplo básico para uso de ADO y CursorAdapter
desconectados ( Parte II )
*
* Uso : Cambiar a necesidad en la variable strCnn el Provider y el
DataSource, o el Initial Catalog, incluso para SQL, ACCESS u Otros
* Cambiar la Variable sqlcmd con el comando de consulta para sus
datos
* Cambiar la variable wCalias con el nombre que desee
* Listo, virtualmente podrá conectarse y actualizar desde muchos
órigenes de datos
*
* Recomendación : accesar primero datos de prueba, pues las
actualizaciones, adiciones y modificaciones las hará reales
**
Public cnn1 As ADODB.Connection
Public rsttabla As ADODB.Recordset
Public loCursorAdapter AS CursorAdapter
wNactualizar = 0
* Preparar Conexón, Comando y Alias
strCnn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=sdime;Data Source=(local)"
*strCnn = "Provider=VFPOLEDB.1;Data
Source=D:\datos.dbc;Password='';Collating Sequence=MACHINE"
*strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=D:\ACCESS\datos.mdb;Persist Security Info=False"
sqlcmd = "select * from Clientes"
wCalias= "Clientes"
wCdata = "ADO"
IF Cargar()
** Modificar Información en este caso con BROWSE, pero puede
adaptarse a un form ya que despues de cargar queda como cursor nativo
VFP
BROWSE
IF !Guardar()
MESSAGEBOX("* No fue Posible Guardar Información *",0+48,"Mensaje")
ENDIF
=Cerrar()
ENDIF
CLOSE DATABASES all
RETURN
FUNCTION Cargar
** Cargar Información
wLreturn = .F.
Try
=CargarRS()
=CargarCursor()
wLreturn = .T.
CATCH TO werr
MESSAGEBOX(werr.message,0+48,"Error")
ENDTRY
RETURN wLreturn
ENDFUNC
FUNCTION Guardar
** Guardar Información
wLreturn = .F.
TRY
=ActualizarRS()
=ActualizarOrigen()
wLreturn = .T.
CATCH TO werr
MESSAGEBOX(werr.message,0+48,"Error")
ENDTRY
RETURN wLreturn
ENDFUNC
PROCEDURE Conectar
** Abrir Conexión
cnn1 = NewObject('ADODB.Connection')
cnn1.Open(strCnn)
ENDPROC
PROCEDURE Desconectar
** Desconectar
cnn1 = null
rsttabla.ActiveConnection = null
ENDPROC
PROCEDURE Cerrar
** Cerrar
rsttabla.Close
loCursorAdapter = null
ENDPROC
PROCEDURE CargarRS
=Conectar()
** Abrir Tabla
rsttabla = NewObject('ADODB.Recordset')
rsttabla.CursorLocation = 3
rsttabla.CursorType = 2
rsttabla.LockType = 4
rsttabla.Open(sqlcmd,cnn1)
=Desconectar()
ENDPROC
PROCEDURE CargarCursor
** Pasar el RS a CursorAdapter
loCursorAdapter = NewObject("CursorAdapter")
loCursorAdapter.Alias = wCalias
loCursorAdapter.DataSourceType = wCdata
loCursorAdapter.CursorFill(,,,rsttabla)
ENDPROC
PROCEDURE ActualizarRS
** Actualizar RS a partir del CursorAdapter
wNactualizar = 0
IF rsttabla.RecordCount > 0
rsttabla.MoveFirst
ENDIF
SET DELETED OFF
SCAN
wNnuevo = 0
IF rsttabla.EOF
wNactualizar = 1
wNnuevo = 1
rsttabla.AddNew
ENDIF
FOR wNcampos=1 TO FCOUNT()-1
IF ((TYPE(FIELD(wNcampos)) = 'M' AND
ISNULL(EVALUATE(FIELD(wNcampos)))) ;
OR ((TYPE(FIELD(wNcampos)) = 'D' OR TYPE(FIELD(wNcampos)) = 'T') AND
EMPTY(EVALUATE(FIELD(wNcampos)))) ;
OR ((TYPE(FIELD(wNcampos)) = 'N' OR TYPE(FIELD(wNcampos)) = 'I') AND
EMPTY(EVALUATE(FIELD(wNcampos))))) ;
AND wNnuevo = 1
LOOP
ENDIF
IF rsttabla.fields(wNcampos-1).Value != EVALUATE(FIELD(wNcampos)) OR
wNnuevo = 1
wNactualizar = 1
rsttabla.fields(wNcampos-1).Value = EVALUATE(FIELD(wNcampos))
ENDIF
ENDFOR
IF DELETED()
wNactualizar = 1
rsttabla.Delete
ENDIF
rsttabla.MoveNext
ENDSCAN
SET DELETED ON
ENDPROC
PROCEDURE ActualizarOrigen
** Actualizar Origen
IF wNactualizar = 1 && Si se Crearon Nuevas filas, Se Realizaron
Modificaciones o Se Eliminaron Registros
=Conectar()
rsttabla.Activeconnection = cnn1
** Actualizar DB Origen
WITH rsttabla
.MoveFirst
TRY
.ActiveConnection.BeginTrans
.UpdateBatch
.ActiveConnection.CommitTrans
CATCH TO werr
MESSAGEBOX(werr.message)
.ActiveConnection.RollBackTrans
.CancelBatch
ENDTRY
ENDWITH
=Desconectar()
ENDIF
ENDPROC
Gracias de nuevo
un saludo
Susan Salas
rogerrod61 escribió:
- Esquema Monolítico
- Interfaz de usuario, lógica o reglas de negocio, acceso a datos y
datos, todo en la misma máquina(o datos en otra máquina pero
accesada desde el programa en una unidad lógica de la misma máquina).
- Cliente servidor
- Interfaz de usuario, lógica o reglas de negocio y acceso a datos
en la máquina cliente
- Datos en la máquina servidor
aquí el cambio es en la forma de acceso de los datos, sino aunque los
datos estén en otra máquina, sigue siendo monolítico
- 3 capas
- Interfaz de usuario en la máquina cliente
- lógica o reglas del negocio y acceso a datos en uno o más
servidores
- Datos en uno o más servidores
- N capas
- Interfaz de usuario en la máquina cliente
- lógica o reglas del negocio en uno o más servidores
- acceso a datos en uno o más servidores
- Datos en uno o más servidores(bdc,sql,access,mysql,oracle, etc)
Como verás el mismo modelo nos lleva a trabajar desconectados de los
datos, pues la capa de acceso a datos se encarga de resolver que tipo
de base de datos utilizará el sistema y así la capa de interfaz de
usuario nunca se da cuenta con cual base de datos esta trabajando, pues
ella solo hace la peticion, exactameante por tu duda, para cualquier
adicion, actualización o consulta, la capa de reglas de negocio se
encarga de solventar que hará y le solicita los datos a la capa de
acceso y ésta a su vez obtiene los el resultado de la consulta que le
regresa a la capa de reglas y esta a su vez a la interfaz. sin embargo
en VFP por medio de cursoradapter, puedes trabajar en forma conectada
de hecho es la forma normal que el utiliza, pero para poder trabajar
mejor en capas, mi experiencia ha sido trabajar desconectado. En el
ejemplo anterior, se llega a trabajar desconectado por medio de ADO y
CursorAdapter, pero no trabaja en capas, sin embargo es el precursor
para un trabajo por capas, ya que solo pasarías los procedmientos de
reglas de negocio y acceso a datos a una dll para utilizarlos en COM+ e
implementarías el modelo de trabajo por capas.
Siento que www.foxynet.net ya no esté funcionando, pues el artículo
de la primera parte mostraba parte al respecto de las capas, descuidado
que extravié la cópia que tenía, como te comenté el ejemplo es una
sección de la segunda parte que escribiría y tengo listo el código
de la tercera que que es propiamente el trabajo en capas y como
elaborar las capas por medio de dll's.
Bueno, espero haber colaborado un poco con tu duda, saludos,
Roger
saludos y exitos
Eyrj
rogerrod61 escribió: