Valeu Carlos!!
Obrigado,
Reginaldo
"Carlos Ortiz" <
cortizassist@hotmail.com> escreveu na mensagem
news:[email=4a295d23@svctag-j7w3v3j....]4a295d23@svctag-j7w3v3j....[/email]
Instalas postgres ( busca este archivo en la pagina de postgres ->
postgresql-8.1.3-1.zip)
Luego instalas el ODBC -> psqlodbc-08_01_0200.zip
Luego para administrar el motor podes usar -> pgadmin3-1.8.3.zip
Cuando instales el ODBC debes crear una conexion odbc nueva en tu pc para
que se conecte con el motor.
Luego en el programa principal de tu aplicacion debes conectarte al motor
con algo como esto:
.....
IF !ConectarAlMotor("app2dev","postgres","postgres")
msgstop("No se ha podido establecer la conexión con el motor")
Application:Terminate()
Quit
ENDIF
......
Te adjunto la funcion ConectarAlMotor
#include "Xailer.ch"
//---------------------------------------------------------- --------------------
FUNCTION ConectarAlMotor(cDsn, cUid, cPwd)
AppData:oOdbcDS:=TOdbcDataSource():New()
AppData:oOdbcDS:cConnect:="DSN="+cDsn+";PWD="+cPwd+";UID= "+cUid+";"
//AppData:oOdbcDS:cConnect:="DSN=app2dev;PWD=postgres;UID=postgres; "
AppData:oOdbcDS:lConnected:=.T.
RETURN AppData:oOdbcDS:lConnected
//---------------------------------------------------------- --------------------
En tu MAIN de la aplicación podes definir un par de DATAS para tenerlas
siempre disponibles
// Datas para la conexión ODBC
AppData:AddData("oOdbcDS")
AppData:AddData("oSQL")
Luego en los programas haces por ejemplo:
oDataSet:=AppData:oSql:QU( "select idsld_obrasocial, codigo, descripcion,
alta, ultimaactualizacion, baja, idestadoregistro from sld_planes where
idsld_plan = "+str(ID) )
Te adjunto mi clase Articulos de ejemplo, nosotros hemos adoptado por el
Modelo Vista Controlador, y ninguna pantalla de la aplicación accede
directamente a los datos, lo hace la clase desde su correspondiente metodo,
ademas redefinimos Query / Execute y demas para que este mas atomizado el
código y sea mas sencillo para nosotros, si necesitamos algo en especial en
la sentencia Query tocamos en un solo lado y listo.
Con esta forma de trabajo se ordenan mejor las cosas y podes realizar por
ejemplo un alta de algo desde donde se te ocurra y solo pedis los datos y
luego haces ::oArticulo:Agregar() y listo, ese metodo de la clase es el que
en un solo lugar da de alta un artículo.
Hay un artículo que comenta mejor esto en la pagina de chochurro.
Todas las propiedades de la tabla son manejadas como propiedades de la
clase, se pasan a variables de memoria en la pantalla y luego se pasan de
nuevo a las propiedades para que la clase realice la actualización.
#include "Xailer.ch"
//---------------------------------------------------------- --------------------
CLASS Articulos From TComponent
METHOD DevolverPorID( ID )
METHOD BuscarPorDescripcionAR( cNombre, aDatos, aCabeceras )
METHOD BuscarPorDescripcionDS( cNombre, oDataSet, cFiltro )
METHOD Actualizar()
METHOD Agregar()
METHOD Eliminar()
PROPERTY oMedicamento INIT NIL
PROPERTY IDArticulo INIT 0
PROPERTY Codigo INIT ""
PROPERTY Descripcion INIT ""
PROPERTY IDTipoArticulo INIT 0
PROPERTY Exento INIT "S"
PROPERTY alta INIT date()
PROPERTY baja INIT date()
PROPERTY idestadoregistro INIT 0
PROPERTY IDProveedor INIT 0
METHOD New( oParent )
ENDCLASS
//---------------------------------------------------------- --------------------
METHOD New( oParent ) CLASS Articulos
// Al iniciar la clase ARTICULOS automáticamente creo una instancia de
MEDICAMENTOS
::oMedicamento := Sld_Medicamentos():New( Self )
::oMedicamento:DevolverPorID( 0 )
RETURN Self
//---------------------------------------------------------- --------------------
METHOD DevolverPorID( ID ) CLASS Articulos
local ret, oDataSet:=TOdbcDataSet():New()
oDataSet:Close()
oDataSet:=AppData:oSql:QU( "select descripcion, codigo, IDTipoArticulo,
exento, alta, baja, idestadoregistro, idproveedor from articulos where
IDArticulo="+str(ID) )
oDataSet:Open()
// Levanto los datos de articulo
::IDArticulo :=ID
::Descripcion :=oDataSet:Descripcion
::Codigo :=oDataSet:Codigo
::IDTipoArticulo :=oDataSet:IDTipoArticulo
::exento :=oDataSet:exento
::alta :=oDataSet:alta
::baja :=oDataSet:baja
::idestadoregistro:=oDataSet:idestadoregistro
::idproveedor :=oDataSet:idproveedor
ret := .T.
oDataSet:Close()
// Levanto los datos de Medicamento, si no existe en dicha tabla traerá
datos en 0 y ""
::oMedicamento:DevolverPorID( ::IDArticulo )
RETURN ret
//---------------------------------------------------------- --------------------
METHOD Agregar() CLASS Articulos
local ret, IDArticulo
AppData:oSql:EX( "begin transaction" )
ret:=AppData:oSql:EX( "insert into Articulos "+;
"( descripcion, codigo, IDTipoArticulo, exento,
alta, baja, idestadoregistro, IDProveedor ) values "+;
"( '"+::Descripcion+"', '"+::Codigo+"',
'"+str(::IDTipoArticulo)+"', '"+::exento+"', "+dsql(::alta)+",
"+dsql(::baja)+", '"+str(::idestadoregistro)+"', "+str(::idproveedor)+" )" )
IF ret
::IDArticulo:=AppData:oSql:QV( "select last_value from
Articulos_IDArticulo_seq")
IF ::IDTipoArticulo = 1 // Si es tipo MEDICAMENTO
ret := ::oMedicamento:Agregar(::IDArticulo)
ENDIF
ENDIF
IF ret
AppData:oSql:EX( "commit" )
ELSE
AppData:oSql:EX( "rollback" )
ENDIF
RETURN ret
//---------------------------------------------------------- --------------------
METHOD Actualizar() CLASS Articulos
local ret
ret:=AppData:oSql:EX( "update articulos set ";
+"descripcion='"+::Descripcion+"',";
+"codigo = '"+::Codigo+"',";
+"IDTipoArticulo = "+str(::IDTipoArticulo)+",";
+"exento = '"+::exento+"',";
+"alta = "+dSql(::alta)+",";
+"baja = "+dSql(::baja)+",";
+"idestadoregistro = "+str(::idestadoregistro)+",";
+"idproveedor = "+str(::idproveedor)+" ";
+"where IDArticulo="+str(::IDArticulo) )
IF ::IDTipoArticulo = 1 // Si es tipo MEDICAMENTO
::oMedicamento:Actualizar(::IDArticulo)
ELSEIF ::IDTipoArticulo # 1
::oMedicamento:Eliminar(::IDArticulo)
ENDIF
RETURN ret
//---------------------------------------------------------- --------------------
METHOD Eliminar() CLASS Articulos
local ret
AppData:oSql:EX( "begin transaction" )
IF ::IDTipoArticulo = 1
ret:=::oMedicamento:Eliminar(::IDArticulo)
ELSE
ret:=.t.
ENDIF
IF ret
ret:=AppData:oSql:EX( "delete from Articulos where IDArticulo =
"+str(::IDArticulo) )
ENDIF
IF ret
AppData:oSql:EX( "commit" )
ELSE
AppData:oSql:EX( "rollback" )
ENDIF
RETURN ret
//---------------------------------------------------------- --------------------
METHOD BuscarPorDescripcionAR( cNombre, aDatos, aCabeceras ) CLASS Articulos
aDatos := aDatos
aCabeceras := aCabeceras
cNombre := upper(alltrim(cNombre))
aDatos := AppData:oSql:QA("select descripcion, codigo, IDTipoArticulo,
exento, alta, baja, idestadoregistro from articulos where descripcion like
'"+cNombre+"%' order by descripcion", @aCabeceras )
RETURN NIL
//---------------------------------------------------------- --------------------
METHOD BuscarPorDescripcionDS( cNombre, oDataSet, cFiltro ) CLASS Articulos
oDataSet := oDataSet
cNombre := upper(alltrim(cNombre))
cFiltro := if( empty(cFiltro),""," and "+cFiltro )
oDataSet := AppData:oSql:QU("select descripcion, codigo,
IDTipoArticulo, exento, alta, baja, idestadoregistro from articulos where
descripcion like '"+cNombre+"%'"+cFiltro+" order by descripcion")
RETURN NIL
//---------------------------------------------------------- --------------------
ESPERO SIRVA DE AYUDA, CUALQUIER COSA PREGUNTE NOMAS.
ATTE. CARLOS ORTIZ.