Consulta por cancelación de proceso

HMG en Español

Moderator: Rathinagiri

Post Reply
citro
Posts: 52
Joined: Wed Dec 22, 2010 3:45 pm

Consulta por cancelación de proceso

Post by citro »

Tengo que hacer un cambio de código en el campo rubro de una tabla de movimientos de mercadería. Esta tabla tiene
cerca de 1000000 de registros y está en una red. Los equipos tienen Windows XP y el servidor es un Windows server 2008
Este proceso lo hago en principio en una carpeta de prueba, que también está en la red, y como es un proceso que
lleva un tiempo en realizarse, en un momento quise cancelar el mismo y me arrojó el mensaje de que "no existe el alias
MOVMER", la tabla que está procesando. La pregunta es, ¿Como puedo cancelar dicho proceso sin que me arroje el mensaje
de error?, o sea cerrar la tabla y salir del formulario como si no hubiese iniciado el proceso. El código fuente es el de abajo.

Code: Select all

use movmer shared new

DEFINE WINDOW frmCambRubr ;
  AT 0,0 ;
  WIDTH 500 ;
  HEIGHT 200 ;
  TITLE "Cambia Rubro Gx" ;
  CHILD ;
  NOSIZE ;
  BACKCOLOR {193,231,253 } ;
  ON RELEASE CierraTabla()
  
  DEFINE TOOLBAR tbCambRubr BUTTONSIZE 120,30 FLAT BORDER
  
  BUTTON btnProcesar ;
  CAPTION '&Procesar' ;
  ACTION Proceso() TOOLTIP 'Procesar'

  BUTTON btnSalir ;
  CAPTION '&Salir' ;
  PICTURE 'Salir.bmp' ;
  ACTION frmCambRubr.release() TOOLTIP 'Salir'
  
  END TOOLBAR
  
  DEFINE STATUSBAR
    STATUSITEM "Cambio de Rubro y código"
  END STATUSBAR
  
ON KEY ESCAPE ACTION {|| ThisWindow.release()  }
        
END WINDOW

frmCambRubr.Center
frmCambRubr.Activate

/***
*/

static Function Proceso()

local nReg100

frmCambRubr.btnProcesar.enabled:=.f.

nReg100:=0
movmer->( OrdSetfocus( 0 ) )
movmer->( DbGotop() )
do whil !movmer->( Eof() )
  if movmer->rubro $ "GB_GC_GE_GF_GN_GO_GP_GT"
    movmer->( Reclock() )
    movmer->clave:=movmer->rubro +rtrim( movmer->clave	)
  	movmer->rubro:="GC"
  end if
  
  if nReg100 = 100
    frmCambRubr.statusbar.item(1):="Procesando movmer: " +str( movmer->( ordkeyno() ) / movmer->( ordkeycount() )*100,3 )+' %' 
    nReg100:=0
    do events
  else
    nReg100++
  end if
  movmer->( DbSkip() )  
end whil
frmCambRubr.statusbar.item(1):=space(40)
movmer->( DbCommitAll() )
movmer->( DbUnlockAll() )

/***/
static Function CierraTabla()

movmer->( DbCloseArea() )

retu Nil
Antonio
Sistemas
Resipol
Antonio
Sistemas
Resipol
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Re: Consulta por cancelación de proceso

Post by Pablo César »

Hola Antonio,

En el lazo (Do While) de la funcion Proceso, poderias intentar para ver si funciona, colocar if lastkey()=27;Return Nil;Endif. No tengo seguridad si es irá funcionar, sinó leés este tópico:

viewtopic.php?f=15&t=1331#p9782

O entonces, al invés de llamar el release, llamar una funcion que alterna una variable tipo flag.
Por ejemplo: Salir := (.T. / .F.) para saber si precisa abortar y utilizas esta variable pública dentro del lazo y después llamas el release.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Consulta por cancelación de proceso

Post by andyglezl »

Hola Antonio

Varios puntos

1.- Cuando publiques un código, trata de darle formato con el botón "CODE" ya que es dificil seguir la lógica.
2.- Sin los archivos necesarios es dificil probar, solo podemos sugerir algo.
3.- Cuando dices "en un momento quise cancelar el mismo" lo haces con la tecla "ESC" ?
. porque puedes hacer esto: ON KEY ESCAPE ACTION {|| CierraTabla(), ThisWindow.release() }
Andrés González López
Desde Guadalajara, Jalisco. México.
citro
Posts: 52
Joined: Wed Dec 22, 2010 3:45 pm

Re: Consulta por cancelación de proceso

Post by citro »

Pablo César wrote:Hola Antonio,

En el lazo (Do While) de la funcion Proceso, poderias intentar para ver si funciona, colocar if lastkey()=27;Return Nil;Endif. No tengo seguridad si es irá funcionar, sinó leés este tópico:

viewtopic.php?f=15&t=1331#p9782

O entonces, al invés de llamar el release, llamar una funcion que alterna una variable tipo flag.
Por ejemplo: Salir := (.T. / .F.) para saber si precisa abortar y utilizas esta variable pública dentro del lazo y después llamas el release.
Gracias Pablo César, la idea de una función que asignara un determinado valor a una variable fue la que funcionó, hice esto:

Antes del DEFINE WINDOW declaré estas 2 variables como privadas con los siguientes valores:

Code: Select all

lCancela:=.f.
lProceso:=.f.
En el ciclo antes de hacer el Skip() puse esto:

Code: Select all

if lCancela
  exit
end if
Una función que Cancela el proceso:

Code: Select all

/***/
static Function CanceProce()

frmCambRubr.btnSalir.enabled:=.f.
lCancela:=.t.
if !lProceso
  ThisWindow.release()
end if

retu Nil
y en el botón de SALIR reemplace el ThisWindow.release(), por CanceProce() y funcionó. Tuve que agregar un par de IF para que no llamara a controles como el STATUSBAR una vez que salia del ciclo, así como también para que no hiciera el COMMIT() y el UNLOCK() de la tabla en caso de que se cancelara el proceso. Gracias por la idea.

Antonio
Sistemas
Resipol
Antonio
Sistemas
Resipol
citro
Posts: 52
Joined: Wed Dec 22, 2010 3:45 pm

Re: Consulta por cancelación de proceso

Post by citro »

andyglezl wrote:Hola Antonio

Varios puntos

1.- Cuando publiques un código, trata de darle formato con el botón "CODE" ya que es dificil seguir la lógica.
2.- Sin los archivos necesarios es dificil probar, solo podemos sugerir algo.
3.- Cuando dices "en un momento quise cancelar el mismo" lo haces con la tecla "ESC" ?
. porque puedes hacer esto: ON KEY ESCAPE ACTION {|| CierraTabla(), ThisWindow.release() }
Gracias por lo del botón "CODE" lo voy a probar con otro posteo. En realidad es una pregunta que consideré genérica, porque no creo que sea la única persona que trabaja con tablas DBF en una red, y que alguna de las tablas tengo cerca de 1000000 de registros y en un momento determinado ya sea un proceso como mi caso, o más habitualmente en un informe x, que es el caso más habitual,y el usuario en algún momento luego de haber aceptado el informe se da cuenta de que puso mal la fecha del informe, por ej., y decide cancelar el mismo ya sea pulsando el botón salir o la tecla ESC, ahi se produce un error si uno no pone alguna variable como me sugirió Pablo César, o sea a lo que voy es que cualquiera puede probar este error en un informe que demore mucho en salir.
Antonio
Sistemas
Resipol
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Re: Consulta por cancelación de proceso

Post by Pablo César »

Hola Antonio, lo que quizo decir Andréz es para que uses las tags de ediccion, para el caso de postear tu código fuente (source code) utilizes la tag CODE pero no para el texto simples de tus mensajes. Esto ayuda mejor comprehension cuando posteas tu código (texto extraído de PRGs).

Yo alteré tus mensajes para propiciar esta visualizacion y puede obtenerse mejor entendimiento de tu código. Ok ?
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
Post Reply