SlideShare una empresa de Scribd logo
1 de 6
Descargar para leer sin conexión
Ing. Vicente Guzmán
Validations for an Entry [Xamarin.Forms]
Introducción
En este artículo veremos algunos de los diferentes tipos de validaciones que puede llevar un Entry, esto
normalmente para los formularios que existen en los registros de cualquier aplicación.
Comencemos
Para este ejemplo debemos de contar ya con nuestra aplicación en Xamarin.Forms, en dado caso que
no, realicemos lo siguiente:
Abramos Visual Studio y seleccionemos un Nuevo Proyecto.
Después, elijamos la aplicación multiplataforma (Cross-Platform), asignemos un nombre al proyecto y
establezcamos la ruta del proyecto. Luego, hagamos clic en OK.
Ing. Vicente Guzmán
Ahora seleccionemos la plantilla: Aplicación en Blanco (Blank App) y la estrategia del código compartido
será: .NET Standard
Una vez creada la solución, procedamos a editar la página MainPage.xaml en donde agregaremos un
mini formulario tipo de registro, al cual le brindaremos las distintas validaciones.
XAML
<StackLayout Margin="0,50">
<StackLayout>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="45*" />
<ColumnDefinition Width="45*" />
</Grid.ColumnDefinitions>
<Entry x:Name="UserName" Grid.Row="0" Grid.Column="0"
Placeholder="Nombre" />
<Entry x:Name="UserLastName" Grid.Row="0" Grid.Column="1"
Placeholder="Apellido" />
</Grid>
</StackLayout>
<StackLayout>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
Ing. Vicente Guzmán
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Entry x:Name="UserEmail" Grid.Row="0" Grid.Column="0"
Placeholder="Email" />
<Entry x:Name="UserCelular" Grid.Row="1" Grid.Column="0"
Placeholder="Teléfono" />
</Grid>
</StackLayout>
<Button x:Name="ClienteBtF" Text="Continuar"
BorderRadius="10"
BorderWidth="1"
BorderColor="Black"
TextColor="White"
Margin="30,0,30,0"/>
</StackLayout>
En el code behind, agreguemos el siguiente método, que se encargara de toda la lógica con respecto a
las distintas validaciones:
C#
private async Task<bool> validarFormulario()
{
//Valida si el valor en el Entry se encuentra vacio o es igual a Null
if (String.IsNullOrWhiteSpace(UserName.Text))
{
await this.DisplayAlert("Advertencia", "El campo del nombre es
obligatorio.", "OK");
return false;
}
//Valida que solo se ingresen letras
else if (!UserName.Text.ToCharArray().All(Char.IsLetter))
{
await this.DisplayAlert("Advertencia", "Tu información contiene números,
favor de validar.", "OK");
return false;
}
else
{
//Valida si se ingresan caracteres especiales
string caractEspecial = @"^[^ ][a-zA-Z ]+[^ ]$";
bool resultado = Regex.IsMatch(UserName.Text, caractEspecial,
RegexOptions.IgnoreCase);
if (!resultado)
{
await this.DisplayAlert("Advertencia", "No se aceptan caracteres
especiales, intente de nuevo.", "OK");
return false;
}
}
if (String.IsNullOrWhiteSpace(UserLastName.Text))
Ing. Vicente Guzmán
{
await this.DisplayAlert("Advertencia", "El campo del apellido es
obligatorio.", "OK");
return false;
}
//Valida que solo se ingresen letras
else if (!UserLastName.Text.ToCharArray().All(Char.IsLetter))
{
await this.DisplayAlert("Advertencia", "Tu información contiene números,
favor de validar.", "OK");
return false;
}
else
{
//Valida si se ingresan caracteres especiales
string caractEspecial = @"^[^ ][a-zA-Z ]+[^ ]$";
bool resultado = Regex.IsMatch(UserLastName.Text, caractEspecial,
RegexOptions.IgnoreCase);
if (!resultado)
{
await this.DisplayAlert("Advertencia", "No se aceptan caracteres
especiales, intente de nuevo.", "OK");
return false;
}
}
if (String.IsNullOrWhiteSpace(UserEmail.Text))
{
await this.DisplayAlert("Advertencia", "El campo del correo electronico
es obligatorio.", "OK");
return false;
}
else
{
//Valida que el formato del correo sea valido
bool isEmail = Regex.IsMatch(UserEmail.Text, @"A(?:[a-z0-
9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-
9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)Z", RegexOptions.IgnoreCase);
if (!isEmail)
{
await this.DisplayAlert("Advertencia", "El formato del correo
electrónico es incorrecto, revíselo e intente de nuevo.", "OK");
return false;
}
}
if (String.IsNullOrWhiteSpace(UserCelular.Text))
{
await this.DisplayAlert("Advertencia", "El campo del número celular es
obligatorio.", "OK");
return false;
}
//Valida si la cantidad de digitos ingresados es menor a 10
else if (UserCelular.Text.Length != 10)
{
await this.DisplayAlert("Advertencia", "Faltan digitos, favor de
ingresar su numero a 10 digitos.", "OK");
return false;
Ing. Vicente Guzmán
}
else
{
//Valida que solo se ingresen numeros
if(!UserCelular.Text.ToCharArray().All(Char.IsDigit))
{
await this.DisplayAlert("Advertencia", "El formato del celular es
incorrecto, solo se aceptan numeros.", "OK");
return false;
}
}
return true;
}
Para que esto funcione correctamente, ahora agregaremos el evento Clicked a nuestro Button, el cual
quedaría de la siguiente manera en el XAML:
Antes
Después
Ya para finalizar solo deberemos de mandar llamar al método de validarFormulario, en donde si todo se
ingresa de la manera correcta nos mostrara un mensaje que expresara que todos los campos cumplen
con el formato requerido.
C#
async void Continue_Tapped(object sender, EventArgs e)
{
if (await validarFormulario())
{
await DisplayAlert("Exito","Todos tus campos cumplieron las
validaciones.","OK");
}
}
Ing. Vicente Guzmán
Ejecutemos la aplicación para corroborar que todo funcione.
Resultado
Descarga el código completo desde mi GitHub.
¡Hasta la próxima!

Más contenido relacionado

La actualidad más candente

Using Java to implement SOAP Web Services: JAX-WS
Using Java to implement SOAP Web Services: JAX-WS�Using Java to implement SOAP Web Services: JAX-WS�
Using Java to implement SOAP Web Services: JAX-WSKatrien Verbert
 
Modelo vista controlador
Modelo vista controladorModelo vista controlador
Modelo vista controladorEmilio Sarabia
 
Unit Testing Using Mockito in Android (1).pdf
Unit Testing Using Mockito in Android (1).pdfUnit Testing Using Mockito in Android (1).pdf
Unit Testing Using Mockito in Android (1).pdfKaty Slemon
 
Locators in selenium - BNT 09
Locators in selenium - BNT 09Locators in selenium - BNT 09
Locators in selenium - BNT 09weekendtesting
 
Spring uygulamaların exception handling yönetimi
Spring uygulamaların exception handling yönetimiSpring uygulamaların exception handling yönetimi
Spring uygulamaların exception handling yönetimiSistek Yazılım
 
Html 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la WebHtml 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la Webjcremiro
 
Angular 4 The new Http Client Module
Angular 4 The new Http Client ModuleAngular 4 The new Http Client Module
Angular 4 The new Http Client Modulearjun singh
 

La actualidad más candente (8)

Using Java to implement SOAP Web Services: JAX-WS
Using Java to implement SOAP Web Services: JAX-WS�Using Java to implement SOAP Web Services: JAX-WS�
Using Java to implement SOAP Web Services: JAX-WS
 
Modelo vista controlador
Modelo vista controladorModelo vista controlador
Modelo vista controlador
 
Unit Testing Using Mockito in Android (1).pdf
Unit Testing Using Mockito in Android (1).pdfUnit Testing Using Mockito in Android (1).pdf
Unit Testing Using Mockito in Android (1).pdf
 
Locators in selenium - BNT 09
Locators in selenium - BNT 09Locators in selenium - BNT 09
Locators in selenium - BNT 09
 
Spring uygulamaların exception handling yönetimi
Spring uygulamaların exception handling yönetimiSpring uygulamaların exception handling yönetimi
Spring uygulamaların exception handling yönetimi
 
Javascript
JavascriptJavascript
Javascript
 
Html 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la WebHtml 5. Estructura de un documento para la Web
Html 5. Estructura de un documento para la Web
 
Angular 4 The new Http Client Module
Angular 4 The new Http Client ModuleAngular 4 The new Http Client Module
Angular 4 The new Http Client Module
 

Similar a Validations for an entry [Xamarin.Forms]

Taller gxtest
Taller gxtestTaller gxtest
Taller gxtestGeneXus
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticasjaespinmora
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collectionsflekoso
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxHacheLOrtega
 
Taller de gxtest
Taller de gxtestTaller de gxtest
Taller de gxtestGeneXus
 
Java script
Java script Java script
Java script Pidusa
 
Introducción de Datos java web internet x
Introducción de Datos java web internet xIntroducción de Datos java web internet x
Introducción de Datos java web internet xLuisAlbertoRaveloLob
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUGJordi Gerona
 
Resumen Java Script
Resumen Java ScriptResumen Java Script
Resumen Java Scriptjlgomezri
 
Mejoras en T-SQL para SQL Server 2005
Mejoras en T-SQL para SQL Server 2005Mejoras en T-SQL para SQL Server 2005
Mejoras en T-SQL para SQL Server 2005pabloesp
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - TrovitJordi Gerona
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESAnaid03
 

Similar a Validations for an entry [Xamarin.Forms] (20)

06 validación
06 validación06 validación
06 validación
 
Taller gxtest
Taller gxtestTaller gxtest
Taller gxtest
 
Mod2ud2 1
Mod2ud2 1Mod2ud2 1
Mod2ud2 1
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas
 
Clase09 java script
Clase09 java scriptClase09 java script
Clase09 java script
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collections
 
Guía Practica de JavaScript
Guía Practica de JavaScriptGuía Practica de JavaScript
Guía Practica de JavaScript
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
 
Taller de gxtest
Taller de gxtestTaller de gxtest
Taller de gxtest
 
Java script
Java script Java script
Java script
 
ASP.NET MVC - validacion de datos
ASP.NET MVC - validacion de datosASP.NET MVC - validacion de datos
ASP.NET MVC - validacion de datos
 
Introducción de Datos java web internet x
Introducción de Datos java web internet xIntroducción de Datos java web internet x
Introducción de Datos java web internet x
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
 
Codigo
CodigoCodigo
Codigo
 
Resumen Java Script
Resumen Java ScriptResumen Java Script
Resumen Java Script
 
Mejoras en T-SQL para SQL Server 2005
Mejoras en T-SQL para SQL Server 2005Mejoras en T-SQL para SQL Server 2005
Mejoras en T-SQL para SQL Server 2005
 
Presentación JavaScript
Presentación JavaScriptPresentación JavaScript
Presentación JavaScript
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
 
Java básico
Java  básicoJava  básico
Java básico
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETES
 

Más de Vicente Gerardo Guzman Lucio

Bienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.FormsBienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.FormsVicente Gerardo Guzman Lucio
 
Consumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en AlexaConsumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en AlexaVicente Gerardo Guzman Lucio
 

Más de Vicente Gerardo Guzman Lucio (20)

GPPB2024 - Integrando ChatGPT en Power Automate
GPPB2024 - Integrando ChatGPT en Power AutomateGPPB2024 - Integrando ChatGPT en Power Automate
GPPB2024 - Integrando ChatGPT en Power Automate
 
Introducción a Amazon Alexa.pptx
Introducción a Amazon Alexa.pptxIntroducción a Amazon Alexa.pptx
Introducción a Amazon Alexa.pptx
 
Creando un Chatbot en C# con ChatGPT.pdf
Creando un Chatbot en C# con ChatGPT.pdfCreando un Chatbot en C# con ChatGPT.pdf
Creando un Chatbot en C# con ChatGPT.pdf
 
ChatGPT & Alexa.pptx
ChatGPT & Alexa.pptxChatGPT & Alexa.pptx
ChatGPT & Alexa.pptx
 
Bienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.FormsBienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.Forms
 
Conectando un Azure Bot con una Alexa Skill
Conectando un Azure Bot con una Alexa SkillConectando un Azure Bot con una Alexa Skill
Conectando un Azure Bot con una Alexa Skill
 
Azure DevOps y Blazor Web Assembly
Azure DevOps y Blazor Web AssemblyAzure DevOps y Blazor Web Assembly
Azure DevOps y Blazor Web Assembly
 
Desarrollo de Interfaces de Voz: Alexa Skills
Desarrollo de Interfaces de Voz: Alexa SkillsDesarrollo de Interfaces de Voz: Alexa Skills
Desarrollo de Interfaces de Voz: Alexa Skills
 
Blazor vs VUE
Blazor vs VUEBlazor vs VUE
Blazor vs VUE
 
Introducción a Blazor
Introducción a BlazorIntroducción a Blazor
Introducción a Blazor
 
Infraestructura como Código en Azure
Infraestructura como Código en AzureInfraestructura como Código en Azure
Infraestructura como Código en Azure
 
Diseño de Experiencias de Voz con Amazon Alexa
Diseño de Experiencias de Voz con Amazon AlexaDiseño de Experiencias de Voz con Amazon Alexa
Diseño de Experiencias de Voz con Amazon Alexa
 
Alexa Skill con .NETCore & AWS Lambda
Alexa Skill con .NETCore & AWS LambdaAlexa Skill con .NETCore & AWS Lambda
Alexa Skill con .NETCore & AWS Lambda
 
Skills Nights - Vol.III - Primeros Pasos
Skills Nights - Vol.III - Primeros PasosSkills Nights - Vol.III - Primeros Pasos
Skills Nights - Vol.III - Primeros Pasos
 
¿Qué es la Nube?
¿Qué es la Nube?¿Qué es la Nube?
¿Qué es la Nube?
 
Consumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en AlexaConsumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en Alexa
 
La era de los Chatbots
La era de los ChatbotsLa era de los Chatbots
La era de los Chatbots
 
Android 64x con Xamarin.Forms
Android 64x con Xamarin.FormsAndroid 64x con Xamarin.Forms
Android 64x con Xamarin.Forms
 
Creando nuestra propia Skill de YouTube
Creando nuestra propia Skill de YouTubeCreando nuestra propia Skill de YouTube
Creando nuestra propia Skill de YouTube
 
Alexa Skill en 5 pasos
Alexa Skill en 5 pasosAlexa Skill en 5 pasos
Alexa Skill en 5 pasos
 

Validations for an entry [Xamarin.Forms]

  • 1. Ing. Vicente Guzmán Validations for an Entry [Xamarin.Forms] Introducción En este artículo veremos algunos de los diferentes tipos de validaciones que puede llevar un Entry, esto normalmente para los formularios que existen en los registros de cualquier aplicación. Comencemos Para este ejemplo debemos de contar ya con nuestra aplicación en Xamarin.Forms, en dado caso que no, realicemos lo siguiente: Abramos Visual Studio y seleccionemos un Nuevo Proyecto. Después, elijamos la aplicación multiplataforma (Cross-Platform), asignemos un nombre al proyecto y establezcamos la ruta del proyecto. Luego, hagamos clic en OK.
  • 2. Ing. Vicente Guzmán Ahora seleccionemos la plantilla: Aplicación en Blanco (Blank App) y la estrategia del código compartido será: .NET Standard Una vez creada la solución, procedamos a editar la página MainPage.xaml en donde agregaremos un mini formulario tipo de registro, al cual le brindaremos las distintas validaciones. XAML <StackLayout Margin="0,50"> <StackLayout> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="45*" /> <ColumnDefinition Width="45*" /> </Grid.ColumnDefinitions> <Entry x:Name="UserName" Grid.Row="0" Grid.Column="0" Placeholder="Nombre" /> <Entry x:Name="UserLastName" Grid.Row="0" Grid.Column="1" Placeholder="Apellido" /> </Grid> </StackLayout> <StackLayout> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions>
  • 3. Ing. Vicente Guzmán <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Entry x:Name="UserEmail" Grid.Row="0" Grid.Column="0" Placeholder="Email" /> <Entry x:Name="UserCelular" Grid.Row="1" Grid.Column="0" Placeholder="Teléfono" /> </Grid> </StackLayout> <Button x:Name="ClienteBtF" Text="Continuar" BorderRadius="10" BorderWidth="1" BorderColor="Black" TextColor="White" Margin="30,0,30,0"/> </StackLayout> En el code behind, agreguemos el siguiente método, que se encargara de toda la lógica con respecto a las distintas validaciones: C# private async Task<bool> validarFormulario() { //Valida si el valor en el Entry se encuentra vacio o es igual a Null if (String.IsNullOrWhiteSpace(UserName.Text)) { await this.DisplayAlert("Advertencia", "El campo del nombre es obligatorio.", "OK"); return false; } //Valida que solo se ingresen letras else if (!UserName.Text.ToCharArray().All(Char.IsLetter)) { await this.DisplayAlert("Advertencia", "Tu información contiene números, favor de validar.", "OK"); return false; } else { //Valida si se ingresan caracteres especiales string caractEspecial = @"^[^ ][a-zA-Z ]+[^ ]$"; bool resultado = Regex.IsMatch(UserName.Text, caractEspecial, RegexOptions.IgnoreCase); if (!resultado) { await this.DisplayAlert("Advertencia", "No se aceptan caracteres especiales, intente de nuevo.", "OK"); return false; } } if (String.IsNullOrWhiteSpace(UserLastName.Text))
  • 4. Ing. Vicente Guzmán { await this.DisplayAlert("Advertencia", "El campo del apellido es obligatorio.", "OK"); return false; } //Valida que solo se ingresen letras else if (!UserLastName.Text.ToCharArray().All(Char.IsLetter)) { await this.DisplayAlert("Advertencia", "Tu información contiene números, favor de validar.", "OK"); return false; } else { //Valida si se ingresan caracteres especiales string caractEspecial = @"^[^ ][a-zA-Z ]+[^ ]$"; bool resultado = Regex.IsMatch(UserLastName.Text, caractEspecial, RegexOptions.IgnoreCase); if (!resultado) { await this.DisplayAlert("Advertencia", "No se aceptan caracteres especiales, intente de nuevo.", "OK"); return false; } } if (String.IsNullOrWhiteSpace(UserEmail.Text)) { await this.DisplayAlert("Advertencia", "El campo del correo electronico es obligatorio.", "OK"); return false; } else { //Valida que el formato del correo sea valido bool isEmail = Regex.IsMatch(UserEmail.Text, @"A(?:[a-z0- 9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0- 9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)Z", RegexOptions.IgnoreCase); if (!isEmail) { await this.DisplayAlert("Advertencia", "El formato del correo electrónico es incorrecto, revíselo e intente de nuevo.", "OK"); return false; } } if (String.IsNullOrWhiteSpace(UserCelular.Text)) { await this.DisplayAlert("Advertencia", "El campo del número celular es obligatorio.", "OK"); return false; } //Valida si la cantidad de digitos ingresados es menor a 10 else if (UserCelular.Text.Length != 10) { await this.DisplayAlert("Advertencia", "Faltan digitos, favor de ingresar su numero a 10 digitos.", "OK"); return false;
  • 5. Ing. Vicente Guzmán } else { //Valida que solo se ingresen numeros if(!UserCelular.Text.ToCharArray().All(Char.IsDigit)) { await this.DisplayAlert("Advertencia", "El formato del celular es incorrecto, solo se aceptan numeros.", "OK"); return false; } } return true; } Para que esto funcione correctamente, ahora agregaremos el evento Clicked a nuestro Button, el cual quedaría de la siguiente manera en el XAML: Antes Después Ya para finalizar solo deberemos de mandar llamar al método de validarFormulario, en donde si todo se ingresa de la manera correcta nos mostrara un mensaje que expresara que todos los campos cumplen con el formato requerido. C# async void Continue_Tapped(object sender, EventArgs e) { if (await validarFormulario()) { await DisplayAlert("Exito","Todos tus campos cumplieron las validaciones.","OK"); } }
  • 6. Ing. Vicente Guzmán Ejecutemos la aplicación para corroborar que todo funcione. Resultado Descarga el código completo desde mi GitHub. ¡Hasta la próxima!