martes, 13 de septiembre de 2011

Mostar un reporte dentro de un Formulario a traves de una rutina .PRG

Saludos! Nuevamente les traigo una aportacion sobre como se puede mostrar un Reporte (.frx) dentro de un formulario (.scx) en una rutina (.prg) de visual foxpro.


1. Creamos un archivo .prg en nuestro proyecto. Lo llamaremos "mostrarreporte".
2. Copiamos el siguiente codigo dentro del .prg.

PROCEDURE xreporte

PUBLIC repform

repform = CREATEOBJECT('Vista previa')
repform.Visible = .T.

**--Definimos la clase Form
DEFINE CLASS vista previa AS FORM
   Name = "Vista Previa"
   ScaleMode = 3
   Top = 0
   Width = 700
   Height = 650
   ShowWindow = 2
   Closable = .T.
   Caption = "Vista previa - Reporte xxx"
   Movable = .T.
   WindowState = 2
   SizeBox = .F.



**--Mostramos el reporte
REPORT FORM "Mireporte" PREVIEW WINDOW vista previa IN WINDOW vista previa

**--
  END DEFINE
ENDPROC

3. Luego, solamente llamamos la rutnina desde cualquier punto de nuestra aplicacion. Por ejemplo, en el evento Click de un boton, ponemos un codigo como este:

DO xreporte IN mostrarreporte


Es decir, llamamos al procedimiento contenido en el .prg. :)


Cualquier duda, o comentario o critica, es siempre bienvenida para mejorar!

Saludos! Desde Managua, Nicaragua!
Ravenn! :)

sábado, 6 de agosto de 2011

Marcar registros para eliminacion (Borrar) con DELETE - VFP

Saludos estimados. En esta ocasion mostraremos como marcar un registro para eliminacion usando el comando DELETE. Esto equivale a borrar o "eliminar" un registro para que no aparezca en nuestros forms y asi inhabilitarlo para cualquier transaccion o accion posterior. No obstante, es correcto aclarar que DELETE no elimina fisicamente los registros de la tabla. Solo los marca para eliminarlos y  posteriormente usando en comando PACK si se pueden borrar 100% de nuestras bases de datos. En mi humilde opinion, basta con marcar un registro para eliminarlo y usar SET DELETED ON en el evento INIT de nuestros forms para "simular" la eliminacion, puesto que los registros no deben ser eliminados totalmente de nuestras tablas.

Para esto, procederemos de la suiguiente manera:

1. En el evento INIT del form escribimos SET DELETED ON. Esto es para que los registros que "eliminamos", no aparezcan. No obstante, tambien puedemos establecer SET DELETED OFF si queremos poder seguir viendolos una vez que ya los "eliminamos". Eso es en dependencia de la aplicacion y como queremos administrar dichos eliminados.

2. Creamos un boton (Eliminar) en tu form y en el evento CLICK escribimos esto:

**--Eliminar registros DELETE--**
#DEFINE   MSGBOX_YES       6
#DEFINE   C_MSGBOX1        36
#DEFINE   C_DELETE_LOC   "Desea eliminar este registro?"
IF EMPTY(ALIAS())
       RETURN
ENDIF

IF MESSAGEBOX(C_DELETE_LOC,C_MSGBOX1) = MSGBOX_YES
              DELETE
       THISFORM.Refresh
ENDIF
IF !EOF()
    SKIP 1
ENDIF
         IF EOF() AND !BOF()
              SKIP -1
         ENDIF

THISFORM.Refresh
**--Fin--**


No es aconsejable eliminar registros "totalmente" de las tablas con PACK en lugar de DELETE... puesto que podrian darse situaciones en que necesitaremos "llamar" o "recuperar"nuevamente esos registros con RECALL!!!



Saludos. Sugerencias y comentarios son siempre bienvenidos para mejorar.
Un abrazo! Desde Managua, Nicaragua.


Ravenn! :)

Abrir pagina web con navegadores (Chrome, Mozilla, Explorer) desde Form - VFP

Saludos. En esta ocasion presentaremos como escribir una direccion web en un control text de un formulario y abrir dicha direccion con los navegadores de Chrome, Mozilla e InternetExplorer.

Vamos a suponer que tenemos un formulario que contiene:

- 1 control Text (Text1) para introducir la direccion de la pagina web.
- 3 botones de comando. Cada boton corresponde a un navegador. Establecemos la propiedad caption de cada uno para hacer referencia:
     ~ Command1.Caption = "Mozilla Firefox"
     ~ Command2.Caption = "Google Chrome"
     ~ Command3.Caption = "Internet Explorer"



Va asi: 

1. En el evento click del Command1 (Navegador Mozilla) escribimos un codigo como este: 

DECLARE INTEGER ShellExecute IN "Shell32.dll" ; 
INTEGER hwnd, ; 
STRING lpVerb, ; 
STRING lpFile, ; 
STRING lpParameters, ; 
STRING lpDirectory, ; 
LONG nShowCmd 

**Abrimos explorador Firefox
=Shellexecute(0,"Open","C:\Program Files (x86)\Mozilla Firefox\firefox.exe",THISFORM.Text1.VALUE,"",0) 


2. En el evento click del Command2 (Navegador Google Chrome) escribimos un codigo como este: 

DECLARE INTEGER ShellExecute IN "Shell32.dll" ; 
INTEGER hwnd, ; 
STRING lpVerb, ; 
STRING lpFile, ; 
STRING lpParameters, ; 
STRING lpDirectory, ; 
LONG nShowCmd 

**Abrimos explorador Chrome
=Shellexecute(0,"Open","C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",THISFORM.Text1.VALUE,"",0) 


3. En el evento click del Command3 (Navegador Internet Explorer) escribimos un codigo como este: 

*Abrimos explorador Explorer
WITH THISFORM
poExplorer = CreateObject("internetexplorer.Application") 
poExplorer.Navigate((THISFORM.Text1.Value), " ")
poExplorer.Visible=.T.
ENDWITH


Guardamos y ejecutamos. :) 


La direccion web debe ser introducida en el control Text1 asi (ejemplo): www.yahoo.com y luego proceder a dar un click sobre el boton que escojamos como navegador para abrir dicha pagina. 

Cabe destacar que en los codigos referentes a Mozilla y Chrome debe copiarse la ubicacion de los ejecutables de cada navegador en el equipo ("firefox.exe" y "chrome.exe"). 


Saludos. Sugerencias y comentarios son siempre bienvenidos para mejorar! 
Un abrazo! Desde Managua, Nicaragua. 
Ravenn! :) 


Exportar tabla a Excel - VFP

Para exportar una tabla a Miscrosoft Excel, ejemplificaremos como proceder. Supongamos que tenemos la tabla  productos con los campos codigo, descripcion, unidadmedida, lineaproducto. Para exportar los campos de la tabla de fox a las columnas de excel, usaremos un codigo como este:


**--GENERACION A MICROSOFT EXCEL

LError = ON('error')
ON ERROR xlapp = NULL
xlapp = GETOBJECT('Excel Application')
ON ERROR &LError
IF ISNULL(xlapp)

**--Generamos la aplicacion
 xlapp = CREATEOBJECT('Excel.Application')
ENDIF

WITH xlapp
 .VISIBLE = 'True'
    .DisplayAlerts = 'False'
    .Workbooks.ADD()
ENDWITH

xlsheet = xlapp.ActiveSheet

 **--Formatos
WITH xlsheet
 .COLUMNS("A:K").Font.Name = "MS Sans Serif"
 .COLUMNS("A:K").Font.Size = 9

 .COLUMNS("A:A").ColumnWidth = 7.00 &&Codigo
 .COLUMNS("A:A").HorizontalAlignment = 3
 .COLUMNS("B:B").ColumnWidth = 15.00 &&Descripcion
 .COLUMNS("C:C").ColumnWidth = 11.00 &&Unidad Medida
 .COLUMNS("C:C").HorizontalAlignment = 3
 .COLUMNS("D:D").ColumnWidth = 11.00 &&Linea
 .COLUMNS("D:D").HorizontalAlignment = 1

ENDWITH

Fila = 1

**--Titulo
xlsheet.Cells(Fila,1).Value = 'Reporte de Productos'

WITH xlsheet.Range("A1:A1")
 .Font.Bold = 'True'
 .HorizontalAlignment = 1
ENDWITH

Fila = Fila + 2

**--Titulos de columna
xlsheet.Cells(Fila,1).Value = "Codigo"
xlsheet.Cells(Fila,2).Value = "Descripcion"
xlsheet.Cells(Fila,3).Value = "Unidad/Medida"
xlsheet.Cells(Fila,4).Value = "Linea"


Fila = Fila + 1

 WITH xlsheet.Range("A10:C10")
 .Font.Bold = 'True'
ENDWITH

SELECT productos

**--Levantamos campos y reemplazamos en columnas de la hoja
SCAN
xlsheet.Cells(Fila,1).Value = productos.codigo
xlsheet.Cells(Fila,2).Value = productos.descripcion
xlsheet.Cells(Fila,3).Value = productos.unidaddemedida
xlsheet.Cells(Fila,4).Value = productos.linea

Fila = Fila + 1
ENDSCAN


**--Fin del codigo



Saludos. Espero sea de utilidad. Comentarios y sugerencias para mejorar son siempre bienvenidos.

Un abrazo! Desde Managua, Nicaragua.
Ravenn! :)

viernes, 5 de agosto de 2011

Generar contador de registros automatico - VFP

Saludos estimados. Hay ocasiones en las que necesitamos generar un contador de registros automatico para nuestras aplicaciones tales como Facturadores, Pedidos, Notas de debito y muchas otras. Al decir "automatico" me refiero a dar un click en un boton "Nuevo registro" (por ejemplo) y que nos aparezca el numero concecutivo de registro en un control (text) de nuestro form. Asi ahorramos tiempo, evitamos errores en la numeracion y hacemos mas eficiente nuestra aplicacion. El generar un concecutivo no es mas que contar el numero de registros actual de la tabla al momento de ingresar uno nuevo [registro] y sumarle 1, el cual representa el registro en cuestion.


Para ilustar esto, tomaremos como supuesto que tenemos la tabla clientes, un campo [numerico] numreg (para almacenar el # de cada registro), un boton "Nuevo"  y un control "Text1".

Nota: el codigo esta dirigido solo a generar el concecutivo al ingresar un nuevo registro. Puede ser usado en culaquier otro evento de otro control! :)

En el evento Click del boton "Nuevo" escribiremos un codigo como este:


SELECT clientes
codreg = RECCOUNT()

THISFORM.Text1.Value = codreg + 1
THISFORM.Refresh


En el campo numreg almacenamos el numero de registro estableciendo la propiedad ControlSource del Text1 = clientes.numreg y almacenandolo a traves de la sintaxis de codigo mas conveniente.

Sugerencias y comentarios son siempre bienvenidos.
Un abrazo! Desde Managua, Nicaragua!
Ravenn! :)

Insertar un Control ComboBox en Grid - VFP

Saludos estimados. Me han consultado en reiteradas ocasiones como insertar un control ComboBox a un Grid. Aqui presentare como hacerlo. Para insertar un control combo en una columna especifica de un control Grid en nuestros formularios, seguiremos los siguientes pasos. Primeramente, vamos a suponer que tenemos un grid (Grid1) y queremos insertar en la columna1 (Column1) un control ComboBox (Combo1). Va asi: 

1. Click derecho sobre el grid y escogemos la opcion "Editar".
2. Seleccionamos la columna donde insertaremos el combo haciendo click izq. sobre la misma. 
3. Una vez seleccionada, vamos a la barra de controles estandar, seleccionamos el control combo y hacemos click sobre la columna seleccionada donde keremos insertar el control . El ComboBox se debe insertar en la columna y  debera aparecer introducido.
4. Los controles grids traen por defecto el control Text insertado en sus columnas. Por tanto, para que  aparezca el combo como control unico, debemos eliminar el Text. Para ilustrar mejor la situacion, seleccionamos la columna donde insertamos el ComboBox, en la ventana de propiedades, desplegamos el combo contenedor de objetos y ahi te debe aparecer esto:

Column1
   Header1
   Text1
   Combo1

Si aparece de esta manera, significa que hemos procedido correctamente.  Eso indica que tenemos los dos controles en la columna (ComboBox y Text). Ahora quitaremos el Text para dejar solo el combo.

5. Seleccionamos el text de la columna en cuestion. Una vez seleccionado, apretamos la tecla "Suprimir". Y listo. Eso debe eliminar el text. Revisamos en el combo contenedor de objetos de la ventana de propiedades  y en la columna te debe aparecer asi:

Column1
   Header1
  Combo1

Si aparece asi, Eureka! :)


Ahora... nos dirigimos a las propiedades de la columna donde insertamos el combo, en la pestana DATA, buscamos la propiedad CurrentControl y su valor debe ser Combo1. Ahi mismo, seleccionamos la propiedad Sparse = .T. (para mostrar el control en todas las lineas del grid) y listo! Para cargar de datos el combo segun nuestras necesidades, solamente lo seleccionamos y procedemos a darle el tratamiento a sus propiedades de manera normal como a cualquier  otro Combo!

Saludos! Comentarios y sugerencias para mejorar el contendio son siempre bienvenidos. :)
Un abrazo, desde Managua, Nicaragua. 
Ravenn! 

Bienvenidos.

Saludos estimados usuarios de Visual FoxPro. En esta seccion podran encontrar algunas aportaciones que he querido recopilar sobre temas de interes respecto a la programacion en Visual FoxPro. Espero sea de su agrado.

Un abrazo.
Saludos!
Desde Managua, Nicaragua.