Aplicaciones en RED
Tengo una aplicación en visual fox 9 me corre para un solo usuario, me gustaría saber como programas un ABC de productos para que varios usuarios lo llenen en varias terminales o sea en RED...
att. Cristina, me pueden responder aquí... Urgente...
[email protected]
att. Cristina, me pueden responder aquí... Urgente...
[email protected]
1 Respuesta
Respuesta de Alonso Jarrín Solís
1
1
Sencillamente creas común y corriente tu aplicación, en un punto determinado tienes que crear una función para que te solicite la ruta de la base de datos y la almacene un una tabla o archivo INI, y en dicho código debe ir la línea de comando Use nombreBasedeDatos Shared esto abre la base de datos en modo compartido, es decir para que puedan tener acceso varios usuarios, esto requiere compartir el sitio donde se encuentra la base de datos como ejemplo una unidad de red.
Ejemplo:
Local lcDataBaseName
DataBaseName = GetFile("*.dbc")
If File(DataBaseName) And Dbc(DataBaseName)
Use (DataBaseName) Shared
Endif
O bien diseñar el sistema para que trabaje con orígenes de datos (ODBC).
Ejemplo:
Local lcDataBaseName
DataBaseName = GetFile("*.dbc")
If File(DataBaseName) And Dbc(DataBaseName)
Use (DataBaseName) Shared
Endif
O bien diseñar el sistema para que trabaje con orígenes de datos (ODBC).
Tengo ahora una consulta, como respaldo toda la base de datos de mi proyecto ejecutable en Fox9, y a la vez como lo recupero...
Tengo un programa que me permite solo respaldar las tablas...
¿Y lo que quiero es respaldar toda la base de datos y sus 10 tablas o hacer BACKUP comprende?
Agradeceré su aclaración
Att. Cristina
Tengo un programa que me permite solo respaldar las tablas...
¿Y lo que quiero es respaldar toda la base de datos y sus 10 tablas o hacer BACKUP comprende?
Agradeceré su aclaración
Att. Cristina
Aquí te envío un código de ejemplo para crear una copia de seguridad de una base de datos:
Supongamos que vamos a crear una copia de seguridad de la base de datos Contabilidad.
Procedure CopyData
Parameters lcDirectory * ? este parámetro es el directorio de destino.
If.Not.Directory(lcDirectory)
Messagebox("El directorio no existe.", 48, "Ejemplo")
Return .F.
Endif
lcCurDir = FullPath(Curdir())
Local lnFiles[1], i, dbf_file, cdx_file, fpt_file, lcPathTables,;
dbf_copy, cdx_copy, fpt_copy, lcRetval, cDatabase, fDatabase, dbc_copy, dtc_copy
Close Databases All
cDatabase = "Contabilidad.dbc"
fDatabase = "Contabilidad".dct"
dbc_copy = lcDirectory + "\" + "Contabilidad.dbc"
dtc_copy = lcDirectory + "\" + "Contabilidad.dct"
If Upper(cDatabase) == Upper(dbc_copy)
*El directorio de destino no debe el mismo que el de origen."
Messagebox("El directorio no es válido.", 48, "Ejemplo")
If FullPath(Curdir()) <> lcCurDir
Set Default To (lcCurDir)
Endif
Return .F.
Endif
If File(dbc_copy)
Delete File (dbc_copy)
Endif
Copy File (cDatabase) To (dbc_copy)
If File(dtc_copy)
Delete File (dtc_copy)
Endif
Copy File (fDatabase) To (dtc_copy)
*Abrir la base de datos para copiar las tablas, vistas, y toda su información.
lcDatabase = Curdir() + "Contabilidad.dbc" && suponiendo que la base de datos se encuentra en el directorio actual de Visual FoxPro.
Open Database (lcDatabase)
lcPathTables = Substr(lcDatabase, 1, (Len(cDatabase) - Len(cDatabase)))
For i = 1 To Adbobjects(lnFiles, "Table")
If !Empty(lnFiles)
If !Used(lnFiles)
dbf_file = lcPathTables + lnFiles + ".dbf"
cdx_file = lcPathTables + lnFiles + ".cdx"
fpt_file = lcPathTables + lnFiles + ".fpt"
dbf_copy = lcDirectory + "\" + lnFiles + ".dbf"
cdx_copy = lcDirectory + "\" + lnFiles + ".cdx"
fpt_copy = lcDirectory + "\" + lnFiles + ".fpt"
If File(dbf_file)
If File(dbf_copy) && Si el archivos existe se lo elimina y actualiza.
Delete File (dbf_copy)
Endif
Copy File (dbf_file) To (dbf_copy)
Endif
If File(cdx_file)
If File(cdx_copy) && Si el archivos existe se lo elimina y actualiza.
Delete File (cdx_copy)
Endif
Copy File (cdx_file) To (cdx_copy)
Endif
If File(fpt_file)
If File(fpt_copy) && Si el archivos existe se lo elimina y actualiza.
Delete File (fpt_copy)
Endif
Copy File (fpt_file) To (fpt_copy)
Endif
lcRetval = .T.
Endif
Else
Messagebox("Debe cerrar todas las tablas de la base de datos, 64, "Ejemplo")
lcDeleteFile = lcDirectory + "*.*"
Delete File (lcDeleteFile)
Exit
Endif
EndFor
If FullPath(Curdir()) <> lcCurDir
Set Default To (lcCurDir)
Endif
Return lcRetval
Endproc
De este código puedes guiarte para solucionar tu problema.
Pdta: En la conexión a una base de datos el en donde dice Dbc(DataBaseName) la parte correcta es ! Empty(Dbc(DatabaseName)), si lo aplicaste corrige esa parte por fa.
Éxitos...
Supongamos que vamos a crear una copia de seguridad de la base de datos Contabilidad.
Procedure CopyData
Parameters lcDirectory * ? este parámetro es el directorio de destino.
If.Not.Directory(lcDirectory)
Messagebox("El directorio no existe.", 48, "Ejemplo")
Return .F.
Endif
lcCurDir = FullPath(Curdir())
Local lnFiles[1], i, dbf_file, cdx_file, fpt_file, lcPathTables,;
dbf_copy, cdx_copy, fpt_copy, lcRetval, cDatabase, fDatabase, dbc_copy, dtc_copy
Close Databases All
cDatabase = "Contabilidad.dbc"
fDatabase = "Contabilidad".dct"
dbc_copy = lcDirectory + "\" + "Contabilidad.dbc"
dtc_copy = lcDirectory + "\" + "Contabilidad.dct"
If Upper(cDatabase) == Upper(dbc_copy)
*El directorio de destino no debe el mismo que el de origen."
Messagebox("El directorio no es válido.", 48, "Ejemplo")
If FullPath(Curdir()) <> lcCurDir
Set Default To (lcCurDir)
Endif
Return .F.
Endif
If File(dbc_copy)
Delete File (dbc_copy)
Endif
Copy File (cDatabase) To (dbc_copy)
If File(dtc_copy)
Delete File (dtc_copy)
Endif
Copy File (fDatabase) To (dtc_copy)
*Abrir la base de datos para copiar las tablas, vistas, y toda su información.
lcDatabase = Curdir() + "Contabilidad.dbc" && suponiendo que la base de datos se encuentra en el directorio actual de Visual FoxPro.
Open Database (lcDatabase)
lcPathTables = Substr(lcDatabase, 1, (Len(cDatabase) - Len(cDatabase)))
For i = 1 To Adbobjects(lnFiles, "Table")
If !Empty(lnFiles)
If !Used(lnFiles)
dbf_file = lcPathTables + lnFiles + ".dbf"
cdx_file = lcPathTables + lnFiles + ".cdx"
fpt_file = lcPathTables + lnFiles + ".fpt"
dbf_copy = lcDirectory + "\" + lnFiles + ".dbf"
cdx_copy = lcDirectory + "\" + lnFiles + ".cdx"
fpt_copy = lcDirectory + "\" + lnFiles + ".fpt"
If File(dbf_file)
If File(dbf_copy) && Si el archivos existe se lo elimina y actualiza.
Delete File (dbf_copy)
Endif
Copy File (dbf_file) To (dbf_copy)
Endif
If File(cdx_file)
If File(cdx_copy) && Si el archivos existe se lo elimina y actualiza.
Delete File (cdx_copy)
Endif
Copy File (cdx_file) To (cdx_copy)
Endif
If File(fpt_file)
If File(fpt_copy) && Si el archivos existe se lo elimina y actualiza.
Delete File (fpt_copy)
Endif
Copy File (fpt_file) To (fpt_copy)
Endif
lcRetval = .T.
Endif
Else
Messagebox("Debe cerrar todas las tablas de la base de datos, 64, "Ejemplo")
lcDeleteFile = lcDirectory + "*.*"
Delete File (lcDeleteFile)
Exit
Endif
EndFor
If FullPath(Curdir()) <> lcCurDir
Set Default To (lcCurDir)
Endif
Return lcRetval
Endproc
De este código puedes guiarte para solucionar tu problema.
Pdta: En la conexión a una base de datos el en donde dice Dbc(DataBaseName) la parte correcta es ! Empty(Dbc(DatabaseName)), si lo aplicaste corrige esa parte por fa.
Éxitos...
Gracias por la respuesta... iré a probarlo
Mi consulta es ahora como recuperar desde mi aplicación la base de datos respaldada...
Comprende...
Agradezco a este experto por tan excelentes respuestas..., Mil gracias...
Cristina
Mi consulta es ahora como recuperar desde mi aplicación la base de datos respaldada...
Comprende...
Agradezco a este experto por tan excelentes respuestas..., Mil gracias...
Cristina
El código que te mostré anteriormente puede solucionar el problema de recuperar la base de datos respaldada, solamente tienes que crear un procedimiento para abrir la base de datos respaldada y no tendrás problema para abrirla en tu aplicación debido a que tiene las mismas características de la base de datos original y los datos de las tablas se prodrán abrir el los formularios de al aplicación.
Ayuda urgente de verdad... nunca me ha pasado pero:
He creado mi aplicación ejecutable y resulta que cuando esta ejecutable, no almacena la información en las tablas de la base de datos, al momento se ve que lo está haciendo pero cuando veo los reportes no esta la información:
Yo he realizado lo siguiente en las versiones anteriores a la 9 de visual fox
Una vez que tengo la aplicación ejecutable
copio las tablas al nuevo directorio donde tengo el ejecutable y tambièn la BD
los archivos dll necesarios: vfp9r, vfp9renu, vfp9rens
y despuès desde la ventana de comando mando a definir la siguiente ruta
set defa to c:\taller (Aquì es donde tengo la aplicación ejecutable)
open database
validate data
Sino me manda ningún error
digito close all
después
set defa to c:\taller
Cual es mi error, que esto nunca me ha pasado en otras aplicaciones que he realizado solo con esta versión...
Mil gracias por la respuesta...
He creado mi aplicación ejecutable y resulta que cuando esta ejecutable, no almacena la información en las tablas de la base de datos, al momento se ve que lo está haciendo pero cuando veo los reportes no esta la información:
Yo he realizado lo siguiente en las versiones anteriores a la 9 de visual fox
Una vez que tengo la aplicación ejecutable
copio las tablas al nuevo directorio donde tengo el ejecutable y tambièn la BD
los archivos dll necesarios: vfp9r, vfp9renu, vfp9rens
y despuès desde la ventana de comando mando a definir la siguiente ruta
set defa to c:\taller (Aquì es donde tengo la aplicación ejecutable)
open database
validate data
Sino me manda ningún error
digito close all
después
set defa to c:\taller
Cual es mi error, que esto nunca me ha pasado en otras aplicaciones que he realizado solo con esta versión...
Mil gracias por la respuesta...
¿Tú guardas los cambios con la función Tableupdate()?, si es así, asegúrate que la unidad donde está guardada la base de datos no esté protegida contra escritura o no esté congelada.
Gracias por la observación pero ya comprobé todo eso
Cuando estoy trabajando con el código fuente todo marcha a la perfección, permite grabar, eliminar, actualizar, etc, etc. todas las operaciones que haga funcionan muy bien, el asunto es cuando lo paso al ejecutable... aparenta estar funcionando bien en el momento de grabación y consultas pero cuando veo los informes no hay nada... veo la tabla y pasa igual, solo con el fuente me está dando bien ...
Es lo mismo que he hecho en versiones anteriores...
Acá e muestro la manera que mando a grabar la información y actualizarla... solo con esta versión me está pasando esto...
Esta es parte de la grabación del catálogo ubicaciones por área:
cMessageTitle = 'Confirmación'
cMessageText = 'Desea agregar este registro?.'
nDialogType = 4 + 32 + 256
IF THISFORM.NUEVO
nAnswer = MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)
IF nAnswer=6
WAIT WINDOW 'GRABANDO...' NOWAIT
INSERT INTO ubic VALUE( THISFORM.G_COD.VALUE,;
THISFORM.G_NOM.VALUE,THISFORM.CMBAREA.VALUE)
ELSE
messgebox("Grabación cancelada...")
ENDIF
ELSE
MESSAGEBOX("Los datos se han actualizados")
SELECT ubic
REPLACE NOMBRE WITH THISFORM.G_NOM.VALUE
ENDIF
thisform.NUEVO=.F.
thisform.boton_nuevo.SETFOCUS
Agradeceré su ayuda...
Att. Cristina
Cuando estoy trabajando con el código fuente todo marcha a la perfección, permite grabar, eliminar, actualizar, etc, etc. todas las operaciones que haga funcionan muy bien, el asunto es cuando lo paso al ejecutable... aparenta estar funcionando bien en el momento de grabación y consultas pero cuando veo los informes no hay nada... veo la tabla y pasa igual, solo con el fuente me está dando bien ...
Es lo mismo que he hecho en versiones anteriores...
Acá e muestro la manera que mando a grabar la información y actualizarla... solo con esta versión me está pasando esto...
Esta es parte de la grabación del catálogo ubicaciones por área:
cMessageTitle = 'Confirmación'
cMessageText = 'Desea agregar este registro?.'
nDialogType = 4 + 32 + 256
IF THISFORM.NUEVO
nAnswer = MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)
IF nAnswer=6
WAIT WINDOW 'GRABANDO...' NOWAIT
INSERT INTO ubic VALUE( THISFORM.G_COD.VALUE,;
THISFORM.G_NOM.VALUE,THISFORM.CMBAREA.VALUE)
ELSE
messgebox("Grabación cancelada...")
ENDIF
ELSE
MESSAGEBOX("Los datos se han actualizados")
SELECT ubic
REPLACE NOMBRE WITH THISFORM.G_NOM.VALUE
ENDIF
thisform.NUEVO=.F.
thisform.boton_nuevo.SETFOCUS
Agradeceré su ayuda...
Att. Cristina
Todo lo anterior es correcto, pero para que se graben los cambios debes utilizar la función Tableupdate() para que los cambios se registren en la base de datos, si solamente utilizas los comandos Replace o Insert de SQL para modificar o registrar datos los cambios no se guardarán una vez cierres el formulario.
Para corregir este problema haz lo siguiente:
1. Establece las propiedades Buffermode y Datassession del formulario a 2 y luego en el evento init del formulario escribe las siguientes comando:
Set Multilocks ON
=CursorSetProp("Buffering", 5, "Ubic")
2. Por último escribe reeamplaza el código enviado por lo siguiente:
Local lcError
IF THISFORM.NUEVO
nAnswer = MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)
IF nAnswer=6
WAIT WINDOW 'GRABANDO...' NOWAIT
INSERT INTO ubic VALUE( THISFORM.G_COD.VALUE,;
THISFORM.G_NOM.VALUE,THISFORM.CMBAREA.VALUE)
lcError = ¡TableUpdate(.T.)
If ¡lcError
messgebox("Se han guardado los cambios...")
Else
messgebox("Ha ocurrido un error al actualizar los datos...")
Endif
ELSE
messgebox("Grabación cancelada...")
ENDIF
ELSE
SELECT ubic
REPLACE NOMBRE WITH THISFORM.G_NOM.VALUE
lcError = ¡TableUpdate(.T.)
If ¡lcError
MESSAGEBOX("Los datos se han actualizados")
Else
messgebox("Ha ocurrido un error al actualizar los datos...")
Endif
ENDIF
If ¡lcError
thisform.NUEVO=.F.
thisform.boton_nuevo.SETFOCUS
Endif
Este es más o menos el código que deberías escribir para solucionar tu problema, obviamente hay que evitar redundancias y que quede con el menor número de líneas posibles.
Para corregir este problema haz lo siguiente:
1. Establece las propiedades Buffermode y Datassession del formulario a 2 y luego en el evento init del formulario escribe las siguientes comando:
Set Multilocks ON
=CursorSetProp("Buffering", 5, "Ubic")
2. Por último escribe reeamplaza el código enviado por lo siguiente:
Local lcError
IF THISFORM.NUEVO
nAnswer = MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)
IF nAnswer=6
WAIT WINDOW 'GRABANDO...' NOWAIT
INSERT INTO ubic VALUE( THISFORM.G_COD.VALUE,;
THISFORM.G_NOM.VALUE,THISFORM.CMBAREA.VALUE)
lcError = ¡TableUpdate(.T.)
If ¡lcError
messgebox("Se han guardado los cambios...")
Else
messgebox("Ha ocurrido un error al actualizar los datos...")
Endif
ELSE
messgebox("Grabación cancelada...")
ENDIF
ELSE
SELECT ubic
REPLACE NOMBRE WITH THISFORM.G_NOM.VALUE
lcError = ¡TableUpdate(.T.)
If ¡lcError
MESSAGEBOX("Los datos se han actualizados")
Else
messgebox("Ha ocurrido un error al actualizar los datos...")
Endif
ENDIF
If ¡lcError
thisform.NUEVO=.F.
thisform.boton_nuevo.SETFOCUS
Endif
Este es más o menos el código que deberías escribir para solucionar tu problema, obviamente hay que evitar redundancias y que quede con el menor número de líneas posibles.
Ok.. gracias, muchíiisimas gracias, ya solucioné...
Por ahora estoy tratando de enviar el resultado de un reporte al correo de yahoo
Tengo este inconveniente,
Estoy creando el reporte con varias salidas
1 Como vista previa
2 Impresión directa
3 Hacia un archivo pdf para que este archivo se adjunte y se envíe al correo de yahoo. Desde mi formulario...
Los incisos 1 y 2 ya los resolví, el número 3 es el que no he terminado... estaré agradecida nuevamente por su ayuda...
Saludes...
Att. Cristina
Por ahora estoy tratando de enviar el resultado de un reporte al correo de yahoo
Tengo este inconveniente,
Estoy creando el reporte con varias salidas
1 Como vista previa
2 Impresión directa
3 Hacia un archivo pdf para que este archivo se adjunte y se envíe al correo de yahoo. Desde mi formulario...
Los incisos 1 y 2 ya los resolví, el número 3 es el que no he terminado... estaré agradecida nuevamente por su ayuda...
Saludes...
Att. Cristina
Una forma muy sencilla es descargar el pdfCreator e instalarlo en el equipo, luego tratar de crear el documento de pdf de la siguiente manera:
mnom='PDFCreator'
SET PRINTER TO NAME (mnom)
REPORT FORM tureporte TO PRINTER noejec noconsole
SET PRINTER TO default
Claro, también tengo la forma complicada y por la misma razón no te suministro el código debido a que es muy difícil de entender porque trabaja con funciones de la API de Windows y hay que traducir código binario.
mnom='PDFCreator'
SET PRINTER TO NAME (mnom)
REPORT FORM tureporte TO PRINTER noejec noconsole
SET PRINTER TO default
Claro, también tengo la forma complicada y por la misma razón no te suministro el código debido a que es muy difícil de entender porque trabaja con funciones de la API de Windows y hay que traducir código binario.
Necesito ayuda urgente... Gracias anticipadamente
Hola tengo este código para filtrar datos de los usuarios por área, resulta que aveces lo hace y aveces lo que me tira es el grid en blanco y aun existiendo la información, y para ninguno lo hace cuando se pone así, de repente aparece que si funciona, me podría ayudar... y por todos lados he metido refresh par ver si ese es el problema...
IF EMPTY(THIS.VALUE)
THISFORM.P.P1.g_cod.ENABLED=.F.
RETURN
ELSE
THISFORM.P.P1.G_cod.ENABLED=.F.
SELECT area3
IF SEEK(this.Value, 'area3')
thisform.P.P1.G_cod.Enabled= .T.
thisform.refresh
THISFORM.Grid1.RecordSource = SPACE(0)
SELECT usuquip1.idusua,usuquip1.nombres FROM usuquip1;
WHERE usuquip1.idarea=this.Value INTO CURSOR UsuaEQ
THISFORM.Grid1.RecordSource = "UsuaEQ"
THISFORM.Grid1.visible= .T.
thisform.cmbarea.Refresh
thisform.grid1.Refresh
ELSE
MESSAGEBOX("Ubicación no Existe!...")
thisform.cmbubica.Value=""
Endif
Thisform.refresh
Endif
Gracias
Cristina
Hola tengo este código para filtrar datos de los usuarios por área, resulta que aveces lo hace y aveces lo que me tira es el grid en blanco y aun existiendo la información, y para ninguno lo hace cuando se pone así, de repente aparece que si funciona, me podría ayudar... y por todos lados he metido refresh par ver si ese es el problema...
IF EMPTY(THIS.VALUE)
THISFORM.P.P1.g_cod.ENABLED=.F.
RETURN
ELSE
THISFORM.P.P1.G_cod.ENABLED=.F.
SELECT area3
IF SEEK(this.Value, 'area3')
thisform.P.P1.G_cod.Enabled= .T.
thisform.refresh
THISFORM.Grid1.RecordSource = SPACE(0)
SELECT usuquip1.idusua,usuquip1.nombres FROM usuquip1;
WHERE usuquip1.idarea=this.Value INTO CURSOR UsuaEQ
THISFORM.Grid1.RecordSource = "UsuaEQ"
THISFORM.Grid1.visible= .T.
thisform.cmbarea.Refresh
thisform.grid1.Refresh
ELSE
MESSAGEBOX("Ubicación no Existe!...")
thisform.cmbubica.Value=""
Endif
Thisform.refresh
Endif
Gracias
Cristina
- Compartir respuesta
- Anónimo
ahora mismo