Cristhian Cuba
Cristhian Cuba
Cristhian Cuba
Aplicaciones
. Bases de Datos
. Controles
. Direcciones
. Fechas y tiempo
. Ficheros
. Formularios
. Gráficos
. Impresora
. Informes
. Internet
. Ms Agents
. Pantalla
. Redes
. SQL
. Tablas
. Varios
. Vistas y Consultas
Aplicaciones
Abrir fichero con el programa asociado
Agrerar línea a un .exe
Cierre automático si no hay actividad
Compartir proyecto
Conectar/Desconectar a unidad de red
Detectar si se está ejecutando .EXE o proyecto
Directorio de Windows. Obtener
Evitar que un programa activado desde VFP se cargue más de una vez
FileSystemObject
Formularios abiertos
Grupo de programas. Crear
Hacer desaparecer las barras de herramientas
Identificar las unidades
Incluir rutinas de VB en VFP
Lanzar un programa y esperar a que termine
Logo en pantalla principal
Memoria. Limitar en VFP
Modificar clases base
Número de versión
Pasar parámetros a un ejecutable
Programa DOS. Ejecutar
Programar el objeto _screen
Saber los usuarios que están usando la Aplicación
Saber si finalizó un programa
Salvapantallas. Ejecutar desde VFP
Tamaño del ejecutable. Reducir
Variable pública
Word. Automatización
Bases de Datos
ADO en VFP
Bases de Datos de Access
Bases de Datos en aplicaciones multiusuario
Cambiar la localización de la Base de Datos
Cambiar la localización de la Base de Datos (1)
Cambiar la localización de la Base de Datos (2)
Conectarse con Access desde VFP
Conexión MySQL
Crear origen de datos ODBC 32 por programa
Direccionar ruta BD
Limpiar una Base de Datos
MSDE. Documentación
ODBC. Conveniencia
ODBC. Crear conexión
Direcciones
ADO en VFP
Chat en VFP
Curso de ASP
Dialer para llamada telefónica
E-Mail en VFP
Empaquetar información para transmitir por modem
FileSystemObject
FoxPress
FrameWorks
Garbage Collection
Instalador Inno Setup
Librería FastLib
Manuales
Mensajes anteriores
MsAgent
MySql
Normalizacion
Portal de programación
Portal de VFP
Proteger/Restaurar Outlook
Refox
Universal Thread
VFP.Net
Windows interface
Controles
Ancho de lista de un cuadro combinado
Asociar un ImageList a un control TreeView
Calendario
Cambiar el RecordSource a un grid
Cambiar la tecla pulsada
Cambiar propiedades a controles del mismo tipo
Combobox. Abrir lista
Combobox. Añadir valores
Comprobar si un control está registrado
Contar los controles de un formulario
Desinstalar OCX
Enviar al fondo
Gif animado. Tani.ocx
Grid. Búsqueda incremental
Grid. Cambiar colores
Grid. Columna desactivada
Grid. Mantener las propiedades
Grid. Marcar toda la línea actual
Grid. Eliminar un control añadido
Grid. Ordenar columnas
MP3 en VFP
Otro control en columna de Grid
PageFrame y TabStrip
RichText. Imprimir
RTF
RTF. Impresión
TreeView. Borrar nodos
TreeView. Recorrer
TreeView. Saber botón presionado
TreeView. Versión
Ultimo enfoque
Windows Script Host
Fechas y tiempo
Calcular el primer día del mes
Calcular el último día del mes
Calcular la diferencia de dos fechas en años, meses y días
Calcular la edad
Calcular la fecha de semana santa
Cambiar la fecha y la hora del PC
Convertir una fecha a formato largo
Modificar fecha y hora
Obtener el número de día del año
Primer dia del mes de un dia de la semana (primer viernes de Agosto...)
Transformar una cantidad de segundos a HH:MM:SS
Ficheros
Comprobar si hay disco en la Unidad
Escribir y leer un valor de un fichero INI
Existencia de índice
Ficheros Cobol
Hacer un cursor modificable
Hacer un SEEK o INDEXSEEK a cualquier vista
Obtener los ficheros de un directorio
Saber si existe un directorio
Saber si un alias pertenece a una vista
Saber si se ha modificado un registro
Tratar ficheros .INI
Formularios
Copiar el DataEnvironment a otro formulario
Devolver más de un valor desde un formulario
Formulario ovalado
Formulario redondo
Formulario transparente
Handle de un form
Imprimir un formulario
Matriz a un formulario como parámetro
Mover una ventana sin título
Objetos de un formulario
ThisForm como parámetro
Gráficos
Dibujar cuadro, líneas, etc.
Dimensión de una imagen
MsGraph. Tipos de gráfico
.OCX similar a Paint
Impresora
Cambiar la Impresora por defecto
Cómo configurar Reports cuya longitud del impreso sea configurable por el usuario en Win 9x/NT para impresoras
matriciales
Controlar un poco la impresora
Cuelgues
Impresora por Defecto
Imprimir en cualquier impresora
Imprimir formularios
Papel de tamaño personalizado
Puertos
Redireccionar impresion
Informes
2 tamaños para un report
3 informes en uno
Anclar la barra del preview
Centrar verticalmente un report
Cómo abrir un Report con un Zoom determinado
Cómo exportar los Report a HTML
Cómo incluir la Barra de Herramientas del diseñador de Reports en tiempo de ejecución
Cómo quitar el botón de imprimir de los Preview de los Report en los ejecutables
Contador de hojas
Crystal Report. Cambiar datos
Cristal Report. Enviar parámetros
Crystal Report. Informes
Enviar un informe por e-mail
Fuente predeterminada
Imprimir con formato de Excel
Imprimir texto DOS desde VFP
Informe con número total de páginas (Hoja x de y)
Informe en Word
Informe en HTML
Informes en miniatura
Impresoras matriciales
Interrumpir impresión
Imprimir varias copias de un informe
Maximizar venta de print preview
Número de copias de un Report
Número total de páginas
Preview de Report con seleccionar impresora
Quitar barra de herramientas
Tamaño de Report Personalizado
Títulos de los Report
Truco para el preview de los reports
Internet
Conexión a archivo
Descargar archivos
Dirección URL. Llamar a una
Enviar/Recibir mensajes con Outlook Express
Outlook Express. Libreta de direcciones
Outlook Express. Agregar registros a Libreta de direcciones
Pantalla
Cantidad de colores
Capturar la pantalla
Colores. Calcular
Ocultar/Mostrar la barra de tareas de Windows
Resolución en pantalla
Redes
Dominio. Conocer
Hora del servidor
SQL
Buscar palabra en tabla
Valores .NULL.
Tablas
Actualizar datos que no existen en otra tabla
Append from desde una vista
Busca un campo en una tabla y retorna .T. si tuvo éxito
Campos memo
Crear tablas con campos variables
Crear tablas de referencias cruzadas
Comprobar si ya existe un valor
Insertar registro en una posición
Pasar datos de un cursor a una tabla
Renombrar campo de una tabla
Reparación de encabezado (Tabla)
Tablas que pertenecen a una DBC
Título del campo
Transacción
Varios
Acceso directo en el escritorio
Actualizar el cursor de un grid
Apagar el PC
Api. Datos TYPE
Arrancar el Internet Explorer e ir a una página Web
C.C.C. Dígito de control
Copiar al portapapeles
Copiar, cortar y pegar
Conectar a Internet
Drivers. Listar
Ejecutar un sonido
Encriptación de cadenas
Enviar un email por Outlook
Fax. Envio desde VFP
Formatear un diskette
Formatear un diskette (1)
Función de consecutivos
Función para quitar acentos
Funciones matemáticas
Marcador telefónico
Número de serie del disco
Números a letras
Números a letras (1)
Pasar un número de color a formato RGB
Prototipos al vuelo
Tamaño del disco
Uso de la coma como separador decimal
Validación CIF
Vistas y Consultas
Consultas. Ejecución
Poder hacer un SEEK o INDEXSEEK a cualquier vista
Nivel de optimización de consultas
Velocidad del select
Vistas. Como cambiar el criterio
Vistas. Como cambiar el formato de campos
Vistas actualizables
Vistas parametrizadas que contengan el contenido de un campo
Vistas parametrizadas en una cuadrícula
Aplicaciones
No olvidarse start.
Set Century On
SET century to 19 ROLLOVER 85
Do programa.exe
Tal vez te sea util usar el control TIMER y la funcion Lastkey(), si LastKey() contiene el mismo valor que tienes guardado
en una variable entonces significa que no se presiono ninguna tecla en el lapso de tiempo que definiste en el control
TIMER.
Compartir proyecto
Lo lógico y correcto seria usar la herramienta prevista para ello, el SourceSafe creo que se llama de micro$oft. Viene en la
versión empresarial de Visual Studio y creo que también se vende como producto independiente.
De todas formas, y como solución "CHAPUZA" (pero que yo la uso y funciona) consiste en hacer una copia de los
archivos del projecto (.PJT y .PJX) con otro nombre y que cada uno de vostros abra un proyecto distinto. Asi no da
el error de que el archivo ya esta abierto. Evidentemente, lo que no podreis hacer es abrir los dos usuarios el mismo form o
report o prg. Hay que tener cuidado con eso, pero por lo demas funciona.
--
Luis María Guayán
Tucumán - Argentina
*--------------------------------------------------------
* FUNCTION GetConnection(lcDrive)
*--------------------------------------------------------
* Retorna el nombre de la PC y recurso
* compartido de una conexión de red
* PARAMETROS: lcDrive
* USO: ? GetConnection("K:")
*--------------------------------------------------------
FUNCTION GetConnection(lcDrive)
DECLARE INTEGER WNetGetConnection IN WIN32API ;
STRING lpLocalName, ;
STRING @lpRemoteName, ;
INTEGER @lpnLength
LOCAL cRemoteName, nLength, lcRet, llRet
cRemoteName=SPACE(100)
nLength = 100
llRet = WNetGetConnection(lcDrive,@cRemoteName,@nLength)
lcRet = LEFT(cRemoteName,AT(CHR(0),cRemoteName)-1)
RETURN lcRet
ENDFUNC
*--------------------------------------------------------
* FUNCTION AddConnection(tcDrive,tcResource,tcPassword)
*--------------------------------------------------------
* Conecta un recurso compartido a la unidad tcDrive
* USO: ? AddConnection("Z:","\\PC_REMOTA\RECURSO")
*--------------------------------------------------------
FUNCTION AddConnection(tcDrive,tcResource,tcPassword)
LOCAL lnRet
DECLARE INTEGER WNetAddConnection IN WIN32API;
STRING @lpzRemoteName, ;
STRING @lpzPassword,;
STRING @lpzLocalName
IF PARAMETERS() < 3
lnRet = WNetAddConnection(@tcResource,0,@tcDrive)
ELSE
lnRet = WNetAddConnection(@tcResource,@tcPassword, @tcDrive)
ENDIF
IF lnRet # 0
RETURN "Error " + ALLT(STR(lnRet)) + ;
" al conectar el drive " + tcDrive
ENDIF
RETURN ""
ENDFUNC
*--------------------------------------------------------
* FUNCTION CancelConnection(tcDrive)
*--------------------------------------------------------
* Desconecta una unidad de red
* USO: ? CancelConnection("Z:")
*--------------------------------------------------------
FUNCTION CancelConnection(tcDrive)
LOCAL lnRet
DECLARE INTEGER WNetCancelConnection IN WIN32API;
STRING @lpzLocalName, ;
INTEGER nForce
lnRet = WNetCancelConnection( @tcDrive, 0)
IF lnRet # 0
RETURN "Error " + ALLT(STR(lnRet)) + ;
" al desconectar el drive " + tcDrive
ENDIF
RETURN ""
ENDFUNC
*--------------------------------------------------------
¿ GETENV('WINDIR').
Evitar que un programa activado desde VFP se cargue más de una vez
La misma función que hemos visto en el caso anterior puede ser usada para evitar que un programa externo se cargue mós
de una vez.
Un ejemplo sencillo es el de la calculadora de Windows.
Imaginemos que en nuestra aplicación demos la posibilidad de utilizar la calculadora. Pondríamos una línea come esta:
RUN /N CALC.EXE
Pero si esta línea la ejecutamos más de una vez, se cargarás la calcuadora una y otra vez.
* LA PONEMOS ENCIMA
SetForegroundWindow(nHWD)
* LA ACTIVAMOS
SetActiveWindow(nHWD)
RETURN .T.
ELSE
* VENTANA NO ACTIVA
RETURN .F.
ENDIF
FileSystemObject
http://msdn.microsoft.com/library/devprods/vs6/vbasic/vbenlr98/vaobjfilesystemobject.htm
Formularios abiertos
Local lDevolver
DoEvents
lDevolver = .T.
For EACH oformsAbiertos IN APPLICATION.FORMS
*!* If oformsAbiertos.WINDOWTYPE = 1
*!* lDevolver = .F.
*!* Exit
*!* Endif
If !oformsAbiertos.Salir() && o .release()
*- mis forms base tienen un metodo SALIR...
lDevolver = .F.
Exit
Endif
Next
Return lDevolver
En el paso 6 del asistente de instalación, buscas el ejecutable de tu aplicación y click en la casilla que pone "administrador
del programa". Entonces deberá de salir una pantalla en la que debes especificar una descripción de tu aplicación y en la
casilla línea de comando colocas:
Axel Olivares
If WVisible(‘Estándar’)
Hide Window ‘Estándar’
EndIf
Ariel: Quizás con esto puedas "ir tirando" hasta conseguir lo que buscas
*------------------------------------------------------
FUNCTION ListDrives()
LOCAL ln, lnTipo
FOR ln = 65 TO 92
lnTipo = DRIVETYPE(CHR(ln))
DO CASE
CASE lnTipo = 1
*--- Ningún tipo
CASE lnTipo = 2
? CHR(ln)+": Disquete"
CASE lnTipo = 3
? CHR(ln)+": Disco duro"
CASE lnTipo = 4
? CHR(ln)+": Unidad de red o unidad extraible "
CASE lnTipo = 5
? CHR(ln)+": CD-ROM"
CASE lnTipo = 6
? CHR(ln)+": Disco RAM"
ENDCASE
ENDFOR
RETURN ""
ENDFUNC
*------------------------------------------------------
ó
Puedes usar el File System Object:
oFSO = CREATEOBJECT('Scripting.FileSystemObject')
For Each oDrive in oFso.Drives
? oDrive.DriveLetter
EndFor
declare laDiscos[6]
laDiscos[1] = "Desconocido"
laDiscos[2] = "Removible"
laDiscos[3] = "Partición Local"
laDiscos[4] = "Compartido LAN"
laDiscos[5] = "CD-ROM"
laDiscos[6] = "RAM Disk"
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Compilala como un componente COM y listo. Distribuyes el dll junto con tu aplicacion.
Asi la puedes llamar desde VFP, Excel, Word, etc.
LOCAL loWshShell
* Se hace cosas antes de ejecutar
loWshShell = CreateObject("WScript.Shell")
loWshShell.Run(<path de exe>, 1, .T.)
*Se hacen cosas despues de ejecutar
Pasando .t. en el tercer parámetro del método RUN fuerza a VFP esperar hasta que el EXE llamado termine.
Efectivamente como dice Alex, @ ... SAY es conveniente no usarlo. Si no quieres usar
_screen.image = "d:\MiArchivo.jpg"
_screen.addobject("oImg", "image")
_screen.oImg.picture = "d:\consulta\dv.jpg"
_screen.oImg.visible = .T.
_screen.oImg.stretch = 1
_screen.oImg.width = 640
_screen.oImg.height = 400
--
Luis María Guayán
Tucumán - Argentina
Con esta funcion puedes setear tanto en foreground como en background. Y segun cuentan se deberia probar mas o menos
al tercio de lo que te informa la primera vez...
Pero la recomendacion es que seteas tu necesidad o vayas bajando de a un k para ir probando la performance.
Ademas de lograr un mejor control de memoria, tendras un mejor aprovechamiento que redundara en mayor velocidad de
ejecucion.
Claudio Campos
En tools->options->field mapping y ahí podes especificar que classes debe usar VFP para cada tipo
Hugo
Número de versión
ln = AGETFILEVERSION(laArray,"C:\Exe\MiApp.exe")
Corre el programa en DOS desde Windows Scripting Host, pasando un parámetro .T. para que corra en forma sincrónnica
(o sea que espere).
#define SW_SHOW_NORMAL 1
#define SW_SHOW_MINIMIZED 2
#define SW_SHOW_MAXIMIZED 3
oShell = createobject("WScript.Shell")
oShell.Run("notepad.exe",SW_SHOW_NORMAL,.T.)
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
No se pueden programar directamente, pero un truco que se puede usar es, en una clase tuya agregá un puntero a _screen,
luego puedes reprogramar los métodos del mismo. Por ejemplo
function oScreen.resize
wait window 'Cambiando el tamaño de la ventana principal' nowait
endfunc
Pero no logré que funcione queryunload, pero igual no creo que sea
necesario ya que puedes usar para el mismo on shutdown ¿o no? (no estoy
muy seguro)
Hugo
Te contaré como controlo yo este tema de los usuarios en aplicaciones en red, quizás te pueda servir.
Añado una tabla adicional con los siguientes campos: Puesto, Fecha, Hora, Usuario
En esta tabla, al configurar el puesto de red para que pueda operar con la aplicación, el proceso agrega un registro a dicha
tabla y deja en el campo "Puesto" el valor de sys(0) que devuelve como ya sabrás (la máquina de red cuando se utiliza VFP
en un entorno de red.)
Cuando una máquina, arranca la aplicación lo primero que hace es buscar en dicha tabla su sys(0)
SELE "loquesea"
LOCATE FOR sys(0) $ "loquesea".puesto
si lo encuentra, BLOQUEA EL REGISTRO Y pone en los campos fecha, hora, usuario los respectivos valores
SET REPROCESS TO 1
IF .not. lock() && ya esta bloqueado la aplicación esta arrancada en este puesto
quit && salida
ENDIF
REPLACE "loquesea".Fecha WITH date(), "loquesea".Hora with time(),
"loquesea".Usuario with m.user
SET REPROCESS TO "lo que uses habitualmente"
Este bloqueo, lo mantengo hasta que salga de la aplicación como se debe salir y entonces deja en blanco los campos fecha,
hora, usuario a la vez que desbloquea el registro.
REPLACE "loquesea".Fecha WITH {" "}, "loquesea".Hora with "",
"loquesea".Usuario with ""
unlock
La ventaj que esto tiene, es que al salir de la aplicación "de forma incorrecta, por error, apagon etc" se desbloquea el
registro si bien quedan anotados los datos del puesto, usuario, fecha y hora; los que borro si sale como es debido.
Si al entrar en la aplicación, el registro está bloqueado, es señal de que ya tiene abierta la aplicación y seguramente la tiene
minimizada por lo que puedes procedo a levantarsela y no seguir en esta nueva apertura.
Si al entrar en la aplicación, no esta bloqueado el registro pero resulta que se encuentra los valores de fecha, hora, usuario;
es señal de que la vez anterior que entró, no salido de forma correcta; en tal caso procedo a lanzarle un mensaje de
SEVERO Y PELIGROSO AVISO ( ...tal usuario, entro en fecha y hora a la aplicación y no salio como debía, "es la XXXX
vez que se apaga de forma ilegal" operación muy peligrosa, posible perdida de datos ...avise al servicio tecnico...)
¡ No te puedes hacer idea, de lo bien que queda uno cuando hay problemas y puedes mirar y decirles que ya se ha salido de
la aplicación 23 veces de forma incorrecta, que ¿que es lo que quieren que hagas?, merece la pena guardar estos incidentes
ya que seguramente, acabarán por mostrarte que puestos tienen problemas, bien sea de operador o de máquina o quizás de
windows, reinstalar nuevamente el windows en algunas máquinas suele ser el final de muchos problemas.
Para saber si un terminal, esta conectado, o cuantos hay conectados solamente habrá que repasar la tabla en cuestión y
contar el numero de registro bloqueados.
SET REPROCESS TO 1
SELE "loquesea"
GO TOP
m.contador=0
DO WHIL .not. eof()
m.contador=m.contador+IIF(lock(),0,1)
unclock
SKIP
ENDD
SET REPROCESS TO "lo que uses habitualmente"
? "Hay "+str(m.contador)+" terminales conectados"
Espero que todo lo anterior, te pueda servir de algo; En cualquier caso, un saludo a Todos
jesse
#DEFINE NORMAL_PRIORITY_CLASS 32
#DEFINE IDLE_PRIORITY_CLASS 64
#DEFINE HIGH_PRIORITY_CLASS 128
#DEFINE REALTIME_PRIORITY_CLASS 1600
DO WHILE .T.
* Use timeout of TIMEOUT_INTERVAL msec so the display
* will be updated. Otherwise, the VFP window never repaints until
* the loop is exited.
IF WaitForSingleObject(hProcess, WAIT_INTERVAL) != WAIT_TIMEOUT
EXIT
ELSE
DOEVENTS
ENDIF
ENDDO
********************
FUNCTION long2str
********************
* Passed : 32-bit non-negative numeric value (m.longval)
* Returns : ASCII character representation of passed
* value in low-high format (m.retstr)
* Example :
* m.long = 999999
* m.longstr = long2str(m.long)
PARAMETERS m.longval
PRIVATE i, m.retstr
m.retstr = ""
FOR i = 24 TO 0 STEP -8
m.retstr = CHR(INT(m.longval/(2^i))) + m.retstr
m.longval = MOD(m.longval, (2^i))
NEXT
RETURN m.retstr
*******************
FUNCTION str2long
*******************
* Passed: 4-byte character string (m.longstr)
* in low-high ASCII format
* returns: long integer value
* example:
* m.longstr = "1111"
* m.longval = str2long(m.longstr)
PARAMETERS m.longstr
PRIVATE i, m.retval
m.retval = 0
FOR i = 0 TO 24 STEP 8
m.retval = m.retval + (ASC(m.longstr) * (2^i))
m.longstr = RIGHT(m.longstr, LEN(m.longstr) - 1)
NEXT
RETURN m.retval
RUN /N black16.scr /S
Prueba cambiar el nombre del archivo .SRC con los que se encuentran en tu PC.
--
Luis María Guayán
Tucumán - Argentina
Tamaño del ejecutable. Reducir
Variable pública
Se trata (habitualmente) de un objeto de clase base 'custom' con muchos métodos personales que vas a usar a lo largo de
toda la aplicación y con propiedades que necesitas acceso rápido a ellas sin leer tablas. Típico:
codigo de usuario, pais, moneda, empresa, etc.... Metodos para calcular la letra del nif, los códigos de control de una
cuenta, etc. Puedes aprovecharlo también para guardar algunos datos que necesites en un momento determinado. Por
ejemplo puede ser una buena idea que tenga una propiedad 'datos(20)' que uses para guardar valores.
Se define como pública y se crea en el 'main' del proyecto
public oApp
oApp = createobject("miobjetoaplicacion", par1, par2, ...)
Y en cualquier lugar de la aplicación puedes referirte a el
oApp.datos(3) = m.nMidato
m.nMidato2 = oApp.datos(5)
etc...
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Word. Automatización
loWord = CREATEOBJECT("Word.Application")
loWord.Application.WindowState = 1 && wdWindowStateMaximize
loWord.Documents.Add()
loWord.Selection.TypeText(‘el texto que se desee’)
loWord.Application.Visible = .T.
loRange = loWord.ActiveDocument.Range()
loRange.InsertAfter("Visual FoxPro es super!")
loWord.ActiveDocument.SaveAs("c:\temp\test.doc")
*loWord.PrintOut()
*loWord.Quit()
*release lorange, loWord
.activeDocument.Content.InsertParagraphAfter
.activeDocument.Content.tables.add(.selection.range, renglones, 3)
---------------------
with oWord.selection.tables(1)
.borders(wdborderleft).linestyle = wdlinestylenone
.borders(wdborderright).linestyle = wdlinestylenone
.borders(wdbordertop).linestyle = wdlinestylenone
.borders(wdborderbottom).linestyle = wdlinestylenone
.borders(wdborderhorizontal).linestyle = wdlinestylenone
.borders(wdbordervertical).linestyle = wdlinestylenone
end with
wdlinestylenone = 0
wdborderleft = -2
wdborderright = -4
wdbordertop = -1
wdborderbottom = -3
wdborderhorizontal = -5
wdbordervertical = -6
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Bases de Datos
ADO en VFP
loConnection = createobject("ADODB.Connection")
lcConnectString = "Provider=SQLOLEDB,1;Data Source=MiServidor;User
ID=sa;Password= "
loConnection.Open(lcConnectString)
En tu ejemplo, te faltan los paréntesis en la función Open() (VB no los necesita ya que lo usa como sentencia)
Aqui te reproduzco el ejemplo simple que da Andy McNeill para acceder a tablas de VFP a través de ODBC y ADO:
objConn = Createobject("ADODB.Connection")
objRS = Createobject("ADODB.Recordset")
cSQL = "SELECT * FROM Customers"
objConn.Open("mydata","","")
objRS.Open(cSQL,objConn,3)
HTH
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Si creamos vistas remotas actualizables de todas las tablas de la .Mdb, podremos manejar la Base de Datos de Access desde
Visual Foxpro.
Tambien meto mi cuchara en esta sopa... :-) Opino que la mejor forma de manejar el tema de la base de datos en
aplicaciones multiusuario es la de no incluir la misma en los instaladores sino "generarla" desde la aplicación.
El procedimiento es más o menos así:
1) Se ejecuta la utilidad GENDBC de VFP la cual genera un programa que "reconstruye" la base de datos.
2) Se incluye este programa en el proyecto de la aplicación.
3) Generar los instaladores de la aplicación excluyendo la base de datos.
4) Instalar la aplicación en una de las estaciones
5) Ejecutar la aplicación
6) La aplicación tratar de cargar la ruta a la base de datos desde un archivo de configuración (DBF, INI, MEM como
prefieran)
7) Al no encontrar la ruta, el programa pregunta si se desea "conectar" a una base de datos existentes o desea crear una
nueva. La opción de conectar lo que hace es mostrar el diálogo de selección de directorio para que el usuario indique la
ubicación de la base de datos; la opción de crear la base de datos pide la ubicación de la misma y la genera utilizando el
programa generado por la utilidad GENDBC.
8) Se selecciona la opción de "crear BD" para crear la base de datos vacia
9) Se sale del programa.
10) Se repiten los pasos 4, 5 y 6, solo que esta vez se selecciona la opción "Conectar con BD".
Este mecanismo ya fué implementado en una aplicación masiva multiusuario y funciona de maravillas; claro, solo para
bases de datos VFP: cliente-servidor es otra cosa...
Victor
Los formularios almacenan el path de las tablas definidas en el Entorno de Datos. Por desgracia cuando se distribuye la
aplicación, estos formularios pueden apuntar al directorio donde se desarrollaron. Estos paths deben ser reseteados en
tiempo de ejecución para asegurarnos que apuntan a las tablas correctas.
modificar la clase base del formulario (o cambialo en cada formulario) en el Metodo Load:
*NOTA: esto funciona con tablas de una base de datos, este codigo debe ser modificado si se usan tablas libres.
Saludos,
Pablo Roca
La Coruña - España
http://pagina.de/visualfox (Portal Gratuito de VisualFoxPro en español)
ID Artículo:
Fecha de Creación:
Fecha de Revisión:
E10117
22-nov-1996
19-APR-1997
La información en este artículo se refiere a:
RESUMEN
En este artículo encontrará información de cómo cambiar en el Entorno de datos la localización de la Base de datos.
MÁS INFORMACIÓN
El Entorno de datos contiene información sobre todas las tablas, vistas, y relaciones que interactuan con un Formulario. En
el Generador de Formularios, cuando se añade una tabla al Entorno de datos, la propiedad Database del cursor se establece
con el camino completo de directorios y el nombre de la Base de datos contenedora (.DBC). El path que contiene la
propiedad Database se establece como absoluto.
Si la base de datos no se encuentra al abrir el Formulario, aparecerá el siguiente error:
MÁS INFORMACIÓN
Cuando una tabla se añade al Entorno de datos por medio del Generador de Formularios, se crea un objeto cursor. Si la
tabla forma parte de un DBC, la propiedad Database (solo lectura en modo diseño) del cursor se establece con el path
completo y el nombre del DBC. Sin embargo, puede que se necesite cambiar o modificar el path absoluto al DBC cuando
se distribuya la aplicación. Por ejemplo, diferentes usuarios pueden abrir bases de datos con el mismo nombre, pero
situadas en diferentes directorios. Si usted necesita referenciar una base de datos en un directorio diferente al que está
especificado en la propiedad Database del Objeto Cursor, puede hacerlo usando el comando SET PATH, antes de que el
programa llame al Formulario, indicando la nueva localización de la Base de datos. Si la Base de datos especificada en la
propiedad Database del cursor no se encuentra en el directorio también especificado por dicha propiedad, Visual FoxPro
seguirá buscando en todos los directorios indicados por SET PATH.
Otra alternativa es cambiar la propiedad Database en tiempo de ejecución, que es de lectura/Escritura. El ejemplo siguiente
ofrece flexibilidad a su código, actualizando el path de la propiedad DATABASE de todos los objetos Cursor que hubiera
en el Entorno de datos. Este código puede actualizar el path de diferentes bases de datos referenciadas en el Entorno de
datos. Solo se referencia un directorio en el ejemplo, así que necesitará modificar el código si quiere abrir Bases de datos de
varios directorios.
Quiero poner mi granito de arena en este tema. La función que anexo al final del mensaje actualiza la propiedad Database
de todos los objetos Cursor definidos en un DataEnvironment, a fín de que apunten al DBC actualmente seleccionado. La
llamada se hace desde el evento BeforeOpenTables del objeto DataEnvironment de la forma:
SetCursorDBC(THIS,gcDBCPath)
donde:
********************************************
Victor Espina
http://www.mitrompo.com/vespina
* SetCursorDBC
* Establece la propiedad Database de todos los objetos Cursor que
* contenga el dataenvironment indicado en la propiedad poDataEnvironment
*
Proc SetCursorDBC(toDataEnvironment,tcDBC)
*
*-- Si no se indicaron parámetros o toDataEnvironment no es un objeto, se
cancela el método
local lnNumParams
lnNumParams=parameters()
if lnNumParams=0 or type("toDataEnvironment")<>"O"
return
endif
j=amembers(laCursors,toDataEnvironment,2)
with toDataEnvironment
*
for i=1 to j
*
vCursor=eval("."+laCursors[i])
if vCursor.BaseClass<>'Cursor'
loop
endif
if not empty(vCursor.Database)
vCursor.Database=tcDBC
endif
endfor
endwith
EndProc
7
Conectarse con Access desde VFP
Tienes que crear un DSN de sistema ,desde el mismo panel de control, con el controlador de Access, le das un nombre
descriptivo y lo conectas a tu mdb.
Conexión MySQL
Simplemente con una conexion ODBC que se puede conseguir en su pagina www.mysql.com en el apartado download,
myodbc.
Basta crear, una vez instalado, una conexion con DNS y conectar con SQLCONNECT(<nombre del dns>) o hacerlo sin
crear conexion con DNS, de esta forma:
sqlsetprop(0,"DISPLOGIN",3)
<variable> = sqlstringconnect("DB=<nombrebasedatosmysql>;SERVER=<Dir.Ipdonde esta el servidor de mysql>;
UID=root;PWD=;PORT=3306;OPTION=25;STMT=";DRIVER={MySQL};DSN='')
a partir de aqui, y de cualquiera de las dos formas anteriores, teneis el numero de conexion en <variable> y "atacas" a
mysql con ordenes del tipo:
Vuelvo a insistir en que es un sistema muy estable y que nos esta dando unos resultados fantasticos. Ademas, a partir de la
version creo que 3.23.19 (ahora va por la 3.23.24), tiene replicacion de bases de datos entre un maestro y n esclavos.
Nosotros tenemos dos servidores cada uno con las mismas bases de datos mysql; cada vez que modificamos un registro en
el servidor maestro nos esta actualizando, automaticamente, el servidor esclavo. Ademas no hay limite en poner tantos
servidores esclavos como se quiera. Nuestro miedo estaba en que cayera la velocidad de proceso pero no
lo ha hecho en absoluto.
Solo una cosa mas. Aunque MySql nacio para Linux es perfectamente utilizable en Windows, de hecho nosotros la estamos
utilizando con servidores NT. La velocidad de actualizacion de las versiones es muy alta, incluyendo mejoras
continuas. Ademas MySql es muy, muy rapido, ..., en windows. Con un servidor Linux vuela.
Un saludo.
Rafael Mateo Rivero
Hola Edison, yo lo pude hacer mediante una Api, no se si se puede de otro modo, te paso el codigo, espero te sirva.
IF lnResp = 0
MESSAGEBOX("No se pudo crear el ODBC", 48 , "ERROR")
llRt = .F.
ELSE
* MESSAGEBOX("BIEEEEEEEEEN ", 48 , "OK")
llRt = .T.
ENDIF
Direccionar ruta BD
Hola Oscar. Yo utilizo el botón de acceso directo de windows. En el destino pongo la ruta donde está mi ejecutable y en
"iniciar en" pongo el directorio compartido donde tengo los datos. Con esto tengo los ejecutables en cada máquina y los
datos compartidos en el servidor. Dentro de la aplicación tengo un path al sys(5)+sys(2003) mas mi directorio de datos. De
esta forma no hay que cambiar nada, vale tanto si está todo en el mismo directorio como si están separados los ejecutables
de los datos.
Un saludo. Angela.
MSDE. Documentación
MIcrosoft Data Engine (MSDE) es prácticamente lo mismo que SQL Server 6.5
Entiendo qyue esta por salir una versión con el motor de SQL Server 7
http://msdn.microsoft.com/library/default.asp?URL=/library/backgrnd/html/usingmsde.htm
http://msdn.microsoft.com/library/default.asp?URL=/library/backgrnd/html/msdeforvs.htm
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
ODBC. Conveniencia
Paso previo muy economico para pasar tus aplicaciones a cliente / servidor. Esto ya no es tan importante al haber varias
bases de datos free, como mySQL, Interbase 6, ...
En concreto le veo otra aplicación, para mi bastante importante, imaginate que comunicas con la central o una delegación ,
via internet, vpn, o una conexion RAS directa. Si desde tu puesto abres una tabla, ten en cuenta que en ese momento
empieza a viajar por el cable el indice de dicha tabla, hay veces que moverse por las tablas en una conexión de este tipo son
un suplicio, si accedes a las tablas via ODBC para VFP, solo te traeras los datos que necesites, en ningun caso te traeras el
indice. Si no quieres pasarte a una base de datos de servidor, esto resulta mucho mas comodo de
trabajar quecon las tablas directamente.
Respecto a la velocidad, lo desconozco, yo estoy por implementar algo sobre ODBC para VFP, y entonces empezare a
realizar las pruebas de velocidad.
--
Saludos,
Espero que lo siguiente te sirva. Si tu quieres conectarte a BD VFP mediante ODBC, debes primero crear tu conexion en el
administrador de ODBC. Ahi debera indicar el nombre de la conexion.
Este mismo nombre debes senalar para conectarte en VFP. POr ejemplo, si creaste una conexion llamada "datos", deberas
conectarte DESDE VFP con el comando =sqlconnect("datos") como es una funcion te devolvera un valor, es un valor
numerico si es mayor a 0 la conexion fue existosa. El valor devuelto te permitira manejar tus datos. Por ejemplo si te
devuelve el valor 1, tu te referiras para realizar una consulta de la siguiente manera, =sqlexec(1,"select * from autor")
Marcelo Ivan
Controles
Para que coincida con el ancho del cuadro, debe ser igual a éste menos 26, pero si está dentro de una página será igual al
ancho del cuadro menos 10.
Inserta un imagelist en el formulario después de haber insertado el treeview, ajusta sus imágenes y en el evento 'init' del
treeview sitúa este código:
this.ImageList = thisform.imagelist1.object
Para asignar una imagen a un nodo usa los parámetros 5 y 6 del método 'add' de la colección 'nodes'
thisform.treeview1.Nodes.add(relativa, relación, clave, texto, imagen, imagen_seleccionada)
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Calendario
Para que en el inicio el control tome la fecha del sistema pone en el Init
del formulario:
ThisForm.oleCalendar.Object.Today
Luis María Guayán
Tucumán - Argentina
Cuando realizamos operaciones con los datos de un grid, como cambiarle el recordsource y vincularlo a otro origen de
datos (tabla/cursor/vista), hay veces en las que se estropea el grid (se pierden los anchos de las columnas, ...), incluso
sucede cuando realizamos diversas operaciones con dichos datos:
LOCAL lcRecordSource
lcRecordSource = ALLTRIM(This.RecordSource)
This.RecordSource = ""
This.RecordSource = lcRecordSource
Si queremos vincularlo a otro cursor o datos, pues simplemente hay que hacer:
thisform.cs_grdresal1.recordsource='lv_diariote'
Es valido si se mantienen los mismos nombres de campos y orden, yo también por asegurarme que todo va bien, siempre
restauro los controlsources de las columnas:
thisform.cs_grdresal1.column1.controlsource='lv_diariote.diafapun'
thisform.cs_grdresal1.column3.controlsource='lv_diariote.dianasi'
thisform.cs_grdresal1.column4.controlsource='lv_diariote.diacuenta'
thisform.cs_grdresal1.column6.controlsource='lv_diariote.diaconcep'
thisform.cs_grdresal1.column7.controlsource='lv_diariote.diadebe'
thisform.cs_grdresal1.column8.controlsource='lv_diariote.diahaber'
thisform.cs_grdresal1.column9.controlsource='lv_diariote.diadivcod'
Evento KeyPress
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
IF nKeyCode=5
Dodefault(9,nShiftAltCtrl)
ENDIF
Toni Atència i Puigdomènech
Departamento informático
[email protected]
www.excover.com
EXCOVER, S.A.
this.addproperty('aTest(1)')
with this
dimension .aTest(5)
.aTest(1)='Argentina'
.aTest(2)='Canada'
.aTest(3)='Mexico'
.aTest(4)='Nicaragua'
.aTest(5)='Inglaterra'
asort(.aTest)
.RowSource='this.aTest'
.RowSourceType=5
endwith
Está el viejo truco de intentar crearlo desactivando la rutina de error, y si la creación tiene éxito está registrado.
on error nada()
mmm = createobject(...)
on error ...
if type("mmm") = "O" && éxito en la creación
...
else
...
endif
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
* Método NombreX
LPARAMETERS oThis
LOCAL loControlRef
LOCAL loControlCont
* Controles de la forma
FOR EACH loControlRef IN oThis.CONTROLS
WITH loControlRef
DO CASE
CASE .BASECLASS = "Textbox"
* Hacer algo en en este Texbox
CASE .BASECLASS = "Editbox"
CASE .BASECLASS = "Combobox"
CASE .BASECLASS = "Commandbutton"
CASE .BASECLASS = "Checkbox"
CASE .BASECLASS = "Grid"
CASE .BASECLASS = "Pageframe"
FOR EACH loPageRef IN .PAGES
WITH loPageRef
THISFORM.NombreX( loPageReft)
ENDWITH
ENDFOR
CASE .BASECLASS = "Page"
THISFORM.NombreX( loControlRef )
CASE .BASECLASS = "Container"
THISFORM.NombreEste Método( loControlRef )
ENDCASE
ENDWITH
ENDFOR
Desinstalar OCX
RegSvr32 /u RutaNombre
Enviar al fondo
En el Grupo microsoft.public.es.vb consegui este Control que te permite mostrar un Gif Animado.
*----------------------------------------------------------------------
* Para hacer una BUSQUEDA INCREMENTAL en un Formulario, debemos poner un
* TextBox (Text1) y una Grilla (Grid1).
* En el Entorno de datos insertaremos la tabla (MiTabla)
* En el método InteractiveChange del TexBox
* escribir el siguiente código:
*----------------------------------------------------------------------
*--- InteractiveChange ---
local lc, lnRecno
Select MiTabla
lc = allt(This.Value)
lnRecno = recno()
if MiTabla.Nombre >= lc
if not bof()
skip -1
endif
if MiTabla.Nombre < lc && debe quedar donde estaba
if lnRecno <= recc()
go recno()
else
go bott
endif
return
endif
if not empty(order()) && busqueda con indice
seek lc
else
go top
locate rest for MiTabla.Nombre=lc while MiTabla.Nombre <= lc nooptimize
endif
else
locate rest for MiTabla.Nombre=lc while MiTabla.Nombre <= lc nooptimize
endif
if lnRecno # recno()
ThisForm.Grid1.SetFocus && el nombre del TextBox
ThisForm.Text1.SetFocus && el nombre del Grid
endif
return
*--- END InteractiveChange ---
*----------------------------------------------------------------------
* NOTA: SE DEBE TENER LAS SIGUIENTES CONSIDERACIONES:
* -La tabla debe estar ordenada ASCENDENTEMENTE o existir un indice
* por Nombre y estar seleccionado (el método busca si hay un
* SET ORDER establecido)
* -Fijarte bien el nombre del TexBox y del Grid para invocar el
* método SetFocus (en el ejemplo Grid1 y Text1)
* -Fijarte el alias de la tabla del grid (en el ejemplo MiTabla)
* -Conviene que los nombres estén en mayúsculas y añadir en la
* propiedad Format del TextBox = ! para que sean ingresados en mayúsculas
* -Conviene que la propiedad del Grid RecordMark = .T. para que se vea
* el registro marcado, o manejar el color del registro seleccionado
*----------------------------------------------------------------------
Señalas el control añadido con las propiedades, presionas click en el marco superior de la ventana y luego presionas delete
Método puntero
thisform.registro = recno("mialias")
thisform.grid1.refresh()
Método pongrid
m.condicion = 'iif(recno("mialias") = thisform.registro, rgb(...),
rgb(...))' && elije los colores que quieras
thisform.grid1.setall("dynamicbackcolor", m.condicion, "column")
m.condicion = 'iif(recno("mialias") = thisform.registro, rgb(...),
rgb(...))' && elije los colores que quieras
thisform.grid1.setall("dynamicforecolor", m.condicion, "column")
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Enabled = .F.
Antes de hacer un REQUERY() para que se refrescara la información de los grid, debía primero que desconectarle a ellos la
fuente, es decir:
si el RecordSource del Grid es "MiVista" entonces tendría que hacer lo siguiente:
this.SetAll("DynamicBackColor",;
"IIF(RECNO()=thisform.nRegistroActualGrid, RGB(0,0,128), this.BackColor)",;
"Column")
this.SetAll("DynamicForeColor",;
"IIF(RECNO()=thisform.nRegistroActualGrid, RGB(255,255,255),
this.ForeColor)",;
"Column")
thisform.nRegistroActualGrid =RECNO()
this.Refresh()
Has un metodo en tu grid base, y solo poner en los click de tus header lo siguiente
this.Parent.PArent.SetORder("cPolicy", THIS)
Donde el primer parametro es el TAG que debes tener (el segundo es una variante mia, aun no implementada, la idea era
mandar el header como parametro para manipular su color y caption, e indicar visualmente la columna que esta
'activamente ordenada').
Claudio Campos
Rafaela, Santa Fe
{CSETORDERGRID.SETORDER}
LPARAMETERS tcControlSource, toHeader
LOCAL loSelect, ;
lnCount, ;
lcField
*-- See if the field name is in the leftmost part of the index
*-- expression. If so, SET ORDER TO the index.
FOR lnCount = 1 TO TAGCOUNT()
IF UPPER(SYS(14, lnCount)) = UPPER(lcField)
SET ORDER TO lnCount
IF TYPE("thisform") == "O"
thisform.Refresh()
ENDIF
EXIT
ENDIF
ENDFOR
MP3 en VFP
En la Galeria de componentes de Herramientas esta el control _soundplayer1. Para ver mejor como funciona hay un sample
de API para reproducir musica con VFP.
Por defecto VFP, te pone textbox en las columnas, lo que tienes que hacer es lo sig.
selecciona el textbox de la columna que quieres, pero desde la ventana de propiedades, después debes hacer click en el
formulario, pero OJO, debe ser sobre la barra de titulo del formulario, para que no pierda el foco el textbox, después de eso
presionas la tecla Suprimir, para que lo borres, ok, después de eso seleccionas el control ComboBox, de la barra de
controles y haces click sobre la columna donde lo quieres, y listo a modificar las propiedades del combo, ya que
automáticamente se te modifica la propiedad CurrentControl de la columna correspondiente..!!
http://www.sistec.com.mx/~leodan
PageFrame y TabStrip
Si van a utilizar pageframes el control incluido en el VFOX unicamente soporta los tabs en la parte superior, peeeerooooo:
pueden usar el Activex incluido "TabStrip" en combinacion con el pageframe
Al pageframe definanlo con la cantidad de paginas que necesiten la propiedad Tabs ponganla a .f. pero durante el diseño no
podran manejar las paginas directamente, asi que durante el diseño pueden dejarla como .t. y en el init del pageframe
ponganlas como .f. ( this.tabs = .f.)
en el tabstrip en el evento click pueden mandar llamar un metodo que ejecute el siguiente
codigo (o pueden poner el siguiente codigo directamente ahi mismo)
combinando estos dos controles podran tener un pageframe con los tabs arriba, a la izquierda, a la derecha, abajo
solo que no se les olvide que deben habilitar el TabStrip, entre los activex a incluir en la distribucion, en el SetupWizard
RichText. Imprimir
Debes utiliza el metodo selprint del control. Aqui te pongo un ejemplo para imprimir todo el contenido
control.selstart=1
control.sellength=len(control.textrtf)
Control.selprint
Emilio Fernandez
RTF
http://msdn.microsoft.com/library/devprods/vs6/basic/rtfbox98/vbojrichedit.htm
RTF. Impresión
Ricardo : No podes imprimir directamente del Richtext control lo tenes que hacer en convinacion con un CommonDialog.
Te mando un ejemplo para poner en un boton de impresion, Espero te sirva.
cdlPDReturnDC =256
cdlPDNoPageNums =8
cdlPDAllPages =0
cdlPDSelection =1
WITH THISFORM
.CommonDialog1.Flags = cdlPDReturnDC + cdlPDNoPageNums
If .RichTextBox1.SelLength = 0 Then
.CommonDialog1.Flags = .CommonDialog1.Flags + cdlPDAllPages
Else
.CommonDialog1.Flags = CommonDialog1.Flags + cdlPDSelection
EndIf
.CommonDialog1.ShowPrinter
.RichTextBox1.SelPrint( .CommonDialog1.hDC )
ENDWITH
thisform.treeview1.nodes.clear()
TreeView. Recorrer
1.- Defino una propiedad en el form que contendrá el número de botón apretado. Ejemplo Boton
LPARAMETERS NODE
Mario Jacas
Cuba. Costa Rica
TreeView. Versión
Queda claro.
La versión 1 está en comctl32.ocx
La versión 2 en mscomctl.ocx
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Ultimo enfoque
--
Alex Feldstein
MCP - Visual FoxPro
Direcciones
ADO en VFP
Busca en www.microsoft.com/data/
Chat en VFP
En el siguiente link podras bajar una aplicacion muy interesante de cómo poder chatear por medio de fox.
http://www.fpress.com/revista/Num0012/articulo.htm
Curso de ASP
http://www.loresolvi.com/portal/asp.php
www.fpress/revista/Num9803/Mar98.htm
E-Mail en VFP
Hay un excelente juego de controles (todos escritos en VFP nativo, no ActiveX) llamados Fox Extension Classes. Uno de
ellos hace exactamente lo que tu quieres.
Ver: http://www.eps-software.com/fec
--
Alex Feldstein - MCP
----------------------------------------------------------
Claudio Rivadera
La Rioja-Argentina
FileSystemObject
Aparte del linbk que te han dado, puedes ver más sobre WSH y FSO en:
http://msdn.microsoft.com/scripting/
http://www.windows-script.com/
--
Alex Feldstein - MCP Visual FoxPro
Miami, FL, USA
FrameWorks
Es difícil recomendar un framework. Todos tienes sus pros y sus contras. Es una decisión muy personal.
Hay una cantidad, con diversas filosofías. La decisión depende mucho de tus necesidades, conocimientos y estilo de
programación.
Para programas más "clásicos" de red uso Visual Maxframe Profesional 5 de Drew Speedie. Este por supuesto hace todo lo
que mencioné anteriormente.
Tienen su foro de soporte técnico en http://discussion.visualmaxframe.com/ y también hay much a gente que lo usa y ayuda
en UT.
Con respecto a tu pregunta sobre cambio de idioma (se conoce esto como "internacionalización" de programas), VMP es
muy fácil de hacer ya que se conecta muy bién con INTL de Steven Black, el que también uso. VMP también tiene fácil
conexión (hooks) con SDT de Doug Hennig y wwXML de Rick Strahl en el caso que los quieras usar.
Para diseños distribuidos (N-Tier), VMP es un poco mas complicado de adaptar (al menos en esta versión) ya que está
basado en forms. En ese caso puedes ver Visual Fox Express, Mere Mortals, Codebook, COMCodebook, entre otros.
FoxPress
--
Luis María Guayán
Tucumán - Argentina
Garbage Collection
http://fox.wikis.com/wc.dll?Wiki~ManualGarbageCollection~VFP
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Yo no sé qué haría sin el Inno Setup. Gratuito y excelente, es una de mis herramientas básicas.
http://www.jordanr.dhs.org/isinfo.htm
Vicent Palasí
Librería FastLib
Según dicen es freeware, y en un principio parece diseñada para Visual Basic, pero desde VFP, los estoy probando y
funcionan muy bien.
¿Los puede incluir en mis aplicaciones, o al ser freeware no se puede cobrar por una aplicación que incorpore estos
controles?
--
Un saludo.
Jesús Sanz
[email protected]
Manuales
www.manualesgratis.com
http://members.es.tripod.de/gratis
Mensajes anteriores
Vicent Palasí
Prueba en http://www.deja.com/home_ps.shtml
MsAgent
http://msdn.microsoft.com/workshop/c-frame.htm?929066716826#/workshop/imedia/agent/default.asp&RLD=79
MySql
Se pueden usar en Windows y Linux( y algun otro mas quizas), yo tengo instalado para win95 y funciona de maravillas
( php y mysql ).
el site de php es www.php.net
mysql www.mysql.com
Normalizacion
http://fox.wikis.com/wc.dll?Wiki~DataNormalization
http://www.oreilly.com/catalog/accessdata2/chapter/ch04.html
http://www.comptechnews.com/~reaster/dbdesign.html
Hugo
Portal de programación
Portal de VFP
El PortalFox: http://clik.to/visualfox
El nuevo PortalFox: http://portalfox.nexen.net
Proteger/Restaurar Outlook
Hay un proceso que te sirve para dejar tu recien instalado Outlook y Outlook Express como estaba en el otro disco. Busca
en
http://www.svetlian.net/.
Saludos
Rafael Figueroa
Refox
http://mx.briefcase.yahoo.com/porcamicheria
-> Mi Carpeta
-> Bingo - Lo que estabas buscando !
=Refox 8.0 Instalacion.zip
Datos de Acceso:
Screen Name: ***El usuario de su cuenta de MySpace***
User Password: ***EL Password de su cuenta de MySpace***
Shared Folder Password: compartido
Archivo:
Refox 8.0 Instalacion.zip 1.4Mb
Kevin Mitnick
Maicrosoft LVP
En esta otra dirección pueden encontrar más. Solo que necesitan el Winrar para descomprimir, en otros casos se puede
utiliar el winzip.
http://www.filesearch.ru/cgi-bin/s?q=refox&m=20&f=1&l=en
copien y peguen.
Universal Thread
http://www.universalthread.com/
--
Alex Feldstein - MCP
----------------------------------------
VFP.Net
Laa resurreccion de VFP y las consejos para programadores VFP en el entorno .Net
http://www.lespinter.com/GetOpEd.asp?ArtNum=21
a partir de enero este site va a estar completamente en castellano e ingles, por ahora es todo en ingles.
Windows interface
http://msdn.microsoft.com/library/devprods/vs6/visualc/vccore/_core_the_user_interface_guidelines_for_microsoft_windo
ws.htm
--
Alex Feldstein - MCP
--------------------------------------------
Fechas y tiempo
*------------------------------------------------
FUNCTION _EOM(dFecha)
*------------------------------------------------
* Retorna el último día del mes (EndOfMonth)
* USO: _EOM(DATE())
* RETORNA: Fecha
*------------------------------------------------
LOCAL ld
ld = GOMONTH(dFecha,1)
RETURN ld - day(ld)
ENDFUNC
*-----------------------------------------------------
* FUNCTION Dif_AMD(tdIni, tdFin)
*-----------------------------------------------------
* Calcula la diferencia entre dos fechas en:
* años, meses y días
* Usa la función DiasDelMes()
*-----------------------------------------------------
FUNCTION Dif_AMD(tdIni, tdFin)
LOCAL ldAux, lnAnio, lnMes, lnDia, lcRet
*--- Fecha inicial siempre menor
IF tdIni>tdFin
ldAux = tdIni
tdIni = tdFin
tdFin = ldAux
ENDIF
lnAnio = YEAR(tdFin) - YEAR(tdIni)
ldAux = GOMONTH(tdIni, 12 * lnAnio)
*--- No cumplio el año aun
IF ldAux > tdFin
lnAnio = lnAnio - 1
ENDIF
lnMes = MONTH(tdFin) - MONTH(tdIni)
IF lnMes < 0
lnMes = lnMes + 12
ENDIF
lnDia = DAY(tdFin) - DAY(tdIni)
IF lnDia < 0
lnDia = lnDia + DiasDelMes(tdIni)
ENDIF
*--- Si el dia es mayor, no cumplio el mes
IF (DAY(tdFin) < DAY(tdIni))
IF lnMes = 0
lnMes = 11
ELSE
lnMes = lnMes - 1
ENDIF
ENDIF
lcRet = ALLTRIM(STR(lnAnio))+ " AÑOS, " + ;
ALLTRIM(STR(lnMes))+ " MESES Y " + ;
ALLTRIM(STR(lnDia))+ " DIAS."
RETURN lcRet
ENDFUNC
*-----------------------------------------------------
* FUNCTION DiasDelMes(dFecha)
*------------------------------------------------
* Retorna los días de un mes. Usada por Dif_AMD
*------------------------------------------------
FUNCTION DiasDelMes(dFecha)
LOCAL ld
ld = GOMONTH(dFecha,1)
RETURN DAY(ld - DAY(ld))
ENDFUNC
Calcular la edad
*-----------------------------------------------------
* FUNCTION Edad(tdNac, tdHoy)
*-----------------------------------------------------
* Calcula la edad pasando como parámetros:
* tdNac = Fecha de nacimiento
* tdHoy = Fecha a la cual se calcula la edad.
* Por defecto toma la fecha actual.
*-----------------------------------------------------
FUNCTION Edad(tdNac, tdHoy)
LOCAL lnAnio
IF EMPTY(tdHoy)
tdHoy = DATE()
ENDIF
lnAnio = YEAR(tdHoy) - YEAR(tdNac)
IF GOMONTH(tdNac, 12 * lnAnio) > tdHoy
lnAnio = lnAnio - 1
ENDIF
RETURN lnAnio
ENDFUNC
Juan Pablo te paso una función que no es mía, calcula el Domingo de Pascua, por ende, se deduce la Semana Santa.
*---------------------------------------------------------------
* FUNCTION _Pascua(tnAnio)
*---------------------------------------------------------------
* USE: _Pascua(1999)
* PARAMETRO: Año a calcular
* RETORNO: Fecha del Domingo de Pascua
*---------------------------------------------------------------
FUNCTION _Pascua(tnAnio)
LOCAL lnCentena, lnAux, lnNroAureo, lnDomingo, lnEpactaJul, ;
lnCorrSolar, lnCorrLunar, lnEpactaGreg, lnDiasLunaP, ;
lnDiasLuna15, lnDiasPascua, ldFecIni, ldFecPascua
IF NOT BETWEEN(tnAnio,1000,9999)
MESSAGEBOX("Rango inválido [1000..9999]")
RETURN {//}
ENDIF
lnCentena = INT(tnAnio/100)
lnAux = (tnAnio+1)%19
lnNroAureo = lnAux+(19*INT((19-lnAux)/19))
lnDomingo = 7+(1-tnAnio-INT(tnAnio/4)+lnCentena-INT(lnCentena/4))%7
lnEpactaJul = ((11*lnNroAureo)-10)%30
lnCorrSolar = -(lnCentena-16)+INT((lnCentena-16)/4)
lnCorrLunar = INT((lnCentena-15-INT((lnCentena-17)/25))/3)
lnEpactaGreg = (30+lnEpactaJul+lnCorrSolar+lnCorrLunar)%30
lnDiasLunaP = 24-lnEpactaGreg+(30*INT(lnEpactaGreg/24))
lnDiasLuna15 = (27-lnEpactaGreg+(30*INT(lnEpactaGreg/24)))%7
lnDiasPascua = lnDiasLunaP+(7+lnDomingo-lnDiasLuna15)%7
ldFecIni = EVALUATE("{^"+STR(tnAnio,4)+"/03/21}")
ldFecPascua = ldFecIni+lnDiasPascua
RETURN ldFecPascua
ENDFUNC
*==========================================================================
FUNCTION WriteLocalTime(ltDateTime)
*==========================================================================
* Escribe mediante API el GetLocalTime
* Parametro: Debe pasarse una variable del tipo DateTime
* Retorno: .T. si pudo cambiar fecha y hora
* .F. envio un parámetro no válido o error
* Autor: LMG - 1998.09.14
*==========================================================================
IF TYPE("ltDateTime") # "T"
RETURN .F.
ENDIF
LOCAL lcCadena
lcCadena = _10to256(YEAR(ltDateTime),2) + ;
_10to256(MONTH(ltDateTime),2) + ;
_10to256(DOW(ltDateTime),2) + ;
_10to256(DAY(ltDateTime),2) + ;
_10to256(HOUR(ltDateTime),2) + ;
_10to256(MINUTE(ltDateTime),2) + ;
_10to256(SEC(ltDateTime),2) + ;
_10to256(000,2) + SPAC(24)
RETURN SetLocalTime(lcCadena)
ENDFUNC
*==========================================================================
FUNCTION _10to256(lnNumero, lnCant)
*==========================================================================
* Toma número en base 10 y lo convierte en "lnCant" caracteres en base 256
* Usada por: WriteLocalTime()
* Autor: LMG - 1998.09.14
*==========================================================================
LOCAL lcRetorno, lnAscii
lcRetorno=''
DO WHILE lnNumero >= 256
lnAscii=MOD(lnNumero,256)
lcRetorno=lcRetorno + CHR(lnAscii)
lnNumero=INT(lnNumero / 256)
ENDDO
lnAscii=lnNumero
lcRetorno=lcRetorno + CHR(lnAscii)
RETURN PADR(lcRetorno, lnCant, CHR(0))
ENDFUNC
*==========================================================================
m.dFecha = {01/01/2000}
allt(str(day(m.dFecha))) + " " + cmonth(m.dfecha) + " " +
allt(str(year(m.dfecha)))
¿ DMY(dFecha)
Hola Javier,
--
Josep Mª Picañol
AUTO DIESEL VIC, S.A.
Vic-Barcelona
e-mail: [email protected]
web: www.autodieselvic.com
Resta la fecha en cuestión menos el primer día del año 01,01, year(date)
Return pfecha-date(year(pfecha),1,1)+1
Hay algunas ocasiones en las que es útil saber el primer dia del mes en el que cae un dia de la semana. Por ejemplo en los
Estados Unidos el primer lunes de septiembre es vacaciones.
La siguiente función dado un mes y un año devuelve la fecha en la que cae un dia de la semana 1 = Domingo, 2 = Lunes,...
Notas: el siguiente codigo usa funciones que pueden estar solo disponibles a VFP 6.0.
* FUNCTION: FirstDay.prg
Ejemplo:
* Saber el primer Lunes de septiembre del año actual.
ldSeptMon = FirstDay(9, YEAR(DATE()), 2)
*--------------------------------------------------------------------------
* FUNCTION _Seg2Hor(nSegundos)
*--------------------------------------------------------------------------
* Transforma segundos a formato hhHH:MM:SS
* USO: _Seg2Hor(nSegundos)
* EJEMPLO: _Seg2Hor(35000)
* RETORNA: Caracter 'HH:MM:SS'
*--------------------------------------------------------------------------
*FUNCTION _Seg2Hor(nSegundos)
lpara nSegundos
LOCAL lnHoras, lnMinutos, lnSegundos
lnHoras = INT(nSegundos/3600)
lnMinutos = INT(((nSegundos-(lnHoras*3600))/60))
lnSegundos = MOD(nSegundos,60)
RETURN IiF(lnHoras<100,TRANSFORM(lnHoras,"@L 99"),TRANSFORM(lnHoras,"@L 9999")) +":"+ ;
TRANSFORM(lnMinutos,"@L 99")+":"+ ;
TRANSFORM(lnSegundos,"@L 99")
ENDFUNC
Ficheros
Códigos correlativos
1) Usa SET REPROCESS TO 1 en lugar de AUTOMATIC. Esto hara que VFP trate de
bloquear el registro solo una vez.
USE Contadores
LOCATE FOR Contador=cContador
IF NOT FOUND()
....
ENDIF
Como vez, la rutina se queda en el ciclo DO WHILE hasta que el usuario que
está obteniendo el siguiente valor de un contador lo libere con el UNLOCK.
Esto te garantiza que, no importa que tan rápidas sean las llamadas a la
función, el registro nunca estará desbloqueado para dos usuarios
simultáneamente.
HTH
Victor
Para saber si tienes el disco en qualquier unidad, puedes utilizar la siguiente función... que es nativa de fox y no necesita
librerias ni declaraciones....
FUNCTION DriveReady
LPARAMETERS cDrive
LOCAL lReturn, oDrive, oFileSystemObject
oFileSystemObject = CREATEOBJECT("Scripting.FileSystemObject")
oDrive = oFileSystemObject.GetDrive(cDrive)
lReturn = oDrive.IsReady
RETURN lReturn
--
Mario Acevedo
[email protected]
Montevideo-Uruguay
*----------------------------------------------------
FUNCTION WriteFileIni(tcFileName,tcSection,tcEntry,tcValue)
*----------------------------------------------------
* Escribe un valor de un archivo INI.
* Si no existe el archivo, la sección o la entrada, la crea.
* Retorna .T. si tuvo éxito
* PARAMETROS:
* tcFileName = Nombre y ruta completa del archivo.INI
* tcSection = Sección del archivo.INI
* tcEntry = Entrada del archivo.INI
* tcValue = Valor de la entrada
* USO: WriteFileIni("C:\MiArchivo.ini","Default","Port","2")
* RETORNO: Logico
*----------------------------------------------------
DECLARE INTEGER WritePrivateProfileString ;
IN WIN32API ;
STRING cSection,STRING cEntry,STRING cEntry,;
STRING cFileName
*----------------------------------------------------
FUNCTION ReadFileIni(tcFileName,tcSection,tcEntry)
*----------------------------------------------------
* Lee un valor de un archivo INI.
* Si no existe el archivo, la sección o la entrada, retorna .NULL.
* PARAMETROS:
* tcFileName = Nombre y ruta completa del archivo.INI
* tcSection = Sección del archivo.INI
* tcEntry = Entrada del archivo.INI
* USO: ReadFileIni("C:\MiArchivo.ini","Default","Port")
* RETORNO: Caracter
*----------------------------------------------------
LOCAL lcIniValue, lnResult, lnBufferSize
DECLARE INTEGER GetPrivateProfileString ;
IN WIN32API ;
STRING cSection,;
STRING cEntry,;
STRING cDefault,;
STRING @cRetVal,;
INTEGER nSize,;
STRING cFileName
lnBufferSize = 255
lcIniValue = spac(lnBufferSize)
lnResult=GetPrivateProfileString(tcSection,tcEntry,"*NULL*",;
@lcIniValue,lnBufferSize,tcFileName)
lcIniValue=SUBSTR(lcIniValue,1,lnResult)
IF lcIniValue="*NULL*"
lcIniValue=.NULL.
ENDIF
RETURN lcIniValue
ENDFUNC
Existencia de índice
IF PARAMETERS() < 2
pAlias = ALIAS()
ENDIF
IF EMPTY(pAlias)
RETURN .F.
ENDIF
lEsTag = .F.
pNombreTag = UPPER(ALLTRIM(pNombreTag))
lTagNum = 1
lTagEncontrado = TAG(lTagNum, pAlias)
DO WHILE !EMPTY(lTagEncontrado)
IF UPPER(ALLTRIM(lTagEncontrado)) == pNombreTag
lEsTag = .T.
EXIT
ENDIF
lTagNum = lTagNum + 1
lTagEncontrado = TAG(lTagNum, pAlias)
ENDDO
RETURN lEsTag
ENDFUNC
Saludos
Eduardo Amat.
Ficheros Cobol
Mira, yo me tuve el mismo problema y estuve investigando un poco. Existe un programa llamado DATA JUNCTION que
lee un archivo de un tipo y lo convierte a otro tipo (reconoce y convierte mas de 30 formatos distintos). Tambien
trabaja con archivos Cobol como MS-Cobol, etc, MENOS con los archivos de RM-COBOL (que por supuesto son con los
que necesitaba laburar yo). Si tus archivos no estan en RM-COBOL podes usar esta aplicacion, existen una version demo
que yo use y la obtuve de la revista numero 61 de Solo Programadores (una reviste de origen español). Si por desgracia son
RM-COBOL o conseguis a alguien que los convierta en TXT o usas el metodo del listado el cual esta piola siempre y
cuando el sistema viejo liste todos los datos necesarios. (El problema principal que existe con los archivos de cobol es
que este lenguaje usa como el RPG campos numericos empaquetados, para ahorrar espacio en el disco, entonces cuando lo
queres visualizar ves un codigo de ASCII tipo archivo ZIP en vez de numeros, es ahi donde necesitas algo que lo "abra" y
lo grabe en un formato legible por otros programas).
Bueno, espero esto te sirva.
Feliz Navidad.
Hernan.
HC-SISTEMAS
Argentina
ICQ: 14378324
FUNCTION hazmodificable
LPARAMETERS tcalias
USE DBF(tcalias) IN 0 AGAIN alias xxTemp
USE DBF("xxTemp") IN (tcalias) AGAIN ALIAS (tcalias)
USE IN xxTemp
En las vistas con modo de almacenamiento en bufer a tabla (es decir 4 o 5), no se
les puede crear un indice, y por tanto no se puede hacer SEEK o INDEXSEEK en ellas.
Para resolver esto se ha reealizado la sisuiente rutina:
************************************************************
*
* Funcion: INDEXVISTA
*
* Indexa cualquier tipo de vista
*
* Parametros:
*
* tcvista - Nombre de la vista
* tcexpr - expresion completa para indexar
* tctag - nombre del indice (tag)
*
* Ejemplos:
*
* ret=indexview("lv_alelin","allart+STR(mov,3)","allart")
*
* Retorno
*
* devuelve verdadero/falso si se pudo crear el indice
*
* Nota
*
* La vista debe estar abierta
*
* Ultima Modificacion: 05/04/2000 Pablo Roca
* Creacion : 05/04/2000 Pablo Roca
*
************************************************************
FUNCTION indexvista (tcvista, tcexpr, tctag)
LOCAL lcOldBufering, llret, lcalias
IF PCOUNT()=3
lcalias = ALIAS()
SELECT (tcvista)
lcOldBufering=CURSORGETPROP("Buffering")
llret=CURSORSETPROP("Buffering",3)
IF llret
INDEX ON &tcexpr TAG (tctag)
SET ORDER TO
llret=CURSORSETPROP("Buffering",lcOldBufering)
ENDIF
IF !EMPTY(lcalias)
SELECT (lcalias)
ELSE
SELECT 0
ENDIF
ELSE
llret = .F.
ENDIF
RETURN llret
ENDFUNC
Ejemplo de uso:
ret=indexvista("lv_alelin","allart+STR(mov,3)","allart")
Con esto podremos realizar cualquier SEEK (mejor SEEK() ) o INDEXSEEK sobre la vista
GETFLDSTATE()
Necesita manejar Buffers.
Obtener los ficheros de un directorio
Aparte de adir()
lc = SYS(2000, "*.DBF")
DO WHILE NOT EMPTY(lc)
USE (lc) EXCLUSIVE
REINDEX
lc = SYS(2000, "*.DBF", 1)
ENDDO
xDir="C:\CLIENTES /Aux"
If !File(xDir)
wait wind "No existe"
Else
Wait Wind "Ya existe"
Endif
RETURN
IIF(WritePrivateProfileString(tcSection,tcEntry,tcValue,tcFileName)=1, .T.,
.F.)
ENDFUNC
*----------------------------------------------------
FUNCTION ReadFileIni(tcFileName,tcSection,tcEntry)
*----------------------------------------------------
* Lee un valor de un archivo INI.
* Si no existe el archivo, la sección o la entrada, retorna .NULL.
* PARAMETROS:
* tcFileName = Nombre y ruta completa del archivo.INI
* tcSection = Sección del archivo.INI
* tcEntry = Entrada del archivo.INI
* USO: ReadFileIni("C:\MiArchivo.ini","Default","Port")
* RETORNO: Caracter
*----------------------------------------------------
LOCAL lcIniValue, lnResult, lnBufferSize
DECLARE INTEGER GetPrivateProfileString ;
IN WIN32API ;
STRING cSection,;
STRING cEntry,;
STRING cDefault,;
STRING @cRetVal,;
INTEGER nSize,;
STRING cFileName
lnBufferSize = 255
lcIniValue = spac(lnBufferSize)
lnResult=GetPrivateProfileString(tcSection,tcEntry,"*NULL*",;
@lcIniValue,lnBufferSize,tcFileName)
lcIniValue=SUBSTR(lcIniValue,1,lnResult)
IF lcIniValue="*NULL*"
lcIniValue=.NULL.
ENDIF
RETURN lcIniValue
ENDFUNC
*----------------------------------------------------
Saludos.
Jesús Aceves.
[email protected]
Formulario ovalado
lWH = _WhToHWnd(_WFindTitl(this.caption))
* Tener cuidado que no vas a poder cerrar la ventana con la 'x' de arriba.
Formulario redondo
fcnColocaRegion = regfn("SetWindowRgn","III","I") && Función para colocar la región en la ventana con el handle
obtenido
*Pueden modificar los parámetros para colocar la región donde uds quieran y hacerla más o menos ancha
IF mRGN <> 0 THEN && Si se creó la región
mSalida = callfn(fcnColocaRegion,hWndActiva,mRGN,1) &&Colocamos la región en la ventana de la
* que obtuvimos en handle
ENDIF
ENDIF
Function GetHwndForm
LParameter toForm
Local lcCaption
lcCaption = toForm.Caption
toForm.Caption = Sys(3)
Local lnHWND
lnHWND = _WhToHwnd( _WFindTitl(toForm.Caption) )
toForm.Caption = m.lcCaption
Return m.lnHWND
Formulario transparente
Handle de un form
***************************************************************************
***************************************************************************
*
* Función : HandlerVentana
* Proposito : Obtiene le manejador de la ventana principal de VFP
* Parametros : Titulo de la ventana de VFP
* Nota : La ventana debe tener el mismo Caption o Texto del Titulo
* que la cadena que se pasa en el parametro
* Regresa : Numero entero con el manejador de la ventana
* Ejemplo : HandlerVentana("Calculadora")
*
***************************************************************************
***************************************************************************
FUNCTION HandlerVentana(c_Caption)
LOCAL n_HWD
IF n_HWD > 0
RETURN n_HWD
ENDIF
ENDFUNC
***************************************************************************
Imprimir un formulario
Te envío una función que me encontré en internet de Mauricio Atanache, y que a mí me funciona correctamente. Has de
tener cargado Foxtools.FLL.
***********************************************************************
*!* ====================================
*!* Child and Parent Form Print Function -- by Mauricio Atanache
*!* ====================================
* Use this procedure as PrintForm( Thisform ) or PrintForm( _Screen )
*******************
* Author : Mauricio Atanache G.
* Date : December 10/97
* Parameters : oObjeto is an object FORM, for example THISFORM,
* ACTIVEFORM, _SCREEN
****************************************************************
Procedure PrintForm
******************
lParameters oObjeto
LOCAL cAlias, lUsado
PUBLIC cTituloFormPrint
* Save current alias
IF USED(ALIAS())
cAlias=ALIAS()
lUsado=.T.
ELSE
lUsado=.F.
ENDIF
* Put image in clipboard
If !TomaFoto( oObjeto )
Return
Endif
*SET STEP ON
* Create a cursor for store the image, uses a general field
CREATE CURSOR Foto_Pantalla (SCREEN G)
SELECT Foto_Pantalla
APPEND BLANK
* Copy the image from the clipboard to the general field
DEFINE WINDOW Ventana FROM 1,1 TO 4,4
MODIFY GENERAL Foto_Pantalla.SCREEN NOWAIT WINDOW Ventana
KEYBOARD "{CTRL+V}{CTRL+W}" CLEAR
*WAIT WIND "***************************" TIMEOUT 2
RELEASE WIND Ventana
DOEVENTS
* Debemos crear un informe llamado prtform con un OleControl y SCREEN como
* fuente
IF !EMPTY(Foto_Pantalla.SCREEN)
SELECT Foto_Pantalla
m.cTituloFormPrint = oObjeto.Caption
IF TYPE('oApp') == 'O'
IF oApp.lDesarrollo
oApp.PrintPreview('prtform')
ELSE
REPORT FORM prtform.frx NOCONSOLE TO PRINTER PROMPT
ENDIF
ELSE
REPORT FORM prtform.frx PREVIEW NOCONSOLE
ENDIF
ELSE
WAIT WINDOW "No se puede imprimir el formulario activo."
ENDIF
* Cerramos el cursor
USE IN Foto_Pantalla
* Restauramos el alias activo al entrar
IF lUsado
SELECT(cAlias)
ENDIF
Return
***************************************************************
* Author : Mauricio Atanache G.
* Date : December 10/97
* This function puts the image of the form in the clipboard, you can use
* it to send form images to other aplications as Word etc.
* Also you can modify this function to print or copy any object on
* screen.
* Parameters : oForm is an object FORM, for example THISFORM,ACTIVEFORM,
_SCREEN
**************************************************************************
Function TomaFoto
******************
lParameters oForm
Local nHwnd, tnHwnd, hDC, hDC_Mem, hBitMap, hPrevBmp
* Must use the Foxtools library, somewhere.
Declare integer FindWindow in Win32Api String cClassName, String cWindName
Declare integer GetDC in Win32Api integer nhwnd
Declare integer CreateCompatibleDC in Win32Api integer nhcd
Declare Integer BitBlt in Win32Api Integer hDestDC, Integer x, Integer y,
Integer nWidth, Integer nHeight, Integer hScrDC, Integer xsrc, Integer ysrc,
Integer dwRop
Declare Integer SelectObject in Win32Api Integer hDC, Integer hObject
Declare Integer CreateCompatibleBitmap in Win32Api Integer hDC, Integer
nWidth, Integer nHeight
Declare Integer SetClipboardData in Win32Api Integer nFormat, Integer
hObject
Declare Integer DeleteDC in Win32Api Integer hDC
Declare Integer ReleaseDC in Win32Api Integer nwnd, Integer hdc
Declare Integer DeleteObject in Win32Api Integer hDC
lnwhandle = _WFindTitl(oForm.Caption)
nHwnd = _WhToHWnd(lnwhandle)
hDC = GetDC( nHwnd )
hDC_Mem = CreateCompatibleDC( hDC )
hBitMap = CreateCompatibleBitMap( hDC, oForm.Width, oForm.Height )
If hBitMap#0
hPrevBmp = SelectObject( hDC_Mem, hBitMap )
BitBlt( hDC_Mem, 0, 0, oForm.Width, oForm.Height, hDC, 0, 0, 13369376 )
If OpenClip( nHwnd )
EmptyClip()
SetClipboardData( 2, hBitMap )
CloseClip()
Else
MessageBox( 'Error opening the clipboard', 48, 'Message' )
Endif
Else
MessageBox( 'Error creating bitmap', 48, 'Menssage' )
Endif
DeleteDC( hDC_Mem )
ReleaseDC( nHwnd, hDC )
Return .t.
*******************************************
*!* e-mail : [email protected]
*!* Address : Crr 19 No. 75 - 20 of 401, Bogotá - Colombia
*!* Telephone : 3460746 - 3460673
***********************************************************************
Saludos.
=========================
Francisco J. Simarro López
[email protected]
Departamento de Informática
Diputación de Albacete
http://www.dipualba.es
========================
Matriz a un formulario como parámetro
lcAnt = SET("UDFPARMS")
SET UDFPARMS TO REFERENCE
Si vas a trabajar en un formulario, puedes crear una propiedad del tipo array, añadiendo una nueva propiedad, y cuando te
pregunta el nombre le pones: aMatriz(1)
--
Luis María Guayán
Tucumán - Argentina
DIJ
Objetos de un formulario
No entiendo muy bien lo que quieres hacer Agustín, pero aquí van dos tips:
1) Si quieres usar el SYS(1272) para obtener una referencia a un objeto cualquiera, debes cambiar el nombre del formulario
en la cadena devuelta por la palabra THISFORM:
cRutaObj=STRTRAN(cRutaObj,thisform.Name,"THISFORM")
luego:
oObj=eval(cRutaObj)
2) Si lo que quieres es pasear por todos los objetos existentes en un formulario, sin importar si los mismos están contenidos
en containers o pageframes, puedes usar la rutina AOBJETCS() que anexo (la incluyo para todos por que es muy pequeña).
Un ejemplo de su uso:
local array aObjs[1]
local oObj,nCount
nCount=aObjects(@aObjs,thisform)
if nCount > 0
for each oObj in aObjs
....
endfor
endif
por defecto, la función toma en cuenta todos los objetos dentro del contenedor indicado (thisform en el ejemplo) y los
objetos contenidos a su vez en ellos. Si solo quieres la lista de objetos en el contenedor, sin
incluir los que están contenidos a su vez, solo añades .F.:
nCount=aObjects(@aObjs,thisform,.F.)
Victor
LPARAMETERS tFormPadre
ThisForm.Codigo = tFormPadre.Codigo
Con esto pasas como parámetro una referencia a todo el formulario Clientes.
Si tu necesidad es solo tomar la Propiedad Codigo del formulario Clientes, debes llamar al formulario Busqueda:
LPARAMETERS tCodigo
ThisForm.Codigo = tCodigo
--
Luis María Guayán
Tucumán - Argentina
Gráficos
Simplemente crea el objeto Image, asigna en la propiedad picture del mismo el nombre archivo jpg y leé luego
las propiedades width y height de la imagen:
_screen.addobject('MyPicture', 'Image')
_screen.MyPicture.picture='YourFile.jpg'
? _screen.MyPicture.width, _Screen.MyPicture.height
Saludos
Hugo
Anillos -4120
Anillos seccionados 80
Área 3D -4098
Área 3D apilada 78
Área 3D 100% apilada 79
Barras 3D agrupadas 60
Barras 3D apiladas 61
Barras 3D 100% apiladas 62
Circular 3D -4102
Circular 3D seccionado 70
Circular 5
Circular seccionado 69
Circular con subgráfico circular 68
Circular con subgráfico de barras 71
Columnas 3D -4100
Columnas 3D agrupadas 54
Columnas 3D apiladas 55
Columnas 3D 100% apiladas 56
Líneas 3D -4101
Área 1
Área apilada 76
Área 100% apilada 77
Barras agrupadas 57
Barras apiladas 58
Barras 100% apiladas 59
Burbujas 15
Burbujas con efectos 3D 87
Columnas agrupadas 51
Columnas apiladas 52
Columnas 100% apiladas 53
Barra cónica agrupada 102
Barra cónica apilada 103
Barra cónica 100% apilada 104
Columna 3D cónica 105
Columna cónica agrupada 99
Columna cónica apilada 100
Columna cónica 100% apilada 101
Barra cilíndrica agrupada 95
Barra cilíndrica apilada 96
Barra cilíndrica 100% apilada 97
Columna 3D cilíndrica 98
Columna cilíndrica agrupada 92
Columna cilíndrica apilada 93
Columna cilíndrica 100% apilada 94
Líneas 4
Líneas con marcadores 65
Líneas apilada con marcadores 66
Línea 100% apilada con marcadores 67
Líneas apiladas 63
Líneas 100% apiladas 64
Barra piramidal agrupada 109
Barra piramidal apilada 110
Barra piramidal 100% apilada 111
Columna piramidal 3D 112
Columna piramidal agrupada 106
Columna piramidal apilada 107
Columna piramidal 100% apilada 108
Superficie 3D 83
Superficie (vista superior) 85
Superficie (estructura metálica vista superior) 86
Superficie 3D (estructura metálica) 84
Dispersión -4169
Dispersión con líneas 74
Dispersión con líneas y sin marcadores de datos 75
Dispersión con líneas optimizadas 72
Dispersión con líneas optimizadas y sin marcadores de datos 73
Radial -4151
Radial relleno 82
Radial con marcadores de datos 81
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
MetaDraw en http://www.bennet-tec.com
ImageXpress pro en http://www.pegasustools.com/
pero no se si funcionen con Visual FoxPro, es cuestion de probar..!
Impresora
Por Ed Rahu
Puede existir algunos casos en los que nos interese que nuestro programa establezca la impresora por defecto
en vez de 'someterse' a la que windows le tiene marcada. Para esto puedes utilizar GetPrinter pero la verdad
es que no acaba de funcionar como a uno le gustaría.
En realidad la clave está en usar la función APRINTERS(), y la clave del Registry para el usuario acutal.
La clave del Registry
HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\Print\Printers
Contiene la lista de las impresoras definidas en el sistema para el usuario que ha hecho el login. Cada
impresora se define en una subclave y ésta es la lista que nos devuelve APRINTERS() en la primera columna
del array de dos dimensiones.
En la clave de impresoras del Registry existe una clave llamada Default que contiene el valor de la impresora
por defecto. Si en vez de ésa escribes el nombre de la impresora que quieres usar como impresora por defecto,
tanto VFP como el resto de las aplicaciones Windows utilizarán esa impresora como la impresora por defecto
EMail: [email protected]
Cómo configurar Reports cuya longitud del impreso sea configurable por el usuario en Win 9x/NT para impresoras
matriciales
Cómo configurar Reports cuya longitud del impreso sea configurable por el usuario en Win 9x/NT para
impresoras matriciales
El Driver
- Tener instalado en la impresora el driver adecuado.
El Report
- En El Report, en el campo del primer registro se debe de poner:
Tag: vacío
Tag2: Vacío
Puede ser que en alguna ocasión te interese tener un control un poco más determinado de la impresora
pudiendo saber si tiene papel o no, si tiene tonner, si está bloqueada, etc...
Esto propiamente no se puede hacer con VFP pero sí con el API de Windows. Mira esto:
lcprinter = 'LPT1:'
lnhandle = 0
llresult = (OpenPrinter(@lcprinter,;
@lnhandle, 0) # 0)
IF llresult
lnsize = 0
= GetPrinterInfo(lnhandle, 2,;
0, 0, @lnsize)
lcstruct = REPLICATE(CHR(0), lnsize)
llresult = (GetPrinterInfo(lnhandle,;
2, @lcstruct, lnsize, @lnsize) # 0)
IF llresult
lcstatus = SUBSTR(lcstruct, 73, 4)
lnstatus = 0
FOR lni = 1 TO 4
lnstatus = lnstatus + ASC(SUBSTR(;
lcstatus, lni, 1)) * ;
(256 ^ (lni - 1))
NEXT
? lnstatus
ENDIF
= ClosePrinter(lnhandle)
ENDIF
* Imprime los códigos devueltos por Win95/98
Cuelgues
Despues de muchas horas de investigación, probando con w95, w98, con sp3, sin sp3, con otros drivers etc. Hemos
descubierto que al menos con impresorad stylus color 600, laserjet 6p/6m y otras muchas el cuelgue de la impresora se
soluciona cambiando en la bios el modo de lpt1 (EPP+SPP) u otro modo, lo mejor probar con todos.
Para cuelgue de stylus 600, se soluciona con el driver que viene con w98, puesto que con los drivers que están en las
paginas de epson, da igual la versión del driver (la última es de 1998) se cuelga, además cambiar el modo de lpt1 a
(EPP+SPP) por ejemplo.
Abre el fichero frx del report como si fuera una tabla y en el primer registro deja en blanco los campos tag, tag2 y expr.
Cuidado porque esto se cuelga y da errores en NT.
Angela.
Imprimir formularios
function printscreen
LPARAMETERS tnHWnd, tcJobName
De esta forma, a la hora de imprimir el reporte tomará el tamaño de hoja especificado en la impresora.
Saludos!
Del Gavilán!
Puertos
El Set printer actua a través del SO (Windows), para saltarse windows directamente al puerto utiliza ... TO LPT1 o LPT2,
es decir report form ... to lpt1 o lpt2.
Francisco M.
Redireccionar impresion
Para solucionar esto puedes hacer lo siguiente.
1. a una variable cualquiera guardas la impresora que tienes por defecto ej. idefault=set("PRINTER",2)
2. buscas con aprinters el nombre de la otra impresora para tener el nombre de esta. ej. =aprinters(x)
en esta matriz tienes todas las impresoras instaladas en tu pc. entonces
3. a otra variable asignas el nombre de la otra impresora asi itemporal=x(1,1) o itemporal=x(2,1) ...
en pocas palabras debes conocer el nombre de la otra impresora.
4. ahora preparas el envio.
set printer on
set device to print
set printer to name (itemporal)
@ prow(),0 say "Primera linea"
@ prow()+1,0 say "Segunda linea"
.
.
5. haces el cambio de la impresora para imprimir el otro reporte.
set printer to name (idefault)
@ prow(),0 say ""
....
Espero te sirva.
Roger
Informes
Ricardo,
Si el informe no está incluido en el proyecto (pues entonces sería de solo lectura) puedes antes de emitirlo cambiar los
valores del campo 'expr' del primer registro del archivo frx, que como sabes es una tabla fox.
Por ejemplo para poner tamaño personalizado a 600 x 500 decimas de milimetro tendrías que incluir las siguientes líneas
(sustituyendo las existentes):
PAPERSIZE=256
PAPERLENGTH=600
PAPERWIDTH=500
3 informes en uno
Para centrar las filas agrupadas calcula las filas en blanco (nNumLineasInsertar ) que deberías insertar al principio de la
cabecera.
Solo necesitas saber el número total de líneas que caben en el report.
cRetornos la puedes calcular en el Evento <al entrar> de la cabecera del report correspondiente a la parte agrupada.
Para ello utilizas una función, por ejemplo CalculaLineasInsertar(@cRetornos)
Function CalculaLineasInsertar(tcRetornos)
.... calcular nNumLineasInsertar
tcRetornos = REPLICATE( CHR(13), nNumLineasInsertar )
return
Pintas cRetornos en una caja de texto que ocupe todo el ancho del report, y la colocas inmediatamente encima de donde
quieras que se desplace el contenido del report.
Activas la opción <ajustar al contenido del texto>.
Todos los controles del grupo los pones flotantes.
De esta forma el grupo de líneas subirá o bajará de altura de acuerdo al valor de cRetornos.
Pruébalo .....
Un saludo
Paco Satué
Vladimir Shevchenko
© Copyrights 1998 by FoxPress, All rights reserved
FoxPress, Mayo 1998
Muchos programas de tratamiento de texto o generadores de informes tienen la posibilidad de exportar sus resultados a
documentos con formato HTML. Sin saber HTML, puedes tener lo mismo usando algún pequeño truco como el que te
comento a cotinuación.
Lo único que tienes que hacer es crear un fichero ASCII usando las funciones de bajo nivel de Visual FoxPro. Algo como lo
siguiente puede servir.
LOCAL lnCanal,lcOutput
lnCanal=FCREATE('test.html')
lcOutput='
Esto es un test
'
FPUTS(lnCanal,lcOutput)
FCLOSE(lnCanal)
Sonrie por favor....
Basado en Q138969
En los ejecutables que uno realiza le puede interesar dotar a sus usuarios de la posibilidad de modificarse los
informes para incorporar nuevos campos o eliminar algunos de los que has puesto. Esta posibilidad la puedes
incluir poniendo el MODI REPORT con el report correspondiente.
No obstante, la barra de herramientas del diseñador de Reports no siempre se muestra y es relativamente fácil
que el usuario la pierda. A continuación se explica como dejar disponible para el susuario esa Barra de
Herramientas
Hay dos métodos: el primero pasa por el archivo de recursos FoxUser. El segundo utiliza el menú y el menú del
sistema.
Método UNO
Cómo quitar el botón de imprimir de los Preview de los Report en los ejecutables
De la Web
1) SET resource OFF 2) USE main_esource_file_name 3) COPY structure to "ViewOnly.DBF" 4) SET resource
to "ViewOnly.DBF" 5) SET resource ON 6) Select "View", "Toolbars". 7) Escoge "Print Preview", and click
Customize… 8) Click-and-drag el botón con el icono de la impresora OFF del Preview Toolbar 9) Click "Close"
en la Customize Toolbar window 10) Si normalmente quieres que el Preveiw Toolbar este anclado (docked),
hazlo ahora 11) SET resource OFF 12) SET resource TO main_resource_file_name 13) SET resource ON 14)
USE "ViewOnly.DBF" exclusive 15) BROWSE 16) Localiza el registro donde ID="TTOOLBAR" y Memo contiene
"Print Preview" 17) Change ReadOnly to True 18) Exit the Browse-window & close the "ViewOnly.DBF" table.
19) INCLUDE the "ViewOnly.DBF" and "ViewOnly.FPT" files in your project. 20) Cuando quieras hacer un
preview de un report SIN el icono de imprimir, usa las siguientes órdenes: 21) m.OldResourceOnOff =
SET("RESOURCE") 22) m.OldResourceName=SET("RESOURCE", 1) 23) SET resource OFF 24) SET
resource TO "ViewOnly.DBF" 25) RELEASE window "Print Preview" 26) REPORT FORM my_report PREVIEW
27) SET resource OFF 28) SET resource to &OldResourceName 29) SET resource &OldResourceOnOff 30)
RELEASE window "Print Preview"
La órden para borrar la ventana del "Print Preview" se incluye para asegurarse de que FoxPro usaraé la
configuración del ToolBar en el nuevo archivo de recursos; en caso de que el preview de un report haya sido
realizado bajo un archivo de recursos diferente (o con ninguno), donde el icono de la impresora sí que estaba
disponible. En ese caso sin la órden RELEASE, FoxPro usaría la configuración del original toolBar, en lugar de
los valores establecidos en el archivo de recursos "ViewOnly". Esto no es algo fácil de imaginar pues ni la
forma de adaptar esas barras de herramientas ni los archivos de recursos son explicados con detalle en la
documentación de VFP.
Contador de hojas
Se corre el reporte dos veces. La primera vez la salida del reporte va a una ventana no visible.
* Se define la ventana
Define Window x From 1,1 To 20,20
* Se activa la ventana de manera invisible
Activate Window x NoShow
* Se prepara una variable pública para recibir el número de hojas
oApp.nPaginas = 0
* Se ejecura el reporte, cuyo nombre está en la variable cReporte
Report Form (cReporte)
* Se guarda el número de hojas del reporte
oApp.nPaginas = _PAGENO
* Se elimina la ventana de paso
Release Window x
* Se activa la ventana actual, en este caso "informes"
Activate Window Informes
* Se ejecuta el reporte a la impresora, como quieras
* Dentro de tu reporte usas la variable oApp.nPaginas para la expresión que
deseas.
* Por ejemplo "ALLTRIM(STR( _pageno)) de oApp.nPaginas"
Creo que lo que quieres es conectar tu reporte a otra base de datos, (si no es asi disculpa).
para realizar esto debes entonces realizar lo siguiente:
CrystalReport1.DataFiles(0) = cPathDB
donde cPathDB es una varible donde colocas la direccion de la base de datos.
Hola claro que se pueden enviar parametros, puedes enviar algun valor a una formula que este insertada en el reporte por
ejemplo
En tu reporte puedes insertar un fomula field (o campo formula), tu por default o por que te dieron ganas le asignaste el
valor de: "Miercoles", y cuando vas a mandar llamar el reporte ya no quieres que diga Miercoles sino
Lunes entonces lo que debes hacer es dentro del codigo de visual establecer
aqui cabe señalar que las formulas dentro de un reporte se manejan o se hacen referencias como elementos de un arreglo,
pero no quiere decir que la formula "FORMULA", sea el elemento 0 del arreglo si no que le indicas al
crystal cuantas formulas estas usando me entiendes?? lo de menos es el indice que le des.
Function _CRReport
Lparameters tcCursorName, tcPath, tcRPTName, tcTableName
lcAlias = alias()
Select (tcCursorName)
lcTemp = sys(2015)
Copy to (tcPath+lcTemp) type fox2x
oCrystal=CreateObject("Crystal.CRPE.Application")
#Define WS_MAXIMIZE 29949952
Declare integer GetForegroundWindow in WIN32API
Declare short IsWindow in WIN32API integer
oRpt = oCrystal.OpenReport(tcRPTName)
With oRpt
With .Database.Tables(tcTableName)
.Location = tcPath+lcTemp+".dbf"
Endwith
With .PrintWindowOptions
.CanDrillDown = .t.
.HasCancelButton = .t.
.HasCloseButton = .t.
.HasExportButton = .t.
.HasGroupTree = .t.
.HasNavigationControls = .t.
.HasPrintButton = .t.
.HasPrintSetupButton =.t.
.HasProgressControls =.t.
.HasRefreshButton =.f.
.HasSearchButton =.t.
.HasZoomControl =.t.
Endwith
.preview ("Report Preview "+"by VFP",,,,,WS_MAXIMIZE,0)
Endwith
Erase (tcPath+lcTemp+".*")
If !empty(lcAlias)and used(lcAlias)
Select (lcAlias)
Endif
En modo diseño:
1.- Modifica cualquier informe
2.- Asegúrate de que ves alguna barra de herramientas (por ejemplo la de controles de informes)
3.- Pincha con el botón derecho en cualquier barra de herramientas.
4.- De la lista que aparece selecciona 'Vista preliminar (Aparece la barra vista preliminar)
5.- Pincha con el botón derecho en la barra de herramientas 'Vista preliminar'
6.- Elige la opción 'personalizar' (Aparece la ventana 'Personalizar barra de herramientas...')
7.- Pincha el botón 'imprimir' (icono impresora) de la barra de herramientas y arrástralo fuera de ella (desaparecerá de la
barra)
8.- Sal del diseño de informe (no es necesario guardar cambios)
9.- Distribuye tu archivo de recursos (foxuser.dbf y foxuser.fpt) junto con las aplicaciones.
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Enviar un informe por e-mail
Mira, yo he visto en otras noticias anteriores y he encontrado una página que contiene un software que te permite enviar tus
reportes por mail. La página es www.hotsend.com en ella lo puedes bajar. es absolutamente gratis y facil de usar. Te crea
una Impresora, la cual tu seleccionas al tirar el reporte y luego te carga un programa que te indica si quieres enviar el
reporte o guardarlo en disco. ES MUY BUENO.
Fuente predeterminada
Bueno, yo solo conozco una manera y se hace despues de crear el informe, no es nada intuitiva pero funciona... me explico:
Con esto ponemos como predeterminado la fuente Tahoma a 12 puntos y negrilla, si en fontstyle ponemos 0 tendremos
letra normal.
Con esto se podria hacer una rutina que investigara en el directorio y lo hiciera para todos los informes, o sea recursiva.
Saludos,
Pablo Roca
La Coruña - España
http://pagina.de/visualfox (Portal Gratuito de VisualFoxPro en español)
Impresoras matriciales
Mira el archivos DOSPRINT.ZIP en la sección Archivos de mi página. Es una clase que te facilita la vida a la hora de
generar reportes para impresoras matriciales.
Victor Espina
http://www.mitrompo.com/vespina
#define xlLastCell 11
#define xlMaximized -4137
#define xlRangeAutoformatClassic2 2
#define xlPortrait 1
* abrir el workbook
oExcel.SheetsInNewWorkBook = 1
oWorkbook = oExcel.Workbooks.Open(cFileName)
oExcelApp = oExcel.Application
oExcelApp.WindowState = xlMaximized
--
Alex Feldstein - MCP
----------------------------------------------------------
Para imprimir un informe con un Pie de página que tenga el formato "Página # de #", donde se indica el nº de página actual
y el total de páginas del informe, se debe usar una función definida por el usuario, tal como se explica a continuación.
Para obtener el número total de páginas, es necesario ejecutar el informe dos veces. Para lanzar el informe se puede utilizar
el siguiente código :
**********PRINCIPIO DE PROGRAMA*****************
CLEAR
CLOSE DATABASES
USE tabla.dbf && tabla.dbf es la tabla utilizada por el Informe
pgcnt = 0 && Almacenará el número de páginas total
check =.T. && Para ejecutar la función pgcnt solo una vez
Old_Con = SET('CONSOLE')
SET CONSOLE OFF
REPORT FORM Informe NOCONSOLE && 'Informe' se lanza una 1ª vez
REPORT FORM Informe TO PRINTER && 'Informe' se imprime
SET CONSOLE&Old_Con
PROCEDURE pgcnt
check =.F.
pgcnt = _PAGENO && Obtiene el número total de páginas
RETURN ''
************FIN DE PROGRAMA***********************
La variable 'check' se utiliza para impedir que la función PGCNT() se ejecute más de una vez.
Se debe modificar el informe para introducir en la Banda de Resumen un campo con la siguiente expresión:
IIF(check=.T.,PGCNT(),'')
En el Pie de página del informe, se debe introducir:
Informe en Word
USE D:\COMPARTIR\VALCAR_05-09-2000
lcTitulo = "PRUEBA"
oFrx2Word = CREATEOBJECT('Frx2Word')
oFrx2Word.SaveFolder="C:\Temp\"
oFrx2Word.DOC_FileName="Wordprueba.doc"
nSuccess=oFrx2Word.ReportForm("Clan_Email")
IF nSucces = 0
= messagebox('siiiiiiiiiii', 48 )
else
= messagebox('no funciona.....', 48 )
endif
Saludos, Emiliano.
--
-------------------------------------------------------------
Mail to: Emil_39 ARROBA hotmail.com
-----------------------
ICQ 34013175
Informe en HTML
Informes en miniatura
Supongo que te imprime en miniatura cuando utilizas la cláusula PROMPT en el REPORT FORM ...
Yo evité el problema lanzando un SYS(1037) (creo que es ese) antes del REPORT FORM... en lugar de añadir PROMPT.
Interrumpir impresión
func sigue
** aqui chequear inkey() o algun flag activado con un
** on key , etc. Hay muchas formas.
Printjob
_pcopies = total_copias
report form informe noconsole to printer
endprintjob
Hay dos maneras posibles. La primera es mas sencilla pero tiene el problema de que es bastante mas lenta
2) =ReportCopias("c:\listados\mireport",ncopias)
=ReportCopias("c:\listados\mireport",1)
FUNCTION ReportCopias
LPARAMETER lcFRX, lnCopias
LOCAL lcNewExpr, lnStartCopiesLine, lcStartAtCopiesLine, lnEndCopiesLine ;
lnLenCopiesLine, lcTop, lcBottom, lcAlias
#DEFINE vfCRLF CHR(13) + CHR(10)
IF EMPTY(EXPR)
lcNewExpr = "COPIES=" + ALLT(STR(lnCopias)) + vfCRLF
ELSE
lnStartCopiesLine = ATC("COPIES", EXPR)
lcStartAtCopiesLine = SUBSTR(EXPR, lnStartCopiesLine)
lnEndCopiesLine = ATC(vfCRLF, lcStartAtCopiesLine)
lnLenCopiesLine = LEN(SUBSTR(lcStartAtCopiesLine, 1, lnEndCopiesLine))
lcTop = SUBSTR(EXPR, 1, lnStartCopiesLine - 1)
lcBottom = SUBSTR(EXPR, (LEN(lcTop) + lnLenCopiesLine))
lcNewExpr = lcTop + "COPIES=" + ALLT(STR(lnCopias)) + lcBottom
ENDIF
KEYBOARD '{CTRL+F10}'
REPORT FORM MiReporte PREVIEW
************************************************************
*
* Clase: report_contarpaginas
*
* Devuelve el número de paginas de un report
*
* Parametros:
*
* Nombre del report
*
* Ejemplos:
*
* lntotpaginas = report_contapaginas("minforme")
*
* Retorno
*
* El numero de paginas del informe.
*
* Nota
*
*
* Creación : 08/09/1999 PRR
* Ultima Modificación: 14/04/2000 RAPY Rafael Angel Ponce Yllanes
*
************************************************************
PARAMETERS lc_report
LOCAL nPaginas
nPaginas = 0
NOTA: gracias a Jose Luis Santana Blasco y a Rafael Angel Ponce Yllanes
por la aclaración del NOCONSOLE, con esto se mejora mucho la velocidad.
Fede, debes añadir 'nowait' a tu linea 'report' y en la siguiente linea de comando la instrucción 'hide/release windows'. Por
cierto, ¿para que incluyes 'while ! eof()' es que no te hace todos los registros en tu informe si no la pones? Prueba a quitar
ese 'while'
Debido a que varios amigos no encontraban el "truco" para los previews el cual tenia por asunto "Un poco mas
de control sobre los Previews....", lo vuelvo a enviar de nuevo con otro asunto.
Un saludo a todos:
Jesús Sanz
Aplicante - Spain
-----------------------------------------------------------------------
Siempre me han inquietado las vistas preliminares de los informes en VFP, ya que estas tienen muy poco
control con el teclado y se debe de recurrir al mouse (cosa que ha muchos de mis clientes no les parece muy
correcto).
Últimamente he visto en el grupo que se han hecho varias consultas, acerca del tema, y me he dicho:
"Venga Jesús, a ver si haces algo que valga para todo el grupo de fox que tanto te ha enseñado a ti"
Y mira por donde, dando algunas que otras vueltas, me ha salido la siguiente rutina. No es que sea la panacea
universal, pero algo de control dá.
A ver si entre todo la mejoramos un poco:
SET RESOURCE OFF
PUSH KEY
POP KEY
SET RESOURCE ON
Internet
Conexión a archivo
poExplorer = CreateObject("InternetExplorer.Application")
*-- el sitio donde esta el archivo .zip
poExplorer.Navigate("ftp://www.vicentetrapani.com/download/constant.zip")
poExplorer.Visible=.T.
Release poExplorer
--
Luis María Guayán
Tucumán - Argentina
Descargar archivos
en realidad es muy facil descargar un archivo desde la web. ya sea desde el explorador o desde vfp, lo importante es que el
cliente acceda a traves de una pagina de html. la descarga de cualquier archivo es una simple referencia a el. por ej. link ->
<a href=www.miservidro.com/miarchivo.exe>
bueno, ver html para detalles...
solo debes pedir al cliente que ejecute el archivo envez de abrirlo o que lo
ejecute manualmente luego del download.
loExplorer = CreateObject("InternetExplorer.Application")
loExplorer.Navigate("http://www.vicentetrapani.com")
loExplorer.Visible=.T.
Release.loExplorer
Local lcCOMANDO
lcCOMANDO = "START.EXE http://www.microsoft.com"
RUN &lcCOMANDO
Your Init on the form will creat the object for the Session:
public lcCurdir
lcCurdir = sys(5) + curdir()
lnSessionID = thisform.session1.SessionID
If lnSessionID > 0
If vartype(thisform.message1) = "O"
with Thisform.message1
.SessionID = lnSessionID
.Compose()
.AttachmentIndex = 0
.AddressResolveUI = .f.
.MsgSubject = "New version of your program"
.MsgNoteText = " Message Text here "
.RecipAddress =
endwith
If thisform.message1.MsgIndex = -1.
If file(your file name here)
Thisform.message1.AttachmentPathName =
Thisform.message1.AttachmentName =
Endif
Endif
Thisform.message1.Send()
Wait window nowait "Message sent..."
Endif && vartype(thisform.message1) = "O"
Thisform.session1.SignOff()
Endif && lnSessionID > 0
Return
READ MAIL:
Thisform.Message1.sessionid = thisform.Session1.sessionid && Session #
Thisform.Message1.fetchunreadonly = .t. && Type of Mail
Thisform.Message1.fetch && Get it
m=0
ms1 = thisform.Message1.msgcount && How many pieces id we received?
*-- run through all the pieces looking for an attachment. XXXX.new
For ms = 1 to ms1
*Wait wind Thisform.Message1.msgorigaddress
*Wait wind thisform.Message1.attachmentname
lcfile = thisform.Message1.attachmentname
cd \ && lcCurdir for instance
if lower(right(lcfile,3))='new'
wait wind nowait ' Installing a new version of the program '
Copy file (lcfile) to c:\
endif
Endif
m=m+1
If m <> ms1
*-- change the message underneath
Thisform.Message1.msgindex = m
Endif
Next
oOutlook = CreateObject("Outlook.Application")
oContacto = oOutlook.CreateItem(2)
oContacto.businesstelephonenumber = "999876543"
oContacto.companyname = "Empresa 3"
oContacto.department = "ventas"
oContacto.email1address = "[email protected]"
oContacto.firstname = "Pepito"
oContacto.lastname = "de los palotes"
etc...
oContacto.save()
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
o = createob('outlook.application')
ospace = o.getnamespace('mapi')
ocarpetacontactos = ospace.getdefaultfolder(10)
contactos = ocarpetacontactos.items
for each persona in contactos
with persona
wait window .FileAs
endwith
endfor
Salu2
Ariel Gimenez
Ms Agents
Idioma
Para Español:
Merlin.LanguageID = 3082
Merlin.LanguageId= "&HC0A"
Para Ingles:
Merlin.LanguageID = 1033
Saludes
Sergio Rocha Tenorio
Pantalla
Cantidad de colores
hWnd = GetDesktopWindow ()
hSrcDC = GetDC (hWnd)
nBitsPixel = GetDeviceCaps (hSrcDC, 12)
ReleaseDC (hWnd, hSrcDC)
RETURN nBitsPixel
Capturar la pantalla
Entra en www.universalthread.com y en la seccion archivos hay ejemplos de como hacer esto con funciones de la API.
Salu2
Ariel Gimenez
Colores. Calcular
16.777.215 es (256^3) - 1
donde:
y la fórmula es:
Aquí va el código
Saludos Alexandre [email protected]
*!* Constantes para ocultar o mostrar la barra de tareas de windows
#DEFINE TOGGLE_HIDEWINDOW 128
#DEFINE TOGGLE_UNHIDEWINDOW 64
Resolución en pantalla
Josep
Redes
Dominio. Conocer
Fijate si asi te sirve:
oWsh = CreateObject("WScript.Network")
? oWsh.UserDomain
? oWsh.UserName
? oWsh.ComputerName
Ramon Giubi
*--------------------------------------------------------------
* FUNCTION NetDateTime(tcSrv, tlSet)
*--------------------------------------------------------------
* Retorna la fecha-hora de la PC remota "tcSrv"
* Si "tlSet" es .T. cambia la hora de la PC
* por la fecha-hora de la PC remota "tcSrv"
* PARAMETROS:
* tcSrv: Nombre de la PC remota
* tlSet: .T. - Si cambia la hora de la PC
* RETORNO:
* DateTime: La fecha-hora de la PC remota
* Numérico: 0 - Si se cambió la fecha-hora correctamente
* -1 - No se pudo cambiar la fecha-hora
* -2 - No se encontró la PC remota
* USO: ? NetDateTime("\\MiServidor", .F.)
* AUTOR: LMG
*--------------------------------------------------------------
FUNCTION NetDateTime(tcSrv, tlSet)
IF ln = 0
lcToD = REPLICATE(CHR(0), 48)
ln = RtlMoveMemory(@lcToD, lnPtr, 48)
lnAno = DW2N(SUBSTR(lcToD, 41, 4))
lnMes = DW2N(SUBSTR(lcToD, 37, 4))
lnDDS = DW2N(SUBSTR(lcToD, 45, 4))
lnDia = DW2N(SUBSTR(lcToD, 33, 4))
lnHor = DW2N(SUBSTR(lcToD, 09, 4))
lnMin = DW2N(SUBSTR(lcToD, 13, 4))
lnSeg = DW2N(SUBSTR(lcToD, 17, 4))
IF tlSet
lcStrDW = N2DW(lnAno) + N2DW(lnMes) + ;
N2DW(lnDDS) + N2DW(lnDia) + ;
N2DW(lnHor) + N2DW(lnMin) + ;
N2DW(lnSeg) + N2DW(0)
lRet = IIF(SetSystemTime(lcStrDW), 0, -1)
ELSE
lpTZI = SPACE(255)
ln = GetTimeZoneInformation(@lpTZI)
lnZT = DW2N(SUBSTR(lpTZI, 1, 2))
IF lnZT > 720
lnZT = (2^16) - lnZT
ELSE
lnZT = (-1) * lnZT
ENDIF
lRet = DATETIME(lnAno, lnMes, lnDia, ;
lnHor, lnMin, lnSeg) + lnZT * 60
ENDIF
ELSE
lRet = -2
ENDIF
RETURN lRet
ENDFUNC
*------------------------
* FUNCTION DW2N(tcDW)
* Usada por NetDateTime()
*------------------------
FUNCTION DW2N(tcDW)
RETURN ASC(SUBSTR(tcDW, 4, 1))*(256^3) + ;
ASC(SUBSTR(tcDW, 3, 1))*(256^2) + ;
ASC(SUBSTR(tcDW, 2, 1))*(256) + ;
ASC(SUBSTR(tcDW, 1, 1))
ENDFUNC
*------------------------
* FUNCTION N2DW(tnN)
* Usada por NetDateTime()
*------------------------
FUNCTION N2DW(tnN)
RETURN CHR(MOD(tnN, 256)) + CHR(INT(tnN/256))
ENDFUNC
*--------------------------------------------------------------
--
Luis María Guayán
Tucumán - Argentina
SQL
Valores .NULL.
Si tu quieres todos los registros de la tabla Elementos, para que no te salga el valor .NULL. en las consultas debes
especificar los campos como:
...,NVL(detalles.precio,0),...
Tablas
*--------------------------------------------------------
* FUNCTION FindField(lcCampo, lcAlias)
*--------------------------------------------------------
* Busca un nombre de campo en una tabla y retorna .T. si tuvo exito.
* USO: ? FindField("MiCampo", "MiAlias")
* ? FindField("MiCampo") && Busca en el alias corriente
*--------------------------------------------------------
FUNCTION FindField(lcCampo, lcAlias)
LOCAL ln
IF EMPTY(lcAlias)
lcAlias = ALIAS()
ENDIF
IF USED(lcAlias)
ln = AFIELDS(MiArray, lcAlias)
IF ln > 0
ln = ASCAN(MiArray, UPPER(lcCampo))
ENDIF
ELSE
ln = 0
MESSAGEBOX("El alias no existe.",16)
ENDIF
RETURN ln # 0
ENDFUNC
Campos memo
Dada su problemática:
2.- Substituir por fichero .txt (crear cuando necesario) y utilizar control RichText
cCmd="CREATE TABLE 'tempo.dbf' name tempo (obra c(10) NOT NULL,NOMB_OBR C(40) NOT NULL,TIPO C(10)
NOT NULL"
for i=1 to nCount
cCampo=aCampos[i]
cCmd=cCmd + "," + cCampo + " N (12,2) NOT NULL"
endfor
&cCmd
ID Artículo:
Fecha de Creación:
Fecha de Revisión:
E10119
22-nov-1996
19-APR-1997
La información en este artículo se refiere a:
-Microsoft FoxPro, versión 3.0 5.0
RESUMEN
Este artículo le infroma sobre la creación y visualización de Tablas/Consultas de Referencias Cruzadas en Visual FoxPro
3.0 / 5.0
para la visualización de datos de una tabla en forma de Hoja de Cálculo.
MÁS INFORMACIÓN
En Visual FoxPro 3.0 / 5.0 se pueden crear Tablas de Referencias Cruzadas (que visualizan los datos en formato hoja de
cálculo) como las de Excel mediante programación.
Este tipo de Tablas de Referencias Cruzadas son muy usadas en Microsoft Access.
Por ejemplo, supongamos que tenemos una tabla de empleados en la que almacenamos la ventas que al mes realiza cada
empleado. Regularmente, querremos obtener una tabla de referencias cruzadas, en la que de un rápido vistazo podamos ver
cuánto ha vendido cada empleado por mes, y cuando ha vendido en el total de los meses.
Para visualizar este tipo de información es muy útil usar el formato Hoja de Cálculo, donde podremos ver en forma de filas
por columnas esta información. Por ejemplo:
Local LcRecno
LcRecno=Recno()
SEEK THIS.VALUE
if !eof() and LcRecno!=Recno()
Messagebox("La clave ya existe...",16,"Validación de campo")
return 0
ENDIF
go Lcrecno
Nota: Tener en cuenta que esta validación es optima y sin ningun error cuando la tabla tiene como mínimo 1 registro ya
digitado, te recomiendo modificar el procedimiento para detectar cuando la tabla esta vacia.
GO RECO 5
INSERT BLANK BEFORE
pero a menos que esto lo estes haciendo sobre un cursor temporal de L/E, me uno al consejo general de no intentar este tipo
de manejos sobre tablas medianas o grandes, ya que es muy lento y además necesitas abrir la tabla en forma exclusiva.
En UniversalThread (www.universalthread.com) en la seccion de archivos, tienes una utilidad (CMRepair) que te lo hace.
--
Luis María Guayán
Tucumán - Argentina
cTitulo=DBGETPROP("Tabla.Columna","FIELD","Caption")
--
Victor Espina
http://www.mitrompo.com/vespina
Transacción
************************************************************
*
* Función: IO_TRANSACCION
*
* Realiza una transacción con las tablas pasadas entre comas
*
* Parametros:
*
* tctablas - tablas que participan en la transaccion (entre comas)
* tlforzar - forzar la grabacion aunque hubiera cambios de otro usuario
* tlanularsifalla - descartar los cambios en el buffer si falla la
transaccion
*
* Ejemplos:
*
* llret = GoCsApp.io_transaccion("lv_ventas, clientes, articulos")
* llret = GoCsApp.io_transaccion("lv_ventas, clientes, articulos",.T.,.T.)
es igual que la anterior
* llret = GoCsApp.io_transaccion("lv_ventas, clientes, articulos",.F.,.F.)
esto lo haria Jim Booth
*
* Retorno
*
* .T. / .F. Indicando si se pudo o no realizar la transacción
*
* Nota
*
* La tablas deben estar abiertas
*
* Usa la funcion st_partes
*
* Importante reseñar que se efectuaran en el orden en que se hayan
* pasado en la lista
*
* En caso de no poder realizar la transaccion anula todos los TABLEUPDATES
* y retorna las tablas/vistas a su situacion original, si tlanularsifalla es .T.
* o no se pone este parametro
*
* Creación : 17/04/2000 PRR
* Ultima Modificacion: 30/04/2000 PRR
*
************************************************************
FUNCTION IO_TRANSACCION
PARAMETERS tctablas, tlforzar, tlanularsifalla
LOCAL lnnumtablas, llRollBack, llret, lni
PRIVATE patabla
DIMENSION patabla[1]
patabla[1] = ""
*valores por defecto
LOCAL llforzar
llforzar = .T.
LOCAL llanularsifalla
llanularsifalla = .T.
llret = .T.
llRollBack = .F.
IF PCOUNT()=0 OR lnnumtablas = 0
MESSAGEBOX("Error de parametros, debe haber al menos una
tabla",48,"ATENCION")
llret = .F.
ELSE
IF PCOUNT()>2
llforzar = tlforzar
ENDIF
IF PCOUNT()=3
llanularsifalla = tlanularsifalla
ENDIF
BEGIN TRANSACTION
FOR lni = 1 TO lnnumtablas
IF NOT llRollBack AND NOT
TABLEUPDATE(1,llforzar,patabla[lni])
llRollBack = .T.
EXIT
ENDIF
ENDFOR
IF llRollBack
ROLLBACK
IF llanularsifalla
FOR lni = 1 TO lnnumtablas
=TABLEREVERT(.T.,patabla[lni])
ENDFOR
ENDIF
lnret = .F. && error en la
grabacion/actualizacion
ELSE
END TRANSACTION
ENDIF
ENDIF
RELEASE patabla
RETURN llret
Varios
oWsh = CreateObject("WScript.Shell")
cDesktopDir = oWsh.SpecialFolders("Desktop")
oLnk = oWsh.CreateShortcut(cDesktopDir + "\\Shortcut to Notepad.lnk")
oLnk.TargetPath = cDesktopDir + "\\notepad.lnk"
oLnk.Save()
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
*********************************************
function CreaAccesoDirecto(cShortCutName,cTargetPath)
*********************************************
*
LOCAL cOldDir, oWshShell, oShortCut, lNormalShortCut, cExt
*
cOldDir = SET("Directory")
*
* DCC - Get extension. Determine if this is a URL shortcut or a normal
(lnk) shortcut.
cExt = UPPER( pciAllTrim( JUSTEXT( cShortCutName ) ) )
lNormalShortCut = ( cExt == "LNK" )
*
* DCC - Create your windows scripting host (WSH) shell to enable a move to
the desk top directory
oWshShell = CreateObject( "WScript.Shell" )
SET DIRECTORY TO (oWshShell.SpecialFolders("Desktop"))
*
* DCC - Use your WSH object to create your shortcut.
oShortCut = oWshShell.CreateShortcut( cShortCutName )
* DCC - Set your properties and save the shortcut
oShortCut.TargetPath = cTargetPath
*
*!* * DCC - The following properties are only available for normal short
cuts.
*!* IF llNormalShortCut
*
*!* * DCC - Below are other properties and examples of setting them.
*!* loShortCut.IconLocation = "notepad.exe, 0"
*!* loShortCut.Description = "Currently running script."
*!* loShortCut.Hotkey = "ALT+CTRL+F"
*!* loShortCut.WindowStyle = 7 && minimized
*!* loShortCut.WorkingDirectory = "c:\"
*!*
*!* * DCC - Display full path of the executable
*!* ?loShortCut.Fullname
*!*
*!* ENDIF
*
*!* * DCC - Must save the short cut. The short cut saves in the current
directory, which is why we moved to the directory
*!* * DCC - prior to creating the shortcut.
*
oShortCut.Save
*
* DCC - Now move back to your starting directory
SET DIRECTORY TO (cOldDir)
*
--
Saludos,
Tuve un problema similar y lo solucione de la forma mas salvaje, sin mayor investigacion pero me funciono y ahora trabajo
solo asi con los grid.
Convierte el grid en un objeto, cuyo recorsource sea el cursos que actualizas y cada vez que modificas el cursors saca y
vuelve a poner el objeto del grid. Por ejemplo, yo un cursor que a cada rato lo modifico
select distinct queja, id_queja from principal into cursor Lista order
by principal.orden , principal.numqueja
por lo que debo refrescar sacando y volviendo a colocar el objeto que me representa el grid en la forma
thisform.RemoveObject('c_listaactual1')
thisform.AddObject('C_LISTAACTUAL1','C_LISTAACTUAL') && Add a Line control to the form
thisform.C_LISTAACTUAL1.Visible = .T. && Make Line control visible
thisform.C_LISTAACTUAL1.Top = 27 && Specify Line control row
thisform.C_LISTAACTUAL1.Left = 698 && Specify Line control column
Esto me soluciono el problema que el grid se quede en blanco cada vez que modifico el cursor,
Apagar el PC
0 = Reinicia windows.
1 = Apaga el sistema.
2 = Reinicia el sistema.
Ej: ExitWindowsEx(1,0)
La estructura de SECURITY_ATTRIBUTES, la tienes que pasar a string, y guardar la informacion que contiene como se
guardaría en memoria. En el caso que has mandado, si mandamos la vacía para que coga los valores por defecto
de seguridad sería lo siguiente :
poExplorer = CreateObject("InternetExplorer.Application")
poExplorer.Navigate("http://www.altavista.com")
poExplorer.Visible=.T.
Release.poExplorer
Hace unos días, y perdón por el retraso, un compañero me pidió que le enviara como hacer el cálculo de los
dígitos de control de la Cuenta Corriente Bancária (para los bancos españoles -> BBBB-EEEE-CC-
XXXXXXXXXX [BBBB:Código del Banco; EEEE: Código de la Entidad; CC: Dígitos de control; XXXXXXXXXX:
Cuenta particular]):
Pues ahí va:
*****************************************************
Enviamos la Cuenta a validar como parámetro
*****************************************************
lparameters Cuenta
DECLARE pesos(10)
LOCAL i,j,k,suma,suma1
pesos(1)=6
pesos(2)=3
pesos(3)=7
pesos(4)=9
pesos(5)=10
pesos(6)=5
pesos(7)=8
pesos(8)=4
pesos(9)=2
pesos(10)=1
IF !empty(Cuenta)
IF len(alltrim(Cuenta))<23
k=0
FOR i=1 to 4
k=k+val(substr(Cuenta,i,1))
ENDFOR
IF k<>0
=MESSAGEBOX("Cuenta erronea. Faltan dígitos",64,"¡ Atención !")
return .f.
ENDIF
ELSE
j=9
k=1
suma=0
suma1=0
FOR i=1 to 9
IF isdigit(substr(Cuenta,i,1))
suma=suma+(val(substr(Cuenta,j,1))*pesos(k))
ELSE
k=k-1
ENDIF
j=j-1
k=k+1
ENDFOR
j=23
k=1
FOR i=1 to 10
suma1=suma1+(val(substr(Cuenta,j,1))*pesos(k))
j=j-1
k=k+1
ENDFOR
j=MOD(suma,11)
k=MOD(suma1,11)
j=iif(j=0,11,j)
j=iif(j=1,10,j)
k=iif(k=0,11,k)
k=iif(k=1,10,k)
IF val(substr(Cuenta,11,1))=(11-j)
IF val(substr(Cuenta,12,1))<>(11-k)
=MESSAGEBOX("Cuenta erronea. No corresponde el segundo dígito de control",64,"¡ Atención !")
return .f.
ENDIF
ELSE
=MESSAGEBOX("Cuenta erronea. No corresponde el primer dígito de control",64,"¡ Atención !"!"))
return .f.
ENDIF
ENDIF
RETURN .t.
ELSE
RETURN .f.
ENDIF
Copiar al portapapeles
cValorMemo=tutabla.campo
_cliptext = cValormemo
No se si te sirva, pero podés usar _cliptext para copy/cut/paste, por ejemplo si tenes dos textboxes (string), t1 y t2 por
ejemplo podes hacer:
Hugo
Conectar a Internet
loExplorer = CreateObject("InternetExplorer.Application")
loExplorer.Navigate("http://www.midireccion.com")
loExplorer.Visible=.T.
Drivers. Listar
oFSO = CREATEOBJECT("Scripting.FileSystemObject")
FOR EACH oDrive IN oFSO.Drives
? oDrive.DriveLetter
ENDFOR
--
Alex Feldstein - MCP
Ejecutar un sonido
Yo pongo los ficheros de sonido en una carpeta, con formato WAV y en el código de un objeto pongo lo siguiente:
*------------------------------------------------
*FUNCTION PlayWav(lcWaveFile,lnPlayType)
*------------------------------------------------
* Ejecuta un archivo .WAV
* USO: _PlayWave(<Arch_WAV> [,<Tipo_Ejecucion>])
* Arch_WAV = Ruta completa del archivo .WAV
* Tipo_Ejecucion = 1 - Ejecución en background (default)
* 0 - La aplicación espera la ejecución
* 2 - Si el archivo no existe, no ejecuta el default
* 4 - Apaga el sonido que se está ejecutando
* 8 - Continuado
* RETORNA: .T. Si el sonido fue ejecutado
*------------------------------------------------
lnPlayType = IIF(TYPE("lnPlayType")="N",lnPlayType,1)
DECLARE INTEGER PlaySound ;
IN WINMM.dll ;
STRING cWave, ;
INTEGER nModule, ;
INTEGER nType
RETURN IIF(PlaySound(lcWaveFile,0,lnPlayType) = 1, .T., .F.)
ENDFUNC
*------------------------------------------------
Encriptación de cadenas
FUNCTION FnEncripta(Texto)
* ------------------------------------------------
* Encripta un texto
* USO: FnEncripta("Texto a encriptar")
* RETORNA: Texto encriptado
* ------------------------------------------------
LOCAL Clave, TextoEnc, j, letra
clave = ')&H%$V1#@^+=?/><;:MN*-'
TextoEnc = SPACE(0)
C=1
FOR j = 1 TO LEN(texto)
letra = MOD(ASC(SUBSTR(texto,j,1)) + ASC(SUBSTR(clave,C,1)),256)
TextoEnc = TextoEnc + CHR(letra)
C=C+1
IF C>=LEN(clave)
C=1
ENDIF
NEXT
RETURN TextoEnc
FUNCTION FnDesencripta(TextoEnc)
* ------------------------------------------------
* Desencripta un texto
* USO: FnDesencripta("Texto encriptado")
* RETORNA: Texto desencriptado
* ------------------------------------------------
local Texto, c, j, clave
clave = ')&H%$V1#@^+=?/><;:MN*-'
Texto = SPACE(0)
C=1
FOR j = 1 TO LEN(TextoEnc)
letra = MOD((256+ASC(SUBSTR(TextoEnc,j,1))) - ASC(SUBSTR(clave,C,1)), 256)
C=C+1
IF C>=LEN(clave)
C=1
ENDIF
Texto = Texto + CHR(letra)
NEXT
RETURN Texto
strProfile = "nombredeusuarioperfil"
strPassword = "passwordperfil"
strRecipient = "[email protected]"
strSubject = "Asunto"
strBody = "Este es el mensaje..."
theApp = CreateObject("Outlook.Application")
theNameSpace = theApp.GetNameSpace("MAPI")
theNameSpace.Logon(strProfile , strPassword)
theMailItem = theApp.CreateItem(0)
theMailItem.Recipients.Add( strRecipient )
theMailItem.Subject = strSubject
theMailItem.Body = strBody
theMailItem.Send
theNameSpace.Logoff
oWinFax = CreateObject("WinFax.SDKSend")
oWinFax.SetSubject("Test Fax")
oWinFax.SetNumber("1234567")
oWinFax.SetAreaCode("555")
oWinFax.SetCompany("Alguna Compañía")
oWinFax.AddRecipient() && requerido
oWinFax.SetPrintFromApp(1)
oWinFax.AddAttachmentFile("") && aqui va archivo si quieres
oWinFax.Send(1)
HTH
--
Alex Feldstein - MCP Visual FoxPro
Formatear un diskette
hWnd = GetHwndForm(THISFORM)
iDrive = 0
IF hWnd <> 0 THEN
Resultado = SHFormatDrive(hWnd, iDrive,SHFD_CAPACITY_DEFAULT, SHFD_FORMAT_QUICK)
ENDIF
*==========================================================
* Esta función recibe una referencia hacia el formulario y devuelve el HWND
* (window handle) de esta ventana o formulario.
*==========================================================
Function GetHwndForm
LParameter toForm
Local lcCaption
lcCaption = toForm.Caption
toForm.Caption = Sys(3)
Local lnHWND
lnHWND = _WhToHwnd( _WFindTitl(toForm.Caption) )
toForm.Caption = m.lcCaption
Return m.lnHWND
http://www.fpress.com/revista/Num0011/dtruco.htm
--
Luis María Guayán
Tucumán - Argentina
Función de consecutivos
FUNCTION NUEV(tcAlias)
public lnID
LOCAL lcAlias, ;
lcOldReprocess, ;
lnOldArea
lnOldArea = SELECT()
IF PARAMETERS() < 1
lcAlias = UPPER(ALIAS())
ELSE
lcAlias = UPPER(tcAlias)
ENDIF
lcOldReprocess = SET('REPROCESS')
SELECT (lnOldArea)
SET REPROCESS TO lcOldReprocess
idinf=lnID
RETURN lnID
ENDFUNC
Funciones matemáticas
Aunque ya VFP trae la función STD() para registros de una tabla, se pueden aprovechar las funciones de Excel (que son
muchas) desde VFP. (Obvio que debes tener instalado Excel en la PC).
Para el caso de la Desviación Estándar:
loExcel = CREATEOBJECT("Excel.Application")
ln = loExcel.WorksheetFunction.STDev(23,26,33,32,22,30)
MESSAGEBOX(TRANSFORM(ln),0, "Desviación Estándar")
RELEASE loExcel
Es una opción mas, que en este caso no sea lo óptimo, pero en otras funciones de Excel sí.
--
Luis María Guayán
Tucumán - Argentina
Marcador telefónico
Puedes hacerlo con mscomm (El ocx) lo insertas en un formulario, donde tengas tambien una caja de texto para ingresar el
numero, despues en el procedimiento donde quieras que se realice el marcado incluyes:
MSCOMM.SETTINGS="9800,N,8,1"
MSCOMM.COMMPORT=1 (Supongo el modem conectado al com1)
MSCOMM.PORTOPEN=.T.
MSCOMM.OUTPUT = "ATDT "+Numero+chr(13)
Emilio Fernandez
loFSO = CREATEOBJECT("Scripting.FileSystemObject")
lcSerialNumber = lofso.drives("c:").serialnumber
o también:
*-----------------------------------------------
FUNCTION GetVol(lpRoot)
*-----------------------------------------------
* Nuestra información del volumen
* USO: GetVol("C:\")
* PARAMETRO: lpRoot = LetraDrive + ":\"
*-----------------------------------------------
LOCAL lnRet, lcString, lpVolName, ;
nVolSize, lpVolNumber, ;
lpMaxComp, lpFlags, ;
lpFSName, nFSSize
IF EMPTY(lpRoot)
lpRoot = "c:\"
ENDIF
lpVolName = SPACE(256)
nVolSize = 256
lpVolNumber = 0
lpMaxComp = 256
lpFlags = 0
lpFSName = SPACE(256)
nFSSize = 256
lnRet=GetVolInfo(@lpRoot, @lpVolName, ;
nVolSize, @lpVolNumber, ;
@lpMaxComp, @lpFlags, ;
@lpFSName, nFSSize)
IF lnRet > 0
lcString = "Drive name: " + ;
ALLT(lpRoot)+CHR(13)+ ;
"Vol name: " + ;
LEFT(ALLT(lpVolName),LEN(ALLT(lpVolName))-1)+CHR(13)+ ;
"Max #/chars in vol name: " + ;
ALLT(STR(nVolSize))+CHR(13)+ ;
"Vol Serial #: " + ;
ALLT(STR(lpVolNumber))+CHR(13)+ ;
"Max #/chars in dir/file names: " + ;
ALLT(STR(lpMaxComp))+CHR(13)+ ;
"File Sys Flags: " + ;
ALLT(STR(lpFlags))+CHR(13)+ ;
"File Sys type: " + ;
LEFT(ALLT(lpFSName),LEN(ALLT(lpFSName))-1)+CHR(13)+ ;
"File Sys Name Size: " + ;
ALLT(STR(nFSSize))
ELSE
lcString = "No se pudo ver información"
ENDIF
=MESSAGEBOX(lcString, "Información del volumen")
RETURN ""
ENDFUNC
Leonardo Velazquez
Números a letras
Hola Visualfoxproeros.
Ahí les mando una rutina sencilla para pasar números a letras :
NOTA : ABRAN LA VENTANA AL MÁXIMO, HAY LÍNEAS QUE TERMINAN EN PUNTO Y COMA
****************************************************************************
*
PROCEDURE NTOL
****************************************************************************
*
PARAMETERS MI_NUMERO
PUBLIC C_ENTERO, C_DECIMAL
C_ENTERO=RIGHT(("00"+ALLTRIM(STR(INT(MI_NUMERO)))),INT(((LEN(ALLTRIM(STR(INT
(MI_NUMERO))))+2)/3))*3)
C_DECIMAL=RIGHT("00"+ALLTRIM(STR((MI_NUMERO-INT(MI_NUMERO))*100)),3)
PUBLIC DIMENSION CENTENA(1,10), DECENA(1,10), UNIDAD(1,15)
UNIDAD(1)=" UN"
UNIDAD(2)=" DOS"
UNIDAD(3)=" TRES"
UNIDAD(4)=" CUATRO"
UNIDAD(5)=" CINCO"
UNIDAD(6)=" SEIS"
UNIDAD(7)=" SIETE"
UNIDAD(8)=" OCHO"
UNIDAD(9)=" NUEVE"
UNIDAD(11)=" ONCE"
UNIDAD(12)=" DOCE"
UNIDAD(13)=" TRECE"
UNIDAD(14)=" CATORCE"
UNIDAD(15)=" QUINCE"
DECENA(1)=" DIEZ"
DECENA(2)=" VEINTE"
DECENA(3)=" TREINTA"
DECENA(4)=" CUARENTA"
DECENA(5)=" CINCUENTA"
DECENA(6)=" SESENTA"
DECENA(7)=" SETENTA"
DECENA(8)=" OCHENTA"
DECENA(9)=" NOVENTA"
CENTENA(1)=" CIENTO"
CENTENA(2)=" DOSCIENTOS"
CENTENA(3)=" TRESCIENTOS"
CENTENA(4)=" CUATROCIENTOS"
CENTENA(5)=" QUINIENTOS"
CENTENA(6)=" SEISCIENTOS"
CENTENA(7)=" SETECIENTOS"
CENTENA(8)=" OCHOCHIENTOS"
CENTENA(9)=" NOVECIENTOS"
STORE "" TO UNIDAD(10),DECENA(10),CENTENA(10)
RC=IIF(VAL(C_ENTERO)=0,"CERO","")
VALOR_N=IIF(i2=1,C_ENTERO,C_DECIMAL)
FN=SUBSTR(VALOR_N,i1,3)
RC=RC+IIF(VAL(FN)=100," CIEN",;
CENTENA(IIF(VAL(LEFT(FN,1))=0,10,VAL(LEFT(FN,1)))))+;
IIF(VAL(RIGHT(FN,2))>10 .AND. VAL(RIGHT(FN,2))<16,;
UNIDAD(VAL(RIGHT(FN,2))),DECENA(IIF(VAL(SUBSTR(FN,2,1))=0,10,VAL(SUBSTR(FN,2
,1))))+;
IIF(VAL(SUBSTR(FN,2,1))<>0 .AND. VAL(SUBSTR(FN,3,1))<>0," Y","")+;
UNIDAD(IIF(VAL(SUBSTR(FN,3,1))=0,10,VAL(SUBSTR(FN,3,1)))))+;
IIF((LEN(VALOR_N)=6 .AND. i1=1) .OR. (LEN(VALOR_N)=9 .AND. i1=4 .AND.
VAL(FN)<>0) .OR.;
(LEN(VALOR_N)=12 .AND. i1=1).OR.;
(LEN(VALOR_N)=12 .AND. i1=7 .AND. VAL(SUBSTR(VALOR_N,7,3))<>0),"
MIL","")+;
IIF((LEN(VALOR_N)=9 .AND. i1=1).OR. (LEN(VALOR_N)=12 .AND. i1=4),;
IIF(VAL(LEFT(VALOR_N,3))=1,IIF(LEN(VALOR_N)=12," MILLONES"," MILLÓN"),"
MILLONES"),"")
ENDFOR
ENDFOR
RETURN RC
ENTEROV=INT(NUMEROV)
N = ""
N1 = "UNO"
N2 = "DOS"
N3 = "TRES"
N4 = "CUATRO"
N5 = "CINCO"
N6 = "SEIS"
N7 = "SIETE"
N8 = "OCHO"
N9 = "NUEVE"
N10 = "DIEZ"
N11 = "ONCE"
N12 = "DOCE"
N13 = "TRECE"
N14 = "CATORCE"
N15 = "QUINCE"
N16 = "DIECISEIS"
N17 = "DIECISIETE"
N18 = "DIECIOCHO"
N19 = "DIECINUEVE"
N20 = "VEINTE"
N30 = "TREINTA"
N40 = "CUARENTA"
N50 = "CINCUENTA"
N60 = "SESENTA"
N70 = "SETENTA"
N80 = "OCHENTA"
N90 = "NOVENTA"
IF ENTEROV <> 100
N100 = "CIENTO"
ENDIF
IF ENTEROV = 100
N100="CIEN"
ENDIF
N200 = "DOSCIENTOS"
N300 = "TRESCIENTOS"
N400 = "CUATROCIENTOS"
N500 = "QUINIENTOS"
N600 = "SEISCIENTOS"
N700 = "SETECIENTOS"
N800 = "OCHOCIENTOS"
N900 = "NOVECIENTOS"
CONTADOR = 1
INICIO = 1
CADENA = STR(ENTEROV,9)
NUMP = " "
DO WHILE CONTADOR < 4
SUBCADENA = SUBSTR(CADENA,INICIO,3)
CENTENA = SUBSTR(SUBCADENA,1,1)+"00"
DECENA = SUBSTR(SUBCADENA,2,2)
UNIDAD = SUBSTR(SUBCADENA,3,1)
IF VAL(SUBCADENA) > 99
NUMP = NUMP + N&CENTENA + " "
ENDIF (SUBCADENA > 99)
T = VAL(DECENA)
IF T > 0
DO CASE
CASE (INT(T/10.0) = T/10.0) .OR. (T > 9 .AND. T <20)
NUMP = NUMP + N&DECENA
CASE T > 9 .AND. (INT(T/10.0) # T/10.0)
DECENA = SUBSTR(DECENA,1,1) + "0"
IF DECENA # "20"
NUMP = NUMP + N&DECENA + " Y " + N&UNIDAD
ELSE
NUMP = NUMP + "VENTI" +N&UNIDAD
ENDIF
CASE T < 10
NUMP = NUMP + N&UNIDAD
ENDCASE
ENDIF (T > 0)
IF ENTEROV > 999999 .AND. CONTADOR = 1
NUMP = NUMP + " MILLONES "
ENDIF
IF NUMP = " UNO MILLONES "
NUMP = " UN MILLON "
ENDIF
IF ENTEROV > 999 .AND. CONTADOR = 2 .AND. VAL(SUBCADENA) > 0
NUMP = NUMP + " MIL "
ENDIF
IF NUMP = " UNO MIL "
NUMP = " UN MIL "
ENDIF
INICIO = CONTADOR * 3 + 1
CONTADOR = CONTADOR + 1
ENDDO
CENTAV = (THISFORM.VABO.VALUE - INT(THISFORM.VABO.VALUE))
CENTAV = ROUND((CENTAV*100),0)
CENTAV = INT(CENTAV)
CENTAV = STR(CENTAV,2)
CENTAV = STRTRAN(CENTAV," ","0")
NUMP = "Pesos" + NUMP + " con " + CENTAV + "/100"
*----------------------------------------------------------
* FUNCTION Col2RGB(tnColor)
*----------------------------------------------------------
* Pasa un número de color a formato RGB
* USO: Col2RGB(<Nro_Color>)
* RETORNA: Caracter RGB(nR, nG, nB)
* AUTOR: LMG
*----------------------------------------------------------
FUNCTION Col2RGB(tnColor)
LOCAL lcRGB, ln
lcRGB="RGB("
FOR ln=1 TO 3
lcRGB=lcRGB+TRAN(tnColor%256,"999")+IIF(ln=3, "", ",")
tnColor=INT(tnColor/256)
ENDFOR
lcRGB=lcRGB+")"
RETURN lcRGB
ENDFUNC
*----------------------------------------------------------
--
Luis María Guayán
Tucumán - Argentina
PROCEDURE Color2RGB(nColor)
*
local nRed,nGreen,nBlue
nBlue=int(nColor / 65536)
nColor=nColor - (nBlue * 65536)
nGreen=int(nColor / 256)
nColor=nColor - (nGreen * 256)
nRed=nColor
return allt(str(nRed))+","+allt(str(nGreen))+","+allt(str(nBlue))
*
ENDPROC
HTH
Victor
Prototipos al vuelo
Ej:
Esto se puede hacer en tiempo de ejecución si tienes VFP6 + SP3 o superior. En la aplicación que estoy desarrollando no
solo se generan PRG's dinámicamente, sino incluso formas y clases!.
Por eso es que digo que VB no es ni remotamente lo más indicado para hacer ese tipo de aplicación para prototipos.
--
Victor Espina
http://www.mitrompo.com/vespina
Validación CIF
Con respecto al significado de la primera letra, nosotros no lo tenemos muy claro pero sabemos que:
A- Sociedades Anonimas
B- Sociedades limitadas
E- Comunidades de Bienes
F- Sociedades Cooperativas
G- Asociaciones, Clubes deportivos.
H- Comunidades de Vecinos
P- Entidades Locales (Ej. Ayuntamientos, Juntas Vecinales)
Q-Asociaciones Religiosas
S- Organismos oficiales (Ej. Ministerios)
FUNCTION ObtenerDCCif()
PARAMETERS cCIF
LOCAl nConta, nConta2, nTotal, cValor
*... o impar para sumarle la suma de los dígitos del número que ha sido
multiplicado por 2.
ELSE
cValor = ALLTRIM(STR(VAL(SUBSTR(cCIF, nConta, 1)) * 2))
FOR nConta2 = 1 TO LEN(cValor)
nTotal = nTotal + VAL(SUBSTR(cValor, nConta2, 1))
ENDFOR
ENDIF
ENDFOR
Saludos
Oscar Fernández
GESPRO S.A.
Madrid-España
Saludos,
Vistas y Consultas
Consultas. Ejecución
Usando sys(3054, [0] [1] [11]) podrás ver el nivel de optimización de tus consultas.
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
En las vistas con modo de almacenamiento en bufer a tabla (es decir 4 o 5), no se
les puede crear un indice, y por tanto no se puede hacer SEEK o INDEXSEEK en ellas.
************************************************************
*
* Funcion: INDEXVISTA
*
* Indexa cualquier tipo de vista
*
* Parametros:
*
* tcvista - Nombre de la vista
* tcexpr - expresion completa para indexar
* tctag - nombre del indice (tag)
*
* Ejemplos:
*
* ret=indexview("lv_alelin","allart+STR(mov,3)","allart")
*
* Retorno
*
* devuelve verdadero/falso si se pudo crear el indice
*
* Nota
*
* La vista debe estar abierta
*
* Ultima Modificacion: 05/04/2000 Pablo Roca
* Creacion : 05/04/2000 Pablo Roca
*
************************************************************
FUNCTION indexvista (tcvista, tcexpr, tctag)
LOCAL lcOldBufering, llret, lcalias
IF PCOUNT()=3
lcalias = ALIAS()
SELECT (tcvista)
lcOldBufering=CURSORGETPROP("Buffering")
llret=CURSORSETPROP("Buffering",3)
IF llret
INDEX ON &tcexpr TAG (tctag)
SET ORDER TO
llret=CURSORSETPROP("Buffering",lcOldBufering)
ENDIF
IF !EMPTY(lcalias)
SELECT (lcalias)
ELSE
SELECT 0
ENDIF
ELSE
llret = .F.
ENDIF
RETURN llret
ENDFUNC
Ejemplo de uso:
ret=indexvista("lv_alelin","allart+STR(mov,3)","allart")
Con esto podremos realizar cualquier SEEK (mejor SEEK() ) o INDEXSEEK sobre la vista
Pues si, en la lista los incluyo todos, pero lo encuentro lógico, ya que asi no tiene que traducir el asterisco por la estructura
de la tabla, si no que le dices exactamente lo que quieres.
Es mas rapido :
SELECT campo1, campo2, campo3,... FROM tabla1
Que :
SELECT * FROM tabla1
Es cierto, la prueba se ha hecho con una tabla con un millon de registros con Indice Unico.
El otro día se me planteó la necesidad cargar una vista con una condición que puede ser variable.
Primero pensé en generar una vista en tiempo de ejecución. Pero después me di cuenta que en realidad lo único que cambia
en la sentencia es la parte del where, por lo que se puede tener definida una vista con la siguiente sentencia SQL:
select * from Tabla where &cCondicion
Entonces antes de hacer el Requery de la vista se carga cCondicion con la condición y listo, funciona. No es necesario estar
redefiniendo vistas y tocar el DBC. La vista es siempre la misma.
El único problema con este método es que la vista se debe definir por código es decir con:
create sql view Vista as select * from Table where &cCondicion
porque con el generador no se puede poner esa condición, y si la intentas abrir da un error de sintaxis.
Marcos Jerouchalmi
Montevideo, Uruguay
Usted puede utilizar DBSETPROP para asegurarse de que los datos pulsan o el formato es cómo usted lo desea:
y/o
--
John Koziol
MCSD, Microsoft MVP FoxPro
Vistas actualizables
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
ID Artículo:
Fecha de Creación:
Fecha de Revisión:
E10115
22-nov-1996
19-APR-1997
La información en este artículo se refiere a:
RESUMEN
Este artículo informa de cómo actualizar una Cuadrícula usando una vista parametrizada.
MÁS INFORMACIÓN
Una situación que puede darse es que los datos mostrados por una Cuadrícula necesiten cambiar en base a una acción del
usuario, como por ejemplo la selección de un cliente nuevo en un Cuadro combinado, de manera que, dependiendo del
cliente seleccionado en el Cuadro combinado, la Cuadrícula muestre solo los registros correspondientes a ese cliente.
En este caso se puede utilizar una Vista parametrizada para proporcionar los registros que debe mostrar la Cuadrícula.
Cuando se seleccione un nuevo cliente en el Cuadro combinado, se establece el parámetro al nuevo valor del Cuadro, y
usando la función REQUERY() se actualiza la Vista y refresca la Cuadrícula.
La idea es que me muestre los registos cuyo campo nombre contiene la cadena que está en lcNom.
?lcNom = "MARIA"
REQUERY("MiVista")