Caros Colegas,
Alguém pode me dizer se o Xailer trabalha com Postgre, interbase ou firebird
???
Obrigado.
Reginaldo
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Xailer com Interbase, Firebird, ou postgre??
Xailer com Interbase, Firebird, ou postgre??
Si yo lo uso con interbase tengo el ODBC de FireBird y uso los
componentes ADO de Xailer y anda muy bien.
Saludos Atte
Christian Assenza
Reginaldo escribió:
> Caros Colegas,
>
> Alguém pode me dizer se o Xailer trabalha com Postgre, interbase ou firebird
> ???
>
> Obrigado.
>
> Reginaldo
>
>
componentes ADO de Xailer y anda muy bien.
Saludos Atte
Christian Assenza
Reginaldo escribió:
> Caros Colegas,
>
> Alguém pode me dizer se o Xailer trabalha com Postgre, interbase ou firebird
> ???
>
> Obrigado.
>
> Reginaldo
>
>
Xailer com Interbase, Firebird, ou postgre??
Caro Christian,
Entendi que vc usa via ADO/ODBC, mas, pode me passar o "caminho das pedras",
pois não consegui fazer via ODBC.... será que com o postgre também, tem que
ser via ODBC ???
Obrigado!
Reginaldo
"Christian R.Assenza" <christianassenza@yahoo.com.ar> escreveu na mensagem
news:[email=4a27cf9f@svctag-j7w3v3j....]4a27cf9f@svctag-j7w3v3j....[/email]
> Si yo lo uso con interbase tengo el ODBC de FireBird y uso los componentes
> ADO de Xailer y anda muy bien.
>
> Saludos Atte
> Christian Assenza
>
>
> Reginaldo escribió:
>> Caros Colegas,
>>
>> Alguém pode me dizer se o Xailer trabalha com Postgre, interbase ou
>> firebird ???
>>
>> Obrigado.
>>
>> Reginaldo
Entendi que vc usa via ADO/ODBC, mas, pode me passar o "caminho das pedras",
pois não consegui fazer via ODBC.... será que com o postgre também, tem que
ser via ODBC ???
Obrigado!
Reginaldo
"Christian R.Assenza" <christianassenza@yahoo.com.ar> escreveu na mensagem
news:[email=4a27cf9f@svctag-j7w3v3j....]4a27cf9f@svctag-j7w3v3j....[/email]
> Si yo lo uso con interbase tengo el ODBC de FireBird y uso los componentes
> ADO de Xailer y anda muy bien.
>
> Saludos Atte
> Christian Assenza
>
>
> Reginaldo escribió:
>> Caros Colegas,
>>
>> Alguém pode me dizer se o Xailer trabalha com Postgre, interbase ou
>> firebird ???
>>
>> Obrigado.
>>
>> Reginaldo
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Xailer com Interbase, Firebird, ou postgre??
Yo estoy usando Postgres por ODBC y va muy bién. Que necesitás?. Saludos.
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
Xailer com Interbase, Firebird, ou postgre??
Caro Carlos Ortiz,
Como faço para usar postgre com odbc ???
Você tem algum projeto exemplo pra me enviar ???
Obrigado
Reginaldo
"Carlos Ortiz" <cortizassist@hotmail.com> escreveu na mensagem
news:[email=4a27df55@svctag-j7w3v3j....]4a27df55@svctag-j7w3v3j....[/email]
> Yo estoy usando Postgres por ODBC y va muy bién. Que necesitás?. Saludos.
>
Como faço para usar postgre com odbc ???
Você tem algum projeto exemplo pra me enviar ???
Obrigado
Reginaldo
"Carlos Ortiz" <cortizassist@hotmail.com> escreveu na mensagem
news:[email=4a27df55@svctag-j7w3v3j....]4a27df55@svctag-j7w3v3j....[/email]
> Yo estoy usando Postgres por ODBC y va muy bién. Que necesitás?. Saludos.
>
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Xailer com Interbase, Firebird, ou postgre??
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.
--
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.
--
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
Xailer com Interbase, Firebird, ou postgre??
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.
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.