Antes de nada, ¡Gracias!, por la respuesta Leandro.
Con lo que me respondio Antonio, ¡Gracias! de nuevo, por ello. Y lo que Vd. me contesto, se soluciono el problema.
Pero, "siempre hay un pero", ahora surgio uno nuevo.
La función funciona, hasta que llega el momento de salir, y en vez de seguir a la línea siguiente a la llamada, hace un RETURN a la función que la llamo.
Lo extraño es que si, le pongo un MsgInfo( "Pausa, antes de salir..." ). Antes del RETURN, este no se muestra, y entonces si funciona:
Code: Select all
*- Ficheros de cabecera:
#INCLUDE "DIRECTRY.CH"
#INCLUDE "FiveWin.CH"
#INCLUDE "MESDBF.CH" // Clase: TDbf
#INCLUDE "..\..\Include\Comunes.CH"
*- Variables: Estaticas.
*- Utilizada por la función: PorcentInd.
STATIC lPrimerVez := TRUE
FUNCTION CrearIndic( cContab )
*- Vectores: Locales.
LOCAL axFicheros := {}
LOCAL anVal := ARRAY( 5 )
*- Constantes Objeto: Locales.
LOCAL oDlg1
LOCAL oDlg2
*- Vectores Objeto: Locales.
LOCAL aoSay := ARRAY( 5 )
LOCAL aoMeter := ARRAY( 5 )
*- Borramos los Indices antiguos.
axFicheros := DIRECTORY( "*.NTX" )
IF LEN( axFicheros ) > 0
AEVAL( axFicheros, ;
{ | fichero | FERASE( fichero[ F_NAME ] ) } )
axFicheros := {}
ENDIF
DEFINE DIALOG oDlg1 RESOURCE "Indices_Creacion"
REDEFINE SAY PROMPT OemToAnsi( "CREACIÓN DE LOS INDI" + ;
"CES DEL AÑO: " + cContab ) ID 101 OF oDlg1
ACTIVATE DIALOG oDlg1 CENTERED NOWAIT
DEFINE DIALOG oDlg2 RESOURCE "Indices_Base_de_Datos"
REDEFINE SAY aoSay[ 1 ] ID 101 OF oDlg2
REDEFINE SAY aoSay[ 2 ] ID 102 OF oDlg2
REDEFINE SAY aoSay[ 3 ] ID 104 OF oDlg2
REDEFINE SAY aoSay[ 4 ] ID 106 OF oDlg2
REDEFINE SAY aoSay[ 5 ] ID 110 OF oDlg2
REDEFINE METER aoMeter[ 1 ] VAR anVal[ 1 ] ;
ID 103 OF oDlg2
REDEFINE METER aoMeter[ 2 ] VAR anVal[ 2 ] :
ID 105 OF oDlg2
REDEFINE METER aoMeter[ 3 ] VAR anVal[ 3 ] ;
ID 107 OF oDlg2
REDEFINE METER aoMeter[ 4 ] VAR anVal[ 4 ] ;
ID 109 OF oDlg2
REDEFINE METER aoMeter[ 5 ] VAR anVal[ 5 ] ;
ID 111 OF oDlg2
ACTIVATE DIALOG oDlg2 ;
CENTERED ;
ON PAINT ( Indexar( aoSay, aoMeter, ;
anVal ), oDlg2:End(), oDlg1:End() )
MsgInfo( "Antes de Salir..." ) // Si lo quito, no funciona
RETURN NIL
FUNCTION Indexar( aoSay, aoMeter, anVal )
*- Vectores: Locales.
LOCAL acMensajes := ARRAY( 4 )
*- Constantes Objeto: Locales.
LOCAL oDbfClient // Para: CLIENTES.DBF
LOCAL oDbfPresup // Para: PRESUPUE.DBF
LOCAL oDbfFactC // Para: FACTCLIE.DBF
LOCAL oDbfProv // Para: PROVEEDO.DBF
LOCAL oDbfFactP // Para: FACTPROV.DBF
LOCAL oDbfDevoP // Para: DEVOPROV.DBF
// Codigo OOP para la generación
// del fichero: CLIENTES.DBF
DEFINE DATABASE oDbfClient FILE "CLIENTES.DBF" ;
ALIAS "CLIENTES"
FIELD NAME "CODIGO" TYPE "C" LEN 7 DEC 0 OF oDbfClient
FIELD NAME "NOMBRE" TYPE "C" LEN 20 DEC 0 OF oDbfClient
FIELD NAME "APELLIDO1" TYPE "C" LEN 30 DEC 0 OF oDbfClient
FIELD NAME "APELLIDO2" TYPE "C" LEN 30 DEC 0 OF DbfClient
FIELD NAME "DOMICILIO" TYPE "C" LEN 40 DEC 0 OF oDbfClient
FIELD NAME "COD_POSTAL" TYPE "N" LEN 5 DEC 0 OF oDbfClient
FIELD NAME "POBLACION" TYPE "C" LEN 30 DEC 0 OF oDbfClient
FIELD NAME "PROVINCIA" TYPE "C" LEN 30 DEC 0 OF oDbfClient
FIELD NAME "NIF" TYPE "C" LEN 12 DEC 0 OF oDbfClient
FIELD NAME "TELEFONO1" TYPE "N" LEN 9 DEC 0 OF oDbfClient
FIELD NAME "TELEFONO2" TYPE "N" LEN 9 DEC 0 OF oDbfClient
// Indices del objeto TDbf oDbfClient
acMensajes := { "BASE DE DATOS: CLIENTES.DBF" , ;
"POR: EL CÓDIGO DEL CLIENTE" , ;
"POR: EL NOMBRE DEL CLIENTE" , ;
"POR: EL TELÉFONO DEL CLIENTE" }
*- Indice: ClieCod = Clientes Codigo del Cliente.
INDEX FILE ClieCod ;
TAG Codigo ;
ON codigo ;
EVAL ( lPrimerVez := TRUE , ;
PorcentInd( oDbfClient, aoMeter[ 1 ], ;
anVal, acMensajes, aoSay ) ) ;
OF oDbfClient
*- Indice: ClieNomb = Clientes Nombre del Cliente.
INDEX FILE ClieNomb ;
TAG Nombre ;
ON apellido1 + apellido2 + ;
nombre + codigo ;
EVAL ( lPrimerVez := TRUE , ;
PorcentInd( oDbfClient, aoMeter[ 2 ] ) ) ;
OF oDbfClient
/* Indice: ClieTele = Clientes
Teléfono del Cliente. */
INDEX FILE ClieTele ;
TAG Telefono ;
ON PADL( telefono1, 9, "0" ) + ;
PADL( telefono2, 9, "0" ) + ;
PADL( movil, 9, "0" ) + ;
PADL( fax, 9, "0" ) + ;
codigo ;
EVAL ( lPrimerVez := TRUE, ;
PorcentInd( oDbfClient, aoMeter[ 3 ] ) ) ;
OF oDbfClient
END DATABASE oDbfClient
ACTIVATE DATABASE oDbfClient // NORECYCLE
oDbfClient:Close()
// Codigo OOP para la generación del fichero: PRESUPUE.DBF
DEFINE DATABASE oDbfPresup FILE "PRESUPUE.DBF" ;
ALIAS "PRESUPUE"
FIELD NAME "TIPO" TYPE "N" LEN 1 DEC 0 OF oDbfPresup
FIELD NAME "ESTADO" TYPE "N" LEN 1 DEC 0 OF oDbfPresup
FIELD NAME "CODIGO" TYPE "C" LEN 7 DEC 0 OF oDbfPresup
FIELD NAME "NUMPRESUPU" TYPE "C" LEN 5 DEC 0 OF oDbfPresup
FIELD NAME "FECHAPRESU" TYPE "D" LEN 8 DEC 0 OF oDbfPresup
FIELD NAME "DESCRIPCIO" TYPE "C" LEN 200 DEC 0 OF oDbfPresup
FIELD NAME "CANTIDAD" TYPE "N" LEN 3 DEC 0 OF oDbfPresup
FIELD NAME "PRECIO" TYPE "N" LEN 8 DEC 3 OF oDbfPresup
// Indices del objeto TDbf oDbfPresup
acMensajes := { "BASE DE DATOS: PRESUPUE.DBF" , ;
"POR: EL CÓDIGO DEL CLIENTE" , ;
"POR: EL NÚMERO DE PRESUPUESTO" , ;
"POR: EL NÚMERO DE PRESUPUESTO, SIN REPETIR" }
*- Indice: CPCodCli = Clientes Presupuestos Codigo del Cliente.
INDEX FILE CPCodCli ;
TAG Codigo ;
ON codigo ;
EVAL ( lPrimerVez := TRUE, ;
PorcentInd( oDbfPresup, aoMeter[ 1 ] , ;
anVal, acMensajes, aoSay ) ) ;
OF oDbfPresup
/* Indice: CPPresup = Clientes Presupuestos
Codigo del Cliente
y Número de Presupuesto */
INDEX FILE CPPresup ;
TAG Presupu ;
ON codigo + numpresupu ;
EVAL ( lPrimerVez := TRUE , ;
PorcentInd( oDbfPresup, aoMeter[ 2 ] ) ) ;
OF oDbfPresup
/* Indice: CPPresuU = Clientes Presupuestos
Codigo del Cliente
y Número de Presupuesto
SIN REPETIR. */
INDEX FILE CPPresuU ;
TAG PresupuU ;
ON codigo + numpresupu UNIQUE ;
EVAL ( lPrimerVez := TRUE, ;
PorcentInd( oDbfPresup, aoMeter[ 3 ] ) ) ;
OF oDbfPresup
END DATABASE oDbfPresup
ACTIVATE DATABASE oDbfPresup // NORECYCLE
oDbfPresup:Close()
RETURN NIL
//-----------------------------------------------------------//
*- Función: PorcentInd.
STATIC FUNCTION PorcentInd( oDbf, oMeter, anVal, acMensajes, aoSay )
*- Variables: Locales.
LOCAL nRegistro := 0
IF lPrimerVez
lPrimerVez := FALSE
oMeter:nTotal := oDbf:LastRec()
IF VALTYPE( acMensajes ) = "A"
IF LEN( acMensajes ) = 4
ASIZE( acMensajes, 5 )
acMensajes[ 5 ] := ""
ENDIF
AEVAL( anVal, { | elemento, n | anVal[ n ] := 0 } )
AEVAL( aoSay, { | elemento, n | ;
aoSay[ n ]:SetText( OemToAnsi( acMensajes[ n ] ) ) , ;
aoSay[ n ]:Refresh() } )
ENDIF
ENDIF
nRegistro := oDbf:RecNo()
oMeter:Set( nRegistro )
SysRefresh()
SI nRegistro = oMeter:nTotal ENTONCES lPrimerVez := TRUE
RETURN TRUE
¿Por que?. ¿Le ha ocurrido alguien lo mismo?
Saludos, José M