DUVIDA VALIDACAO/GRAVACAO

ADHEL 06/08/2013 21:06:16
#427120
Pessoal
Tenho duas classes :
1) Faz a validação dos campos que são obrigatórios(Classe que peguei aqui mesmo do colega Altair e fiz uma pequena alteração).
2) Classe que grava na tabela funcionários.
  Public Class ValidarCampos
Public Sub Validar(ByVal Page As Control)
For Each ctrl As Control In Page.Controls
If TypeOf ctrl Is TextBox Then
With CType(ctrl, TextBox)
If .Visible AndAlso .Text = String.Empty And .Tag = 1 Then
KryptonMessageBox.Show([Ô]CAMPO [Ô] & Mid(.Name.ToUpper, 4, 20) & [Ô] é OBRIGATÓRIO[Ô], empresa, MessageBoxButtons.OK, MessageBoxIcon.Information)
.Focus()
Exit Sub
End If
End With
ElseIf TypeOf ctrl Is ComboBox Then
With CType(ctrl, ComboBox)
If .Visible AndAlso .SelectedIndex < 0 And .Tag = 1 Then
KryptonMessageBox.Show([Ô]CAMPO [Ô] & Mid(.Name.ToUpper, 4, 20) & [Ô] é OBRIGATÓRIO[Ô], empresa, MessageBoxButtons.OK, MessageBoxIcon.Information)
.Focus()
Exit Sub
End If
End With
Else
If ctrl.Controls.Count > 0 Then
Validar(ctrl)
End If
End If
Next
End Sub
End Class

  Public Class Funcionario
Private _id As Integer
Private _cpf As String
...
...
...
Public Property Id() As Integer
Get
Return _id
End Get
Set(ByVal value As Integer)
_id = value
End Set
End Property

Public Property Cpf() As String
Get
Return _cpf
End Get
Set(ByVal value As String)
_cpf = value
End Set
End Property
Public Property Nome() As String
Get
Return _nome
End Get
Set(ByVal value As String)
_nome = value
End Set
End Property
...
...
...
Public Sub gravarFuncionario()
Try
ConexaoBd()
sql = [Ô]insert into funcionarios(cpf,rg,nome,endereco,bairro,cidade,cargo,telefone,celular,salario)values(@cpf,@rg,@nome,@endereco,@bairro,@cidade,@cargo,@telefone,@celular,@salario)[Ô]
Comando = New MySqlCommand(sql, Conexao)
With Comando
.Parameters.AddWithValue([Ô]@cpf[Ô], _cpf)
.Parameters.AddWithValue([Ô]@rg[Ô], _rg)
.Parameters.AddWithValue([Ô]@nome[Ô], _nome)
.Parameters.AddWithValue([Ô]@endereco[Ô], _endereco)
.Parameters.AddWithValue([Ô]@bairro[Ô], _bairro)
.Parameters.AddWithValue([Ô]@cidade[Ô], _cidade)
.Parameters.AddWithValue([Ô]@cargo[Ô], _cargo)
.Parameters.AddWithValue([Ô]@telefone[Ô], _telefone)
.Parameters.AddWithValue([Ô]@celular[Ô], _celular)
.Parameters.AddWithValue([Ô]@salario[Ô], _salario)
.ExecuteNonQuery()
End With
Catch ex As Exception
MessageBox.Show(ex.Message, empresa, MessageBoxButtons.OK, MessageBoxIcon.Information)
Finally
conClose()
End Try
End Sub
End Class

O que desejo é que quando clicar no botão de gravação ,ele chame o método de validação e se tiver tudo ok(os campos obrigatórios preenchidos) ele chame o método de gravação e tudo termina bem.
Só que não é isso que está acontecendo, quando ele encontra um campo que é obrigatório e não está preenchido ele avisa, só que faz a gravação.
Não sei como implantar do modo correto.
No botão está errado ,atualmente assim.
   Private Sub btnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravar.Click
_validar.Validar(Me)
gravar()
End Sub
NILSONTRES 06/08/2013 23:02:33
#427126
Exemplo Basico para vc entender como funciona uma function:

Function Valida() as boolean
if campo=[Ô][Ô] then
msgbox [Ô]campo obrigatorio[Ô]
return False
end if

return True
end function

DEPOIS VC CHAMA ASSIM:

IF Valida=False then exit sub [ô] AQUI O CODIGO PARA SE A FUNÇÃO RETORNAR FALSA, CASO CONTRARIO CONTINUA

segue para o trecho que grava
F001E 06/08/2013 23:13:18
#427127
Resposta escolhida
Na sua Classe Validar faz assim
mude o Sub para Function

Public Function Validar(ByVal Page As Control) As Boolean
Dim Retorno As Boolean = True
For Each ctrl As Control In Page.Controls
If TypeOf ctrl Is TextBox Then
With CType(ctrl, TextBox)
If .Visible AndAlso .Text = String.Empty And .Tag = 1 Then
KryptonMessageBox.Show([Ô]CAMPO [Ô] & Mid(.Name.ToUpper, 4, 20) & [Ô] é OBRIGATÓRIO[Ô], Empresa, MessageBoxButtons.OK, MessageBoxIcon.Information)
.Focus()
Retorno = False
Validar = Retorno
Exit Function
End If
End With
ElseIf TypeOf ctrl Is ComboBox Then
With CType(ctrl, ComboBox)
If .Visible AndAlso .SelectedIndex < 0 And .Tag = 1 Then
KryptonMessageBox.Show([Ô]CAMPO [Ô] & Mid(.Name.ToUpper, 4, 20) & [Ô] é OBRIGATÓRIO[Ô], Empresa, MessageBoxButtons.OK, MessageBoxIcon.Information)
.Focus()
Retorno = False
Validar = Retorno
Exit Function
End If
End With
Else
If ctrl.Controls.Count > 0 Then
Validar(ctrl)
End If
End If
Next
Validar = Retorno
End Function

dai para voce chamar essa Validação faça assim

If _validar.Validar(Me) = False Then
Exit Sub
End If

Gravar()

desse jeito só vai passar para a função Gravar quando a classe _validar.Validar for igual a True,. caso contrario vai parar no Exit Sub....

ADHEL 07/08/2013 09:34:58
#427146
Obrigado NILSON e F001E.
Fiz como você disse F001E.
Apenas alterei essa parte no botão gravar que ficou assim.
   Private Sub btnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravar.Click
If _validar.Validar(Me) = True Then
Exit Sub
Else
gravar()
End If
End Sub

O problema inicial realmente foi sanado.
Agora apareceu um [Ô]probleminha[Ô].
Quando é executado o método de validação ,quando é encontrado os campos obrigatórios que não estão preenchidos ele avisa do último ao primeiro.
Basicamente, no form dois TextBoxs ,sendo o primeiro Nome e o segundo Salario, se nenhum estiver preenchido a validação avisa e joga o focus primeiro no campo Salario(que é o segundo na ordem do formulário) e depois de preenchido no campo Nome.
Precisava seguir pelo menos nos TextBoxs a sequência do formulário.
até mais.

F001E 07/08/2013 09:47:16
#427151
Citação:

:
Obrigado NILSON e F001E.
Fiz como você disse F001E.
Apenas alterei essa parte no botão gravar que ficou assim.

   Private Sub btnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravar.Click
If _validar.Validar(Me) = True Then
Exit Sub
Else
gravar()
End If
End Sub

O problema inicial realmente foi sanado.
Agora apareceu um [Ô]probleminha[Ô].
Quando é executado o método de validação ,quando é encontrado os campos obrigatórios que não estão preenchidos ele avisa do último ao primeiro.
Basicamente, no form dois TextBoxs ,sendo o primeiro Nome e o segundo Salario, se nenhum estiver preenchido a validação avisa e joga o focus primeiro no campo Salario(que é o segundo na ordem do formulário) e depois de preenchido no campo Nome.
Precisava seguir pelo menos nos TextBoxs a sequência do formulário.
até mais.


Estranho..não era para acontecer isso..
Faça um teste com apenas um campo, preenche o campo Salário e deixa o campo Nome em branco e executa a validação e vê se o foco vai para o Nome e se for para o campo Salário tem alguma coisa na sua classe com problema daí aconselho você ir passo-a-passo pelo breakpoint e ver o que está acontecendo...
ADHEL 07/08/2013 10:07:44
#427154
F001E.
Me expressei mal(como sempre).
O problema único que estou enfrentando é .
Abro o formulário não preencho nenhum campo e aperto o botão gravar.
Gostaria que a mensagem que é disparada pela classe validação acusasse que o campo Nome que é o primeiro estava em branco e não o último que é o campo salário.
Campos Nome e Salario são apenas exemplos para melhor entendimento.
São cinco campos obrigatórios.
Vou chamá-los de 1,2,3,4 e 5.
Se preencho o campo 1, gostaria que a mensagem acusasse que o campo 2 não estava preenchido e depois que preenche-se o campo 2 e apertasse o botão gravar me acusasse que o campo 3 não estava preenchido assim sucessivamente.
A mensagem apresenta primeiro o campo 5 , sendo que o 2 ainda não está preenchido, se preencho o campo 5 e aperto o botão gravar ele apresenta o campo 4.
Desculpe o livro que escrevi ,para mostrar minha pequena dúvida.



F001E 07/08/2013 16:51:01
#427209
ADHEL achei problema...no seu Form ma opção Form.Designer.vb os componentes estão sendo inicializados de forma que voce colocou eles no Form. O Seu ForEach começa do botão dai vai para o Text5, Text 4 e assim por diante, por isso para o foco no Text5. O que voce vai ter que fazer ? Alterar o ordenação dos Componente o Form.Desiginer.vb assim

[ô]
[ô]Form1
[ô]
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(661, 398)
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.TextBox2)
Me.Controls.Add(Me.TextBox3)
Me.Controls.Add(Me.TextBox4)
Me.Controls.Add(Me.Button1)
Me.Name = [Ô]Form1[Ô]
Me.Text = [Ô]Form1[Ô]
Me.ResumeLayout(False)
Me.PerformLayout()

no seu Form deve estar fora de ordenação...
F001E 07/08/2013 16:55:14
#427210
Para modificar o Form.Designer.vb, clique no botão Show All Filas do Solution Explorer e altere o trecho do código como mencionei acima...
ADHEL 07/08/2013 20:29:12
#427227
F001E
Obrigado pela disposição em me ajudar.
Infelizmente não é isso que você citou.
Olhe esse exemplo em anexo por favor.
até mais.
F001E 07/08/2013 21:07:23
#427228
ADHEL é o que falei sim mas você não mudou onde eu falei...
Eu alterei seu projeto e agora esta do jeito que você quer..
Quando você abrir o projeto pressione Ctrl+F e no campo Find What digite VBMANIA e no campo Look in coloque a opção Current Project e depois clique em Find Next que vai para a parte que eu mudei para você..lá esta como era e como ficou...
ADHEL 07/08/2013 21:21:44
#427230
F001E
Muito OBRIGADO.
Foi Fantástico.
Pode até parecer pouco, mas para mim que estou tentando aprender OOP foi de uma ajuda imensa.
Valeu
Tópico encerrado , respostas não são mais permitidas