28 de junio de 2004

Reiniciar los contadores de campos AutoIncrementales

Con Visual FoxPro 8.0 se introdujeron los campos AutoIncrementales, veremos una forma de reiniciarlos.

El caso puede llegar en el momento en que se desea borrar todo el contenido de una tabla con autoincrementales, pero tambien deseas que dichos incrementos inicien como si la tabla fuera "nueva".

Está claro que lo puedes hacer mediante el diseñador de tablas, pero esta opción no estará disponible en tiempo de ejecución ("Runtime"), lo mismo pasará en el caso de que desees hacerlo con cursores creados con el comando CREATE CURSOR.

A continuación un código que mandé como respuesta a esta duda en el newsgroup de microsoft, el cual ayudará a realizar esta tarea programáticamente.

****************************************************
* Procedure: ResetTables
* Author: Esparta Palma   Date: 17/Mayo/2004
* Purpose: Reinicia los contadores de AutoIncrementales en un cursor
* Parameters: 
*     tcCursor: The cursor (can include full or relative path) or alias
* Returns:
*      < 0 : Number of reset fields
*      -1  : Error -> Wrong parameters
*      -2  : Error -> The table doesn't exist in the path
*      -3  : Error -> Acess denied, used by another user
*      -4  : Error -> Used by this user, but not Exclusive
*      -5  : Error -> Unknow Error
*      -6  : Error -> Error altering the cursor
* Use:
*     lnSucess = ResetTable("myCursor")
****************************************************
PROCEDURE ResetTables
LPARAMETERS tcCursor
LOCAL llError 
llError = .F.

IF VARTYPE(tcCursor)="C" AND NOT EMPTY(tcCursor) AND NOT (IsNull(tcCursor))
    IF NOT USED(Juststem(tcCursor))
        TRY
            USE (tcCursor) IN 0 EXCLUSIVE
        CATCH TO loErrorUsing
            llError = .T.
            DO CASE
                CASE loErrorUsing.ErrorNo = 1
                    lnReturnValue = -2 && The Table doesn't exists
                CASE loErrorUsing.ErrorNo = 1705
                    lnReturnValue = -3 && Acess denied, used by another user
                OTHERWISE
                    lnReturnValue = -5 &&Unknow Error
            ENDCASE
        ENDTRY
        IF llError 
          RETURN lnReturnValue
        ENDIF
    ELSE
        IF NOT ISEXCLUSIVE(tcCursor)
            RETURN -4 && Used by this user, but not Exclusive
        ENDIF
    ENDIF
    llError = .F.
    lnChangedFields = 0
    FOR lnFields=1 TO AFIELDS(laFields,tcCursor)
        IF laFields[lnFields,18] # 0 &&This Field has AutoInc
           TRY
             ALTER TABLE (tcCursor) ALTER COLUMN (laFields[lnFields,1]);
                   INT AUTOINC NEXTVALUE 1 STEP (laFields[lnFields,18])
               lnChangedFields = lnChangedFields + 1
           CATCH TO loError
              llError = .T.
               ?[  Error: ] + STR(loError.ErrorNo)
               ?[  Message: ] + loError.MESSAGE
               lnReturnValue =  -6 &&Error Altering the Table
           ENDTRY
           IF llError 
             RETURN lnReturnValue
           ENDIF
        ENDIF
    ENDFOR
ELSE
    RETURN -1 && Wrong parameters...
ENDIF
RETURN lnChangedFields

ENDPROC

El procedimiento anterior, lo que hace es utilizar la tabla que hemos pasado de parametro(si es que no está en uso), si tiene algún error, devolverá un valor menor que cero ( < 0) , si cambia algún campo que tuvo incremental devolverá un número mayor que cero ( > 0) , si no cambia nada, devolverá cero... Hay que recordar que puede haber "n" campos autoincrementales un un cursor, y cada uno de esos campos, puede tener un valor distinto en su STEP...

Espero te sirva.

Espartaco Palma

22 de junio de 2004

New in Nine: Visual FoxPro's Latest Hits

Nuevo libro en Inglés de Tamar E. Granor, Doug Hennig, Rick Schummer, Toni Feltman y Jim Slater, sobre lo nuevo en VFP9 Beta.



Title: New in Nine: Visual FoxPro's Latest Hits
Authors: Tamar E. Granor, Doug Hennig, Rick Schummer, Toni Feltman y Jim Slater
Edited by: Jim Slater
ISBN: 1-930919-64-6
Length: Est. 240 pages
Formats Available: Printed (incl. ebook) or Ebook only
Printed book format: Paperback, 7"x9"
Ebook format: PDF (5 MB)
Price ($US): 49.95
Weight: 1.1 lbs.
Press date: October, 2004

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

Tabla de Contenidos

IDE
Chapter 1: Project Manager Improvements
Chapter 2: Controlling the Property Sheet
Chapter 3: Writing Code
Chapter 4: Better Tools

Reporting
Chapter 5: Enhancements to the Reporting System
Chapter 6: Customizing the Report Designer at Design-Time
Chapter 7: Customizing the Report Designer at Runtime

Data
Chapter 8: SQL Changes
Chapter 9: New Data and Index Types
Chapter 10: Managing XML
Chapter 11: Working with Remote Data
Chapter 12: Other Data Changes

Programming
Chapter 13: Forms and Controls
Chapter 14: Language Improvements
Chapter 15: Setup and Deployment

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

.

14 de junio de 2004

Obtener el tamaño de un archivo o serie de archivos

Una función para calcular el tamaño de un archivo...
****************************************************************
* Function FileSize
* Purpose: Get the FileSize (in bytes) of a single or multiple file
* Use: ?FileSize("miArchivo.txt") or ?FileSize("*.txt")
****************************************************************

FUNCTION FileSize
LPARAMETERS tcFile

LOCAL lnFileSize
lnFileSize = 0

FOR lnCounter=1 TO ADIR(laFile,tcFile)
   lnFileSize = lnFileSize+ laFile[2]  
ENDFOR

RETURN lnFileSize
ENDFUNC

Espartaco Palma Martínez

9 de junio de 2004

Autocompletar en un ComboBox

Método para añadir la característica Autocompletar en un control ComboBox.

* Escribe este codigo en el evento InteractiveChange
LOCAL lnUltimaTecla, lcMostrarValor,lcUltimoValorMostrado, ;
  lnUltimaSeleccion, lnSeleccionados
lnUltimaTecla = LASTKEY()
lcUltimoValorMostrado = ""
lnUltimaSeleccion = 0
lnSeleccionados = 0
IF (lnUltimaTecla >= 32 AND lnUltimaTecla <= 126)
  IF THIS.SELSTART >= 1
    lcMostrarValor = SUBSTR(THIS.DISPLAYVALUE,1,THIS.SELSTART-1)+(CHR(lnUltimaTecla))
  ELSE
    lcMostrarValor = (CHR(lnUltimaTecla))+ALLT(THIS.DISPLAYVALUE)
  ENDIF
  IF EMPTY(lcMostrarValor)
    lcMostrarValor = ALLT(CHR(lnUltimaTecla))
  ENDIF
  FOR i = 1 TO THIS.LISTCOUNT
    IF UPPER(lcMostrarValor) = UPPER(SUBSTR(THIS.LIST(i),1,LEN(lcMostrarValor)))
      THIS.DISPLAYVALUE = THIS.LIST(i)
      IF LEN(ALLT(THIS.DISPLAYVALUE)) > LEN(lcMostrarValor)
        THIS.SELSTART = LEN(lcMostrarValor)
        THIS.SELLENGTH = LEN(ALLT(THIS.DISPLAYVALUE))-LEN(lcMostrarValor)
      ENDIF
      lcUltimoValorMostrado = THIS.DISPLAYVALUE
      lnUltimaSeleccion = THIS.SELSTART
      lnSeleccionados = THIS.SELLENGTH
      RETURN
    ENDIF
  ENDFOR
  THIS.DISPLAYVALUE = lcUltimoValorMostrado
  THIS.SELSTART = lnUltimaSeleccion
  THIS.SELLENGTH = lnSeleccionados
ENDIF
Oscar Arley Yepes Aristizabal

Nota del editor: A continuación un ejemplo completo para ejecutar con el código anterior.
PUBLIC oMiFormulario
oMiFormulario=NEWOBJECT("MiFormulario")
oMiFormulario.SHOW
RETURN
*--------------------------------
DEFINE CLASS MiFormulario AS FORM
  DOCREATE = .T.
  CAPTION = "Autocompletar en ComboBox"
  NAME = "frmAutocompletar"
  ADD OBJECT combo1 AS COMBOBOX WITH ;
    FONTBOLD = .T., ;
    FONTSIZE = 12, ;
    ROWSOURCETYPE = 1, ;
    ROWSOURCE = "ALICIA,AMIRA,ANA,ELENA,ESTELA," + ;
    "ESTHER,MARCELA,MARIA,MARTA," + ;
    "MARTINA,MERCEDES,MIRTA,MONICA", ;
    HEIGHT = 24, ;
    LEFT = 24, ;
    TOP = 24, ;
    WIDTH = 240, ;
    NAME = "Combo1"
  PROCEDURE combo1.INTERACTIVECHANGE
    LOCAL lnUltimaTecla, lcMostrarValor,lcUltimoValorMostrado, ;
      lnUltimaSeleccion, lnSeleccionados
    lnUltimaTecla = LASTKEY()
    lcUltimoValorMostrado = ""
    lnUltimaSeleccion = 0
    lnSeleccionados = 0
    IF (lnUltimaTecla >= 32 AND lnUltimaTecla <= 126)
      IF THIS.SELSTART >= 1
        lcMostrarValor = SUBSTR(THIS.DISPLAYVALUE,1,THIS.SELSTART-1)+(CHR(lnUltimaTecla))
      ELSE
        lcMostrarValor = (CHR(lnUltimaTecla))+ALLT(THIS.DISPLAYVALUE)
      ENDIF
      IF EMPTY(lcMostrarValor)
        lcMostrarValor = ALLT(CHR(lnUltimaTecla))
      ENDIF
      FOR i = 1 TO THIS.LISTCOUNT
        IF UPPER(lcMostrarValor) = UPPER(SUBSTR(THIS.LIST(i),1,LEN(lcMostrarValor)))
          THIS.DISPLAYVALUE = THIS.LIST(i)
          IF LEN(ALLT(THIS.DISPLAYVALUE)) > LEN(lcMostrarValor)
            THIS.SELSTART = LEN(lcMostrarValor)
            THIS.SELLENGTH = LEN(ALLT(THIS.DISPLAYVALUE))-LEN(lcMostrarValor)
          ENDIF
          lcUltimoValorMostrado = THIS.DISPLAYVALUE
          lnUltimaSeleccion = THIS.SELSTART
          lnSeleccionados = THIS.SELLENGTH
          RETURN
        ENDIF
      ENDFOR
      THIS.DISPLAYVALUE = lcUltimoValorMostrado
      THIS.SELSTART = lnUltimaSeleccion
      THIS.SELLENGTH = lnSeleccionados
    ENDIF
  ENDPROC
ENDDEFINE
*--------------------------------