COMO FAZER ISSO SEM UM MONTE DE IF

WEBIER 12/02/2010 18:37:44
#334290
tenho o seguinte string que usarei numa SQL:
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?
DANIKULL 12/02/2010 18:57:42
#334291
WEBIER, boa tarde....

Use o Select Case, fica mais enxuto o código...

MARCELO.TREZE 12/02/2010 20:07:30
#334292
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

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

DANIKULL 12/02/2010 20:42:10
#334293
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:

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....
WEBIER 13/02/2010 01:49:46
#334309
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:
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!

ICEMAN 13/02/2010 10:26:51
#334320
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




DANIKULL 13/02/2010 11:07:02
#334325
Resposta escolhida
WEBIER, bom dia...

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.....
WEBIER 13/02/2010 11:35:00
#334329
DANIKULL...

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
DANIKULL 13/02/2010 11:44:57
#334330
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.
DANIKULL 13/02/2010 11:47:47
#334331
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.

  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
WEBIER 13/02/2010 11:52:13
#334333
apareceu a janela, titulo Teste e icone Informação.... nada mais.... nada escrito...
Página 1 de 3 [21 registro(s)]
Tópico encerrado , respostas não são mais permitidas