Page 1 of 1

No se actualizan, los SAY.

Posted: Thu Feb 16, 2006 12:23 am
by JMFS-D
Necesito ayuda, os reproduzco, un poco del codigo que no me funciona:

Code: Select all

FUNCTION CrearIndic( cContab )

   *- Vectores y Matrices: Locales.

      LOCAL axFicheros := {}
      LOCAL anVal        := ARRAY( 4 )

      LOCAL oDlg1
      LOCAL oDlg2

   *- Vectores Objeto: Locales.
      
      LOCAL aoSay        := ARRAY( 4 )
      LOCAL aoMeterInd := ARRAY( 4 )

   *- 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 INDICES DEL AÑO: "  + cContab )      ID 101 OF oDlg1

   ACTIVATE DIALOG oDlg1 CENTERED NOWAIT

      *- Creación de los Indices de la Base de Datos: CLIENTES.DBF

         AEVAL( anVal, { | elemento, n | anVal[ n ] := 0 } )

         DEFINE DIALOG oDlg2 RESOURCE "Indices_Base_de_Datos"
            REDEFINE SAY    aoSay[ 1 ]                                         ;
                     PROMPT "BASE DE DATOS: CLIENTES.DBF"  ID 101 OF      oDlg2 UPDATE
            REDEFINE SAY    aoSay[ 2 ]                                         ;
                     PROMPT "POR: EL CODIGO DEL CLIENTE"   ID 102 OF oDlg2 UPDATE
            REDEFINE SAY    aoSay[ 3 ]                                         ;
                     PROMPT "POR: EL NOMBRE DEL CLIENTE"   ID 104 OF oDlg2 UPDATE
            REDEFINE SAY    aoSay[ 4 ]                                         ;
                     PROMPT "POR: EL TELEFONO DEL CLIENTE" ID 106 OF oDlg2 UPDATE

            REDEFINE METER aoMeterInd[ 1 ] VAR anVal[ 1 ] ID 103 OF oDlg2
            REDEFINE METER aoMeterInd[ 2 ] VAR anVal[ 2 ] ID 105 OF oDlg2
            REDEFINE METER aoMeterInd[ 3 ] VAR anVal[ 3 ] ID 107 OF oDlg2
            REDEFINE METER aoMeterInd[ 4 ] VAR anVal[ 4 ] ID 109 OF oDlg2
         ACTIVATE DIALOG oDlg2 CENTERED NOWAIT
.
.   Me genera los indices, y realizo una pausa, para ver que muestra el DIALOG. Hasta aquí todo correcto.
.
           MsgInfo( "Pausa..." )

*- Tras la Pausa, pasamos a otra DBF. Por lo que cambio, los SAY del DIALOG. Pero no _, se queda como, cuando se activo el DIALOG. Le pogo la pausa, para verlo, pero nada.

            AEVAL( anVal, { | elemento, n | anVal[ n ] := 0 } )

            aoSay[ 1 ]:SetText( OemToAnsi( "BASE DE DATOS: PRESUPUE.DBF" ) )
            aoSay[ 1 ]:Refresh()
            aoSay[ 2 ]:SetText( OemToAnsi( "POR EL CODIGO DEL CLIENTE" ) )
            aoSay[ 2 ]:Refresh()
            aoSay[ 3 ]:SetText( OemToAnsi( "POR: EL NÚMERO DE PRESUPUESTO" ) )
            aoSay[ 3 ]:Refresh()
            aoSay[ 4 ]:SetText( OemToAnsi( "POR: EL NÚMERO DE PRESUPUESTO"   + ;
                                           " SIN REPETIR"                 ) )
            aoSay[ 4 ]:Refresh()

            oDlg2:UpDate()
            SysReFresh()

*- Y así con una tercera DBF. Tampoco cambía

El DIALOG, tiene definidos los SAY, de manera que no sean de solo escritura, pues pensando que influía, desactive en el WORKSOP, READ ONLY. Pero nada, activado, o no. No me funciona.

¿Que debo hacer?

Saludos, José Mª

Sigo haciendo pruebas.

Posted: Sun Feb 19, 2006 11:37 am
by JMFS-D
No, se que sucede. Sigo haciendo pruebas, y no hay forma.

Los SAY, continuan si actualizarse.

¿Me podeís dar, una pequeña orientación?

Gracias anticipadas. Saludos, José Mª

Posted: Sun Feb 19, 2006 11:49 am
by Antonio Linares
José Mª,

Este ejemplo funciona correctamente. Quizá te sirva de orientación:

Code: Select all

#include "FiveWin.ch"

function Main()

   local oDlg1, oDlg2, oTimer
   
   DEFINE DIALOG oDlg1 TITLE "First"
   
   @ 2, 2 SAY oSay PROMPT Time()
   
   ACTIVATE DIALOG oDlg1 NOMODAL CENTERED
            
   DEFINE TIMER oTimer ACTION oSay:SetText( Time() )
   
   ACTIVATE TIMER oTimer
   
   DEFINE DIALOG oDlg2 TITLE "Second" 
   
   ACTIVATE DIALOG oDlg2
            
return nil

Gracias Antonio.

Posted: Mon Feb 20, 2006 6:15 pm
by JMFS-D
Parece, que ya va en camino.

Espero no molestar, en algún tiempo.

Pero ya se sabe, basta que digas algo, para que ocurra lo contrario.

Saludos, José Mª

Quita update

Posted: Tue Feb 21, 2006 1:29 pm
by leandro
Amigo, a mi en alguna oportunidad me sucedio lo mismo y se debia a la clausula UPDATE, intenta quitarla, creo que esto te solucionara el problema.

Lo que decía.

Posted: Thu Feb 23, 2006 5:44 pm
by JMFS-D
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

No entendi?

Posted: Thu Feb 23, 2006 7:21 pm
by leandro
Amigo, la verdad no entendi, lo que quieres si mandas algun pedazo de codigo?

Posted: Fri Feb 24, 2006 2:15 pm
by Antonio Linares
Jose Mª,

>
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:
>

Llama a SysRefresh() en vez de a MsgInfo()

Gracias Antonio.

Posted: Sun Feb 26, 2006 8:14 pm
by JMFS-D
Lo acabo de probar, efectivamente, de momento funciona.

¡Gracias!, de nuevo. José Mª