Wilson y amigos del foro:
La idea es que cuando una PC t茅rminal registra una nueva orden de fabricaci贸n,
el 谩rea de fabricaci贸n reciba un aviso inmediatamente.
Siguiendo tu idea, cree una tabla donde se registra n煤mero de orden, fecha y
hora de la nueva orden de fabricaci贸n.
聽 聽 聽 聽 聽 聽 // Agregamos la orden a los avisos
聽 聽 聽 聽 聽 聽 cCmdSql聽:= "INSERT INTO " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avisos " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "SET " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avi_Ord = " + STR(oOrd:ORD,7,0) + "," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avi_Rev = " + STR(oOrd:REV,2,0) + "," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avi_Usu = 'Jesus A'," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avi_Fde = '" + DTOS(DATE()) + "'," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avi_Hde = '" + TIME() + "'," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avi_Lei = " + STR(0,1,0)
En el PRG main() puse un Timer para que cada x tiempo, en mi caso 5 minutos "vea" si hay
nuevos registros en la tabla AVISOS
STATIC FUNCTION Tiempo()
聽 聽 // 60,000 es igual a 1 minuto, se crea y se activa solo una vez
聽 聽 DEFINE TIMER oTimer OF oWindow INTERVAL 10000 ACTION Revisar()
聽 聽 oTimer:Activate()
RETURN(NIL)
FUNCTION Revisar()
聽 聽 LOCAL oRsAvi
聽 聽 LOCAL oDlg
聽 聽 LOCAL aGets聽:= ARRAY(03)
聽 聽 LOCAL oSays
聽 聽 LOCAL cSays
聽 聽 LOCAL oFont1
聽 聽 LOCAL oFont2
聽 聽 LOCAL nDiaDif聽 聽:= 0
聽 聽 LOCAL oAceptar
聽 聽 IF lVentana
聽 聽聽lVentana聽 聽 := (.F.)
聽 聽 聽 聽 oSays聽 聽聽 聽 := ARRAY(08)
聽 聽 聽 聽 cSays聽 聽聽 聽 := ARRAY(08)
聽 聽 聽 聽 TRY
聽 聽 聽 聽 聽 聽 oRsAvi:=聽 聽 TOleAuto():New("adodb.recordset")
聽 聽 聽 聽 CATCH oError
聽 聽 聽 聽 聽 聽 MsgStop( "No se ha podido crear el RECORDSET de MENSAJES !", oApp:cAplicacion)
聽 聽 聽 聽 聽 聽 ShowError(oError)
聽 聽 聽 聽 聽 聽 oRsAvi聽 :=聽 NIL
聽 聽 聽 聽 聽 聽 RETURN(.F.)
聽 聽 聽 聽 END
聽 聽 聽 聽 oRsAvi:CursorLocation聽 聽:= adUseClient
聽 聽 聽 聽 oRsAvi:LockType聽聽 聽 聽 聽 := adLockOptimistic
聽 聽 聽 聽 oRsAvi:CursorType聽 聽聽 聽 聽 聽 := adOpenDynamic
聽 聽 聽 聽 oRsAvi:Source聽 聽聽 聽 聽 聽 聽 聽 := "SELECT " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "* " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "FROM " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avisos " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "WHERE " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "! AVI_LEI"
聽 聽 聽 聽 oRsAvi:ActiveConnection(oApp:oCon)
聽 聽 聽 聽 TRY
聽 聽 聽 聽 聽 聽 oRsAvi:Open()
聽 聽 聽 聽 CATCH oError
聽 聽 聽 聽 聽 聽 MsgStop( "No se ha podido abrir el RECORDSET Mensajes !", oApp:cAplicacion)
聽 聽 聽 聽 聽 聽 ShowError(oError)
聽 聽 聽 聽 聽 聽 RETURN(.F.)
聽 聽 聽 聽 END
聽 聽 聽 聽 IF oRsAvi:BOF() .AND. oRsAvi:EOF()
聽 聽 聽 聽 聽 聽 RETURN(.T.)
聽 聽 聽 聽 ELSE
聽 聽 聽 聽 聽 聽 oRsAvi:MoveFirst()
聽 聽 聽 聽 聽 聽 DO WHILE ! oRsAvi:EOF()
聽 聽 聽 聽 聽 聽 聽 聽 nDiaDif := ROUND(DATE() - oRsAvi:Fields("AVI_FDE"):Value,0)
聽 聽 聽 聽 聽 聽 聽 聽 DO CASE
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CASE nDiaDif == 0
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cSays[01]聽 聽:= "Hoy:"
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CASE nDiaDif == 1
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cSays[01]聽 聽:= "Ayer:"
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CASE nDiaDif == 2
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cSays[01]聽 聽:= "Antier:"
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 OTHER
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cSays[01]聽 聽:= "El d铆a:"
聽 聽 聽 聽 聽 聽 聽 聽 ENDCASE
聽 聽 聽 聽 聽 聽 聽 聽 cSays[02]聽 聽:= DATE2TXT(oRsAvi:Fields("AVI_FDE"):Value)
聽 聽 聽 聽 聽 聽 聽 聽 cSays[03]聽 聽:= "A las"
聽 聽 聽 聽 聽 聽 聽 聽 cSays[04]聽 聽:= TIME()
聽 聽 聽 聽 聽 聽 聽 聽 cSays[05]聽 聽:= "Se registr贸 la nueva orden"
聽 聽 聽 聽 聽 聽 聽 聽 cSays[06]聽 聽:= TRANSFORM(oRsAvi:Fields("AVI_ORD"):Value,"@Z 9999999")
聽 聽 聽 聽 聽 聽 聽 聽 cSays[07]聽 聽:= "Rev:"
聽 聽 聽 聽 聽 聽 聽 聽 cSays[08]聽 聽:= TRANSFORM(oRsAvi:Fields("AVI_REV"):Value,"@ 99")
聽 聽 聽 聽 聽 聽 聽 聽 DEFINE FONT oFont1 NAME "Arial" SIZE 0,-12
聽 聽 聽 聽 聽 聽 聽 聽 DEFINE FONT oFont2 NAME "Arial" SIZE 0,-20 BOLD
聽 聽 聽 聽 聽 聽 聽 聽 DEFINE DIALOG oDlg RESOURCE "SndMsg" OF oWindow COLORS CLR_WHITE,RGB(060,097,145)
聽 聽 聽 聽 聽 聽聽聽 聽 REDEFINE SAY oSays[01] VAR cSays[01] ID 101 OF oDlg FONT oFont1;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 COLORS CLR_WHITE,RGB(060,097,145)
聽 聽 聽 聽聽聽 聽 聽 聽 REDEFINE SAY oSays[02] VAR cSays[02] ID 102 OF oDlg FONT oFont2;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 COLORS CLR_WHITE,RGB(060,097,145)
聽 聽 聽 聽聽聽 聽 聽 聽 REDEFINE SAY oSays[03] VAR cSays[03] ID 103 OF oDlg FONT oFont1;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 COLORS CLR_WHITE,RGB(060,097,145)
聽 聽 聽 聽聽聽 聽 聽 聽 REDEFINE SAY oSays[04] VAR cSays[04] ID 104 OF oDlg FONT oFont2;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 COLORS CLR_WHITE,RGB(060,097,145)
聽 聽 聽 聽聽聽 聽 聽 聽 REDEFINE SAY oSays[05] VAR cSays[05] ID 105 OF oDlg FONT oFont1;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 COLORS CLR_WHITE,RGB(060,097,145)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 REDEFINE GET aGets[01] VAR oRsAvi:Fields("AVI_ORD"):Value ID 106 OF oDlg UPDATE;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 WHEN (.T.) .AND. (.F.) FONT oFont2;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 PICTURE "@K 999999"
聽 聽 聽 聽聽聽 聽 聽 聽 REDEFINE SAY oSays[07] VAR cSays[07] ID 107 OF oDlg FONT oFont1;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 COLORS CLR_WHITE,RGB(060,097,145)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 REDEFINE GET aGets[02] VAR oRsAvi:Fields("AVI_REV"):Value ID 108 OF oDlg UPDATE;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 WHEN (.T.) .AND. (.F.) FONT oFont2;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 PICTURE "@K 99"
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 REDEFINE BUTTON oAceptar ID 901 OF oDlg UPDATE;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ACTION (UpdAvi(oRsAvi),oDlg:END())
聽 聽 聽 聽 聽 聽 聽 聽 ACTIVATE DIALOG oDlg ON INIT SetWindowPos( oDlg:hWnd, -1, 0, 0, 0, 0, 3 )
聽 聽 聽 聽 聽 聽 聽 聽 oRsAvi:MoveNext()
聽 聽 聽 聽 聽 聽 ENDDO
聽 聽 聽 聽 聽 聽 lVentana聽 聽 := (.T.)
聽 聽 聽 聽 ENDIF
聽 聽 ENDIF
RETURN(NIL)
/*
* --------------------------------------------------------------------------*
* --------------------------------------------------------------------------*
*/
FUNCTION UpdAvi(oRsAvi)
聽 聽 LOCAL cCmdSql聽 聽:= ""
聽 聽 cCmdSql聽:= "UPDATE " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Avisos " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "SET " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "AVI_LEI = ! AVI_LEI,"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "AVI_FDL = '" + DTOS(DATE()) + "'," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "AVI_HDL = '" + TIME() + "' " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "WHERE " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "AVI_ORD = " + STR(oRsAvi:Fields("AVI_ORD"):Value,7,0) + " " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "AND " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "AVI_REV = " + STR(oRsAvi:Fields("AVI_REV"):Value,2,0)
聽 聽 TRY
聽 聽 聽 聽 oApp:oCon:Execute(cCmdSql)
聽 聽 CATCH oError
聽 聽 聽 聽 MsgInfo("No pude ejecutar el comando " + cCmdSql,oApp:cAplicacion)
聽 聽 聽 聽 RETURN(.F.)
聽 聽 END
RETURN(.T.)
Si hay registros nuevos son mostrados en un di谩logo ON TOP y espera respuesta del usuario
del 谩rea de producci贸n, cuando el usuario da clic sobre el bot贸n ENTERADO se actualiza la
tabla con fecha y hora en que se dio clic. Es muy simple.
Esta es la imagen

http://postimg.org/image/6cegtrckp/" alt="" loading="lazy">