Grande Daniel, excelente trabajo con dolphin.
Code: Select all | Expand
/*-------------------------------------------------------------------------------------------------*/
#include "encabezado.ch"
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados()
PRIVATE oError
PRIVATE oDlg, oBrw, oToolbar, oPopUp1, oBtnFilter
PRIVATE oQryFeri, oQryCiud
PRIVATE cFiltro, lFiltrado
PRIVATE bColCiudad
cFiltro := ""
lFiltrado := FALSE
IF !oSesion:EsAdmin()
cFiltro := ""
ELSE
cFiltro := "NUM_CIUD=%1 OR NUM_CIUD=0"
cFiltro := StrFormat( cFiltro, Var2Str( oSesion:GetNumCiudad() ) )
ENDIF
TRY
oQryCiud := oServer:Query2( "SELECT NUM_CIUD, NOMBRE FROM CIUDADES ORDER BY NOMBRE" )
IF !Empty( cFiltro )
oQryFeri := oServer:Query2( "SELECT * FROM vCATFERI WHERE " + cFiltro + " ORDER BY FECHA" )
ELSE
oQryFeri := oServer:Query2( "SELECT * FROM vCATFERI ORDER BY FECHA" )
ENDIF
oQryCiud:FillDbf( "TBLCIUD", "TEMP1" )
oQryCiud:END()
CATCH oError
IIf( HB_IsObject( oQryCiud ), oQryCiud:END(), NIL )
IIf( HB_IsObject( oQryFeri ), oQryFeri:END(), NIL )
ShowError( oError )
RETURN
END
bColCiudad := {|| IIf( oQryFeri:RecCount() > 0, IIf( oQryFeri:NACIONAL, "N/D", oQryFeri:NOMCOR ), "" ) }
DEFINE DIALOG oDlg NAME "DLG_FERIADOSC" OF oMainWnd ICON GetIcon() FONT oFontD
REDEFINE XBROWSE oBrw ID 101 OF oDlg ALIAS "FERI" ON DBLCLICK Feriados_Editar( FALSE ) FONT oFontD
ADD TO oBrw DATA oQryFeri:FECHA TITLE "Fecha" SIZE 090 CENTER PICTURE "@D"
ADD TO oBrw DATA oQryFeri:MOTIVO TITLE "Motivo del feriado" SIZE 270
ADD TO oBrw DATA oQryFeri:NACIONAL TITLE "Nacional" SIZE 054
ADD TO oBrw DATA bColCiudad TITLE "Ciudad" SIZE 054
WITH OBJECT oBrw
:SetDolphin( oQryFeri, .F. )
:MyConfig()
:aCols[ 03 ]:SetCheck( { "BMS_CHECKON","BMS_CHECKOFF" } )
:bKeyDown := {|nKey| Feriados_ProcesaTecla( nKey ) }
:lHScroll := FALSE
:nHeaderHeight := 36
END
ACTIVATE DIALOG oDlg ON INIT Feriados_Toolbar()
TEMP1->( DBCloseArea() )
oQryFeri:END()
RETURN
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_Toolbar()
MENU oPopUp1 POPUP 2010
MENUITEM "&1.-Mostrar feriados de un año" ACTION Feriados_Filtrar( 1 )
MENUITEM "&2.-Mostrar todos los feriados" ACTION Feriados_Filtrar( 2 )
ENDMENU
DEFINE BUTTONBAR oToolBar OF oDlg SIZE 60, 60 2010
DEFINE BUTTON NAME "TB_CLOSE" OF oToolBar ACTION oDlg:END() PROMPT "&Salir"
DEFINE BUTTON NAME "TB_ADD" OF oToolBar ACTION Feriados_Editar( TRUE ) PROMPT "&Nuevo" GROUP
DEFINE BUTTON NAME "TB_EDIT" OF oToolBar ACTION Feriados_Editar( FALSE ) PROMPT "&Editar"
DEFINE BUTTON NAME "TB_DELETE" OF oToolBar ACTION Feriados_Borrar() PROMPT "&Borrar"
DEFINE BUTTON NAME "TB_PRINTER" OF oToolBar ACTION Feriados_Listar() PROMPT "&Imprimir"
DEFINE BUTTON NAME "TB_HOLYDAYADD" OF oToolBar ACTION Feriados_Agregar() PROMPT "&Generar" GROUP
DEFINE BUTTON NAME "TB_FILTERADD" OF oToolBar ACTION Feriados_Filtrar(2) PROMPT "&Filtrar" GROUP MENU oPopUp1
SET MSGBAR OF oDlg TO "INS=Nuevo, DEL=Borrar, ENTER=Editar, F3=Imprimir, F4=Generar/Año, F5=Filtrar/Quitar, F9=Refrescar" 2010
oDlg:SetControl( oBrw )
WITH OBJECT oToolBar
:bRClicked := {|| NIL }
:bLClicked := {|| NIL }
:aControls[ 1 ]:cToolTip := "Cierra modulo"
:aControls[ 2 ]:cToolTip := "Agrega un nuevo registro"
:aControls[ 3 ]:cToolTip := "Edita datos del registro actual"
:aControls[ 4 ]:cToolTip := "Elimina datos del registro actual"
:aControls[ 5 ]:cToolTip := "Lista datos para ser impresos"
:aControls[ 6 ]:cToolTip := "Agrega los feriados de un año automaticamente"
oBtnFilter := :aControls[ 7 ]
END
RETURN
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_ProcesaTecla( nKey )
DO CASE
CASE nKey == VK_INSERT
Feriados_Editar( TRUE )
CASE nKey == VK_RETURN
Feriados_Editar( FALSE )
CASE nKey == VK_DELETE
Feriados_Borrar()
CASE nKey == VK_F3
Feriados_Listar()
CASE nKey == VK_F4
Feriados_Agregar()
CASE nKey == VK_F5
IF !lFiltrado
Feriados_Filtrar( 1 )
ELSE
Feriados_Filtrar( 2 )
ENDIF
CASE nKey == VK_F9
Refrescar_Browse( oBrw )
ENDCASE
RETURN
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_Filtrar( nOpcion )
LOCAL nAno
DO CASE
CASE nOpcion=1
nAno := 0
IF !MsgGet( "Mostrar feriados del año", "Introdusca el año que desea filtrar", @nAno, "9999", "TB_HOLYDAY" )
oBrw:SetFocus()
RETURN
ELSE
IF nAno <= 0
oBrw:SetFocus()
RETURN
ENDIF
ENDIF
IF oSesion:EsAdmin()
cFiltro := "YEAR(FECHA)=" + Var2Str( nAno )
ELSE
cFiltro := "NUM_CIUD=%1 OR NUM_CIUD=0 AND YEAR(FECHA)=" + Var2Str( nAno )
ENDIF
WITH OBJECT oBtnFilter
:FreeBitmaps()
:LoadBitmaps( "TB_FILTERDEL" )
:cTooltip := "Elimina filtro, muestra todos los feriados"
:Refresh()
END
lFiltrado := TRUE
CASE nOpcion=2
IF oSesion:EsAdmin()
cFiltro := ""
ELSE
cFiltro := "NUM_CIUD=%1 OR NUM_CIUD=0"
ENDIF
WITH OBJECT oBtnFilter
:FreeBitmaps()
:LoadBitmaps( "TB_FILTERADD" )
:cTooltip := "Filtra los feriados de un año en particular"
:Refresh()
END
lFiltrado := FALSE
ENDCASE
oQryFeri:SetWhere( cFiltro, TRUE )
oBrw:GoTop()
oBrw:Refresh()
oBrw:SetFocus()
RETURN
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_Borrar()
LOCAL lBorrar := TRUE
IF oQryFeri:eof()
MsgAlert( "No existen feriados registrados, nada que borrar." )
ELSE
IF MsgNoYes( "Desea borrar datos del feriado seleccionado?" )
TRY
IF lBorrar
oServer:Execute2( "DELETE FROM FERIADOS WHERE FECHA=%1", { oQryFeri:FECHA } )
oQryFeri:LoadQuery()
ENDIF
CATCH oError
ShowError( oError )
END
oBrw:Refresh()
ENDIF
ENDIF
oBrw:SetFocus()
RETURN
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_Editar( lNuevo )
PRIVATE oDlgE
PRIVATE oFecha, oNomCiud
PRIVATE dFecha, cMotivo, lNacional, nNumCiud, cNomCiud
IF TEMP1->( RecCount() ) == 0
MsgAlert( "No hay ciudades/oficinas definidas, no puede continuar." )
oBrw:SetFocus()
RETURN
ENDIF
IF lNuevo
dFecha := Date()
cMotivo := Space( 40 )
lNacional := TRUE
nNumCiud := 0
cNumCiud := ""
ELSE
IF oQryFeri:eof()
MsgAlert( "No existen feriados registrados, nada que editar." )
oBrw:SetFocus()
RETURN
ENDIF
dFecha := oQryFeri:FECHA
cMotivo := oQryFeri:MOTIVO
lNacional := oQryFeri:NACIONAL
nNumCiud := oQryFeri:NUM_CIUD
cNomCiud := oQryFeri:CIUDAD
ENDIF
DEFINE DIALOG oDlgE NAME "DLG_FERIADOSE" OF oDlg ICON GetIcon() FONT oFontD
REDEFINE GET oFecha VAR dFecha ;
ID 101 OF oDlgE ;
PICTURE "@D" ;
BITMAP "BMS_CALENDAR" ;
WHEN lNuevo ;
VALID Feriados_ValidarFecha() ;
ACTION ( dFecha := MsgDate( dFecha, "Seleccione fecha", oFecha ) )
REDEFINE GET cMotivo ;
ID 102 OF oDlgE ;
PICTURE "@!"
REDEFINE CHECKBOX lNacional ;
ID 103 OF oDlgE ;
ON CHANGE IIf( lNacional, ( nNumCiud:=0, cNomCiud:="", oNomCiud:Refresh() ), NIL )
REDEFINE GET oNomCiud VAR cNomCiud ;
ID 104 OF oDlgE ;
WHEN FALSE ;
UPDATE
REDEFINE BUTTON ;
ID 105 OF oDlgE ;
WHEN !lNacional ;
ACTION Feriados_SeleccionarCiudad()
REDEFINE BUTTON ;
ID 201 OF oDlgE ;
ACTION IIf( Feriados_Grabar( lNuevo ), oDlgE:END(), NIL )
REDEFINE BUTTON ;
ID 202 OF oDlgE ;
ACTION oDlgE:END() ;
CANCEL
ACTIVATE DIALOG oDlgE
oBrw:SetFocus()
RETURN
/*-------------------------------------------------------------------------------------------------*/
FUNCTION Feriados_ValidarFecha()
LOCAL lOk := FALSE
LOCAL lRepetido := FALSE
IF Empty( dFecha )
MsgAlert( "Debe definir la fecha del feriado." )
ELSE
TRY
oQryTmp := RunSQL( "SELECT COUNT(*) AS CONTADOR FROM FERIADOS WHERE FECHA=%1 AND NUM_CIUD=%2 AND NACIONAL=%3", { dFecha, nNumCiud, FALSE } )
IF oQryTmp:CONTADOR > 0
MsgAlert( "Ya se ha registrado un feriado con la fecha indicada, verifique." )
lRepetido := TRUE
ELSE
lOk := TRUE
ENDIF
oQryTmp:END()
CATCH oError
IIf( HB_IsObject( oQryTmp ), oQryTmp:END(), NIL )
ShowError( oError )
END
ENDIF
RETURN lOk
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_SeleccionarCiudad()
LOCAL bEval := {|| nNumCiud := TEMP1->NUM_CIUD, cNomCiud := TEMP1->NOMBRE, oNomCiud:Refresh() }
TEMP1->( DBFSeleccionar( oDlgE, "NOMBRE", "Ciudad/Oficina", nNumCiud, bEval ) )
RETURN
/*-------------------------------------------------------------------------------------------------*/
FUNCTION Feriados_Grabar( lNuevo )
LOCAL cWhere
LOCAL lGrabado := FALSE
IF Empty( dFecha ) .or. Empty( cMotivo )
MsgAlert( "Datos incompletos, no se puede actualizar datos." )
RETURN lGrabado
ENDIF
TRY
oServer:BeginTransaction()
IF lNuevo
oServer:Insert( "FERIADOS", { "NUM_CIUD", "FECHA", "MOTIVO", "NACIONAL" }, ;
{ nNumCiud , dFecha , cMotivo, lNacional } )
ELSE
cWhere := "FECHA=" + Var2Str( dFecha )
oServer:Update( "FERIADOS", { "NUM_CIUD", "FECHA", "NOMBRE", "NACIONAL" }, ;
{ nNumCiud , dFecha , cMotivo, lNacional }, cWhere )
ENDIF
oServer:CommitTransaction()
lGrabado := TRUE
CATCH oError
oServer:RollBack()
ShowError( oError )
END
IF lGrabado
oQryFeri:LoadQuery()
IIf( lNuevo, oBrw:Refresh(), oBrw:RefreshCurrent() )
ELSE
oBrw:GoTop()
ENDIF
RETURN lGrabado
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_Agregar()
LOCAL aFeriados, aDia
LOCAL dFecha, nAnoAct
LOCAL nAno, nSiglo, nG, nK, nI, nJ, nL, nDiaSS, nMesSS
LOCAL nFound := 0
nAnoAct := Year( Date() )
IF !MsgGet( "Agregar feriados de año", "Introdusca el año que desea procesar", @nAnoAct, "9999", "TB_HOLYDAYADD" )
oBrw:SetFocus()
RETURN
ELSE
IF nAnoAct <= 0
oBrw:SetFocus()
RETURN
ENDIF
ENDIF
aFeriados := {}
dFecha := DMY2DATE( 1, 1, nAnoAct )
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados , { dFecha, "PRIMER DIA DEL AÑO" } )
ENDIF
nAno := nAnoAct
nSiglo := Int( nAno / 100 )
nG := Mod( nAno, 19 )
nK := Int( ( nSiglo - 17 ) / 25 )
nI := Mod( ( nSiglo - int( nSiglo / 4 ) - int( (nSiglo - nK ) / 3 ) + 19* nG + 15 ), 30 )
nI := nI - Int( nI / 28 ) * ( (1 - Int( nI / 28 ) * ( Int( 29 / ( nI+1 ) ) * ( Int( ( 21 - nG ) / 11 ) ) ) ) )
nJ := Mod( ( nAno + Int( nAno / 4 ) + nI + 2 - nSiglo + Int( nSiglo / 4 ) ), 7 )
nL := nI - nJ
nMesSS := 3 + Int( ( nL + 40 ) / 44 )
nDiaSS := nL + 28 - 31 * Int ( nMesSS / 4 )
dFecha := DMY2DATE( nDiaSS, nMesSS, nAnoAct ) - 3
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "JUEVES DE SEMANA SANTA" } )
ENDIF
dFecha := DMY2DATE( nDiaSS, nMesSS, nAnoAct ) - 2
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "VIERNES DE SEMANA SANTA" } )
ENDIF
dFecha := DMY2DATE( 01, 05, nAnoAct )
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "DIA DE LOS TABAJADORES" } )
ENDIF
dFecha := DMY2DATE( 19, 07, nAnoAct )
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "DIA DE LA REVOLUCION" } )
ENDIF
dFecha := DMY2DATE( 14, 09, nAnoAct )
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "BATALLA DE SAN JACINTO" } )
ENDIF
dFecha := DMY2DATE( 15, 09, nAnoAct )
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "INDEPENDENCIA DE NICARAGUA" } )
ENDIF
dFecha := DMY2DATE( 08, 12, nAnoAct )
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "DIA DE LA CONCEPCION DE MARIA" } )
ENDIF
dFecha := DMY2DATE( 25, 12, nAnoAct )
IF oQryFeri:Locate( {dFecha}, { "FECHA" } )
AAdd( aFeriados, { dFecha, "DIA DE NACIMIENTO DE NIÑO JESUS" } )
ENDIF
IF Len( aFeriados ) > 0
TRY
oServer:BeginTransaction()
FOR EACH aDia IN aFeriados
oServer:Insert( "FERIADOS", { "FECHA", "MOTIVO", "NACIONAL", "NUM_CIUD" }, ;
{ aDia[1], aDia[2] , TRUE , 0 } )
NEXT
oServer:CommitTransaction()
CATCH oError
oServer:RollBack()
ShowError( oError )
END
ENDIF
oQryFeri:LoadQuery()
oBrw:GoTop()
oBrw:Refresh()
oBrw:SetFocus()
RETURN
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Feriados_Listar()
RETURN
/*-------------------------------------------------------------------------------------------------*/
/*EOF*/
/*-------------------------------------------------------------------------------------------------*/