Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ejecutar sp y capturar su valor en vfp

32 views
Skip to first unread message

Jose

unread,
Aug 16, 2006, 4:43:20 PM8/16/06
to
Estimados(as). Como ejecutar un sp de sql 2000 y capturar su valor en vfp?
Gracias de antemano


rogerrod61

unread,
Aug 17, 2006, 2:53:01 AM8/17/06
to
Hola Jose, espero te sirve el siguiente código, solo tienes que
sustituir los nombres de bases de datos, procedimientos, etc que tu
utilices, Saludos,

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

Jose

unread,
Aug 17, 2006, 9:13:48 AM8/17/06
to
Gracias
"rogerrod61" <roger...@gmail.com> escribió en el mensaje
news:1155797581.6...@b28g2000cwb.googlegroups.com...

Susan Salas

unread,
Aug 17, 2006, 2:34:53 PM8/17/06
to
Roger, es un muy buen ejemplo, me gustaria saber si tienes uno para
agregar, modificar y eliminar datos con cursoradapter, agradeceria mucho
tu ayuda, ya que empiezo a trabajar de esta forma....

un saludo

Susan Salas


Jose escribió:

rogerrod61

unread,
Aug 17, 2006, 11:28:13 PM8/17/06
to
Hola Susan, fíjate que sí escribí un pequeño artículo al respecto
llamado "Ejemplo básico de VFP para ADO y CursorAdapter Desconectados
para n-capas" en www.foxynet.net, pero desde hace algunos días no
está activo, no sé porque, pero buscaré a ver si tengo una copia,
con gusto la publicaré aqui, saludos,


Roger

rogerrod61

unread,
Aug 18, 2006, 12:37:50 AM8/18/06
to
Hola Susan, no encontré el artículo que te comenté, pero encontré
el código para la segunda parte que publicaría, quizá sea más
oportuno. Solamente tienes que cambiar el string de conexión, el
comando sql y el alias que desees, así virtualmente podrás accesar
virtualmente muchos orígenes de datos. Espero te sirva, saludos,

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

Susan Salas

unread,
Aug 18, 2006, 4:23:30 PM8/18/06
to
Roger !! muy buena ayuda,y lo pondre en practica, unicamente tengo
algunas dudas... no me queda muy claro lo de trabajar desconectados,
asumo que de la base de datos, mi pregunta es, si se trabaja en forma
desconectada, que pasa por ejemplo, con una facturacion en la que en
cada terminal se va generando el numero de factura, que pasa si estoy
ingresando articulos para la venta y tengo que validar que el articulo
tenga existencia ???

Gracias de nuevo

un saludo

Susan Salas

rogerrod61 escribió:

rogerrod61

unread,
Aug 21, 2006, 12:43:38 AM8/21/06
to
Hola Susan, como tu lo dices se trata de trabajar desconectado de la
bases de datos, eso trae muchas dudas en un principio, pues hemos
estado acostumbrados a trabajar con datos locales aunque esten en otra
máquina que equivocadamente le llamemos servidor, ya que los datos los
utilizamos como si estuviecen locales, lo cual trae muchos
inconvenientes, daños de indices, pérdidas de datos, para mencionar
algunos, por ello era necesario el cambio de modelo y se inicio la
filosofía de trabajo por capas, que evolucionó más o menos asi:

- 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

Susan Salas

unread,
Aug 22, 2006, 10:27:45 AM8/22/06
to
Roger !!!
claro que me has ayudado bastante, veo un poco complejo el trabajo de
esta forma, logicamente lo tengo que aprender a usar de alguna forma y
entonces ya lo vere mas facil, agradezco tu ayuda y espero que pronto
tengas listo el articulo numero tres.

saludos y exitos

Eyrj

rogerrod61 escribió:

0 new messages