31 de agosto de 2004

Obtener el IP de la maquina facilmente

Obtener la dirección IP local de la maquina.

loSock = CREATEOBJECT('MSWinsock.Winsock.1')
? loSock.LocalIP
loSock = .NULL.

José Temporini

30 de agosto de 2004

Truncar un número

Función que trunca un número en "n" posiciones decimales.

Ejemplo:
? Truncar(123.456789,2)
-> 123.45

*-------------------------------------------
* FUNCTION Truncar(tnNro, tnDec)
*-------------------------------------------
* Trunca un número en "n" posiciones decimales
* USO: Truncar(nNumero, nDecimales)
* PARAMETROS: 
*   tnNro = Número a truncar
*   tnDec = Número de cifras decimales a truncar
* RETORNO: Numérico
*-------------------------------------------
FUNCTION Truncar(tnNro, tnDec)
  LOCAL ln
  IF EMPTY(tnDec)
    tnDec = 0
  ENDIF
  ln = 10 ^ tnDec
  RETURN ROUND(INT(tnNro * ln) / ln, tnDec)
ENDFUNC
*-------------------------------------------

Luis María Guayán

23 de agosto de 2004

Soy un programador de FoxPro

Artículo original: http://fox.wikis.com/wc.dll?Wiki~VFPArticleByBurtRosen
Autor: Burton J. Rosen
Traductor: Esparta Palma



Me siento como si estuviera parado en un cuarto con personas, anunciando "mi nombre es Burt, y soy un programador de FoxPro". Sabe alguien si hay algún programa de "20 pasos" llamado PAF (Programadores Anónimos de FoxPro)?

Ahora mismo, muchos de ustedes se estarán preguntando "Que es FoxPro, y porqué debería importarme?". FoxPro son varias cosas, pero los atributos principales son 2 partes. Primero, FoxPro es un lenguaje de programación (la herramienta básica usada para desarrollar un software para computadoras), y segundo, FoxPro es una base de datos. Una vez más te preguntarás: Por qué me debería importar?

Si está involucrado en el uso de computadoras, le debería importar. Si está involucrado en la compra de software, le debería importar aún más. Si está involucrado en la contratación de personal para desarrollar software, éste debería ser un tema más importante para usted. Otra vez, me preguntará, ¿Por qué?.

Muchas aplicaciones de negocio computarizadas están en tres cosas: formularios, imágenes o datos (información). Si está tratando con formuarios, usted probablemente está usando un procesador de textos (como Microsoft Word) o una hoja de cálculo (como Microsoft Excel). Si está tratando con imágenes, tal vez alguien está proveyendo las imagenes, o ya sabe que software usar. En cualquier caso, el software de graficas está más allá del alcance de esta discusión.

Mi preocupación aquí, es por aquellos que están tratando con datos. Cuando enfrentamos con un problema de 'datos', muchas gente escogerá uno de esos tres métodos para sobrellevarlo. Ellos también pegarán los datos en un documento de Word (la peor solución posible), o lo pondrán en una hoja de cálculo, o lo pondrán en Microsoft Access (un sistema de base de datos de nivel inicial).

Por que es importante cuál herramienta usar? Ha tratado de insertar un tornillo usando un martillo? Puede hacerlo (a veces), pero el resultado no siempre será limpio. Alternativamente, puede meter un clavo usando desarmador. Usualmente con el resultado de un desarmador roto. Es importante usar una herramienta que sea apropiada para el proyecto actual. Si está procesando datos, necesita usar un programa que esté diseñado para el procesamiento de datos (llamado Sistema de Base de Datos).

Las herramientas de bases de datos mas populares de Microsoft son Acess y SQL Server. Access es un sistema orientado al usuario, está satisface razonablemente bien a las aplicaciones de bajo nivel. Esta es una herramienta que alguien puede usar para solventar rápida y en sucio, un problema de datos. Hay muchos términos clave que use anteriormente. Primero que nada, Access trabaja bien para el uso en un solo lugar (éste no escala bien para el uso de muchas personas). En segundo lugar, dije que sería "rapido y en sucio". Si el problema de datos es un tema de una sola vez, Access probablemente sea aceptable. Pero no recomendaría usar Access para un sistema que será usado regularmente, por meses o años.

En el extremo alto, Microsoft tiene SQL Server. Éste es un ambiente de desarrollo diseñado para las aplicaciones de niveles corporativos empresariales. Las personas que desarrollan aplicaciones grandes, para grandes corporativos usarán bases de datos SQL Server, Oracle o IBM DB2.

Pero, que deberían hacerlas personas organizaciones que están enmedio para soluciones de datos? Ellos necesitan soluciones reales para problemas reales que son muy grandes para Access, pero que no tienen el presupuesto o el equipamento para soportar SQL Server o sus competidores. Cuáles son sus soluciones? Es ahí donde entra FoxPro. FoxPro, o paa ser un poco más exactamente técnico, Visual FoxPro (VFP), es la base de datos con un lenguaje de programación integrado. Satisface idelamente a problemas de datos de rango medio. Se puede acomodar fácilmente en una base de datos pequeña que funciona en el escritorio con varias
docenas de expedientes. También puede manejar bases de datos con millones de registro es una red ampliamente distribuida. La buena noticia es que este tambien maneja todos los tamaños que están enmedio y los maneja muy bien.

Así pues, se puede preguntar: ¿Cuál es el problema?, cuando digo a la gente que soy un programador de FoxPro, la reacción más común que obtengo es "Oh, todavía existe?". La genete piense que FoxPro desapareció al menos hace 10 años, y que todo lo que queda son programas heredados que no vale la pena re-codificar. La verdad es que Microsoft estará liberando la versión 9 de VFP en Septiembre. VFP es una herrmienta de desarrollo que sigue viva y es próspera, y en mi opinión, es el ambiente de desarrollo más poderoso y versatil que hay en el mercado hoy en día.

Así que la próxima vez que esté buscando una solución de base de datos, busque algo escrito en VFP. Creo encontrará soluciones de gran alcance, con precio razonablem dispuestas de gran flexibilidad y desempeño. Si necesita una aplicación desarrollada especialmente para usted, pregunte por un desarrollador de FoxPro.

Actualmente, yo me levantaría y confesaría "Soy un programador de FoxPro, Y ESTOY ORGULLOSO DE ELLO".

BurtRosen

Este artículo fué publicado originalmente en CWCE Magazine ( www.cwce.com)
(c) 2004 by Burton J. Rosen

18 de agosto de 2004

Saber si una aplicación ya está activa (2)

Una manera más para saber si una aplicación ya está activa, esto para evitar cargar dos veces la misma.

Cortesía del MVP turco: Çetin Basöz
*** En el PRG inicial de tu aplicación***
If AppAlreadyRunning()
  Messagebox('Another instance is already running.')
...

Function AppAlreadyRunning
Local hsem, lpszSemName
#Define ERROR_ALREADY_EXISTS 183
Declare Integer GetLastError In win32API
Declare Integer CreateSemaphore In WIN32API ;
 string @ lpSemaphoreAttributes, ;
 LONG lInitialCount, ;
 LONG lMaximumCount, ;
 string @ lpName
lpszSemName = "CadenaUnicadetuAplicacion"
hsem = CreateSemaphore(0,0,1,lpszSemName)
Return (hsem # 0 And GetLastError() == ERROR_ALREADY_EXISTS)
PS:FindWindow() works with ClassNames too.

Çetin Basöz
MS Foxpro MVP, MCP
Welcome to FoxyClasses

16 de agosto de 2004

Guardar archivo HTML como cadena

Con esta rutina puedes simular el efecto de la función "Guardar cómo ... Archivo de Texto", de los navegadores web (IE, Netscape, etc..)

Local m.myHTML,m.parsed
myHTML=[This< br> is an < font color="red">< b>example< /b >< /font >< Hr>x2&nbsp&lt&nbspx3]
*myHTML= FileToStr(GetFile('HTM'))
parsed = ''
oParser = Createobject('myParser',m.myHTML,@m.parsed)
? m.Parsed
*StrToFile(m.Parsed,'ParseResult.txt')

Define Class myParser As Form
  Add Object oWB As OleControl With ;
    OleClass = 'Shell.Explorer'

  Procedure Init
  Lparameters tcHTML, tcParse
  lcTemp = Sys(2015)+'.htm'
  Strtofile(tcHTML,lcTemp)
  With This.oWB
    .Navigate2('file://'+Fullpath(lcTemp))
    Wait window 'Parsing...' nowait
    Do While .ReadyState # 4 && Wait for ready state
    EndDo
  Endwith
  Erase (lcTemp)
  tcParse = This.oWB.Document.body.innerText
  Wait clear
  Return .f.
Endproc
Enddefine

Çetin Basöz
MS Foxpro MVP, MCP 
Welcome to FoxyClasses

13 de agosto de 2004

Enviar email con Adjuntos utilizando CDO

Un código bastante sencillo (y gratis) cortesía de Pepe Llopis, extraido de los newsgroup de microsoft:

Necesitas un XP profesional o superior (2000, 2003, etc) y tener configurado el servicio SMTP

    iMsg = CreateObject("CDO.Message")
    iMsg.From   = ALLTRIM(Thisform.txtEmail.Value)
    iMsg.Subject  = ALLTRIM(Thisform.txtAsunto.Value)
    iMsg.To   = ALLTRIM(lcMailAddress)
    IF !EMPTY(Thisform.txtAdjunto1.Value)
          iMsg.AddAttachment(ALLTRIM(Thisform.txtAdjunto1.Value))
    ENDIF
    WaitWCtr("Dando formato al mensaje ....",.T.)
    lcMessage = ALLTRIM(Thisform.txtPlantilla.Value)
    lcMessage = "file://"+FULLPATH(ALLTRIM(lcMessage))
    iMsg.CreateMHTMLBody( lcMessage,0)
    WaitWCtr("Enviando mensaje....",.T.)
    iMsg.Send
    RELEASE iMsg

Espero les sea de utilidad.


-----------------------------------
Espartaco Palma Martínez

12 de agosto de 2004

Hacer respaldo de la base de datos de MS-SQLServer (programáticamente)

Dos formas de lograrlo, utilizando código de VFP.

Con SQLDMO:
LOCAL loServer, loBackup

loServer   = CREATEOBJECT('SQLDMO.SqlServer')
loServer.Connect("MiServidor","MiUsuario", "Mi password")

loBackup = CREATEOBJECT('SQLDMO.Backup')
WITH loBackup
 .Database     = "LabasedeDatos"
 .Files        = '[C:BackupsNombreRespaldo]'
 .Initialize   =  .T.
 .BackupSetName   = "MiRespaldo"
 .BackupSetDescription = "MiDescripcion"
 .SQLBackup(loServer)
ENDWITH

Y con ADO:
LOCAL lcSQLScript, loConnection

loConnection = CREATEOBJECT('ADODB.CONNECTION')
loConnection.Open("Provider=SQLOLEDB.1;User ID=MiUsuario"+;
 +";PWD=MiPassword"+;
 +";Persist Security Info=False"+;
 +";Initial Catalog=LaBasedeDatos"+;
 +";Data Source=MiServidor")

lcSQLScript = ;
"BACKUP DATABASE [LaBasedeDatos] TO  DISK = N'C:BackupsNombreRespaldo' "+;
"WITH  INIT ,  NOUNLOAD ,  NAME = N'MiRespaldo',  NOSKIP ,  STATS = 10,  "+;
"DESCRIPTION = N'MiDescripcion',  NOFORMAT "

loConnection.Execute(lcSQLScript)

Espero les sea de utilidad.

Espartaco Palma Martínez