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.
- Code: Select all Expand view RUN
// 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
- Code: Select all Expand view RUN
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
[img]
http://postimg.org/image/6cegtrckp/[/img]