Aplicación como servicio o programar tarea

HMG en Español

Moderator: Rathinagiri

Post Reply
jparada
Posts: 430
Joined: Fri Jan 23, 2009 5:18 pm

Aplicación como servicio o programar tarea

Post by jparada »

Hola,

Se tienen algunos reportes de ventas que solicitan se realice el envío automático (vía correo) a los agentes, se planea se realice la programación del envío cada 5 días del mes 5,10,15,20... he estado buscando y leyendo un poco de información al respecto, pero aún no aterrizo si estamos hablando que tengo que generar un binario sin interfaz gráfica y utilizar el programador de tareas o realizarlo como un servicio, alguna idea?.

Saludos,
Javier
User avatar
danielmaximiliano
Posts: 2611
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Aplicación como servicio o programar tarea

Post by danielmaximiliano »

que los dias sean 5,10,15 y 20 en un servicio instalado en windows implica que la computadora este siempre encendida.
que se haga en dias y horarios laborables al encender el computador y dentro de una rutina para sabes si los dias definidos no sean laborables se enviaria digamos un dia 4... a menos que esa informacion sea armada especificamente el dia definido.. como ser una cuenta , saldo
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
jparada
Posts: 430
Joined: Fri Jan 23, 2009 5:18 pm

Re: Aplicación como servicio o programar tarea

Post by jparada »

Hola Daniel,

Esa parte que comentas tengo bien clara las condiciones que se deben de realizar y la programación para ello es correcto que se plantea que sea en horario laboral, incluso validar si los días definidos caen en fin de semana etc., la duda específica como lo mencioné es si debo investigar realizarlo como servicio o una programación de tarea con el administrador de tareas de Windows.

Saludos,
Javier
martingz
Posts: 394
Joined: Wed Nov 18, 2009 11:14 pm
Location: Mexico

Re: Aplicación como servicio o programar tarea

Post by martingz »

Tenemos un programa que se encarga de Timbrar nuestras facturas, genera el xml y el pdf, asi como el envio de correos con estos documentos, el programa esta hecho en HMG interfase grafica y utilizamos el System Shceduler para ejecutar el programa, a una hora y dia establecidos, su funcionamiento es muy bueno , casi sin problemas


saludos
jparada
Posts: 430
Joined: Fri Jan 23, 2009 5:18 pm

Re: Aplicación como servicio o programar tarea

Post by jparada »

Hola Martín,
La versión Pro cuesta 30US que es asequible o para lo que lo necesito es suficiente la versión free?.

Saludos,
Javier
martingz
Posts: 394
Joined: Wed Nov 18, 2009 11:14 pm
Location: Mexico

Re: Aplicación como servicio o programar tarea

Post by martingz »

Si esamos usando la version free, con eso nos basta


saludos
jparada
Posts: 430
Joined: Fri Jan 23, 2009 5:18 pm

Re: Aplicación como servicio o programar tarea

Post by jparada »

Perfecto Martín, hago pruebas. Gracias!!

Saludos,
Javier
User avatar
edufloriv
Posts: 238
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Re: Aplicación como servicio o programar tarea

Post by edufloriv »

Hola JParada,

No sé si entiendo bien tu post. Si se trata de automatizar procesos yo uso un módulo creado enteramente en HMG entre las tareas que ejecuta este módulo tengo:
- envio de avances de ventas.
- envio de varios tipos de alerta y reportes al área comercial.
- revisión de validez de documentos electrónicos.
- y una de la más importante el facturador automático: descarga de los pedidos de los clientes, facturación, generación de notas de crédito, envio de las hojas de picking al almacén y respuesta al cliente del pedido facturado.

Todos estos procesos sin intervención alguna de usuario. Para esto desarrollé un módulo con una interfaz gráfica de CONTROL. El módulo se encuentra siempre activo en el servidor de datos de la empresa y coloqué un acceso directo en la carpeta de inicio de dicho servidor para que si se reinicia el servidor el módulo se aperture solo de forma automática, no lo corro ni como servicio ni uso ninguna funcionalidad schedule de Windows. Para lo único que uso un programa externo gratuito es para la descarga de documentos electrónicos que nos envian nuestros proveedores ya que no he tenido tiempo de probar una solución que Daniel amablemente me alcanzó en un post en este foro para realizar esta tarea.

Te muestro el código del main para q tengas una idea de como lo realicé:

Code: Select all

* ------------------------------------------------------ *
* SISTEMA     : SISCOMFAR                                *
* PRG         : ROBOT.PRG                                *
* CREADO      : 09-07-2014                               *
* ACTUALIZADO :                                          *
* AUTOR       : EDUARDO V. FLORES RIVAS                  *
* COMENTARIOS : ROBOT FACTURADOR                         *
* ------------------------------------------------------ *

#include <minigui.ch>
#include <hbcurl.ch>

#define adUseNone             1
#define adUseServer           2
#define adUseClient           3

#define adOpenForwardOnly     0
#define adOpenKeySet          1
#define adOpenDynamic         2
#define adOpenStatic          3

#define adLockReadOnly        1
#define adLockPessimistic     2
#define adLockOptimistic      3
#define adLockBatchOptimistic 4

#define adCmdText             1
#define adCmdTable            2
#define adCmdStoredProc       4
#define adCmdUnknown          8
#define adCmdFile           256
#define adCmdTableDirect    512

#define adIndex 0x100000

FUNCTION MAIN

REQUEST DBFCDX
REQUEST HB_LANG_ES
REQUEST HB_CODEPAGE_ESWIN

RDDSETDEFAULT("DBFCDX")
HB_LANGSELECT( "ES" )
HB_SetCodePage("ESWIN")

   INISETS()
   INIPUBLIC()
   INICOLORES()

   DEFINE WINDOW Win_Robot;
      AT 0 , 0 ;
      WIDTH 1010 HEIGHT 650 ;
      TITLE 'ROBOT DE PROCESOS' ;
      ON INIT RobotIniciar() ;
      ON RELEASE RobotTerminar() ;
      MAIN

      ON KEY CONTROL+F1 OF Win_Robot ACTION Proceso_Manual()
      ON KEY CONTROL+I  OF Win_Robot ACTION SetearPrinters()

      DEFINE TIMER Timer_1 ;
      INTERVAL 120000 ;
      ACTION RobotRevisaTareas()

      DEFINE TOOLBAR FacturaBar BUTTONSIZE 70,30 FLAT BORDER

         BUTTON BotPausa     ;
            CAPTION '&Pausa' ;
            PICTURE 'imagen\pausa.bmp' ;
            ACTION RobotPausar()

         BUTTON BotTareas    ;
            CAPTION '&Tareas' ;
            PICTURE 'imagen\engranajes.bmp' ;
            ACTION RobotRevisaTareas()

         BUTTON BotReanudar  ;
            CAPTION '&Reanudar' ;
            PICTURE 'imagen\siguiente.bmp' ;
            ACTION RobotReanudar()

         BUTTON BotSalir     ;
            CAPTION '&Salir' ;
            PICTURE 'imagen\salir.bmp' ;
            ACTION Win_Robot.Release

      END TOOLBAR
//
//
//
   @  060 , 010 BROWSE BrwMensajes ;
      WIDTH  800 ;
      HEIGHT 500 ;
      HEADERS { 'Fecha' , 'Hora' , 'Mensaje' } ;
      WIDTHS  {  100    ,  100   , 580       } ;
      FIELDS  { 'FECHA' , 'HORA' , 'MENSAJE' } ;
      JUSTIFY { BROWSE_JTFY_LEFT , BROWSE_JTFY_LEFT , BROWSE_JTFY_LEFT } ;
      WORKAREA XMENSA
//
//
//
      DEFINE STATUSBAR
         STATUSITEM "..." ACTION MsgInfo('Facturador')
         CLOCK
         DATE  WIDTH 90
      END STATUSBAR

   END WINDOW


   DEFINE WINDOW Mensajes;
      AT 0,0 ;
      WIDTH 300 ;
      HEIGHT 120 ;
      TITLE 'Robot' ;
      CHILD

      @ 10,10 LABEL Linea1 ;
      WIDTH 280 HEIGHT 25 ;
      VALUE "" ;
      CENTERALIGN

      @ 30,10 LABEL Linea2 ;
      WIDTH 280 HEIGHT 25 ;
      VALUE "" ;
      CENTERALIGN

      @ 50,10 LABEL Linea3 ;
      WIDTH 280 HEIGHT 25 ;
      VALUE "" ;
      CENTERALIGN

   END WINDOW

   CENTER WINDOW Mensajes

   ACTIVATE WINDOW Win_Robot
   ACTIVATE WINDOW Mensajes

   HIDE WINDOW Mensajes

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
* FUNCION   : MENSABAR
* COMENTARIO: MOSTRAR MENSAJES EN LA BARRA DE ESTADO
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

FUNC MENSABAR(texto,titulo)

titulo:=IF(titulo=NIL,'Facturador',titulo)

IF VALTYPE(texto)='A'
   texto := texto[1]
ENDIF

IF PCOUNT()>0
   Win_Robot.StatusBar.Item(1) := texto
   do events
ELSE
   Win_Robot.StatusBar.Item(1) := '...'
   do events
ENDIF

RETURN(.T.)


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotIniciar

IF ! IsDir('c:\farmacom\Robot')
   CreateFolder('c:\farmacom\Robot')
ENDIF
IF ! IsDir('c:\farmacom\Robot\Downs')
   CreateFolder('c:\farmacom\Robot\Downs')
ENDIF
IF ! IsDir('c:\farmacom\Robot\Progs')
   CreateFolder('c:\farmacom\Robot\Progs')
ENDIF
IF ! IsDir('c:\farmacom\Robot\Stand')
   CreateFolder('c:\farmacom\Robot\Stand')
ENDIF
IF ! IsDir('c:\farmacom\Robot\Zips')
   CreateFolder('c:\farmacom\Robot\Zips')
ENDIF
IF ! IsDir('c:\farmacom\Robot\Diarios')
   CreateFolder('c:\farmacom\Robot\Diarios')
ENDIF
IF ! IsDir('c:\farmacom\Robot\Temps')
   CreateFolder('c:\farmacom\Robot\Temps')
ENDIF
IF ! IsDir('c:\farmacom\Robot\Facts')
   CreateFolder('c:\farmacom\Robot\Facts')
ENDIF

IF FILE(cDbfTimer)

   Win_Robot.Timer_1.Enabled                := .F.
   Win_Robot.FacturaBar.BotPausa.Enabled    := .F.
   Win_Robot.FacturaBar.BotReanudar.Enabled := .F.

   MENSABAR('CONECTANDO A LA BASE DE DATOS...')

   INICONEXION()
   INICONFIG()
   TrackerOpen()
   RobotAbreDia()
   IniEstacion()

   SIS_TIMER := .T.
   TrackRegistrar('ACTIVACION DEL ROBOT')

   MENSABAR('CONECTADO')

   Win_Robot.Timer_1.Enabled                := .T.
   Win_Robot.FacturaBar.BotPausa.Enabled    := .T.
   Win_Robot.FacturaBar.BotReanudar.Enabled := .F.

ELSE

   Win_Robot.Timer_1.Enabled                := .F.
   Win_Robot.FacturaBar.BotPausa.Enabled    := .F.
   Win_Robot.FacturaBar.BotReanudar.Enabled := .F.
   MENSABAR('SIN CONEXION (No existe ROBOT.DBF)')

ENDIF

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotAbreDia

LOCAL aMsgRobot := {;
{'FECHA'   ,'C', 8,0},;
{'HORA'    ,'C', 8,0},;
{'MENSAJE' ,'C',90,0}}

   IF SELECT('XMENSA') > 0
      CLOSE XMENSA
   ENDIF
   IF SELECT('XDATA') > 0
      CLOSE XDATA
   ENDIF

   USE &cDbfTimer ALIAS XDATA EXCLUSIVE NEW
   IF RECCOUNT() = 0
      APPEND BLANK
   ENDIF
   IF RECCOUNT() = 1
      APPEND BLANK
   ENDIF
   IF RECCOUNT() = 2
      APPEND BLANK
   ENDIF
   IF RECCOUNT() = 3
      APPEND BLANK
   ENDIF
   IF RECCOUNT() = 4
      APPEND BLANK
   ENDIF

   cStampHoy := DTOS(DATE())
   cMsgRobot := RUTA_ROBOT+'Diarios\HISTORIAL'

   IF .NOT. FILE(cMsgRobot+'.DBF')
      DBCREATE(cMsgRobot,aMsgRobot)
   ENDIF
   USE &cMsgRobot ALIAS XMENSA EXCLUSIVE VIA 'DBFCDX' NEW
   IF .NOT. FILE(cMsgRobot+'.CDX')
      INDEX ON DTOS(CTOD(FECHA))+HORA TAG MsgxHora TO &cMsgRobot DESCENDING
   ENDIF
   SET INDEX TO &cMsgRobot
   DBGOTOP()
   Win_Robot.BrwMensajes.Value   := XMENSA->(RECNO())
   Win_Robot.BrwMensajes.Refresh

   SELE XMENSA

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotTerminar

   TrackRegistrar('APAGADO DEL ROBOT (X)')

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotPausar

   TrackRegistrar('PAUSA DEL SISTEMA')

   MENSABAR('En Pausa...')

   Win_Robot.Timer_1.Enabled                := .F.
   Win_Robot.FacturaBar.BotPausa.Enabled    := .F.
   Win_Robot.FacturaBar.BotReanudar.Enabled := .T.

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotReanudar

   TrackRegistrar('REANUDACION DEL SISTEMA')

   MENSABAR('...')

   Win_Robot.Timer_1.Enabled                := .T.
   Win_Robot.FacturaBar.BotPausa.Enabled    := .T.
   Win_Robot.FacturaBar.BotReanudar.Enabled := .F.

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotRevisaTareas

LOCAL cErrorMsg

   IF lLocker = .T.
      RETURN
   ENDIF

   lLocker = .T.
   Win_Robot.Timer_1.Enabled                := .F.
   Win_Robot.FacturaBar.Enabled             := .F.
   MENSABAR('Iniciando tareas...')
   DO EVENTS


//   BEGIN SEQUENCE WITH { |err| break(err) }
      RobotTrabaja()
//   RECOVER USING err
//      cErrorMsg := err:Description
//      RobotTrack( 'ERROR:'+cErrorMsg )
//   END SEQUENCE


   lLocker = .F.
   Win_Robot.Timer_1.Enabled                := .T.
   Win_Robot.FacturaBar.Enabled             := .T.
   Win_Robot.FacturaBar.BotReanudar.Enabled := .F.
   MENSABAR('En espera...')
   DO EVENTS

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotTrabaja

LOCAL cStmCheck
LOCAL cDbfCheck

// Revisión de tareas cada 2 minutos
   IF FILE('Facturador.txt')
      Fact_Auto()
      RobotTrack( 'Pedidos revisados en el host.' )
   ENDIF
   IF FILE('Acepta.txt')
      Acepta_Actualizar()
      FOR nwait = 1 TO 5000000
      NEXT
      Acepta_Copiar()
   ENDIF
//   Proc_AutoCargaFactProv()

// Revision de tareas inicio del día (madrugada)
   IF (LEFT( TIME() , 5 ) >= '06:00' .AND. LEFT( TIME() , 5 ) <= '10:00')
      SELE XDATA
      DBGOTO(1)
      IF XDATA->(ALLTRIM(DATA)) < DTOS(DATE())
         XDATA->DATA := DTOS(DATE())
         RobotTareasDiaInicio()
         SELE XDATA
         DBGOTO(1)
         XDATA->DATA := DTOS(DATE())
         RobotTrack( 'Tareas de inicio del día realizadas.' )
      ENDIF
   ENDIF

// Revision de tareas cada media hora
   IF LEFT( TIME() , 5 ) >= '07:00' .AND. LEFT( TIME() , 5 ) <= '20:00' .AND. FILE('Web.txt')
      SELE XDATA
      DBGOTO(2)
      cUltiHora := XDATA->( ALLTRIM(DATA) )
      cActuHora := TIME()
      IF ElapTime( cUltiHora , cActuHora ) > '00:30'
         MENSABAR('Revisión de rutina de cada media hora...')
         ActualizarConsumos()
         SubirAWeb()
         webcanjes_Revisar()
         Proc_PromoYDetectaTopes()
         SELE XDATA
         DBGOTO(2)
         XDATA->DATA := cActuHora
         MENSABAR('...')
         RobotTrack( 'Tareas programadas cada media hora realizadas.' )
      ENDIF
   ENDIF

// Revision de tareas final del día
   IF ( STR(DOW(DATE()),1) $ '23456' .AND. LEFT( TIME() , 5 ) >= '22:00' .AND. LEFT( TIME() , 5 ) <= '24:00' ) .OR. ( DOW(DATE())=7 .AND. LEFT(TIME(),5) >= '12:00' .AND. LEFT( TIME() , 5 ) <= '13:00' )
      SELE XDATA
      DBGOTO(3)
      IF XDATA->(ALLTRIM(DATA)) < DTOS(DATE())
         XDATA->DATA := DTOS(DATE())
         RobotTareasDiaFin()
         SELE XDATA
         DBGOTO(3)
         XDATA->DATA := DTOS(DATE())
         RobotTrack( 'Tareas de final del día realizadas.' )
      ENDIF
   ENDIF
   
RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotTareasDiaInicio

LOCAL xOldSel := SELECT()

   MENSABAR('Revisando Actualizaciones...')
   VerificaActualizacion()
   RobotTrack( 'Actualizaciones revisadas.' )

   MENSABAR('Generando avance de ventas P.P....')
   CrearAvancePPXls()      // Proc_AvancePP.prg
   RobotTrack( 'Avance Ventas P.P creado.' )

   MENSABAR('Generando avance de ventas general...')
   CrearAvanceGeneralXls() // Proc_AvanceGen.prg
   RobotTrack( 'Avance Ventas Co-Dist. creado.' )

   MENSABAR('Enviando correo a ventas...')
   EmailAvancePPXls()      // Proc_CorreoVentas.prg
   RobotTrack( 'Correos de avances enviados a ventas.' )

   MENSABAR('Limpiando pendientes...')
   LimpiarPendientes()     // Proc_LimpiarPends.prg
   RobotTrack('Ordenes pendientes eliminadas.')

   MENSABAR('Creando reporte de NO ATENDIDOS...')
   Proc_OrdenesPendientes()
   RobotTrack('Reporte de no atendidos creado y enviado a compras.')

   MENSABAR('Creando reporte de CANJES SIN RECUPERAR...')
   Repo_CanjesSinRecuperar()
   RobotTrack('Reporte de Canjes sin recuperar enviado a compras.')

   MENSABAR('Creando reporte de DEVOLUCIONES SIN RECUPERAR...')
   Repo_DevolsNoRecup()
   RobotTrack('Reporte de DEVOLUCIONES SIN RECUPERAR enviado a compras.')

   MENSABAR('Creando reporte de NOTAS DE CREDITO PROV. SIN APLICAR...')
   Proc_NotasProvsPends()
   RobotTrack('Reporte de NOTAS DE CREDITO PROV. SIN APLICAR enviado a compras.')

   MENSABAR('Creando reporte de ANALISIS DE ORDENES DE COMPRA...')
   Repo_OrdenesAnalisis()
   RobotTrack('Reporte de ANALISIS DE ORDENES enviado a gerencia.')

   MENSABAR('Revisando documentos en ORDENES DE PAGO en SUNAT...')
   Repo_SunatRevisa()
   RobotTrack('Se revisaron los documentos en ORDENES DE PAGO en SUNAT.')

   MENSABAR('Enviando correo de documentos NO VALIDOS...')
   Repo_SunatCorreo()
   RobotTrack('Se envió correo de documentos NO VALIDOS en SUNAT.')

   MENSABAR('Actualizando Registro Electrónico de Controlados...')
   REC_ActualizarAuto2()
   RobotTrack('Se actualizó el registro de controlados.')

   MENSABAR('Revisando estado del almacén...')
   Proc_AlmacenEstado()
   RobotTrack('Se revisó el estado del almacén.')

   MENSABAR('Imprimiendo notas de crédito proveedores...')
   ImprimeNotasProv()
   RobotTrack('Se imprimieron las notas de crédito de proveedores.')

   MENSABAR('Revisando stocks almacén vs stocks ventas...')
   Proc_StockU_vs_StockV()
   RobotTrack('Se compararon los stocks de almacén vs stocks ventas.')

   MENSABAR('Revisando márgenes de ingresos...')
   Repo_ComprasGerencia()
   RobotTrack('Se revisaron los márgenes de los ingresos del día de ayer.')

   cDiaHoy := STRZERO( DAY(GetHoy()) , 2 )
   IF cDiaHoy+'.' $ '25.26.27.28.29.30.31.'
      MENSABAR('Enviando avance de ventas a contabilidad...')
      AvanceVentasMesEnCurso()
      RobotTrack('Se envió el avance de ventas a contabilidad.')
   ENDIF

   IF DOW(DATE()) = 2
      MENSABAR('Enviando lista de precios en excel (tabla B)...')
      StocksExcel('B')
      RobotTrack('Lista de precios en excel enviada.')
   ENDIF

   SELE XDATA
   DBGOTO(5)
   IF ALLTRIM( XDATA->DATA ) < LEFT( DTOS(DATE()) , 6 )
      IF DAY(DATE()) > 12
         MENSABAR('Eliminando política de canjes de la plataforma web...')
         webcanjes_BorrarCsv()
         SELE XDATA
         DBGOTO(5)
         XDATA->DATA := LEFT( DTOS(DATE()) , 6 )
      ENDIF
   ENDIF
   
   MENSABAR('Actualizando pendientes en plataforma web...')
   Pends_SubirAWeb()
   RobotTrack('Actualización completa de pendientes en P.W. realizada.')

   MENSABAR('Actualizando tránsito en plataforma web...')
   Trans_SubirAWeb()
   RobotTrack('Actualización completa de productos en tránsito en P.W. realizada.')

   MENSABAR('...')
   SELE &xOldSel

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotTareasDiaFin

LOCAL xOldSel := SELECT()

   MENSABAR('Enviando reporte de notas de crédito por promoción...')
   Proc_NotasPromo()
   RobotTrack('Reporte de notas por promoción enviado.')

   MENSABAR('Actualizando logístico...')
   LogisticoActualizar()   // Proc_Logistico.prg
   RobotTrack('Logístico actualizado.')

   MENSABAR('Corrigiendo stocks bonificaciones...')
   CorrigeStocksBonificados()  // Proc_FixStockB.prg
   RobotTrack('Stocks bonificados corregidos.')

   MENSABAR('Revisando electrónicos generados...')
   Acepta_Revisar(.F.)

   MENSABAR('Revisando política de canjes...')
   webcanjes_SubirCsv()

   MENSABAR('...')
   SELE &xOldSel

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC VerificaActualizacion

LOCAL cPathOri := '\\192.168.1.79\publica6\SisComFar\Updates\'
LOCAL cPathDes := '\\192.168.1.79\publica6\SisComFar\Accesos\'
LOCAL cFileExe := cPathOri+'FARMACOM.EXE'
LOCAL cVentExe := cPathOri+'VENTAS.EXE'
LOCAL cRutaExe := cPathOri+'RUTA.EXE'
LOCAL cPackExe := cPathOri+'PACKING.EXE'
LOCAL cKardExe := cPathOri+'KARDISTA.EXE'
LOCAL cDeTeExe := cPathOri+'DT.EXE'
LOCAL cLetrExe := cPathOri+'LETRAS.EXE'

   BEGIN SEQUENCE WITH { |err| break(err) }

      IF FILE(cVentExe)
         COPY FILE &cVentExe TO (cPathDes+'Ventas\VENTAS.exe')
         COPY FILE &cVentExe TO (cPathDes+'Gerencia\VENTAS.exe')
         DELETE FILE &cVentExe
      ENDIF

      IF FILE(cRutaExe)
         COPY FILE &cRutaExe TO (cPathDes+'Almacen\RUTA.EXE')
         DELETE FILE &cRutaExe
      ENDIF

      IF FILE(cPackExe)
         COPY FILE &cPackExe TO (cPathDes+'Almacen\PACKING.EXE')
         DELETE FILE &cPackExe
      ENDIF

      IF FILE(cKardExe)
         COPY FILE &cKardExe TO (cPathDes+'Almacen\KARDISTA.EXE')
         DELETE FILE &cKardExe
      ENDIF

      IF FILE(cDeteExe)
         COPY FILE &cDeteExe TO (cPathDes+'DT\DT.EXE')
         DELETE FILE &cDeteExe
      ENDIF

      IF FILE(cLetrExe)
         COPY FILE &cLetrExe TO (cPathDes+'Finanzas\LETRAS.EXE')
         DELETE FILE &cLetrExe
      ENDIF

      IF FILE(cFileExe)
         COPY FILE &cFileExe TO (cPathDes+'Sistemas\FARMACOM.exe')
         COPY FILE &cFileExe TO (cPathDes+'Almacen\FARMACOM.exe')
         COPY FILE &cFileExe TO (cPathDes+'Finanzas\FARMACOM.exe')
         COPY FILE &cFileExe TO (cPathDes+'Gerencia\FARMACOM.exe')
         COPY FILE &cFileExe TO (cPathDes+'Recepcion\FARMACOM.exe')
         COPY FILE &cFileExe TO (cPathDes+'DT\FARMACOM.exe')
         COPY FILE &cFileExe TO (cPathDes+'Compras\FARMACOM.exe')
         DELETE FILE &cFileExe
      ENDIF

   RECOVER USING err

      cErrorMsg := err:Description
      RobotTrack( 'ERROR:'+cErrorMsg )

   END SEQUENCE

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotTrack( cMensaje )  // Panel Derecho

LOCAL xOldSel := SELECT()

   SELE XMENSA
   APPEND BLANK
   REPLACE FECHA   WITH DTOC(DATE())
   REPLACE HORA    WITH TIME()
   REPLACE MENSAJE WITH cMensaje
   DBGOTOP()
   Win_Robot.BrwMensajes.Value   := XMENSA->(RECNO())
   Win_Robot.BrwMensajes.Refresh

   SELE &xOldSel

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC RobotCreaData

LOCAL aDataStru := {{'DATA','C',30,0}}

   DBCREATE( cDbfTimer , aDataStru )
   USE &cDbfTimer ALIAS XDATA EXCLUSIVE NEW
   APPEND BLANK
   APPEND BLANK
   APPEND BLANK
   APPEND BLANK
   APPEND BLANK
   CLOSE XDATA
   MsgInfo('Se creó el archivo')
   Win_Robot.Release

RETURN

#INCLUDE "Inicios.prg"
#INCLUDE "PcAgregar.prg"
#INCLUDE "Proc_Manual.prg"

// Procesos inicio del día
#INCLUDE "Proc_LimpiarPends.prg"
#INCLUDE "Proc_PagaVent.prg"
#INCLUDE "Proc_AvancePP.prg"
#INCLUDE "Proc_AvanceGen.prg"
#INCLUDE "Proc_CorreoVentas.prg"
#INCLUDE "Proc_CorreoNotasCred.prg"
#INCLUDE "Proc_OrdenNoAtend.prg"
#INCLUDE "Proc_ImprimeNotasProv.prg"
#INCLUDE "Proc_AvanceVentas.prg"
#INCLUDE "Proc_CanjesNoRecup.prg"
#INCLUDE "Proc_DevolsNoRecup.prg"
#INCLUDE "Proc_NotasProvPends.prg"
#INCLUDE "Proc_AceptaRevisar.prg"
#INCLUDE "Proc_AceptaMatch.prg"
#INCLUDE "Proc_AceptaCopiar.prg"
#INCLUDE "Proc_AceptaReenviar.prg"
#INCLUDE "Proc_ImprimeFacsRuta.prg"
#INCLUDE "Proc_OrdenesAnalisis.prg"
#INCLUDE "Proc_SunatCheck.prg"
#INCLUDE "Proc_SunatCorreo.prg"
#INCLUDE "Proc_StocksExcel.prg"
#INCLUDE "Proc_AlmacenEstado.prg"
#INCLUDE "Proc_DetectaStocksUV.prg"
#INCLUDE "Proc_ComprasGerencia.prg"

// Procesos cada hora
#INCLUDE "Proc_FarmaStock.prg"
#INCLUDE "Proc_DetectaTopes.prg"
#INCLUDE "Proc_AutoCargaFactProv.prg"
#INCLUDE "Proc_ClieConsumo.prg"
#INCLUDE "Web_SubirAWeb.prg"
#INCLUDE "Web_Canjes.prg"

// Procesos a las 5:00 p.m.
#INCLUDE "Proc_ComprasDelDia.prg"

// Procesos final del día
#INCLUDE "Proc_NotasProm.prg"
#INCLUDE "Proc_Logistico.prg"
#INCLUDE "Proc_RAS_Quebrados.prg"
#INCLUDE "Proc_RAS_PorPedir.prg"
#INCLUDE "Proc_RECAuto.prg"
#INCLUDE "Proc_RECAuto2.prg"
#INCLUDE "Proc_FixStockB.prg"

// FACTURADOR
#INCLUDE "Fact_Auto.prg"
#INCLUDE "Fact_Pedido.prg"
#INCLUDE "Fact_Genera.prg"
#INCLUDE "Fact_Kardex.prg"
#INCLUDE "Fact_Notas.prg"
#INCLUDE "Fact_NotaSave.prg"
#INCLUDE "PromoVGeneraNC.prg"
#INCLUDE "PromoWGeneraNC.prg"
#INCLUDE "PromoXGeneraNC.prg"
#INCLUDE "PromoYGeneraNC.prg"
#INCLUDE "PromoZGeneraNC.prg"
#INCLUDE "PromoIGeneraNC.prg"
#INCLUDE "PrintFact2.prg"
#INCLUDE "PrintCred2.prg"
#INCLUDE "PrinterSets.prg"

// ACEPTA
#INCLUDE "TextAcepta.prg"
#INCLUDE "TextFactura.prg"
#INCLUDE "TextBoleta.prg"
#INCLUDE "TextCredito.prg"
#INCLUDE "TextDebito.prg"
#INCLUDE "Proc_BajaXls.prg"

#INCLUDE "CORREO.PRG"
#INCLUDE "TRACKER.PRG"
#INCLUDE "FUNCION.PRG"
#INCLUDE "VISUALES.PRG"
#INCLUDE "USERED.PRG"
#INCLUDE "WATCHMAN.PRG"
#INCLUDE "XLS.PRG"
#INCLUDE "ZIPS.PRG"
#INCLUDE "FTPS.PRG"
Te pongo los includes para que tengas una idea de todas la tareas que realiza el módulo. Lo gracioso es que realizar estas tareas automatizadas requiere MENOS código que realizar una interfáz gráfica para usuario, ya que no hay que validar todas las "cosas extrañas" que puede realizar un usuario humano :D

Espero haber ayudado y espero haber entendido tu interrogante.

Cordiales saludos a todos y un abrazo.

Eduardo Flores Rivas


LIMA - PERU
User avatar
Ismach
Posts: 161
Joined: Wed Nov 28, 2012 5:55 pm
DBs Used: DBF, mySQL, Mariadb, postgreSQL, Oracle, Db2, Interbase, Firebird, and SQLite
Location: Buenos Aires - Argentina

Re: Aplicación como servicio o programar tarea

Post by Ismach »

Bueno esto se puede hacer de 2 formas creo, Una es crear un Servicio Windows y que ese servicio dispare una tarea o un programa, creo los dias que se puede disparar la tarea se puede parametrizarla y la segunda es hacer un programa tipo automata y de ejecucion permanente que es lo que hice yo en su momento para una empresa y me base en el codigo de (HMG version extendida) ..\Samples\CuckooClock\
pero ademas de hacer algo los dias 15 y 20 (emitir un reporte, enviar un mail despues de las 5 de la tarde) , los dias 28 29 y 30 debia realizar un backups. Es decir el programa funcionada a modo pseudoautomata, cambiando de estado segun el rango horario durante el dia y segun la fecha.
Post Reply