30 de noviembre de 2007

Semanas del mes

Un compañero de trabajo hoy me estaba solicitando una rutina que le mostrara las semanas del mes así que basado en un ejemplo que existe en fox.wikis.com del ultimo día del mes lo adapte e hice la siguiente función a la cual podría ayudar a alguien como este compañero si existe una mejor forma agradecería sus comentarios.
? SEMANASMES(DATE())

FUNCTION SEMANASMES(ldFecha)
  IF TYPE("ldFecha") # "D"
    MESSAGEBOX('Parametro invalido',16,"Alto")
    RETURN 0
  ENDIF
  RETURN CEILING(DAY(GOMONTH(ldFecha, 1) - DAY(ldFecha)) / 7)
ENDFUNC
Emanuel Omar Villicaña Villegas

28 de noviembre de 2007

Agregar campo autoincremental a tabla con registros

Tuve que agregar un campo incremental a varias tablas que tenían cantidades variables de registros y me encontré con el problema que, por un lado, a todos los registros les puso el valor de cero; y por otro lado, el campo era de sólo lectura.

Imaginé que había una función que actualizaba ese campo en todos los registros, pero busqué información al respecto en la documentación y web pero al no encontrarla (y con la presión de terminar el trabajo lo más pronto posible) hice la función siguiente:

FUNCTION NewIncrem
   LPARAMETERS lcTabla, lcNombreCampo, lnError, lnUltInc
   * abre la tabla
   TRY
      USE (lcTabla) IN 0 EXCLUSIVE
      lnError = 0
   CATCH
      MESSAGEBOX("Error al abrir tabla", 48, "Error")
      lnError = 1
   ENDTRY
   IF lnError = 1
      RETURN 0
   ENDIF
   * crea el campo, si ya existe el nombre o es inválido cancela la operación
   * crea el campo como numérico para poder actualizar los valores
   TRY
      SELECT (lcTabla)
      ALTER TABLE (lcTabla) ADD COLUMN (lcNombreCampo) N(10)
   CATCH
      MESSAGEBOX("Error al crear el campo", 48, "Error")
      lnError = 1
   ENDTRY
   IF lnError = 1
      RETURN 0
   ENDIF
   * actualiza los valores del campo
   REPLACE (lcNombreCampo) WITH RECNO() ALL
   * actualiza el tipo de campo a incremental y el siguiente valor del autoincremental
   ALTER TABLE (lcTabla) ALTER COLUMN (lcNombreCampo) I
   GO BOTTOM
   lnUltInc = &lcNombreCampo
   ALTER TABLE (lcTabla) ALTER COLUMN (lcNombreCampo) INT AUTOINC NEXTVALUE iUltReg+1 STEP 1
   RETURN 1
ENDFUNC
Lo primero que hace es crear el campo como numérico, para poder reescribirlo, le pone a cada fila el número de registro que le corresponde. Luego, modifica el tipo de campo a entero autoincremental y actualiza el valor siguiente en la base de datos.

Devuelve numérico: 0 si falló, 1 si se realizó la operación.

Para llamarlo:
=NewIncrem("miTabla", "miCampo")


Arturo Panana

7 de noviembre de 2007

Rutina para una fecha en letras

Hice una variaciones para utilizar la rutina de Hector Urrutia en una función definida por el usuario (UDF) el programa puede tener cualquier nombre yo le puse datestr.prg y asi se llama la función, es como sigue:
PARAMETERS tddate
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 
De esta forma agrega mucha funcionalidad ya que si tenemos una tabla donde haya un campo fecha se puede ver directamente usando el browse tanto el campo fecha como su descripción en letra utilizando la función como un campo calculado por ejemplo:
BROWSE FIELD FECHA,A=DATESTR(FECHA)
también
DISP ALL FECHA,DATESTR(FECHA)
también si tienes la fecha en una variable
? DATESTR(variable)
Gracias a todos en especial a Hector mucha salud y suerte.

Nelson Maranjes
Cuba