30 de octubre de 2007

Retorna una fecha en palabras

Rutina que retorna una fecha en palabras.
*!* Retorna una fecha en palabras 
*!* USO: ? DateToStr(DATE())
FUNCTION DateToStr(tdDate as Date)
 LOCAL lcStr as String
 lcStr = UPPER(CDOW(tdDate)) + [, ] + ALLT(STR(DAY(tdDate))) + [ DE ] + ;
   UPPER(SUBSTR(SUBSTR(DMY(tdDate),AT(" ",DMY(tdDate),1) + 1,LEN(DMY(tdDate))),1,RAT(" ",SUBSTR(DMY(tdDate),;
   AT(" ",DMY(tdDate),1) + 1,LEN(DMY(tdDate))),1))) + [ DE ]+ ALLT(STR(YEAR(tdDate)))
  RETURN lcStr 
ENDFUNC 
Saludos desde El Salvador

Hector Urrutia

22 de octubre de 2007

Cómo obtener la palabra bajo el cursor en un control editbox

Ejemplo de cómo obtener la palabra bajo el cursor en un control editbox.

PUBLIC oForm1

oForm1 = NEWOBJECT("Form1")
oForm1.SHOW
RETURN

DEFINE CLASS Form1 AS FORM
  TOP = 0
  LEFT = 0
  HEIGHT = 276
  WIDTH = 419
  DOCREATE = .T.
  CAPTION = "Form1"
  ALLOWOUTPUT = .F.
  NAME = "Form1"

  ADD OBJECT Edit1 AS EDITBOX WITH ;
    FONTNAME = "Tahoma", FONTSIZE = 8, NAME = "Edit1", ;
    ANCHOR = 15, HEIGHT = 217, LEFT = 12, TOP = 12, WIDTH = 397, ;
    VALUE = [In Windows© XP®, {owner/draw} menus show icons, but Windows Vista® uses ] ;
    + [alpha-blended bitmaps instead.] + CHR(13) + CHR(10) ;
    + [Windows Vista "provides" menus are (part of) the 'visual schema'. ] ;
    + CHR(13) + CHR(10) ;
    + [Using a destroyed menu handle] + CHR(13) + CHR(10)

  ADD OBJECT Timer1 AS TIMER WITH ;
    TOP = 216, LEFT = 0, HEIGHT = 23, WIDTH = 23, ;
    INTERVAL = 100, NAME = "Timer1"

  ADD OBJECT Text1 AS TEXTBOX WITH ;
    FONTNAME = "Tahoma", FONTSIZE = 8, ;
    HEIGHT = 23, LEFT = 12, TOP = 240, WIDTH = 396, ;
    ANCHOR = 14, READONLY = .T., NAME = "Text1"

  PROCEDURE Edit1.KEYPRESS
    LPARAMETERS nKeyCode, nShiftAltCtrl
    *!* We have to use a timer to get out of the KeyPress event loop
    *!* because Selstart and SelLength get updated AFTER pressing
    *!* the left/right arrow keys, but does NOT get updated
    *!* after pressing up/down arrow keys
    THISFORM.Timer1.ENABLED = .T.
  ENDPROC

  PROCEDURE Edit1.MOUSEUP
    LPARAMETERS nButton, nShift, nXCoord, nYCoord
    THISFORM.Timer1.ENABLED = .T.
  ENDPROC

  PROCEDURE Timer1.TIMER
    THIS.ENABLED = .F.
    m.loEdit = THISFORM.edit1
    m.charfilter = " ,;.:[]{}()/\'®©<>" + '"' + CHR(13) + CHR(0)
    m.lcWord = ""
    m.lcChar = ""
    *!* 25 arbitrary limit for search, just in case
    FOR m.lnx = 0 TO 25
      m.lcWord = m.lcChar + m.lcWord
      m.lcChar = SUBSTR(m.loEdit.TEXT, m.loEdit.SELSTART + m.loEdit.SELLENGTH - m.lnx, 1)
      IF m.lcChar $ m.charfilter
        EXIT
      ENDIF
    ENDFOR
    m.lcChar = ""
    FOR m.lnx = 1 TO 25
      m.lcWord = m.lcWord + m.lcChar
      m.lcChar = SUBSTR(m.loEdit.TEXT, m.loEdit.SELSTART + m.loEdit.SELLENGTH + m.lnx, 1)
      IF m.lcChar $ m.charfilter
        EXIT
      ENDIF
    ENDFOR
    THISFORM.text1.VALUE = m.lcWord
    m.loEdit = NULL
  ENDPROC

ENDDEFINE

Carlos Alloatti

7 de octubre de 2007

Directorio actual: FULLPATH(CURDIR())

VFP contiene un número de funciones para ayudar a determinar un directorio o carpeta específica. La función a menudo mas necesaria es una que devuelve la ruta completa del directorio actual.

Volviendo a los días de Fox2x, esto es lo que yo utilicé:

? SYS(5) + SYS(2003)

En VFP también he visto esta variación:

? SYS(5) + CURDIR()

He estado utilizando éste por bastante tiempo, sobre todo porque se parece el más fácil recordar:

? FULLPATH(CURDIR())

Otro desarrollador sugiere esto:

? FULLPATH("")

[072] VFP Tips & Tricks - Drew Speedie

2 de octubre de 2007

VFP9 a MySQL5 - Eliminacion de Procedimientos y Funciones

Ha veces puede ser necesario o resultarnos util borrar todas las funciones, y procedimientos que tenemos almacenados en nuestra base de datos. Bien sea por limpieza de la misma o para volver a recrearlos a través de un Script de MySQL. (Archivo de texto con con instrucciones propias de MySQL).

Los procedimientos están almacenados en una tabla de las base de datos principal de MySQL (mysql.proc). Y las funciones están almacenadas en la tabla (mysql.func). Simplemente lo único de debemos hacer es un "ZAP" de dichas tablas.

Utilizaremos la sentencia de MySQL "TRUNCATE" que es equivalente al "ZAP" de Visual FoxPro.

Vamos ha hacerlo como siempre desde nuestro querido FOX.
******************************************************
* ZAP(eliminacion)   de Funciones y Procedimientos de MySQL
******************************************************

LOCAL CSQL, NH, CCADENA
CSQL=””
NH=0
CCADENA=””
CSQL= "DRIVER={MySQL ODBC 3.51 Driver};" + ;
"SERVER=127.0.0.1;" + ;
"PORT=3306;" + ;
"UID=usuario;" + ;
"PWD=pasword;" + ;
"DATABASE=mybasededatos;" + ;
"OPTIONS=2049;"

NH=SQLSTRINGCONNECT(""+CSQL, .T.)
IF NH>0
        SQLSETPROP(NH,'Asynchronous', .T.)
        SQLSETPROP(NH,'BatchMode', .T.)

        ** ZAP de Funciones
        TEXT TO CSQL TEXTMERGE NOSHOW
                TRUNCATE TABLE MYSQL.FUNC
        ENDTEXT
        SQLPREPARE(NH,""+CSQL)
        SQLEXEC(NH)

        ** ZAP de Procedimientos
        TEXT TO CSQL TEXTMERGE NOSHOW
                TRUNCATE TABLE MYSQL.PROC
        ENDTEXT
        SQLPREPARE(NH,""+CSQL)
        SQLEXEC(NH)

        SQLDISCONNECT(NH)
 
ENDIF

RELEASE CSQL,NH,CCADENA

*************************************************************
Una vez eliminados los procedimientos y Las funciones podemos recrearlos a través de un Script de MySQL

Desde la linea de comandos del MySQL podemos ejecutar:
SOURCE C:\SCRIPT.SQL
Donde SCRIPT.SQL es un archivo de texto que contiene instrucciones MySQL específicas que puede ser creado perfectamente con el NOTEPAD de Windows.

Antonio L. Montagut
www.ontarioxb.es