COMO FAZER ISSO SEM UM MONTE DE IF
tenho o seguinte string que usarei numa SQL:
está montado ao que ele deve fazer no caso de selecionar somente 1 check ele deve usar tal criterio...
Queria saber como eu faço no caso de selecionar mais de 1 check (2, 3 ou até mesmo os 4 checks)... vou ter q criar uma linha de IF para cada situação? ficaria enorme isso! como seria o jeito mais funcional disso? e como ficaria?
Private Sub String_Status()
If chkComecar.Value = 1 And chkExecucao.Value = 0 And chkAguardando.Value = 0 And chkTerminado.Value = 0 Then
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]À COMEÇAR[ô][Ô]
ElseIf chkComecar.Value = 0 And chkExecucao.Value = 1 And chkAguardando.Value = 0 And chkTerminado.Value = 0 Then
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]EM EXECUÇÃO[ô][Ô]
ElseIf chkComecar.Value = 0 And chkExecucao.Value = 0 And chkAguardando.Value = 1 And chkTerminado.Value = 0 Then
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]AGUARDANDO[ô][Ô]
ElseIf chkComecar.Value = 0 And chkExecucao.Value = 0 And chkAguardando.Value = 0 And chkTerminado.Value = 1 Then
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]TERMINADO[ô][Ô]
Else
TIPO_STATUS = [Ô][Ô]
End If
End Sub
está montado ao que ele deve fazer no caso de selecionar somente 1 check ele deve usar tal criterio...
Queria saber como eu faço no caso de selecionar mais de 1 check (2, 3 ou até mesmo os 4 checks)... vou ter q criar uma linha de IF para cada situação? ficaria enorme isso! como seria o jeito mais funcional disso? e como ficaria?
WEBIER, boa tarde....
Use o Select Case, fica mais enxuto o código...
Use o Select Case, fica mais enxuto o código...
Bom primeiro no código acima como a seleção é em apenas um um campo SE ENCAIXARIA melhor um Option Button
eu quando tenho de usar vairos checkboxs procuro usar o controle em matriz.
exemplo coloco um Checkebox coloco um nome ex: chkOpcoes e na propriedade Index coloco 0 (Index =0)
depois copio este controle colo quantas vezes for necessário.
ficará assim
chkOpcoes(0)
chkOpcoes(1)
chkOpcoes(2)
ai eu delcaro no general do form uma string para armazenar as opçõs como se fosse um binário
quando vc for criar as combinações em um botão basta ria fazer assim, ex:
em um botão de nome cmdSalvar
e assim eu faço
veja se te ajuda
eu quando tenho de usar vairos checkboxs procuro usar o controle em matriz.
exemplo coloco um Checkebox coloco um nome ex: chkOpcoes e na propriedade Index coloco 0 (Index =0)
depois copio este controle colo quantas vezes for necessário.
ficará assim
chkOpcoes(0)
chkOpcoes(1)
chkOpcoes(2)
ai eu delcaro no general do form uma string para armazenar as opçõs como se fosse um binário
Dim Combinacoes As String
quando vc for criar as combinações em um botão basta ria fazer assim, ex:
em um botão de nome cmdSalvar
Private Sub cmbSalvar_Click()
Combinacoes = [Ô][Ô]
For f=0 To chkOpcoes.UBound
Combinacoes = combinacoes & CStr(chkOpcao(f).Value)
Next f
[txt-color=#007100][ô] supondo que vc possua 3 CheckBox, seriam criados as seguintes combinações
[ô] [Ô]100[Ô],[Ô]010[Ô],[Ô]001[Ô],[Ô]110[Ô],[Ô]011[Ô],[Ô]101[Ô],[Ô]111[Ô],[Ô]000[Ô]
[ô] ai bastaria você usar estas combinaçõesd para fazer o que quizer[/txt-color]
Select Case Combinacoes
Case [Ô]000[Ô]
[txt-color=#007100][ô] faça X[/txt-color]
Case [Ô]100[Ô]
[txt-color=#007100][ô] faça Y
[ô] ....e assim por diante[/txt-color]
End Select
End Sub
e assim eu faço
veja se te ajuda
WEBIER,, boa noite...
Somente reforçando a ideia, você poderia fazer da seguinte forma.
Obs.: Eu entendo que estas opções são fixas, então:
Em um módulo, você declararia a variável TIPO_STATUS como pública e craria um Array, ficando mais ou menos da seguinte forma:
No módulo:
e para chamar é só você fazer assim:
Veja aà se te ajuda....
Somente reforçando a ideia, você poderia fazer da seguinte forma.
Obs.: Eu entendo que estas opções são fixas, então:
Em um módulo, você declararia a variável TIPO_STATUS como pública e craria um Array, ficando mais ou menos da seguinte forma:
No módulo:
Option Explicit
Public TIPO_STATUS As String
Public Condicao(1 To 4) As Variant
Public Sub Monta_Condicao(chkComecar As OptionButton, _
chkExecucao As OptionButton, _
chkAguardando As OptionButton, _
chkTerminado As OptionButton)
Dim mArray As Variant
[ô]True = 1
[ô]False =0
Condicao(1) = chkComecar
Condicao(2) = chkExecucao
Condicao(3) = chkAguardando
Condicao(4) = chkTerminado
mArray = Join(Condicao, [Ô], [Ô])
Select Case mArray
Case [Ô]True, False, False, False[Ô]
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]À COMEÇAR[ô][Ô]
Case [Ô]False, True, False, False[Ô]
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]EM EXECUÇÃO[ô][Ô]
Case [Ô]False, False, True, False[Ô]
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]AGUARDANDO[ô][Ô]
Case [Ô]False, False, False, True[Ô]
TIPO_STATUS = [Ô]AND OS.STATUS = [ô]TERMINADO[ô][Ô]
Case Else
TIPO_STATUS = [Ô]vazio[Ô] [ô]coloquei só para teste
End Select
End Sub
e para chamar é só você fazer assim:
Call Monta_Condicao(chkComecar, chkExecucao, chkAguardando, chkTerminado)
Veja aà se te ajuda....
esse objetos sao do tipo checkbox
Preciso de Checkbox pois poderei marcar 1, 2 ou quantos eu quizer
ai baseado no que o DANIKULL falou fiz a seguinte modificação:
mas mesmo assim nao deu!
Não sei se expliquei direito...
Usando Checkbox e marcando somente um checkbox por vez.... fiz aquele código que citei logo no inicio e tah funcionando perfeitamente....
o que queria era somente uma forma de nao ter q usar tanto IF para cada condição
exemplo:
[txt-color=#e80000]if [/txt-color]check1=1 and check2=0 and check3=0 and check4=0
[txt-color=#e80000]if [/txt-color]check1=0 and check2=1 and check3=0 and check4=0
[txt-color=#e80000]if [/txt-color]check1=0 and check2=0 and check3=1 and check4=0
[txt-color=#e80000]if [/txt-color]check1=0 and check2=0 and check3=0 and check4=1
[txt-color=#e80000]if [/txt-color]check1=1 and check2=1 and check3=0 and check4=0
[txt-color=#e80000]if [/txt-color]check1=1 and check2=1 and check3=1 and check4=0
[txt-color=#e80000]if [/txt-color]check1=1 and check2=1 and check3=1 and check4=1
[txt-color=#e80000]if [/txt-color]check1=0 and check2=1 and check3=1 and check4=1
[txt-color=#e80000]if [/txt-color]check1=0 and check2=0 and check3=1 and check4=1
e assim vai.....
quero uma forma inteligente dele verificar qual checkbox foi marcado e usar o criterio (OS.STATUS = [ô]?????[ô]) certo, se eu marcar 2 checkbox... ele vai usar os 2 criterios (OS.STATUS = [ô]?????[ô] and OS.STATUS = [ô]?????[ô]) e assim sucessivamente!
Preciso de Checkbox pois poderei marcar 1, 2 ou quantos eu quizer
ai baseado no que o DANIKULL falou fiz a seguinte modificação:
Public Sub Monta_Condicao(chkComecar As CheckBox, _
chkExecucao As CheckBox, _
chkAguardando As CheckBox, _
chkTerminado As CheckBox)
Dim mArray As Variant
[ô]True = 1
[ô]False =0
Condicao(1) = chkComecar
Condicao(2) = chkExecucao
Condicao(3) = chkAguardando
Condicao(4) = chkTerminado
mArray = Join(Condicao, [Ô], [Ô])
Select Case mArray
Case [Ô]1, 0, 0, 0[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]À COMEÇAR[ô][Ô]
Case [Ô]0, 1, 0, 0[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]EM EXECUÇÃO[ô][Ô]
Case [Ô]0, 0, 1, 0[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]AGUARDANDO[ô][Ô]
Case [Ô]0, 0, 0, 1[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]TERMINADO[ô][Ô]
End Select
End Sub
mas mesmo assim nao deu!
Não sei se expliquei direito...
Usando Checkbox e marcando somente um checkbox por vez.... fiz aquele código que citei logo no inicio e tah funcionando perfeitamente....
o que queria era somente uma forma de nao ter q usar tanto IF para cada condição
exemplo:
[txt-color=#e80000]if [/txt-color]check1=1 and check2=0 and check3=0 and check4=0
[txt-color=#e80000]if [/txt-color]check1=0 and check2=1 and check3=0 and check4=0
[txt-color=#e80000]if [/txt-color]check1=0 and check2=0 and check3=1 and check4=0
[txt-color=#e80000]if [/txt-color]check1=0 and check2=0 and check3=0 and check4=1
[txt-color=#e80000]if [/txt-color]check1=1 and check2=1 and check3=0 and check4=0
[txt-color=#e80000]if [/txt-color]check1=1 and check2=1 and check3=1 and check4=0
[txt-color=#e80000]if [/txt-color]check1=1 and check2=1 and check3=1 and check4=1
[txt-color=#e80000]if [/txt-color]check1=0 and check2=1 and check3=1 and check4=1
[txt-color=#e80000]if [/txt-color]check1=0 and check2=0 and check3=1 and check4=1
e assim vai.....
quero uma forma inteligente dele verificar qual checkbox foi marcado e usar o criterio (OS.STATUS = [ô]?????[ô]) certo, se eu marcar 2 checkbox... ele vai usar os 2 criterios (OS.STATUS = [ô]?????[ô] and OS.STATUS = [ô]?????[ô]) e assim sucessivamente!
Public Sub Monta_Condicao(chkComecar As CheckBox, _
chkExecucao As CheckBox, _
chkAguardando As CheckBox, _
chkTerminado As CheckBox)
Dim mArray As String
[ô]True = 1
[ô]False =0
Condicao(1) = chkComecar.value
Condicao(2) = chkExecucao.value
Condicao(3) = chkAguardando.value
Condicao(4) = chkTerminado.value
mArray = Join(Condicao, [Ô], [Ô])
Select Case mArray
Case [Ô]vbchecked, vbunchecked, vbunchecked, vbunchecked[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]À COMEÇAR[ô][Ô]
Case [Ô]vbunchecked, vbchecked, vbunchecked, vbunchecked[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]EM EXECUÇÃO[ô][Ô]
Case [Ô]vbunchecked, vbunchecked, vbchecked, vbunchecked[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]AGUARDANDO[ô][Ô]
Case [Ô]vbunchecked, vbunchecked, vbunchecked, vbchecked[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]TERMINADO[ô][Ô]
End Select
End Sub
ou vc pode setar os numeros mesmo
Public Sub Monta_Condicao(chkComecar As CheckBox, _
chkExecucao As CheckBox, _
chkAguardando As CheckBox, _
chkTerminado As CheckBox)
Dim mArray As String
[ô]True = 1
[ô]False =0
Condicao(1) = chkComecar.value
Condicao(2) = chkExecucao.value
Condicao(3) = chkAguardando.value
Condicao(4) = chkTerminado.value
mArray = Join(Condicao, [Ô], [Ô])
Select Case mArray
Case [Ô]1, 0, 0, 0[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]À COMEÇAR[ô][Ô]
Case [Ô]0, 1, 0, 0[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]EM EXECUÇÃO[ô][Ô]
Case [Ô]0, 0, 1, 0[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]AGUARDANDO[ô][Ô]
Case [Ô]0, 0, 0, 1[Ô]
TIPO_STATUS = [Ô]AND var_STATUS = [ô]TERMINADO[ô][Ô]
End Select
End Sub
Citação:só que vc tem q setar que vc quer o value pq se vc poe só: Condicao(1) = chkComecar / Condicao(2) = chkExecucao / Condicao(3) = chkAguardando / Condicao(4) = chkTerminado ele pega oque ele quizer pode ser o caption e não o value, eu usava muito por exemplo text1=[Ô]Webier[Ô]
só que eu vi que se eu fizer assim não está errado mais em alguns casos ele pega as informações que eu nao quero, no seu caos ele esta pegando o caption, faz um teste pra ver
msgbox [Ô]Valor pego: [Ô] & chkExecucao & vbcrlf & vbcrlf & [Ô] Valor que eu quero: [Ô] & chkExecucao.value
depois posta ai o retorno
WEBIER, bom dia...
Fiz a modificação no exemplo te passado, segue:
No módulo:
Para chamar a função é do mesmo jeito:
Veja se é isto quer você quer.....
Fiz a modificação no exemplo te passado, segue:
No módulo:
Option Explicit
Public TIPO_STATUS As String
Public Condicao(1 To 4) As Variant
Private I As Integer
Public Sub Monta_Condicao(chkComecar As CheckBox, _
chkExecucao As CheckBox, _
chkAguardando As CheckBox, _
chkTerminado As CheckBox)
[ô]True = 1
[ô]False = 0
Condicao(1) = chkComecar
Condicao(2) = chkExecucao
Condicao(3) = chkAguardando
Condicao(4) = chkTerminado
[ô]Limpando a variável sempre que iniciar
TIPO_STATUS = [Ô][Ô]
For I = 1 To 4
Select Case I
Case 1
If Condicao(1) = 1 Then TIPO_STATUS = TIPO_STATUS & [Ô] AND OS.STATUS = [ô]À COMEÇAR[ô][Ô]
Case 2
If Condicao(2) = 1 Then TIPO_STATUS = TIPO_STATUS & [Ô] AND OS.STATUS = [ô]EM EXECUÇÃO[ô][Ô]
Case 3
If Condicao(3) = 1 Then TIPO_STATUS = TIPO_STATUS & [Ô] AND OS.STATUS = [ô]AGUARDANDO[ô][Ô]
Case 4
If Condicao(4) = 1 Then TIPO_STATUS = TIPO_STATUS & [Ô] AND OS.STATUS = [ô]TERMINADO[ô][Ô]
End Select
Next I
End Sub
Para chamar a função é do mesmo jeito:
Call Monta_Condicao(chkComecar, chkExecucao, chkAguardando, chkTerminado)
Veja se é isto quer você quer.....
DANIKULL...
no modulo coloquei o q vc falou...
chamei a função no meu form assim:
qualquer checkbox que eu marque... ele me mostra todos cadastrados sem o criterio... ai coloquei para parar o codigo após preencher o grid e quando posicionei a seta do mouse sobre [Ô] & TIPO_STATUS & [Ô] ele me mostra TIPO_STATUS = [Ô][Ô].... em qq check q seleciona ele me dar o mesmo resultado
no modulo coloquei o q vc falou...
chamei a função no meu form assim:
Call Monta_Condicao(chkComecar, chkExecucao, chkAguardando, chkTerminado)
Call ABRIR_BD_SEM_DATA1
SQL = [Ô]SELECT CLIENTE.NOME AS var_NOME, CLIENTE.*, OS.STATUS AS var_STATUS, OS.* FROM CLIENTE INNER JOIN OS ON CLIENTE.CODIGO = OS.COD_CLIENTE WHERE COD_OS > 0 [Ô] & TIPO_STATUS & [Ô] ORDER BY DATA_ENTRADA, HORA_ENTRADA, OS.STATUS[Ô]
Set Rs = BD.OpenRecordset(SQL)
FormatarGrid
qualquer checkbox que eu marque... ele me mostra todos cadastrados sem o criterio... ai coloquei para parar o codigo após preencher o grid e quando posicionei a seta do mouse sobre [Ô] & TIPO_STATUS & [Ô] ele me mostra TIPO_STATUS = [Ô][Ô].... em qq check q seleciona ele me dar o mesmo resultado
WEBIER,
Faz um teste ai. Da um break point n linha do SQL e paasa o mouse sobre a variável TIPO_STATUS e veja o que ela vai retonar.
Se não for um resultado satisfatório, se fo nulo, cheque se ela nao está sendo apagada em algum lugar....
No aguardo.
Faz um teste ai. Da um break point n linha do SQL e paasa o mouse sobre a variável TIPO_STATUS e veja o que ela vai retonar.
Se não for um resultado satisfatório, se fo nulo, cheque se ela nao está sendo apagada em algum lugar....
No aguardo.
WEBIER,
Só para voce testar se está ok, faça a seguinte alteração na sua programação assim, depois é so comentar as linhas que vou incluir.
Só para voce testar se está ok, faça a seguinte alteração na sua programação assim, depois é so comentar as linhas que vou incluir.
Call Monta_Condicao(chkComecar, chkExecucao, chkAguardando, chkTerminado)
MsgBox TIPO_STATUS, vbInformation, [Ô]Teste[Ô]
Exit Sub
Call ABRIR_BD_SEM_DATA1
SQL = [Ô]SELECT CLIENTE.NOME AS var_NOME, CLIENTE.*, OS.STATUS AS var_STATUS, OS.* FROM CLIENTE INNER JOIN OS ON CLIENTE.CODIGO = OS.COD_CLIENTE WHERE COD_OS > 0 [Ô] & TIPO_STATUS & [Ô] ORDER BY DATA_ENTRADA, HORA_ENTRADA, OS.STATUS[Ô]
Set Rs = BD.OpenRecordset(SQL)
FormatarGrid
apareceu a janela, titulo Teste e icone Informação.... nada mais.... nada escrito...
Tópico encerrado , respostas não são mais permitidas