HELP !!! CON MDI
Publicado por Luis Ponce (119 intervenciones) el 18/02/2008 17:42:10
Amigos del foro
Toco que casi enloquezca con los las ventanas MDI, sucede que tengo un sistema que trabaja en red y de los terminales genera pedidos de mercaderia que son recuperados en el server que es la caja (ya que con la TDOSPRN, no se puede imprimir desde los terminales en impresoras remotas....) es ese equipo donde tengo dos puertos de impresión LPT1 y LTP2 donde imprimo facturas y Boletas y un COM2 donde va la TM300 para tikets... ah esa es otra historia que luego contare.
Es el hecho que lo hacia con un dialogo que daba el ultimo clic para emitir un comprobante de pago, tambien adicione un timer que me haga un refresh al dialogo para saber de pedidos nuevos recien generados desde algun terminal (que dicho sea de paso tampoco funciona), en este dialogo declaro unas variables como LOCALES de la forma usual (me refiero a LOCAL cCodDoc:=cSerDoc:=cCodVen:=cCodZon:=cObserva:="") y al parecer no funciona, me da error ERROR BASE/1003 Variable Does Not Exist cSerDoc.. al momento de hacer el ON DBLCLICK en el Listbox, (y me pregunto x que esa variable da error si al invocar a la funcion que ejecuta el mouse ImpCmp(..) llama a otras variables y la primera es cCodDoc) ¿?? ya me arranque los pelos probando de todo un poco y oh sorpresa si funciona cuando declaro por separado las variables en mecion :
LOCAL cCodDoc
LOCAL cSerDoc
LOCAL cCodVen
LOCAL cCodZon
LOCAL cObserva
Ahí comparto mi codigo a lo mejor algo estoy haciendo mal.
Y no es todo, cuando en teoria debo cerar la base de datos al final con (AliasPed)->(DbCloseArea()) al parecer lo cierra cuando aun no cerre el dialogo y cuando retorna de refcaja(..) me da el error de ERROR BASE/1002 Alias Does Not Exist PEDIDOS01 por eso la puse como comentario, al igual que las dos lineas siguientes a esa que tambien provocan un error.
Function FacCajaX()
LOCAL oWndCaja,oDlgCaja,oLbxPedidos,oFntArial,oFntArial2,oTimer,oTotal,oTitulo,oObserva,oMeter
LOCAL cCodClt,cNomClt,nTotPed,nLineas
LOCAL cCodDoc:=cSerDoc:=cCodVen:=cCodZon:=cObserva:=""
LOCAL nMoneda:=ASCAN(aMon,IMPMFA)
LOCAL nTotal :=0.00
LOCAL nActual:=nTotalPro:=0
LOCAL AliasPed
USE &FIL46 NEW SHARED Alias (AliasPed := GetNewAlias( "PEDIDOS" ) )
(AliasPed)->(OrdSetFocus(1))
DbEval( { || nTotal += (AliasPed)->IMPORTE } )
(AliasPed)->(DbGoTop())
DEFINE FONT oFntArial NAME "Arial" SIZE 0, -13
DEFINE FONT oFntArial2 NAME "Arial" SIZE 0, -16 BOLD
DEFINE FONT oFntArial3 NAME "Arial" SIZE 0, -24 BOLD
DEFINE WINDOW oWndCaja MDICHILD FROM 0.5,0.5 TO 26,70;
TITLE "Movimiento de Caja"
DEFINE DIALOG oDlgCaja NAME "DLG_CAJA" OF oWndCaja
// DEFINE TIMER oTimer INTERVAL 10000 ACTION nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)) OF oDlgCaja *** esta es la instrucción inicial hice otra mas sencilla a continuación para probar
DEFINE TIMER oTimer INTERVAL 10000 ACTION msgalert("Funciono el Timer !!") OF oDlgCaja
// ACTIVATE TIMER oTimer ***** y no funciona
REDEFINE SAY oTitulo PROMPT "Pendientes de Facturar" ID 118 OF oDlgCaja FONT oFntArial2 COLORS nRgb(200,0,0)
REDEFINE METER oMeter VAR nActual TOTAL nTotalPro ID 119 OF oDlgCaja UPDATE
REDEFINE LISTBOX oLbxPedido ;
FIELDS (AliasPed)->NUMERO, (AliasPed)->NOMBRE, TRANS((AliasPed)->IMPORTE,MA72C) ;
ALIAS (AliasPed) ;
HEAD "Pedido", "A Nombre de", "Total" ;
ON CHANGE (cCodClt:=(AliasPed)->CODCLT,cNomClt :=(AliasPed)->NOMBRE, ;
nTotPed:=(AliasPed)->IMPORTE,nLineas:=(AliasPed)->LINEAS, ;
cCodVen:=(AliasPed)->VENDEDOR,cCodZon:=(AliasPed)->ZONA, ;
cCodDoc:=(AliasPed)->COMPROBANT,cSerDoc:=(AliasPed)->SERIE,cObserva:=TRIM((AliasPed)->OBSERVA),oDlgCaja:Update()) ;
ON DBLCLICK IIF(!EMPTY((AliasPed)->IMPORTE),(aImpCmp:=ImpCmp(cCodDoc,cSerDoc,UltDoc(cCodDoc,cSerDoc),DATE(),1,'01',cCodClt,cNomClt,nMoneda,nTotPed,nLineas,(AliasPed)->NUMERO,cCodVen,cCodZon),nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)),oDlgCaja:Update()),) ;
ON RIGHT CLICK ( ShowPopCaja( nRow, nCol, oLbxPedido, oDlgCaja,(AliasPed)->IMPORTE,(AliasPed)),nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)), oDlgCaja:Update() ) ;
FIELDSIZES 60, 330, 80 ;
FONT oFntArial ;
ID 114 OF oDlgCaja
oLbxPedido:aJustify := {.F.,.F.,.T.}
oLbxPedido:nClrPane := { || IIF( (AliasPed)->(RECNO())%2=0, nRGB( 153, 204, 255 ), nRGB( 230, 230, 230 ) )}
REDEFINE SAY oObserva VAR cObserva ID 187 OF oDlgCaja FONT oFntArial3 COLORS nRgb(255,255,0),nRgb(255,0,0)
REDEFINE SAY oMoneda VAR aSimMon[nMoneda] ID 117 OF oDlgCaja FONT oFntArial3 COLORS nRgb(255,255,0),nRgb(0,0,0)
REDEFINE SAY oTotal VAR nTotal ID 120 PICTURE MA72C OF oDlgCaja FONT oFntArial3 COLORS nRgb(255,255,0),nRgb(0,0,0)
REDEFINE BUTTON ID 115 OF oDlgCaja ACTION (nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)),oLbxPedido:SetFocus())
REDEFINE BUTTON ID 116 OF oDlgCaja ACTION (oDlgCaja:End(),oWndCaja:End())
ACTIVATE DIALOG oDlgCaja NOWAIT ON INIT (oDlgCaja:Move(0,0),oTimer:Activate()) **** el timer deberia activarse
ACTIVATE WINDOW oWndCaja VALID oLbxPedido:lCloseArea()
// (AliasPed)->(DbCloseArea()) **** estas lineas van como comentario si no ERROR
// oTimer:DeActivate() ***** esto debiera de funcionar
// oTimer:Release()
oFntArial:End()
oFntArial2:End()
Return Nil
*** en esta funcion en mi desesperación puse algunos indicadores ?, Browse() para saber en donde eme encuentro
FUNCTION RefCaja(oLbxPedido,oDlgCaja,oTotal,oMeter,cAliasPed)
LOCAL nTotal:=nTotPed:=nTotLin:=0.00
LOCAL LPedido
oMeter:SetTotal((cAliasPed)->(LastRec()))
* verifica coherencia
USE &FIL47 NEW SHARED Alias ( LPedido := GetNewAlias( "Lineas" ) )
(LPedido)->(OrdSetFocus(1))
(cAliasPed)->(DbGoTop())
? cAliasPed
browse()
WHILE !(cAliasPed)->(EOF())
cPedido:=(cAliasPed)->NUMERO
nRecno :=(cAliasPed)->(Recno())
oMeter:Set((cAliasPed)->(Recno()))
IF ((LPedido)->( DbSeek(TRIM(cPedido)))) // si existen lineas, refresco el total y nro de lineas
WHILE (LPedido)->PEDIDO=cPedido // refresco total en lineas, y sumo total y cuento lineas
IF (LPedido)->(Rlock())
(LPedido)->TOTAL :=((LPedido)->PRECIO*(LPedido)->CANTIDAD)
nTotPed+=((LPedido)->PRECIO*(LPedido)->CANTIDAD)
nTotLin+=1
ENDIF
(LPedido)->(DbUnLock())
(LPedido)->(DbSkip())
END
SysRefresh()
IF ((cAliasPed)->( DbSeek(TRIM(cPedido)))) // en cabecera si existe, refresco lineas e importe
IF (cAliasPed)->(Rlock())
(cAliasPed)->LINEAS :=nTotLin
(cAliasPed)->IMPORTE :=nTotPed
ENDIF
(cAliasPed)->(DbUnLock())
nTotLin:=nTotPed:=0
ELSE // si no existe en cabecera, elimino lineas
IF ((LPedido)->( DbSeek(TRIM(cPedido))))
WHILE (LPedido)->PEDIDO=cPedido
IF (LPedido)->(Rlock())
(LPedido)->(DbDelete())
ENDIF
(LPedido)->(DbSkip())
END
SysRefresh()
ENDIF
ENDIF
ELSE // si ni existen lineas, elimino la cabecera
IF (cAliasPed)->(Rlock())
(cAliasPed)->(DbDelete())
ENDIF
ENDIF
Select((cAliasPed))
(cAliasPed)->(DbGoTo(nRecno))
(cAliasPed)->(DbSkip())
END
(LPedido)->(DbCloseArea())
SysRefresh()
// Refresca (cAliasPed)
? cAliasPed
Select((cAliasPed))
(cAliasPed)->(DbGoTop())
DbEval( { || nTotal += (cAliasPed)->IMPORTE } )
(cAliasPed)->(DbGoTop())
oTotal:SetText(nTotal)
oLbxPedido:Refresh()
oLbxPedido:GoTop()
oDlgCaja:Refresh()
RETURN Nil
He tratado de ser lo mas explicito posible, ayudando a que me ayuden...Tengo las joyas de mi familia hinchadas de tanto tiempo que vengo invirtiendo en esto, si alguien me da una mano mucho lo agradecere.
Ya me pase a los indices CDX’s con algun exito
Trabajo con el Clip 5.3b, FiveWin 2.4 y Blinker 7.0 con el Borland 4.5
Att.
Luis Ponce
Toco que casi enloquezca con los las ventanas MDI, sucede que tengo un sistema que trabaja en red y de los terminales genera pedidos de mercaderia que son recuperados en el server que es la caja (ya que con la TDOSPRN, no se puede imprimir desde los terminales en impresoras remotas....) es ese equipo donde tengo dos puertos de impresión LPT1 y LTP2 donde imprimo facturas y Boletas y un COM2 donde va la TM300 para tikets... ah esa es otra historia que luego contare.
Es el hecho que lo hacia con un dialogo que daba el ultimo clic para emitir un comprobante de pago, tambien adicione un timer que me haga un refresh al dialogo para saber de pedidos nuevos recien generados desde algun terminal (que dicho sea de paso tampoco funciona), en este dialogo declaro unas variables como LOCALES de la forma usual (me refiero a LOCAL cCodDoc:=cSerDoc:=cCodVen:=cCodZon:=cObserva:="") y al parecer no funciona, me da error ERROR BASE/1003 Variable Does Not Exist cSerDoc.. al momento de hacer el ON DBLCLICK en el Listbox, (y me pregunto x que esa variable da error si al invocar a la funcion que ejecuta el mouse ImpCmp(..) llama a otras variables y la primera es cCodDoc) ¿?? ya me arranque los pelos probando de todo un poco y oh sorpresa si funciona cuando declaro por separado las variables en mecion :
LOCAL cCodDoc
LOCAL cSerDoc
LOCAL cCodVen
LOCAL cCodZon
LOCAL cObserva
Ahí comparto mi codigo a lo mejor algo estoy haciendo mal.
Y no es todo, cuando en teoria debo cerar la base de datos al final con (AliasPed)->(DbCloseArea()) al parecer lo cierra cuando aun no cerre el dialogo y cuando retorna de refcaja(..) me da el error de ERROR BASE/1002 Alias Does Not Exist PEDIDOS01 por eso la puse como comentario, al igual que las dos lineas siguientes a esa que tambien provocan un error.
Function FacCajaX()
LOCAL oWndCaja,oDlgCaja,oLbxPedidos,oFntArial,oFntArial2,oTimer,oTotal,oTitulo,oObserva,oMeter
LOCAL cCodClt,cNomClt,nTotPed,nLineas
LOCAL cCodDoc:=cSerDoc:=cCodVen:=cCodZon:=cObserva:=""
LOCAL nMoneda:=ASCAN(aMon,IMPMFA)
LOCAL nTotal :=0.00
LOCAL nActual:=nTotalPro:=0
LOCAL AliasPed
USE &FIL46 NEW SHARED Alias (AliasPed := GetNewAlias( "PEDIDOS" ) )
(AliasPed)->(OrdSetFocus(1))
DbEval( { || nTotal += (AliasPed)->IMPORTE } )
(AliasPed)->(DbGoTop())
DEFINE FONT oFntArial NAME "Arial" SIZE 0, -13
DEFINE FONT oFntArial2 NAME "Arial" SIZE 0, -16 BOLD
DEFINE FONT oFntArial3 NAME "Arial" SIZE 0, -24 BOLD
DEFINE WINDOW oWndCaja MDICHILD FROM 0.5,0.5 TO 26,70;
TITLE "Movimiento de Caja"
DEFINE DIALOG oDlgCaja NAME "DLG_CAJA" OF oWndCaja
// DEFINE TIMER oTimer INTERVAL 10000 ACTION nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)) OF oDlgCaja *** esta es la instrucción inicial hice otra mas sencilla a continuación para probar
DEFINE TIMER oTimer INTERVAL 10000 ACTION msgalert("Funciono el Timer !!") OF oDlgCaja
// ACTIVATE TIMER oTimer ***** y no funciona
REDEFINE SAY oTitulo PROMPT "Pendientes de Facturar" ID 118 OF oDlgCaja FONT oFntArial2 COLORS nRgb(200,0,0)
REDEFINE METER oMeter VAR nActual TOTAL nTotalPro ID 119 OF oDlgCaja UPDATE
REDEFINE LISTBOX oLbxPedido ;
FIELDS (AliasPed)->NUMERO, (AliasPed)->NOMBRE, TRANS((AliasPed)->IMPORTE,MA72C) ;
ALIAS (AliasPed) ;
HEAD "Pedido", "A Nombre de", "Total" ;
ON CHANGE (cCodClt:=(AliasPed)->CODCLT,cNomClt :=(AliasPed)->NOMBRE, ;
nTotPed:=(AliasPed)->IMPORTE,nLineas:=(AliasPed)->LINEAS, ;
cCodVen:=(AliasPed)->VENDEDOR,cCodZon:=(AliasPed)->ZONA, ;
cCodDoc:=(AliasPed)->COMPROBANT,cSerDoc:=(AliasPed)->SERIE,cObserva:=TRIM((AliasPed)->OBSERVA),oDlgCaja:Update()) ;
ON DBLCLICK IIF(!EMPTY((AliasPed)->IMPORTE),(aImpCmp:=ImpCmp(cCodDoc,cSerDoc,UltDoc(cCodDoc,cSerDoc),DATE(),1,'01',cCodClt,cNomClt,nMoneda,nTotPed,nLineas,(AliasPed)->NUMERO,cCodVen,cCodZon),nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)),oDlgCaja:Update()),) ;
ON RIGHT CLICK ( ShowPopCaja( nRow, nCol, oLbxPedido, oDlgCaja,(AliasPed)->IMPORTE,(AliasPed)),nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)), oDlgCaja:Update() ) ;
FIELDSIZES 60, 330, 80 ;
FONT oFntArial ;
ID 114 OF oDlgCaja
oLbxPedido:aJustify := {.F.,.F.,.T.}
oLbxPedido:nClrPane := { || IIF( (AliasPed)->(RECNO())%2=0, nRGB( 153, 204, 255 ), nRGB( 230, 230, 230 ) )}
REDEFINE SAY oObserva VAR cObserva ID 187 OF oDlgCaja FONT oFntArial3 COLORS nRgb(255,255,0),nRgb(255,0,0)
REDEFINE SAY oMoneda VAR aSimMon[nMoneda] ID 117 OF oDlgCaja FONT oFntArial3 COLORS nRgb(255,255,0),nRgb(0,0,0)
REDEFINE SAY oTotal VAR nTotal ID 120 PICTURE MA72C OF oDlgCaja FONT oFntArial3 COLORS nRgb(255,255,0),nRgb(0,0,0)
REDEFINE BUTTON ID 115 OF oDlgCaja ACTION (nTotal:=refcaja(oLbxPedido,oDlgCaja,oTotal,oMeter,(AliasPed)),oLbxPedido:SetFocus())
REDEFINE BUTTON ID 116 OF oDlgCaja ACTION (oDlgCaja:End(),oWndCaja:End())
ACTIVATE DIALOG oDlgCaja NOWAIT ON INIT (oDlgCaja:Move(0,0),oTimer:Activate()) **** el timer deberia activarse
ACTIVATE WINDOW oWndCaja VALID oLbxPedido:lCloseArea()
// (AliasPed)->(DbCloseArea()) **** estas lineas van como comentario si no ERROR
// oTimer:DeActivate() ***** esto debiera de funcionar
// oTimer:Release()
oFntArial:End()
oFntArial2:End()
Return Nil
*** en esta funcion en mi desesperación puse algunos indicadores ?, Browse() para saber en donde eme encuentro
FUNCTION RefCaja(oLbxPedido,oDlgCaja,oTotal,oMeter,cAliasPed)
LOCAL nTotal:=nTotPed:=nTotLin:=0.00
LOCAL LPedido
oMeter:SetTotal((cAliasPed)->(LastRec()))
* verifica coherencia
USE &FIL47 NEW SHARED Alias ( LPedido := GetNewAlias( "Lineas" ) )
(LPedido)->(OrdSetFocus(1))
(cAliasPed)->(DbGoTop())
? cAliasPed
browse()
WHILE !(cAliasPed)->(EOF())
cPedido:=(cAliasPed)->NUMERO
nRecno :=(cAliasPed)->(Recno())
oMeter:Set((cAliasPed)->(Recno()))
IF ((LPedido)->( DbSeek(TRIM(cPedido)))) // si existen lineas, refresco el total y nro de lineas
WHILE (LPedido)->PEDIDO=cPedido // refresco total en lineas, y sumo total y cuento lineas
IF (LPedido)->(Rlock())
(LPedido)->TOTAL :=((LPedido)->PRECIO*(LPedido)->CANTIDAD)
nTotPed+=((LPedido)->PRECIO*(LPedido)->CANTIDAD)
nTotLin+=1
ENDIF
(LPedido)->(DbUnLock())
(LPedido)->(DbSkip())
END
SysRefresh()
IF ((cAliasPed)->( DbSeek(TRIM(cPedido)))) // en cabecera si existe, refresco lineas e importe
IF (cAliasPed)->(Rlock())
(cAliasPed)->LINEAS :=nTotLin
(cAliasPed)->IMPORTE :=nTotPed
ENDIF
(cAliasPed)->(DbUnLock())
nTotLin:=nTotPed:=0
ELSE // si no existe en cabecera, elimino lineas
IF ((LPedido)->( DbSeek(TRIM(cPedido))))
WHILE (LPedido)->PEDIDO=cPedido
IF (LPedido)->(Rlock())
(LPedido)->(DbDelete())
ENDIF
(LPedido)->(DbSkip())
END
SysRefresh()
ENDIF
ENDIF
ELSE // si ni existen lineas, elimino la cabecera
IF (cAliasPed)->(Rlock())
(cAliasPed)->(DbDelete())
ENDIF
ENDIF
Select((cAliasPed))
(cAliasPed)->(DbGoTo(nRecno))
(cAliasPed)->(DbSkip())
END
(LPedido)->(DbCloseArea())
SysRefresh()
// Refresca (cAliasPed)
? cAliasPed
Select((cAliasPed))
(cAliasPed)->(DbGoTop())
DbEval( { || nTotal += (cAliasPed)->IMPORTE } )
(cAliasPed)->(DbGoTop())
oTotal:SetText(nTotal)
oLbxPedido:Refresh()
oLbxPedido:GoTop()
oDlgCaja:Refresh()
RETURN Nil
He tratado de ser lo mas explicito posible, ayudando a que me ayuden...Tengo las joyas de mi familia hinchadas de tanto tiempo que vengo invirtiendo en esto, si alguien me da una mano mucho lo agradecere.
Ya me pase a los indices CDX’s con algun exito
Trabajo con el Clip 5.3b, FiveWin 2.4 y Blinker 7.0 con el Borland 4.5
Att.
Luis Ponce
Valora esta pregunta
0