21 de agosto de 2002

¿Cómo saber si el equipo está conectado a Internet?

Una simple llamada a esta función puede resolverlo.

Tomado del news de microsoft en ingles;

? IsInternetActive()

***********************************
Function IsInterNetActive (tcURL)
***********************************
* PARAMETERS: URL, no olvidar pasar la URL completa, con http:// al inicio
* Retorna .T. si hay una conexion a internet activa
*Tekno
*Wireless Toyz
*Ypsilanti, Michigan
***********************************
tcURL = IIF(TYPE("tcURL")="C" AND !EMPTY(tcURL),tcURL,"http://www.yahoo.com")

  DECLARE INTEGER InternetCheckConnection in wininet;
                    STRING lpszUrl,;
                    INTEGER dwFlags,;
                    INTEGER dwReserved

    RETURN ( InternetCheckConnection(tcURL, 1, 0) == 1)
ENDFUNC
***********************************
Esparta Palma

19 de agosto de 2002

Preview en forma maximizada y con diálogo de impresión

Preview en forma maximizada y con diálogo de impresión, mucho más fácil y en una sola línea...

Esta línea de código me pareció muy buena, lo único que solo funciona de la versión 6.0 en adelante...

KEYBOARD '{CTRL+F10}' PLAIN CLEAR
REPORT FORM tureporte NOCO TO PRINTER PROMPT PREV

Chris Ascencio

16 de agosto de 2002

REGISTRAR Y DESREGISTRAR UN ARCHIVO OCX O DLL

Excelente cuando distribuimos aplicaciones.
DECLARE INTEGER DLLSelfRegister IN "Vb6stkit.DLL" ;
  STRING lpDllName

*-- Esta es la ruta donde esta el archivo
nombredll="s:/sistemas/ocx/hwnd.ocx"

liRet = DLLSelfRegister(NombreDll)

IF liRet = 0 Then
  SelfRegisterDLL = .T.
  MESSAGEBOX ("Registrado ocx")
ELSE
  SelfRegisterDLL = .F.
  MESSAGEBOX ("Error- No Registrado ocx")
ENDIF
Jorge Mota

15 de agosto de 2002

Print Preview en ventana Maximizada versión OOP

Solucion OOP del problema de la ventana Preview Maximizada.

Cómo ya muchos sabran, las ventanas de Preview del reporteador no están maximizadas, por lo que para remediarlo se ha utilizado la instrucción define window, pero a continuación les comparto algo que para no variar encontré en los foros en ingles del news de microsoft.
*-----------------------------
* Fred Taylor
* Microsoft Visual FoxPro MVP
* News: microsoft.public.fox.vfp.reports.printing
* Subject: Re: Report preview window size control
* Date: 05/19/2002
*-----------------------------
oForm = CREATEOBJECT("Form")
WITH oForm
   .Caption = "Tu Titulo del Preview"
   .WindowState = 2    && Maximized
   .Show()

   REPORT FORM tureporte PREVIEW WINDOW (.Name)
   .Release()
ENDWITH

Esparta Palma

14 de agosto de 2002

ACTIVAR Y DESACTIVAR EL PROTECTOR DE PANTALLA

Útil cuando no queramos que el protector se active cuando estamos programando.

DECLARE LONG SystemParametersInfo IN "user32";
  LONG uAction,;
  LONG UParam,;
  LONG lpvParam,;
  LONG fuWinIni

SPI_SETSCREENSAVEACTIVE = 17
SPIF_SENDWININICHANGE = 2

*-- para impedir que se active :
=SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, .F., 0, SPIF_SENDWININICHANGE)

*-- Para volver a restaurarlo como estaba antes de nuestra intervención :
=SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, .T., 0, SPIF_SENDWININICHANGE)

Jorge Mota

13 de agosto de 2002

Autoregistrar OCX

Como autoregistrar OCX y DLLs. Tomado del news de microsoft en inglés.
------------------------------------------
DECLARE LONG DllRegisterServer IN [archivo.ocx]
IF DllRegisterServer() = 0
    * OK
ELSE
    * Not OK
ENDIF
Este método también puede ser usado con archivos COM DLL.

Eric den Doop

12 de agosto de 2002

VACIAR LA CARPETA DE DOCUMENTOS RECIENTES

Util cuando no queramos que vea el usuario que archivo estuvimos abriendo.

DECLARE LONG SHAddToRecentDocs IN "Shell32";
  LONG lFlags,;
  LONG lPv

=SHAddToRecentDocs (0, 0)

Jorge Mota

8 de agosto de 2002

WebRAD: Building Database Applications on the Web with Visual FoxPro and Web Connection

WebRAD: Building Database Applications on the Web with Visual FoxPro and Web Connection 
by Harold Chattaway, Randy Pearson & Whil Hentzen.



Title: WebRAD: Building Database Applications on the Web with Visual FoxPro and Web Connection
Author: Harold Chattaway, Randy Pearson & Whil Hentzen
Edited: Barbara Peisch
ISBN: 1-930919-07-7
Length: 502 pages
Press date: June, 2002
Ebook format: .PDF

Table of Contents

1. Introduction
2. What's In Web Connection
3. Your First Web Connect App - Installing Web Connection
4. Your First Sample Application
5. How the Internet Works
6. Complete Web Development Environment
7. Server Hardware and Hosting
8. Configuring Server Software
9. How a Web Page Works
10. Getting in Tune - Overcoming Conceptual Hurdles
11. Managing Your Configuration
12. A Web Connection Application from Start to Finish
13. Identifying Users and Managing Session Data
14. Com vs File Based Operation
15. 101 Things You Want to Know How To Do
16. Extending the Framework
17. Advanced Trouble Shooting and Maintenance
18. Asynchronous Services
19. XML and Distributed Applications
20. SOAP and Web Services
21. Web Connection Add on Tools
22. Version Updates
23. Making Your Site Successful

Para mas información: http://www.hentzenwerke.com/catalog/webrad.htm

7 de agosto de 2002

CAMBIAR LA ETIQUETA DE UNA UNIDAD DE DISCO

Ejemplo para cambiar la etiqueta de un disco.

DECLARE LONG SetVolumeLabel IN "kernel32" ;
  STRING lpRootPathName,;
  STRING lpVolumeName

=SetVolumeLabel("D:/","PROBANDO")

Jorge Mota

2 de agosto de 2002

COM+ con VFP 7.0 - Parte 2

Publicado originalmente en FoxTalk.
Traducción de Jorge Espinosa.

En la primera parte de esta serie hemos revisado COM y MTS y nos hemos introducido en los servicios de COM+ en Windows 2000.También le he mostrado como crear una nueva aplicación COM+ e instalar el componente en el servidor. Ahora, en la parte 2, le mostraré cómo hacer que el cliente use el componente en el servidor, la seguridad y el manejo de errores.

¿El cliente siempre tiene razón?

En el articulo anterior, le he mostrado cómo instalar su aplicación en el servidor. Pero esto, no sirve de mucho si usted no puede usar el componente desde el cliente. Lo bueno es, que Windows 2000 hace que esto sea muy fácil. Yendo un poco hacia atrás, al componente que hemos creado e instalado, le damos un vistazo al código:

DEFINE CLASS Math AS SESSION OLEPUBLIC
FUNCTION Multiply(tnNum1, tnNum2)
LOCAL lnResult, loMtx, loContext 
*Creamos una referencia al Objeto MTS
loMtx=CREATEOBJECT("MTXAS.APPSERVER.1") 

*Creamos la ref. al Contexto
loContext=loMtx.GetObjectContext()
lnResult=tnNum1*tnNum2

*Si hay alguna transacción abierta hacemos el Commit y avisamos al MTS
*que terminamos de usar el objeto.
loContext.SetComplete()
RETURN lnResult
ENDFUNC
ENDDEFINE
He llamado a este el más tonto de los componentes COM. Todo lo que hace es multiplicar dos números. Sin embargo, manteniendo este simple código de ejemplo, nos permite concentrarnos en los aspectos COM+ del mismo.

Ahora, necesitamos hacer la instalación en el cliente. Volvamos a Component Services Manager. Expanda el árbol debajo de COM+ Applications y seleccione MyFirstCOMApp. Esta es la aplicación que hemos creado e instalado en el artículo anterior. Ahora, clic derecho sobre MyFirstCOMApp y seleccionar Export. El asistente de COM Application Export aparecerá (Figura 1). En primera instancia le solicitará el path completo y el nombre del archivo para su aplicación. Ingrese C:\COMApps\MyFirstCOMAppProxy. Luego asegúrese de haber seleccionado "Application Proxy-Install on other machines to enable access to this machine". (La otra opción, "Server Application", es utilizada cuando quiere instalar el componente en otro servidor). clic en Next para finalizar.


El asistente creará dos archivos MyFirstCOMAppProxy.MSI.CAB y MyFirstCOMAppProxy.MSI. Estos archivos pueden ser copiados e instalados en la computadora cliente. Estos archivos NO contienen el componente. Usted no necesita de él en el cliente. Estos archivos contienen información acerca de los métodos públicos y propiedades que expone el componente y punteros hacia el servidor que lo aloja de modo que Windows pueda encontrarlo e instanciarlo.

Nuevamente, usted nunca instala el componente en el cliente. En su lugar instala un proxy. Su aplicación "piensa" que el componente esta alojado y corriendo localmente, pero no es así. Tome nota de esto. Un componente instalado sobre un servidor de aplicaciones nunca corre en el cliente. Por alguna razón, este es un concepto difícil de entender para algunas personas.

Usted instancia el componente servidor exactamente de la misma forma que lo hace localmente. Pruebe esto en su ventana de comandos:

ox = CREATEOBJECT("MyCom.Math")
? ox.Multiply(3, 4) && devolvera 12
ox = NULL
¿Porque ésto funciona?. VFP hace un llamado a Windows, solicitando instanciar el componente. Windows toma información del componente desde la Registry y encuentra que el componente se aloja en un servidor de aplicaciones. Windows entonces instancia el proxy del componente y hace una llamada al servidor para instanciar el componente. VFP no sabe que esta "hablando" con el proxy; "piensa" que lo hace directamente con el componente. Cuando usted llama al método Multiply, el proxy envía el llamado al Server vía DCOM y el resultado es pasado al proxy, quien a su vez se lo pasa a VFP.

¿Se siente inseguro?

Ahora que el componente está instalado en el servidor y el proxy en el cliente, permítame mostrarle cuan fácilmente podemos permitir o prohibir accesos a los componentes.

COM+ utiliza seguridad basada en roles. Un rol es un tipo de usuario. Por ejemplo, en un banco podría tener cajeros, gerentes, oficiales de cuenta, personal de servicios de clientes, etc. Cada una de esas personas cumple un rol. Si quiere prohibir a los cajeros hacer préstamos, en COM+ podría setear seguridad sobre el componente "PRESTAMO" para prohibir esto. Lo bueno es que esto es una opción de configuración que se puede cambiar utilizando el Component Service Manager.

Los roles están basados en los usuarios y grupos de Windows, así el primer paso en setear el esquema de seguridad es establecer los grupos de seguridad de Windows. Puede ser confuso para entender donde encajan los roles en las jerarquías de grupos y usuarios. Los archivos de ayuda COM+ dicen que : " Los Roles son categorías de usuarios que han sido definidos para la aplicación con el propósito de determinar los permisos de acceso para los recursos de la aplicación. El desarrollador asigna los roles (como categorías de usuarios simbólicas) para la aplicación". Esto se asemeja a un grupo de usuarios de Windows, tome esto con cuidado, piense en el rol como un grupo de usuarios para una aplicación específica.

Ahora volviendo sobre nuestro ejemplo del banco, tenemos cuatro grupos: cajeros, gerentes, oficiales de cuenta y servicios al cliente. Avanzamos y creamos estos en el servidor utilizando el User Manager de Windows NT o la herramienta Computer Management de Windows 2000. Ingrese el primer grupo de usuario y luego los otros tres.

Una vez que estos grupos han sido creados volvemos sobre MyFirstCOMApp en Component Services Manager. clic sobre roles, clic derecho y seleccione New Role. Ingrese el primer rol, cajero, y clic OK (figura 2). No es necesario nombrar los roles igual a los grupos de usuarios de Windows pero esto hace que la administración sea mucho mas fácil. Ahora cree los tres roles restantes gerente, oficial de cuenta y servicios al cliente.


Luego necesitamos identificar los usuarios en cada rol. Expanda el árbol debajo de cajero. Verá una carpeta llamada Users. clic sobre esa carpeta, clic derecho y seleccione New User. Ubique en la lista de grupos y usuarios de Windows y seleccione el grupo de usuarios Cajero, clic sobre Add. Lo mismo para gerentes y servicios al cliente. clic en Ok. Podrá ver cada uno de los grupos de seguridad de Windows agregados en el rol cajero en Components Services (figura 3).


Cuando un usuario es agregado al sistema este debe ser agregado a su correspondiente grupo de Windows que automáticamente lo agregará dentro de su rol correspondiente. Entonces tenemos identificados los roles, pero aún no le hemos indicado a Components Services sobre el uso de seguridad. clic sobre MyFirstCOMApp, clic derecho y seleccionamos Properties, allí seleccionamos la solapaSecurity. Habilitamos la opción "Enforce access checks for this application" y clic en Ok (figura 4). Ignore la otra opción por ahora que será tratada en breve.


Ahora clic derecho sobre MyComm.math y seleccione Properties, luego la solapa Security. Usted verá que está habilitada la opción"Enforce component level access checks". También verá la lista de seguridad para los roles. Simplemente seleccione el rol que tendrá acceso a este componente (figura 5).


Usted puede desplegar y asignar el acceso de seguridad a la interfaz o método en el nivel que usted desee. Esto le permite a usted tener un mismo componente con varias interfaces, cada una conteniendo diferentes niveles de seguridad. Si un usuario no tiene el permiso apropiado para el uso del componente, se mostrará un mensaje de error indicando que el componente no puede ser instanciado.

Ahora retomemos al cuadro de diálogo de Aplication Security (figura 4), allí hay algunas opciones adicionales que necesitamos discutir. La primera es el nivel de seguridad. Esta controla cuando COM+ valida la seguridad de usuario. Con la primera opción, "Perform access checks only at the process level", el chequeo del rol no será hecho a nivel de componente, interfaz o método. En la segunda opción,"Perform access checks at the process and component level", la seguridad es chequeada cuando se produce una llamada al componente. Casi siempre se debería utilizar la segunda opción.

No obstante, la primera opción es útil cuando usted ya tiene validado al usuario.

El siguiente seteo es "Authentication level for calls". Éste tiene seis opciones descriptas en la tabla 1.

Viendo a través de la lista cada opción toma progresivamente mas seguridad, note que el mayor nivel de seguridad está en validar el usuario. La opción por defecto es Packet.



Tabla 1. Niveles de autenticación

NivelDescripción
NoneSin autenticación.
ConnectChequea la seguridad sólo cuando el cliente se conecta al componente.
CallChequea la seguridad al comienzo de cada llamada.
PacketChequea la seguridad y valida que todos los datos fueron recibidos.
Packet IntegrityChequea la seguridad y valida que ningún dato fue modificado en tránsito.
Packet PrivacyChequea la seguridad y encripta el paquete.

Finalmente tenemos "Impresonation level". Este es el seteo de niveles de autoridad que los componentes tienen con otros procesos. Estos son cuatro niveles diferentes como describe la tabla 2. Por defecto es Impersonate.

Tabla 2. Niveles de Impersonamiento

NivelDescripción
AnonymousEl segundo proceso no sabe nada acerca del cliente.
IdentifyEl segundo proceso puede identificar quién es el cliente.
ImpersonateEl segundo proceso puede impersonar al cliente, pero sólo por procesos en el mismo servidor.
DelegateEl segundo proceso puede impersonar al cliente en todas las instancias.

Bien, hemos discutido sobre seguridad declarativa basada en roles, la cual es definida y manejada en tiempo de ejecución. También puede usar la seguridad programática. Esto le permite expandir su código basado en los niveles de acceso del usuario. Por ejemplo, un oficial de cuentas solo podría estar autorizado a prestar $50.000. Después que el gerente hace la aprobación para autorizar el préstamo.

Do case
   Case IsCallerInrole("Loan Officer")
       lnMaxLoanAmt = 50000

   Case IsCallerInRole("Manager")
       LnMaxLoanAmt = 100000

   OTherWise 
       LnMaxLoanAmt = 10000000000000
EndCase
Utilizar ambos, seguridad basada en roles combinado con seguridad programática, puede soportar cualquier esquema de seguridad que usted necesite.

Manejo de errores

Una de las preguntas que con mas frecuencia de ve en los foros es, "Como mostrar un error de vuelta al usuario?". Si usted piensa sobre esto la respuesta no parece fácil. Usted NO puede mostrar un cuadro de diálogo con el error de su componente. Este está corriendo en una computadora distinta de la que contiene la interfaz de usuario. VFP posee la función COMRETURNERROR(), para enviar el mensaje de error de vuelta al cliente. COMRETURNERROR() usa dos parámetros. El primero es el nombre del módulo donde ocurre el error. El segundo es el mensaje que muestra al usuario. Veámoslo en el código.

Define Class ErrorExample as SESSION OLEPUBLIC
   Procedure Error(tnError, tcMetodo, tnLine)
 Local lcMensaje

 LcMensaje = "Este es mi mensaje de error")

 COMRETURNERROR(tcMethod, lcMensaje)
   EndProc

   Function CauseError
 Error 15
 Return "Esto nunca debería ser mostrado"
   EndFunc

Enddefine   
Ahora compile el código en una DLL e instancie lo siguiente.

Ox = CREATEOBJECT("MyError.ErrorExample")
? ox.CauseError()
Usted debe esperar "Esto nunca debería ser mostrado" para mostrar en el escritorio de VFP. Sin embargo, aparece un cuadro de dialogo con el mensaje de error.

>Puede retornar cualquier información que quiera en el parámetro del mensaje. Podría querer mejorar el método de error al capturar información adicional utilizando la función AERROR( ) o escribiendo información en el log de errores. Esta es una advertencia: El método de error no se disparará si el error ocurre en el método Init.

Conclusión

Hemos cubierto instalación, seguridad y manejo de errores. En la próxima oportunidad discutiremos transacciones y veremos como COM+ y VFP 7 permite incluir datos de VFP en las transacciones, algo que no se podía hacer con MTS y VFP 6.


Craig Berntson es Microsoft Certified Solution Developer y fue nombrado cuatro veces Microsoft Most Valuable Profesional. Disertante de varias conferencias de FoxPro en todo EEUU y eventos de Microsoft en Salt Lake. Es Presidente del Salt Lake City Fox Users Group y actualmente ingeniero de software senior para 3m Health Information Systems.
Jorge A. Espinosa, Buenos Aires (Capital Federal), Argentina, es Analista Programador y MCP. Dedicado al desarrollo de sistemas desktop desde el año 1987; siempre en el entorno xBase y en Visual Fox Pro desde la version 3.0. Hoy Gerente de Sistemas en Droguería Saporiti SACIFIA.

1 de agosto de 2002

MegaFox: 1002 Things You Wanted to Know About Extending Visual FoxPro

MegaFox: 1002 Things You Wanted to Know About Extending Visual FoxPro
by Andy Kramek, Marcia Akins & Rick Schummer



Title: MegaFox: 1002 Things You Wanted to Know About Extending Visual FoxPro
Author: Andy Kramek, Marcia Akins & Rick Schummer
Editor: Steve Dingle
ISBN: 1-930919-27-1
Length: 600 pages
Press date: June, 2002
Format: .PDF

Table of Contents

Chapter 1: KiloFox Revisited
Chapter 2: Data Driving with VFP
Chapter 3: Intellisense, inside and out
Chapter 4: Sending and receiving email
Chapter 5: Accessing the Internet
Chapter 6: Creating charts and graphs
Chapter 7: New and improved reporting
Chapter 8: Integrating PDF technology
Chapter 9: Using ActiveX controls
Chapter 10: Putting Windows to work
Chapter 11: Deployment
Chapter 12: VFP tool extensions and tips
Chapter 13: Working with remote data
Chapter 14: VFP and COM
Chapter 15: Desiging for extensibility
Chapter 16: VFP on the Web
Chapter 17: XML and ADO
Chapter 18: Testing

Para mas información: http://www.hentzenwerke.com/catalog/megafox.htm