VFP_PostgreSQL

373 views
Skip to first unread message

gonzal...@hotmail.com

unread,
Dec 30, 2012, 5:31:55 PM12/30/12
to publice...@googlegroups.com
Estimados colegas:

Para quienes estan interesados en introducirse o meterle el diente a las aplicaciones VFP usando BD PostgreSQL, les envio este pequeño ejemplo que sirve para crear una base de datos, unas tablas como parte de esa base de datos y unos datos adicionados a esas tablas. el programita acepta un parametro c que es el nombre de la base de datos. El interes es crear un subgrupo para compartir conocimientos sobre el uso de VFP+Postgresql.

Saludos
parameters c
local nHandle,nset,lcStringCnxLocal,comando,cad
lcStringCnxLocal = "DRIVER={postgreSQL ODBC Driver(ANSI)};" + ;
                   "SERVER=localhost;" + ;
                   "DATABASE=postgres;"+;
                   "UID=postgres;" + ;
                   "PWD=root;"
cad = "DRIVER={postgreSQL ODBC Driver(ANSI)};" + ;
                   "SERVER=localhost;" + ;
                   "DATABASE="+lower(alltrim(c))+";"+;
                   "UID=postgres;" + ;
                   "PWD=root;"
SQLSETPROP(0,"DispLogin" , 3 )
nhandle = SQLSTRINGCONNECT(lcStringCnxLocal)
IF !(nhandle > 0)
    AERROR(laErr)
     MESSAGEBOX("No se pudo conectar a poistgreSQL. Error: " + CHR(13) + laErr[2])
else
    sqlexec(nHandle,'DROP DATABASE IF EXISTS '+alltrim(c))
    sqlexec(nHandle,'CREATE DATABASE '+lower(alltrim(c))) &&+' OWNER postgres')
    sqldisconn(nHandle)

    SQLSETPROP(0,"DispLogin" , 3 )
    nhandle = SQLSTRINGCONNECT(cad)
endif
if nhandle>0
    text to comando noshow pretext 10
        create table productos (
        parte varchar(20),
        tipo varchar(20),
        especificacion varchar(20),
        psugerido float(6),
        clave serial,
        primary key(clave)
        )
     endtext
     sqlexec(nHandle,comando)

    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Procesador','2 GHz','32 bits',null)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Procesador','2.4 GHz','32 bits','35')")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Procesador','1.7 GHz','64 bits',205)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Procesador','3 GHz','64 bits',560)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('RAM','128MB','333 MHz',10)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('RAM','256MB','400 MHz',35)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Disco Duro','80 GB','7200 rpm',60)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Disco Duro','120 GB','7200 rpm',78)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Disco Duro','200 GB','7200 rpm',110)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Disco Duro','40 GB','4200 rpm',null)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Monitor','1024x876','75 Hz',80)")
    sqlexec(nHandle,"insert into productos (parte,tipo,especificacion,psugerido) values ('Monitor','1024x876','60 Hz',67)")
    text to comando noshow pretext 10
        create table proveedores (
        empresa varchar(20) not null,
        credito bool,
        efectivo bool,
        primary key (empresa)
        )
     endtext
     sqlexec(nHandle,comando)
    sqlexec(nHandle,"insert into proveedores (empresa,efectivo) values ('Tecno-k',TRUE)")    &&
    sqlexec(nHandle,"insert into proveedores (empresa,credito) values ('Patito',TRUE)")    &&
    sqlexec(nHandle,"insert into proveedores (empresa,credito,efectivo) values ('Nacional',TRUE,TRUE )")    &&

    text to comando noshow pretext 10
        create table ganancia(
        venta varchar(16),
        factor decimal (4,2),
        primary key (venta)
        )       
     endtext
     sqlexec(nHandle,comando)

    sqlexec(nHandle,"insert into ganancia values('Al por mayor','1.05')")
    sqlexec(nHandle,"insert into ganancia values('Al por menor','1.12')")

    text to comando noshow pretext 10
        create table precios (
        empresa varchar(20) not null,
        clave int not null,
        precio float(6),
        orden serial,
        primary key (orden),
        foreign key (empresa) references proveedores MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
        foreign key (clave) references productos
        )
     endtext
     sqlexec(nHandle,comando)
     sqlexec(nHandle,"alter table precios SET ( autovacuum_enabled=true)")
    sqlexec(nHandle,"insert into precios values ('Nacional',1,'30.82')")
    sqlexec(nHandle,"insert into precios values ('Nacional',2,'32.73')")
    sqlexec(nHandle,"insert into precios values ('Nacional',3,'202.25')")
    sqlexec(nHandle,"insert into precios values ('Nacional',5,'9.76')")
    sqlexec(nHandle,"insert into precios values ('Nacional',6,'31.52')")
    sqlexec(nHandle,"insert into precios values ('Nacional',7,'58.41')")
    sqlexec(nHandle,"insert into precios values ('Nacional',10,'64.38')")
    sqlexec(nHandle,"insert into precios values ('Patito',1,'30.40')")
    sqlexec(nHandle,"insert into precios values ('Patito',2,'33.63')")
    sqlexec(nHandle,"insert into precios values ('Patito',3,'195.59')")
    sqlexec(nHandle,"insert into precios values ('Patito',5,'9.78')")
    sqlexec(nHandle,"insert into precios values ('Patito',6,'32.44')")
    sqlexec(nHandle,"insert into precios values ('Patito',7,'59.99')")
    sqlexec(nHandle,"insert into precios values ('Patito',10,'62.02')")
    sqlexec(nHandle,"insert into precios values ('Tecno-k',3,'198.34')")
    sqlexec(nHandle,"insert into precios values ('Tecno-k',5,'9.27')")
    sqlexec(nHandle,"insert into precios values ('Tecno-k',6,'34.85')")
    sqlexec(nHandle,"insert into precios values ('Tecno-k',7,'59.95')")
    sqlexec(nHandle,"insert into precios values ('Tecno-k',10,'61.22')")
    sqlexec(nHandle,"insert into precios values ('Tecno-k',12,'62.29')")
    sqldisconn(nHandle)
else
    wait window "no pudo crear base de datos ni mierda"
endif

Rafael Morales

unread,
Dec 30, 2012, 6:03:55 PM12/30/12
to publice...@googlegroups.com
Muy bueno el ejemplo. Me parece fantástica la idea de crear un grupo VFP+Postgresql.

jajajaja me gustó el mensaje que devuelve cuando no se logra crear la Base de Datos.


--
Rafael Morales

eap pupo

unread,
Jan 9, 2013, 11:34:19 AM1/9/13
to publice...@googlegroups.com
 

Necesito de su ayuda tengo un problema con el UPDATE desde un formulario para actualizar la tabla a Postgres, le he puesto de todo pero no me funciona, si lo hago desde el motor de bases de datos de Postgres lo hace pero con estas líneas que supuestamente dicen que funciona no lo hace.

Estas han sido todas las variantes, pero antes le he puesto un wait windows " " para ver el valor a reemplazar y coge el correcto pero no lo actualiza a la tabla que quiero.

Un variante:

Text TO tuQuery NoShow
Update plantilla set espec = <<cExistccosto.espec>>
Where where plantilla.tarje = <<cExesteDB.tarje>>
EndText

If SqlExec(cHandle,tuQuery)<0
=Aerror(lError)
messagebo(lError(2))
EndIf

SQLEXEC(cHandle, "select * from plantilla","mycursore" )
SELECT mycursore
BROWSE FIELDS tarje,nombre,espec  && aqui se muestra correctamente la tabla pero no la actualización

Otra variante:

SQLEXEC(cHandle, "update plantilla set espec = ?cExistccosto.espec where plantilla.tarje = cExesteDB.tarje")

Otra variante:

lcespec=cExistccosto.espec
lctarje=cExesteDB.tarje

SQLEXEC(cHandle, "update plantilla set espec = ?lcespec where plantilla.tarje = ?lctarje")

Que me dices amigo, donde está el problema?

Saludos

eap pupo

unread,
Jan 9, 2013, 11:35:49 AM1/9/13
to publice...@googlegroups.com

Necesito de ayuda la parecer domina lo que yo intento hacer y me da error, puedes enviarme la respuesta a: eap...@gmail.com

Miguel Canchas

unread,
Jan 9, 2013, 11:51:12 AM1/9/13
to publice...@googlegroups.com

Haz revisado los espacios que hay en tu campo… o en todo caso tendrías que poner ALLTRIM….

 

Aparentemente todo esta bien….

 

 

MK

--
 
 

Carlos Salcedo

unread,
Jan 9, 2013, 2:07:25 PM1/9/13
to visual fox
Revisa los tipos de datos y si alguno es diferente a texto setealo y luego
pasale el alltrim()

Saludos
Carlos


Subject: RE: [vfp] Error de UPDATE de VFP9 con Postgres
Date: Wed, 9 Jan 2013 11:51:12 -0500
From: mcan...@ximesa.com
To: publice...@googlegroups.com
--
 
 

eap pupo

unread,
Jan 9, 2013, 2:25:30 PM1/9/13
to publice...@googlegroups.com
Gracias por responder Carlos, ahi tienes las líneas de código pero no funciona, los campos son ídem en ambas tablas y no hay espacio.

Ej. 01 o 83 son los espec, y en el tarje llevaría cero, así 001, 003, o 013, no hay espacio y ambos son caracter.

Saludos

Pupo

eap pupo

unread,
Jan 9, 2013, 2:31:48 PM1/9/13
to publice...@googlegroups.com
Muy bueno tu ejemplo, tienes alguno por ahi con frm de UPDATE.
Por favor lee el error con el UPDATE de VFP9 con POSTGRES ahora estoy iniciando.

Gracias!

Saludos

Pupo


El domingo, 30 de diciembre de 2012 14:31:55 UTC-8, gonzal...@hotmail.com escribió:

Carlos Salcedo

unread,
Jan 9, 2013, 2:38:40 PM1/9/13
to visual fox
Pupo, ten la gentileza y mandame el script de la tabla, para ayudarte mejor

Saludos
Carlos


Date: Wed, 9 Jan 2013 11:25:30 -0800
From: eap...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Error de UPDATE de VFP9 con Postgres
--
 
 

eap pupo

unread,
Jan 10, 2013, 11:40:52 AM1/10/13
to publice...@googlegroups.com

Mil gracias Carlos.
Te mando el pequeño proyecto, y ahí va el formulario y salva BD en postgres
con las tres tablas con datos asi te es mas facil.

Saludos


Pupo
proyectpostgres.rar

eap pupo

unread,
Jan 17, 2013, 2:56:10 PM1/17/13
to publice...@googlegroups.com
Hola Carlos!

Haz logrado hacer algo con lo que te envie.

Saludos

Pupo

El miércoles, 9 de enero de 2013 11:38:40 UTC-8, Carlos Salcedo escribió:

Rafael Morales

unread,
Feb 6, 2013, 9:47:28 AM2/6/13
to publice...@googlegroups.com
¿Alguien ya creó el grupo VFP-PostgresSQL ?.


--
Rafael Morales

saul pina

unread,
Feb 6, 2013, 11:02:56 AM2/6/13
to publice...@googlegroups.com
hermano, yo tengo una duda y no sé si te ha pasado a ti. tengo una tabla de 90 campos y más de 330,000 registros. entonces abro pgadim III y al tratar de ver todos los registros e incluso hacer alguna consulta. ésta se demora mas de 5 minutos; para mi eso es mucho, demasiado tardado.

entonces, mi pregunta es: es normal?

ya que tambien tengo esta misma tabla en bd nativa de vfp y tarda menos de 2 minutos en abrir la tabla.

gracias

Miguel Canchas

unread,
Feb 6, 2013, 11:06:15 AM2/6/13
to publice...@googlegroups.com
Y para que quieres ver 330 000 registros ??? wtf .....
Tabla de 90 campos ?????? estará normalizada esa tabla ????


Las veces que usaba postgresql era rápido...

MK


-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de saul pina
Enviado el: miércoles, 06 de febrero de 2013 11:03 a.m.
Para: publice...@googlegroups.com
Asunto: [vfp] VFP_PostgreSQL

saul pina

unread,
Feb 6, 2013, 11:58:57 AM2/6/13
to publice...@googlegroups.com
digo es natural ver todos mis registros. se supone que es un motor de bases de datos. o acaso no se puede abrir?
es un padron de todos los ciudadanos mayores de 18 años. es muy importante manejar esos datos rapidamente.

Miguel Antúnez

unread,
Feb 6, 2013, 12:12:36 PM2/6/13
to publice...@googlegroups.com
Saul, es normal ver toda la información, pero no creo a la vez, para eso son las búsquedas las sentencias Where,  de esta forma el usuario busca por los criterios.

Saludos. 


El 6 de febrero de 2013 11:58, saul pina <vfxpro...@gmail.com> escribió:
digo es natural ver todos mis registros. se supone que es un motor de bases de datos. o acaso no se puede abrir?
es un padron de todos los ciudadanos mayores de 18 años. es muy importante manejar esos datos rapidamente.



--
Miguel Angel Antúnez Camones
mant...@gmail.com

saul pina

unread,
Feb 6, 2013, 12:59:59 PM2/6/13
to publice...@googlegroups.com
aun asi, las consultas son algo lentas. aunque no he probado realizar con indices.

Miguel Canchas

unread,
Feb 6, 2013, 1:05:22 PM2/6/13
to publice...@googlegroups.com
Nunca terminarias de ver todos tus registros..con 1000 registros ya estas cansado...se puede abrir por eso la demora, un gestor de base de datos va a demorar un poco mas por los procesos internos que pueda tener.... en un dbf el proceso es mas rápido ya que es una tabla simple....


MK


-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de saul pina
Enviado el: miércoles, 06 de febrero de 2013 11:59 a.m.
Para: publice...@googlegroups.com
Asunto: RE: [vfp] VFP_PostgreSQL

Guillermo MDQ

unread,
Feb 6, 2013, 1:04:47 PM2/6/13
to publice...@googlegroups.com
Amigo si te traes 300.000 registros a la vez y encima trabajas sin indices, me parece que siempre vas a tener problemas de lentitud, sea con la base de datos que sea que trabajes.
Crea indices por los campos por los que utilizarias en una clausula WHERE para traer conjuntos de datos mas pequeños y vas  a ver como tus rendimientos en las consultas cambian como del dia a la noche,

Saludos
Guillermo

eap pupo

unread,
Feb 6, 2013, 2:25:55 PM2/6/13
to publice...@googlegroups.com
Está buena la idea.
Ojala prospere la idea.

Saludos

Pupo

saul pina

unread,
Feb 6, 2013, 3:04:16 PM2/6/13
to publice...@googlegroups.com
no es que los vea a la vez, solo que me da curiosidad que un dbf abre en menos de 10 segundos todos los registros y puedo navegar, y en postgres no sucede así, se abre como despues de 2 minutos.

por otro lado, quisiera que me ayudaran a esclarecer esta otra duda, en un dbf para indexar o para buscar con un seek y que la búsqueda sea mas rápida solo hago esto:

select mi tabla
set order to clave
seek "mi_dato"
if found()
browse
endif

***Con esto yo ya sé que estoy utilizando un indice.

Como se debe hacer en un motor de base de datos?  es decir, como puedo utilizar un indice en postgres?


Gracias!

Miguel Canchas

unread,
Feb 6, 2013, 3:18:36 PM2/6/13
to publice...@googlegroups.com

Dbf es solo un archivo….un SGDB es otra cosa, mas compleja con mas control, mas manejo y con mas opciones por eso demora mas (breve resumen…)

 

 

Todos los tratamientos de select update o delete el uso de los índices los hace de manera interna(implicita).. si quieres ver su uso tendrías que ver su trazabilidad o recorrido de la consulta….

 

 

MK

saul pina

unread,
Feb 6, 2013, 4:25:14 PM2/6/13
to publice...@googlegroups.com
en otras palabras, en postgresql, mysql con un "where" bastaria para utilizar el indice?

gracias!

Carlos Miguel FARIAS

unread,
Feb 6, 2013, 6:59:46 PM2/6/13
to publice...@googlegroups.com
En cualquier SGBD, los indices mejoran el desempeño si están creados sobre los campos que se usan de filtro y por supuesto, con los campos que establecen la relación entre dos tablas.
Si la relación es muchos a 1, no es necesario el indice en muchos

Ejemplo:
clientes = {idcliente, nombre, codigopostal}
ciudades = {codigopostal, ciudad}

SELECT * FROM clientes c INNER JOIN ciudades k ON ( c.codigopostal=k.codigopostal)
solo necesita indice en codigopostal de ciudades pero...

SELECT * FROM clientes c INNER JOIN ciudades k ON ( c.codigopostal=k.codigopostal) WHERE c.codigopostal=8000
mejorará con un indice común en codigopostal de clientes

Saludos: Miguel, La Pampa (RA)

Douglas Sánchez

unread,
Feb 6, 2013, 9:46:53 PM2/6/13
to publice...@googlegroups.com
Tiene razon se tendria que crear indices por cada campo que se use en la clausula where y pueden usar tambien FORCE INDEX para forzar al MySQL habra algo asi en PostgreSQL

SALUDES

Douglas

--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

Douglas Sánchez

unread,
Feb 6, 2013, 9:49:06 PM2/6/13
to publice...@googlegroups.com
Hola Gonzalo, me gustaria hacerte una consulta se ve que usas PostgreSql como se hace para agregar a los usuarios al motor yo lo puedo hacer en sql server y en mysql pero en Postgre no lo ye usado nunca a mi me gusta controlar los usuarios en una tabla y a nivel de gestor tambien, doble seguridad.

Saludes

Douglas



--
 
 
Reply all
Reply to author
Forward
0 new messages