Hola a tod@s, tiempo sin pasar aquí, bueno, en realidad he pasado pero no he colaborado. Hoy os dejo una nueva aplicación que he desarrollado. El programa consiste en una especie de cuaderno de bitácora donde pueda controlar en qué he empleado mi tiempo (solo a nivel laboral :D). He usado sqlite y he creado una tabla donde voy insertando las tareas que hago. Solamente inserto ya que la inserción de una nueva tarea produce el cierre de la que estuviera abierta. Además he realizado la opción de exportar los datos de la tabla a un fichero txt separado por |.
Quedan cosas que mejorar, pero como v 1.0 no esta mal.
Os adjunto el fuente,
SALUDOS
BITACORA
Re: BITACORA
Aquí teneis el código
Código: Seleccionar todo
; ==========================================================================================
; AGRADEZCO ENORMEMENTE LAS APORTACIONES QUE TODOS LOS USUARIOS DEL FORO DE AUTOIT REALIZAN.
; SIN ELLAS ESTE PROGRAMA NO HUBIERA SIDO POSIBLE
; ==========================================================================================
;======================================================================================================
; QBITA IP V.1.0
; Autor: quinux
; email: [email protected]
; Descripcion: Mediante este programa el usuario podrá realizar un control del tiempo que emplea en
; cada tarea. Es una especie de Bitácora
;======================================================================================================
#include <SQLite.au3>
#include <SQLite.dll.au3>
#Include <Constants.au3>
#include <Date.au3>
#include <GuiConstantsEx.au3>
#Include <GuiListView.au3>
#NoTrayIcon
$g_nombre_bbdd = "bitacora.db"
Local $hQuery, $aRow, $aNames
Global $g_bbdd
Global $gDia = 0, $gMes = 0, $gAno = 0, $gHora = 0, $gMinuto = 0
Global $gNombreFichero = "bitacora.txt"
HotKeySet("+!i", "pMostrar")
_SQLite_Startup()
if crearBBDD() = 0 Then
$g_bbdd=_SQLite_Open($g_nombre_bbdd)
EndIf
Opt("TrayMenuMode",1)
$g_insertar_registro = TrayCreateItem("Insertar registro")
$g_consultar_bitacora = TrayCreateItem("Consultar registros")
TrayCreateItem("")
$g_acerca_de = TrayCreateItem("Acerca de ...")
TrayCreateItem("")
$g_salir = TrayCreateItem("Salir")
TraySetState()
TraySetState()
TraySetToolTip("Tarea activa: " & dameDatosTareaActiva("observacion") & @CR & "Comenzada el: " & dameDatosTareaActiva("fecha_inicio") & " a las " & dameDatosTareaActiva("hora_inicio"))
TraySetIcon("qbita.ico")
While 1
$msg = TrayGetMsg()
Select
Case $msg = 0
ContinueLoop
Case $msg = $g_insertar_registro
insertarRegistro()
Case $msg = $g_consultar_bitacora
consultarBitacora()
Case $msg = $g_acerca_de
Msgbox(64,"Acerca de ...","QBITA V 1.0" & @CRLF & "Realizado por Fernando García" & @CRLF & "Mail: [email protected]" )
Case $msg = $g_salir
; Cerramos la tarea que se encuentre activa
actualizarTareaActiva(@MDAY & "/" & @MON & "/" & @YEAR,@HOUR & ":" & @MIN,dameContador(),dameTiempo())
ExitLoop
EndSelect
WEnd
GUIDelete()
_SQLite_Shutdown ()
Exit
; ====================================================================================================================
; Name...........: crearBBDD()
; Description ...: Controla si la BBDD está existe, sino existe la crea
; Syntax.........:
; Parameters ....:
; Return values .: 1, 0
; Author ........: Fernando Garcia
; Remarks .......: Devuelve 1 si la BBDD no está creada y es creada en el momento
; Devuelve 0 si la BBDD está creada
; ====================================================================================================================
Func crearBBDD()
If NOT FileExists($g_nombre_bbdd) Then ; chequeamos si existe la base de datos, si no existe se crea
$g_bbdd =_SQLite_Open($g_nombre_bbdd)
_SQLite_Exec($g_bbdd,"CREATE TABLE t_bitacora(contador INTEGER,fecha_inicio DATE,hora_inicio TIME,fecha_fin DATE,hora_fin TIME,tiempo INTEGER,observacion varchar(500),PRIMARY KEY (contador));")
;_SQLite_Exec($g_bbdd,"INSERT into t_bitacora values ('1','13/10/10','12:52','01/01/1000','0:00',0,'hola');");
Return 1
Else
Return 0
EndIf
EndFunc
; ====================================================================================================================
; Name...........: insertarRegistro()
; Description ...: Muestra un cuadro de diálogo para que el usuario inserte una nueva tarea, la inserta si el usuario
; pulsa guardar y cierra la tarea que hubiera abierta.
; Syntax.........:
; Parameters ....:
; Return values .:
; Author ........: Fernando Garcia
; Remarks .......:
; ====================================================================================================================
Func insertarRegistro()
Local $v_msg
Local $v_ventana,$v_boton_cancelar,$v_etiqueta_descripcion,$v_texto_descripcion ,$v_etiqueta_tarea_actual, $v_descricion_tarea_actual, $v_hora_inicio_tarea_actual
Local $v_boton_guardar, $v_boton_cancelar, $v_fecha_inicio_tarea_atual
Local $v_etiqueta_fecha_ta,$v_etiqueta_hora_ta
Local $v_contador
Local $v_fecha_actual,$v_hora_actual
$v_ventana = GUICreate("Datos para la nueva tarea", 400, 200)
GuiSetIcon("qbita.ico")
$v_etiqueta_tarea_actual=GuiCtrlCreateLabel("Tarea actual: ", 30, 20, 300, 40)
$v_descripcion_tarea_actual = GuiCtrlCreateLabel(dameDatosTareaActiva("observacion"), 100, 20, 100, 40)
GUICtrlSetColor($v_descripcion_tarea_actual,0xffF000)
$v_etiqueta_fecha_ta=GuiCtrlCreateLabel("Comenzada el día: ", 30, 50, 100, 40)
$v_fecha_inicio_tarea_actual = GUICtrlCreateLabel(dameDatosTareaActiva("fecha_inicio"),125,50,60)
GUICtrlSetColor($v_fecha_inicio_tarea_actual,0xffF000)
$v_etiqueta_hora_ta=GuiCtrlCreateLabel("a las ", 190, 50, 100, 40)
$v_hora_inicio_tarea_actual = GUICtrlCreateLabel(dameDatosTareaActiva("hora_inicio"),215,50,60)
GUICtrlSetColor($v_hora_inicio_tarea_actual,0XFFF000)
$v_etiqueta_descripcion=GuiCtrlCreateLabel("Tarea: ", 30, 80, 100, 40)
$v_texto_descripcion = GuiCtrlCreateEdit("", 70, 80, 300, 70)
$v_boton_guardar = GUICtrlCreateButton("Guardar", 220, 170, 70, 20)
$v_boton_cancelar = GUICtrlCreateButton("Cancel", 300, 170, 70, 20)
GUISetState()
While 1
$v_msg = GUIGetMsg()
Select
Case $v_msg = $v_boton_cancelar ;Or $v_msg = $cancelbutton
ExitLoop
case $v_msg = $v_boton_guardar
; Nos quedamos con el día, mes, año, hora y minutos actuales con los que cerraremos y abriremos la siguiente tarea
$vTiempo = dameTiempo()
; Obtenemos la primary key del último registro
$v_contador = dameContador()
; Las variables globales han sido actualizadas dentro de la función dameTiempo
$v_fecha_actual = $gDia & "/" & $gMes & "/" & $gAno
$v_hora_actual = $gHora & ":" & $gMinuto
actualizarTareaActiva($v_fecha_actual,$v_hora_actual,$v_contador,$vTiempo)
; Ahora insertamos la nueva tarea
$v_contador = $v_contador + 1
_SQLite_Exec($g_bbdd,"INSERT into t_bitacora values (" & $v_contador & "," & "'" & $v_fecha_actual & "'" & "," & "'" & $v_hora_actual & "'" & ",'','', 0," & "'" & GUICtrlRead($v_texto_descripcion) & "'" & ");");
if @error Then
MsgBox(0,"ERROR","Se ha producido un error al actualizar el ini. consulte con el administrador")
Else
; Actualizamos el display dónde aparece la tarea activa
GUICtrlSetData($v_descripcion_tarea_actual,GUICtrlRead($v_texto_descripcion))
Guictrlsetdata($v_fecha_inicio_tarea_actual,$v_fecha_actual)
Guictrlsetdata($v_hora_inicio_tarea_actual,$v_hora_actual)
TraySetToolTip("Tarea activa: " & dameDatosTareaActiva("observacion") & @CR & "Comenzada el: " & dameDatosTareaActiva("fecha_inicio") & " a las " & dameDatosTareaActiva("hora_inicio"))
ExitLoop
EndIf
EndSelect
WEnd
GUIDelete()
EndFunc
; ====================================================================================================================
; Name...........: dameContador()
; Description ...: Nos devuelve la primary key del último registro insertado en la tabla
; Syntax.........:
; Parameters ....:
; Return values .: 0, si la tabla no tiene registros y si tiene devuelve el valor de su primary key
; Author ........: Fernando Garcia
; Remarks .......:
; ====================================================================================================================
Func dameContador()
Local $vContador = 0
_SQlite_Query ($g_bbdd, "SELECT max(contador) FROM t_bitacora;", $hQuery) ; the query
While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
$vContador = $aRow[0]
WEnd
return $vContador
EndFunc
; ====================================================================================================================
; Name...........: dameDatosTareaActiva()
; Description ...: Devuelve el contenido de un campo pasado como parámetro del último registro de la tabla
; Syntax.........:
; Parameters ....: $pColumna --> Nombre del campo de la tabla del cual queremos obtener el contenido
; Return values .: Devuelve el valor del campo de la tabla o ""
; Author ........: Fernando Garcia
; Remarks .......:
; ====================================================================================================================
Func dameDatosTareaActiva($pColumna)
Local $vDato = ""
_SQlite_Query ($g_bbdd, "SELECT " & $pColumna & " FROM t_bitacora WHERE contador = " & dameContador() & " and fecha_fin = '';", $hQuery) ; the query
While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
$vDato = $aRow[0]
WEnd
return $vDato
EndFunc
; ====================================================================================================================
; Name...........: actualizarTareaActiva()
; Description ...: Actualiza la tarea que esté activa en el momento de llamar al procedimiento
; Syntax.........:
; Parameters ....: $pFechaActual --> Fecha actual
; $pHoraActual --> Hora actual
; $pContador --> primary key del registro a actualizar
; $pTiempo --> Tiempo total que ha estado la tarea activa
; Return values .:
; Author ........: Fernando Garcia
; Remarks .......:
; ====================================================================================================================
Func actualizarTareaActiva($pFechaActual,$pHoraActual,$pContador,$pTiempo)
_SQLite_Exec($g_bbdd,"UPDATE t_bitacora set tiempo = " & $pTiempo & ", fecha_fin = " & "'" & $pFechaActual & "'" & ", hora_fin = " & "'" & $pHoraActual & "'" & " where contador = " & $pContador & " and fecha_fin = '';")
EndFunc
; ====================================================================================================================
; Name...........: consultarBitacora()
; Description ...: Muestra un cuadro de diálogo para que el usuario seleccione el rango de fechas a consultar de las
; tareas. Posteriormente este procedimiento llama mostrarConsulta
; Syntax.........:
; Parameters ....:
; Return values .:
; Author ........: Fernando Garcia
; Remarks .......:
; ====================================================================================================================
Func consultarBitacora()
Local $vDesdeFecha, $vHastaFecha, $vVentana
Local $labelDesdeFecha, $labelHastaFecha
Local $vBotonMostrar, $vBotonCancelar
Local $vMsg, $vFormatoFecha, $vEstilo
$vVentana = GUICreate("Seleccione intervalo de fechas", 300, 100)
GuiSetIcon("qbita.ico")
$labelDesdeFecha = GuiCtrlCreateLabel("Desde fecha: ", 10, 9, 80, 40)
$vDesdeFecha = GuiCtrlCreateDate("", 90, 10, 100, 20)
$labelHastaFecha = GuiCtrlCreateLabel("Hasta fecha: ", 10, 39, 80, 40)
$vHastaFecha = GuiCtrlCreateDate("", 90, 40, 100, 20)
$vFormatoFecha = 0x1032
$vEstilo = "dd/MM/yyyy"
GUICtrlSendMsg($vDesdeFecha, $vFormatoFecha, 0, $vEstilo)
GUICtrlSendMsg($vHastaFecha, $vFormatoFecha, 0, $vEstilo)
$vBotonMostrar = GUICtrlCreateButton("Mostrar", 150, 70, 70, 20)
$vBotonCancelar = GUICtrlCreateButton("Cancelar", 220, 70, 70, 20)
GUISetState()
While 1
$vMsg = GUIGetMsg()
Select
Case $vMsg = $vBotonMostrar
mostrarConsulta(GUICtrlRead($vDesdeFecha),GUICtrlRead($vHastaFecha))
Case $vMsg = $vBotonCancelar ;Or $v_msg = $cancelbutton
ExitLoop
Case $vMsg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
GUIDelete()
EndFunc
; ====================================================================================================================
; Name...........: mostrarConsulta()
; Description ...: Muestra en una rejilla de datos las tareas realizadas en el rango de fechas pasado como parámetro
; Syntax.........:
; Parameters ....: $pDesdeFecha --> Fecha inicio
; $pHastaFecha --> Fecha fin
; Return values .:
; Author ........: Fernando Garcia
; Remarks .......: El rango de fechas solo se aplica a la fecha de inicio de la tarea, es decir, siempre se consultan
; tareas cuya fecha de inicio se encuentre en el rango dado
; ====================================================================================================================
Func mostrarConsulta($pDesdeFecha,$pHastaFecha)
Local $vDesdeFecha, $vHastaFecha, $vVentana
Local $labelDesdeFecha, $labelHastaFecha
Local $vBotonMostrar, $vBotonSalir,$vRejillaDatos,$vExportarDatos
Local $vTiempo, $vMsg
$vVentana = GUICreate("", 500, 700)
GuiSetIcon("qbita.ico")
$vRejillaDatos = GuiCtrlCreateListView("Tarea |Fecha Ini|Hora Ini|Fecha Fin|Hora Fin| Tiempo total", 10, 10, 480, 650)
_SQlite_Query ($g_bbdd, "SELECT observacion,fecha_inicio,hora_inicio,fecha_fin,hora_fin,tiempo FROM t_bitacora where fecha_inicio between " & "'" & $pDesdeFecha & "'" & " and " & "'" & $pHastaFecha & "'" & " ORDER BY contador;", $hQuery)
_SQLite_FetchNames ($hQuery, $aNames)
While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
GUICtrlCreateListViewItem($aRow[0] & "|" & $aRow[1] & "|" & $aRow[2] & "|" & $aRow[3] & "|" & $aRow[4] & "|" & $aRow[5],$vRejillaDatos)
WEnd
$vBotonCancelar = GUICtrlCreateButton("Salir", 420, 670, 70, 20)
$vExportarDatos = GUICtrlCreateButton("Exportar",350,670,70,20)
GUISetState()
While 1
$vMsg = GUIGetMsg()
Select
Case $vMsg = $vExportarDatos
exportarDatosRejilla($vRejillaDatos)
Case $vMsg = $vBotonCancelar ;Or $v_msg = $cancelbutton
ExitLoop
EndSelect
WEnd
GUIDelete()
EndFunc
; ====================================================================================================================
; Name...........: dameTiempo()
; Description ...: Calcula el tiempo
; Syntax.........:
; Parameters ....:
; Return values .: valor en minutos
; Author ........: Fernando Garcia
; Remarks .......: De momento no calcula el tiempo empleado en varios días ya que hemos tomado como precondición que
; siempre que el programa se cierre se cerrará la tarea activa
; ====================================================================================================================
Func dameTiempo()
Local $vDia = 0, $vMes = 0, $vAno = 0, $vHora = 0, $vMinuto = 0
$vDia = @MDAY
$vMes = @MON
$vAno = @YEAR
$vHora = @HOUR
$vMinuto = @MIN
$vTiempo = 0
;Calculamos el tiempo en minutos que ha estado la tarea abierta
$vTiempo =((($vHora - $gHora) * 60) + ($vMinuto - $gMinuto))
; Actualizamos la fecha y hora de fin de la última entrada
$gDia = $vDia
$gMes = $vMes
$gAno = $vAno
$gHora = $vHora
$gMInuto = $vMinuto
return $vTiempo
EndFunc
; ====================================================================================================================
; Name...........: exportarDatosRejilla()
; Description ...: Exporta los datos de una rejilla a un fichero .txt
; Syntax.........:
; Parameters ....: $pRejillaDatos --> Puntero a la rejilla de datos creada previamente en cualquier otro procedimiento
; Return values .:
; Author ........: Fernando Garcia
; Remarks .......:
; ====================================================================================================================
Func exportarDatosRejilla(ByRef $pRejillaDatos)
Local $vI, $vJ
Local $vDirectorioDestino,$vFicheroDestino
Local $vLinea = ""
Local $vArray
$vDirectorioDestino = FileSelectFolder("Seleccione el directorio de destino","",2)
$vFicheroDestino = FileOpen($vDirectorioDestino & "\" & $gNombreFichero, 2)
; Check if file opened for writing OK
If $vFicheroDestino = -1 Then
MsgBox(0, "Error", "Imposible crear el fichero")
Exit
Else
If $vFicheroDestino <> "" Then
; Insertamos la cabecera de las columnas separadas por |
For $vI = 0 to (_GUICtrlListView_GetColumnCount($pRejillaDatos) - 1) step 1
$vArray = _GUICtrlListView_GetColumn($pRejillaDatos,$vI)
$vLinea = $vLinea & $vArray[5]
If $vI < (_GUICtrlListView_GetColumnCount($pRejillaDatos) - 1) Then
$vLinea = $vLinea & "|"
EndIf
Next
FileWriteLine($vFicheroDestino,$vLinea)
$vLinea = ""
For $vI = 0 to (_GUICtrlListView_GetItemCount($pRejillaDatos) - 1) Step 1
$vLinea = ""
For $vJ = 0 to (_GUICtrlListView_GetColumnCount($pRejillaDatos) - 1) Step 1
$vLinea = $vLinea & _GUICtrlListView_GetItemText($pRejillaDatos,$vI,$vJ)
If $vJ < (_GUICtrlListView_GetColumnCount($pRejillaDatos) - 1) Then
$vLinea = $vLinea & "|"
EndIf
Next
FileWriteLine($vFicheroDestino,$vLinea)
Next
FileClose($vFicheroDestino)
MsgBox(64,"PROCESO FINALIZADO","La exportación del fichero " & $gNombreFichero & " en el directorio " & $vDirectorioDestino & " ha sido finalizada")
EndIf
EndIf
EndFunc
Func pMostrar()
insertarRegistro()
EndFunc
Creéis que 1000 = 1?
- BasicOs
- Site Admin
- Mensajes: 2083
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: BITACORA
Gracias por el aporte y felicidades por el nivelazo que has cogido.
Y a ver si nos organizamos mejor con tu task manager!!!
Tienes un error que cuando no hay datos en la consulta, genera un error de la sintaxis sqllite.
Unas ideas puenden ser incluir ya una base de datos que se autocree, y/o que la función dameContador() devuelva un mensaje cuando esté vacia, o bien devuelva algún dato por defecto admitido en la consulta para este caso, explicando lo que ocurre.
prueba a copiar y pegar el código al Editor Scite, y con F5 ejecutarlo solo con el fichero del programa, y verás lo que te comento.
Salu22:)
Y a ver si nos organizamos mejor con tu task manager!!!
![:smt026](./images/smilies/026.gif)
![:smt026](./images/smilies/026.gif)
![:smt020](./images/smilies/020.gif)
![:smt020](./images/smilies/020.gif)
Tienes un error que cuando no hay datos en la consulta, genera un error de la sintaxis sqllite.
Unas ideas puenden ser incluir ya una base de datos que se autocree, y/o que la función dameContador() devuelva un mensaje cuando esté vacia, o bien devuelva algún dato por defecto admitido en la consulta para este caso, explicando lo que ocurre.
![:smt048](./images/smilies/048.gif)
![:smt048](./images/smilies/048.gif)
prueba a copiar y pegar el código al Editor Scite, y con F5 ejecutarlo solo con el fichero del programa, y verás lo que te comento.
Salu22:)
Re: BITACORA
Gracias, pero nivel poco, solo hay que ver algunos ejemplos y ya está. Sois muchos como tu los que hacéis que programar en autoit sea fácil.
Lo de los errores sintácticos lo tengo en cuenta y lo modificaré.
SALUDOS
Lo de los errores sintácticos lo tengo en cuenta y lo modificaré.
SALUDOS
Creéis que 1000 = 1?