Página 1 de 1

BITACORA

Publicado: 19 Oct 2010, 13:43
por quinux
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

Re: BITACORA

Publicado: 19 Oct 2010, 13:45
por quinux
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


Re: BITACORA

Publicado: 19 Oct 2010, 14:43
por BasicOs
Gracias por el aporte y felicidades por el nivelazo que has cogido.
Y a ver si nos organizamos mejor con tu task manager!!! :smt026 :smt026 :smt020 :smt020
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 :smt048
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

Publicado: 19 Oct 2010, 16:05
por quinux
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