Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
aplitec
Mensajes: 10
Registrado: 25 Jul 2010, 11:23

Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por aplitec »

Hola necesito ayuda , ¿Como tengo que poner un campo fecha sin ninguna fecha (en blanco) con la instrucción ? :

$fecha=" "
$fechaalta = GUICtrlCreateDate($fecha, 129, 390, 90, 23,$DTS_SHORTDATEFORMAT)
(en pantalla siempre me aparece la fecha de hoy )

Lo que necesito :
Es un campo de fecha en blanco, cuando hago click en el campo es cuando me sale el calendario con la fecha actual.

En conclusión este campo lo utilizo para actualizar el campo de una tabla de una base de datos Mysql , si Esta en blanco no realizo la actualización de este campo , si tiene un valor lo actualizo y también cuando recupero la información de esta campo la enseño.

Espero haberme explicado, saludos
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda: ¿Como poner un campo fecha sin ninguna fecha?

Mensaje por Ximorro »

Supongo que te refieres a cómo tenerlo sin fecha en el control, porque en la base de datos es fácil (null o un valor prefijado que indique que la fecha no es válida)

En el DateControl por las pruebas que hice con él en su momento no hubo manera, si pones una fecha vacía o incorrecta (por ejemplo un 30 de febrero) el control visualmente se pone en la fecha actual.

Una opción que veo es que pongas un checkbox junto a la fecha, que diga "Incluir fecha" o algo así. Si no está activado pones fecha nula en la BD y si está activado la tomas del control.
Quedará más bonito si habilitas o inhabilitas el control de fecha según el chequeo del checkbox.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
aplitec
Mensajes: 10
Registrado: 25 Jul 2010, 11:23

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por aplitec »

Ximorro, utilizo el checkbox que tiene el estilo de control _GUICtrlDTP_SetSystemTimeEx($baja, $tDate, True)

$lfalta = GUICtrlCreateLabel("Fecha alta S.S", 16, 394, 83, 19)
GUICtrlSetFont(-1, 9, 400, 0, "Arial")
$fechaalta = GUICtrlCreateDate("", 129, 390, 114, 23,BitOR($DTS_SHOWNONE,$WS_TABSTOP))
$alta = GUICtrlGetHandle($fechaalta)
$resalta=_GUICtrlDTP_SetSystemTimeEx($alta, $tDate, True)
$lfbaja = GUICtrlCreateLabel("Fecha baja", 265, 393, 65, 19)
GUICtrlSetFont(-1, 9, 400, 0, "Arial")
$fechabaja = GUICtrlCreateDate("", 358, 390, 114, 23, BitOR($DTS_SHOWNONE,$WS_TABSTOP))
$baja = GUICtrlGetHandle($fechabaja)
$resbaja=_GUICtrlDTP_SetSystemTimeEx($baja, $tDate, True)

¡Esta es la solución que me comentas!

No hay otra más fácil

Muchas Gracias
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por Chefito »

Noooooo, esa no es la solución que Ximorro te comenta. El te está diciendo que utilices un control checkbox, el cual se crea con la función GUICtrlCreateCheckbox. Mirala en la ayuda.
Esta es una muy buena forma de hacerlo sin complicaciones :smt023 .
Otra también facil sería poner un control input (GUICtrlCreateInput) donde se pusiese la fecha cuando le dieses a un control button (un simple botón - GUICtrlCreateButton). El contenido de este control input podría estar al principio en blanco, y una vez le dieses al botón le pasarías el contenido del control dtpicker (la fecha) al control input. Finalmente, lo que se le manda a la base de datos sería el contenido del control input.

Seguro que hay más soluciones fáciles de implementar. Solo hay que ponerse a pensar un poco :smt002 .

Y ahora una solución un tanto más dificil (para algunos), pero hace exactamente lo que quieres :smt002 .

Código: Seleccionar todo

#include <GuiConstantsEx.au3>
#include <GuiDateTimePicker.au3>
#include <WindowsConstants.au3>

$Debug_DTP = False ; Check ClassName being passed to DTP functions, set to True and use a handle to another control to see it work

Global $hDTP, $aux=True, $hGUI

; Create GUI
$hGUI = GUICreate("(UDF Created) DateTimePick Create", 400, 300)
$hDTP = _GUICtrlDTP_Create($hGUI, 2, 6, 190)
;Otra forma de crear el control dtpicker. Se necesita objener el handle del control para luego poder trabajar con _GUICtrlDTP_SetFormat
;~ 	$DTP = GUICtrlCreateDate("", 10, 10, 100, 20, $DTS_SHORTDATEFORMAT)
;~ 	$hDTP=GUICtrlGetHandle($DTP)

; Set the display format
_GUICtrlDTP_SetFormat($hDTP, "'")	;se utiliza la comilla simple para poder poner un campo en blanco, o para poner caracteres que devolverían algo del formato.
;_GUICtrlDTP_SetFormat($hDTP, "Pon aquí la fec'ha")		;Como veis, se puede poner un mensaje en la caja del control.

GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg, $iwParam
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR ;, $tInfo

	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hDTP
			Switch $iCode
				Case $DTN_DATETIMECHANGE ; Sent by a date and time picker (DTP) control whenever a change occurs
					If $aux Then 
						_GUICtrlDTP_SetFormat($hDTP, "dd/MM/yyyy")
						$aux=False
					EndIf
					MsgBox(0,"",ControlGetText($hgui,"",$hDTP))
					;MsgBox(0,"",GUICtrlRead($DTP))		;Otra forma de devolver el dato que contiene el control dtpicker cuando se está trabajando con GUICtrlCreateDate
;~ 					$tInfo = DllStructCreate($tagNMDATETIMECHANGE, $ilParam)
;~ 					_DebugPrint("$DTN_DATETIMECHANGE" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tInfo, "hWndFrom") & @LF & _
;~ 							"-->IDFrom:" & @TAB & DllStructGetData($tInfo, "IDFrom") & @LF & _
;~ 							"-->Code:" & @TAB & DllStructGetData($tInfo, "Code") & @LF & _
;~ 							"-->Flag:" & @TAB & DllStructGetData($tInfo, "Flag") & @LF & _
;~ 							"-->Year:" & @TAB & DllStructGetData($tInfo, "Year") & @LF & _
;~ 							"-->Month:" & @TAB & DllStructGetData($tInfo, "Month") & @LF & _
;~ 							"-->DOW:" & @TAB & DllStructGetData($tInfo, "DOW") & @LF & _
;~ 							"-->Day:" & @TAB & DllStructGetData($tInfo, "Day") & @LF & _
;~ 							"-->Hour:" & @TAB & DllStructGetData($tInfo, "Hour") & @LF & _
;~ 							"-->Minute:" & @TAB & DllStructGetData($tInfo, "Minute") & @LF & _
;~ 							"-->Second:" & @TAB & DllStructGetData($tInfo, "Second") & @LF & _
;~ 							"-->MSecond:" & @TAB & DllStructGetData($tInfo, "MSecond"))
					Return 0
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

;~ Func _DebugPrint($s_text, $line = @ScriptLineNumber)
;~ 	ConsoleWrite( _
;~ 			"!===========================================================" & @LF & _
;~ 			"+======================================================" & @LF & _
;~ 			"-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
;~ 			"+======================================================" & @LF)
;~ EndFunc   ;==>_DebugPrint
Explico un poco el rollo, auque lo he comentado bastante bien :smt001 .
Con la función _GUICtrlDTP_SetFormat, al principio le pongo un formato vacio en la caja. Esto se consigue gracias a la comilla simple. Gracias a esta función, también podemos poner un mensaje de texto en la caja. Para poder poner caracteres de formato, se debe poner delante de éste la comilla simple.
Utilizo la función GUIRegisterMsg para capturar los mensajes WM_NOTIFY del control dtpicker. Exactamente me interesa el evento que se genera al cambiar el texto del control (la fecha o la hora).
Cuando entramos en la función anterior, la primera vez cambio el formato (en mi caso a fecha corta) del control dtpicker gracias a una variable auxiliar ($aux). Lo he puesto así para que no tenga que estar cambiando el formato siempre que cambias la fecha......aunque si te pones a pensar tampoco pasa nada por eso :smt003 .
Y finalmente hago saltar un msgbox con la fecha que se pone cada vez que se cambia.
Si quisieras poner de nuevo el dtpicker en blanco, podrías hacerlo poniendo un botón que te cambiase el formato a vacío. Si haces esto tendrías que cambiar la condición del cambio de formato y en vez de poner una variable auxiliar, deberías de comprobar el contenido del control con ControlGetText o la longitud del string con stringlen (el campo vacio sería longitud 0). Pero si te pones a pensar, puede que ya no merezca nada poner la condición para evitar que cambie el formato continuamente, ya que tienes que llamar a otras funciones para generar esta condición :smt005 . Asi que casi mejor la quitas :smt002 .

He dejado comentado algo de código para realizar esto creando un control dtpicker con la función GUICtrlCreateDate en vez de con _GUICtrlDTP_Create.

Solamente le veo una pequeña pega sin importancia a este modo de hacer esto :smt002 . Que al tener un formato vacio, inicialmente no puede escribir dentro de la caja. Tiene que elegir la fecha desplegando el calendario. Yo no le veo importancia, pero algún titismiquis puede verla :smt005 .
Esto último supongo que se podría corregir dándole formato al dtpicker cuando detectase la pulsación de las teclas en el control. Pero como creo que es algo casi sin importancia y lo veo un poco rollo de implementar no lo he hecho :smt016 .

He dejado comentada la estructura y sus elementos que consiguen información del control por si la necesitais :smt002 . Para ver más sobre esto mirar en la ayuda el ejemplo de la función _GUICtrlDTP_Create.

Espero que os haya gustado :smt029 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por Ximorro »

¡Qué maravillas se pueden hacer con GuiDateTimePicker.au3!

Efectivamente yo me refería a poner un checkbox independiente pero asociado al estado del DatePicker, pero la solución de aplitec es realmente buena y también me gusta mucho. Quizás la magia no está en esas líneas que ha subrayado, creo que la cosa está más bien en el estilo $DTS_SHOWNONE, que saca el checkbox dentro del DatePicker.
El _GUICtrlDTP_SetSystemTimeEx es complementario para no poner fecha inicialmente en el control, pero el checkbox sale por el estilo, no por esa línea.

Chefito, tu solución la veo un poco complicada, pero muy últil para aprender unas cuantas cosas, por ejemplo lo de la comilla simple para poner el texto que quieras, muy interesante.

Aunque me hace una cosa rara, el msgbox sale dos veces, tengo que darle dos veces para que desaparezca, ¿cambia la fecha dos veces seguidas?
Veo que sólo ocurre al seleccionar la fecha con el calendario desplegable, si la escribo a mano sólo hay una notificación ¿?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por Chefito »

Ximorro escribió:Aunque me hace una cosa rara, el msgbox sale dos veces, tengo que darle dos veces para que desaparezca, ¿cambia la fecha dos veces seguidas?
Veo que sólo ocurre al seleccionar la fecha con el calendario desplegable, si la escribo a mano sólo hay una notificación ¿?
Sí. Cuando pulsas con el ratón en el calendario da un mensaje y entra en la condición, y cuando sueltas da otro. Se podría intentar anular por ejemplo el mensaje de suelte. No se no se, así de pronto, algo que no sea muy complicado....se me ocurre poner una condición que compare el contenido anterior de la caja con el nuevo. Si ha cambiado, ejecuta lo que sea (en este caso sería el msgbox), y si no pues no hagas nada :smt002 . Y algo más complicado sería investigar si tiene relación algún byte del mensaje que lanza el suelte. También se podría intentar anular el suelte del ratón por algún método. Pero esas cosas las veo más complicadas :smt024 .
A mí con el msgbox solo me salía una vez, no me volvía a salir otro (windows 7). Pero con un consolewrite ví que daba dos mensajes.
Si se utiliza un msgbox habría que tratar eso. Pero para el rellenado de la caja o cualquier otro rellenado no tiene mucha importancia.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
aplitec
Mensajes: 10
Registrado: 25 Jul 2010, 11:23

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por aplitec »

La solución de Chefito es buena pero tengo cerca de 10 fechas en esta ventana y me resulta complicado controlarla

La solución de checkbox dentro del DatePicker, es buena pero no puedo comprobar el checkbox.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por Ximorro »

¿No se puede comprobar al checkbox? no lo había pensado pero es raro, seguro que hay alguna propiedad oculta del control para verlo, ¿qué pasa cuando lees un control de fecha con el check desactivado? (con GUICtrlRead), si da vacío o algo especial quizás pueda verse por ahí.

Y si no pues te pasas a mi solución y pones tú los checkboxes, no quedarán integrados dentro del control pero son muy fáciles de manejar.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
aplitec
Mensajes: 10
Registrado: 25 Jul 2010, 11:23

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por aplitec »

La he encontrado : (no pongo todo el script porque es muy largo)

$fechanac = GUICtrlCreateDate("" , 129, 241, 114, 23,BitOR($DTS_SHOWNONE,$WS_TABSTOP))
$nac = GUICtrlGetHandle($fechanac)
;_GUICtrlDTP_SetFormat(GUICtrlGetHandle($fechanac), "")
;$resnac=_GUICtrlDTP_SetSystemTimeEx($nac, $tDate, False)
..
...

$Button4 = GUICtrlCreateButton("Añadir / Modificar", 200, 560, 150, 25, 0)
$Button5 = GUICtrlCreateButton("Cancelar", 400, 560, 150, 25, 0)
GUISetOnEvent($GUI_EVENT_CLOSE, "closeentry")
GUICtrlSetOnEvent($Button4, "addupdate")
GUICtrlSetOnEvent($Button5, "closeentry")
GUISetState(@SW_HIDE)
..
...
; función que da de alta el registro
Func addupdate()
_GUICtrlDTP_GetSystemTimeEx($nac)
If @error = $GDT_NONE Then ;-----------------------> Solución
$fechanac = '"" ; --------------------- > estado no check
Else
$fechanac = GUICtrlRead($fechanac) ; -----------------------> estado check
MsgBox(0, ""," n:"&$fechanac)
Global $fnac=StringSplit($fechanac, "/")
$fechanac =$fnac[3]&'-'&$fnac[2]&'-'&$fnac[1]
EndIf
MsgBox(0, ""," n:"&$fechanac)
..
...
......
endfunc

Creo que es la solución ideal y sencilla
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda: ¿Como pongo un campo fecha sin ninguna fecha?

Mensaje por Ximorro »

¡Buen trabajo!

Muy interesante, esa udf GuiDateTimePicker.au3 hace maravillas.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder