26 de junio de 2002

Cambiar el papel tapiz del escritorio

Cambiar el papel tapiz del escritorio, para personalizar una aplicacion cuando la instalamos.
DECLARE LONG SystemParametersInfo IN "user32";
  LONG uAction,;
  LONG uParam,;
  STRING lpvParam,;
  LONG fuWinIni

filename = GETFILE('bmp')

=SystemParametersInfo(20, 0, filename, 1)
Jorge Mota

21 de junio de 2002

Como Obtener la Fecha del Servidor Utilizando Componentes COM

Visual FoxPro permite crear servidores de Automatizaciòn (componenente COM) con la finalidad de empaquetar el còdigo para realizar procesos comunes a muchas aplicaciones.

En la Seccion de articulos de la Web de Davphantom (www.davphantom.cjb.net/) se encuentran dos documentos valiosos que permiten asimilar de forma sencilla la teoria y la manipulacion de un Componente COM.

Para crear un servidor de Automatizacion se necesita crear un proyecto que incluya clases definidas como OLEPUBLIC, las cuales se pueden definir en un programa(.prg) o en bibliotecas de clases.

Por ejemplo, la definicion de la clase siguiente en un archivo de programa que llamaremos MAIN.PRG crea una clase public OLE personalizada que retorna la fecha del sistema.

Define class SERVERLIB as custom olepublic
name ="SERVERLIBUNO"
  function fecha_sys
           fecha_sys=date()
  returm fecha_sys
enddefine

EL programa MAIN.PRG se vincula a un proyecto que denominaremos SERVICIO.PJX

Cuando estemos compilando el proyecto en el cuadro de dialogo opciones, elijimos (*) Ejecutable WIn32 o Servidor COM (EXE)

Una vez creado el proyecto con clases OLE pùblicas, se crean tres archivos :

1.- El archivo .dll o .exe
2.- Un archivo de bibliotecas de tipos (.tbl)
3.- Un archivo de registro (.vbr)

Para poner en funcionamiento el componente realizamos los siguientes pasos:

release all
close all
run SERVICIO.exe /regserver    &&  Registrar el componente
oCom = createobject("SERVICIO.SERVERLIB") &&  Crea el COM
?oCom.feh_sys()                           &&  Ejecuta  la funcion
run SERVICIO.exe /unregserver             &&  Descarga el COM de memoria
release all
close all

El proceso anterior nos devuelve la fecha del cliente desde donde se ejecuta el componente.

Recuerdan ustedes el problema que existia para obtener la fecha del servidor cuando trabajamos con la base de Datos Nativas de Visual FoxPro utilizando clientes Windows 98.

En lo personal recurri a toda una serie de artificios entre los que figuran :

1.- Permitir que el usuario digite la fecha.

2.- Crear una tabla de configuracion con un campo fecha, la cual era accesada por todas la aplicaciones. La actualizacion de esta tabla era responsabilidad del administrador y la debia realizar todos las mañanas.

3.- La misma tabla del numeral anterior pero esta vez la actualizacion se realizaba por medio de un ejecutable que corria en el servidor, lo que implicaba apagar y preder todas las mañanas el servidor.

4.- La mas original y mas utilizada que es sincronizando el cliente con el servidor por medio del comando NET TIME. Este proceso se realiza al inicio de la aplicacion pero resulta que hay usuarios que no apagan los PC y es muy dispendioso estar realizando el NET TIME constantemente.

El uso de la Automatizacion (Componentes COM) nos brinda otra alternativa para solucionar este problema de una manera mas paractica, para esto utilizaremos el COM desarrollado anteriormente (SERVICIO.EXE).

Pero antes se deben realizar los siguientes pasos:

1.- Asignar direcciones estatica IP a todos los equipos incluyendo el servidor.

2.- Copiar el archivo ejecutable del servidor de automatizacion (.EXE) en el servidor (en nuestro caso SERVICIO.EXE) y ejecutarlo en el servidor para registrarlo en el registro de Windows (Windows 2000 o Windows NT).

run SERVICIO.exe /regserver

oCom = createobject("SERVICIO.SERVERLIB") && O lo ejecutamos desde el explorador


3.- En el equipo Servidor, ejecute RACMGR32.EXE, el Administrador de para conexiones :

* Selecciones la clase en la lista (SERVICIO.SERVERLIB).

* En la pestaña "Acceso de Cliente", elija "Permitir creaciones remotas mediante clave".

* Compruebe que la opcion "Permitir activacion remota" este activada.

4.- Una vez activado el acceso al cliente en el Administrador de Conexiones de Automatizacion Remota , agrege en la barrad de menu "Programasinicio" un acceso directo al programa AUTMGR32.exe el cual se encuentra en la carpeta System32 en Windows NT y paso seguido reiniciar servidor.

Estos pasos solo se repiten cada vez que se actualize el componente.

Una vez configurado el equipo servidor y cargado el Administrador de Conexiones de Automatizacion Remota (AUTMGR32.exe) procedemos a ejecutar el componente.

En la carpeta donde estemos ubicados deben exitir "obligatoriamente" los siguientes archivos:

1.- SERVICIO.VBR
2.- CLIREG32.EXE el cual viene con Visual FoxPro.

El codigo que permite ejecutar el componente es el siguiente :

  id_ip =" 192.168.0.200 "  && Asigna la Ip del servidor a una variable
  ord   ="run /n7 clireg32 SERVICIO.VBR -s"+ID_IP+; 
          "-p ncacn_ip_tcp -q -nologo"  
  wait window ord  && Esta la sintaxis que se ejecuta para registrar el COM
  &ord                             
  oCOm=createobject("servicio.serverlib") 
  ?oCom.fecha_sys()
  close all  
  ord="run /n7 clireg32 -u SERVICIO.vbr -q -nologo" 
  wait window ord && Sintaxis que descarga el COM del cliente
  &ord

Espero que este truco le sirva a todos ..!!!!!

Atentamente

William Cañas

17 de junio de 2002

Validar CBU (solo para Argentina)

Rutina que valida la CBU (Clave Bancaria Uniforme) para Argentina
*------------------------------------------------------------
* FUNCTION ValidarCBU(tcCBU)
*------------------------------------------------------------
* Valida CBU (Clave Bancaria Uniforme)
* Solamente para la Argentina
* USOS:
*   ? ValidarCBU("2650450-2 0214505639667-6")
*   ? ValidarCBU("2650450202145056396676")
*   ? ValidarCBU("26504502/02145056396676")
*------------------------------------------------------------
*-- Formato del CBU:
*--   EEESSSS-V TTTTTTTTTTTTT-V
*-- Bloque 1:
*--   EEE - Número de entidad (3 posiciones)
*--   SSSS - Número de sucursal (4 posiciones)
*--   V - Dígito verificador de las primeras 7 posiciones
*-- Bloque 2:
*--   TTTTTTTTTTTTT - Identificación de la cuenta individual
*--   V - Dígito verificador de las anteriores 13 posiciones
*--
*-- Para el cálculo de los dígitos verificadores se
*-- debe aplicar la clave 10 con el ponderador 9713
*------------------------------------------------------------
FUNCTION ValidarCBU(tcCBU)
  LOCAL lcCBU, lcBloque1, lcBloque2
  lcCBU = CHRTRAN(tcCBU,CHRTRAN(tcCBU,"1234567890",""),"")
  IF LEN(lcCBU) = 22
    lcBloque1 = SUBSTR(lcCBU, 1, 8)
    lcBloque2 = SUBSTR(lcCBU, 9, 14)
    RETURN ValidarDigito(lcBloque1) ;
     AND ValidarDigito(lcBloque2)
  ELSE
    RETURN .F. && Largo de CBU incorrecto
  ENDIF
ENDFUNC

*------------------------------------------------------------
* FUNCTION ValidarDigito(tcBloque)
*------------------------------------------------------------
* Valida Dígito Verificador
*------------------------------------------------------------
FUNCTION ValidarDigito(tcBloque)
  *-- Ponderador '9713'
  #DEFINE Pond '9713'
  LOCAL lnSuma, lnLargo, ln, lcDigito, lcBloque
  lnSuma = 0
  lnLargo = LEN(tcBloque)
  lcDigito = SUBSTR(tcBloque, lnLargo, 1)
  lcBloque = SUBSTR(tcBloque, 1, lnLargo - 1)
  FOR ln = 1 TO lnLargo - 1
    lnSuma = lnSuma + ;
      VAL(SUBSTR(lcBloque, lnLargo - ln, 1)) * ;
      VAL(SUBSTR(Pond, MOD(4-ln,4) + 1, 1))
  ENDFOR
  RETURN lcDigito = RIGHT(STR(10 - MOD(lnSuma, 10)),1)
ENDFUNC
*------------------------------------------------------------
Luis María Guayán

3 de junio de 2002

Como liberar el máximo de memoria

**** Mensaje tomado por Esparta Palma de microsoft.public.fox.vfp.forms ****

-- Forms Eats Memory (04/25/2002) --

En VFP 6/7 algo que puede afectar *sorprendentemente* el Garbage Collection es haciendo una asignación a _screen.Visible

 He hecho las siguientes pruebas (los numeros son de dos pruebas solamente y pueden varias dependiendo del hardware, creo)

* Iniciar VFP 7 SP1 y el Administrador de Tareas de W2K
* Muestra 5.5 MB RAM en uso. Entonces, desde la ventana de comandos:

test = REPLICATE('x',16770000)    && ~38 MB RAM usados
RELEASE test        && 19 - 22 MB RAM en el Administrador de Tareas
SYS(1104)    && Casi sin efecto
_Screen.Visible = _Screen.Visible    && Consumo de Memoria DESCIENDE A 5.x MB

Pueden reproducir algo igual?

HTH. Stefan Wuebbe


Nota de Pablo Roca: Creo que también es interesante hacer antes del RELEASE:
Test = .NULL.
Esto libera también memoria, pero el _Screen.Visible, aun consigue liberar mas.