AJUDA COM REFATORAO

 Tópico anterior Próximo tópico Novo tópico

AJUDA COM REFATORAO

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#444146 - 30/01/2015 16:57:49

SINCLAIR
CRICIUMA
Cadast. em:Janeiro/2001


Prezados,

H um tpico sobre refatorao que me chamou ateno e pensei em aplicar em um pequeno bloco de meus cdigos.

Em uma tela tenho 3 caixas de verificao sendo

[ ] Exibe Status FATURADO
[ ] Exibe Status AGUARDANDO
[ ] Exibe Demais Status

a tabela TabItens tem o campo Status Varchar(1) que funciona como flag, sendo []F[] para Faturado, []A[] para Aguardando, []B[] para desistncia do item, []C[] para Em Transporte e alguns outros status possveis.

Se marcar []Exibe Faturado[] e Exibe Aguardando, por exemplo, poderia ser

Where Status in ([]F[],[]A[]) por exemplo.

A opo []Exibe Demais Status[] faz com que sejam listados os status []C[], []D[], []H[], etc. Claro, dever desconsiderar o []F[] e o []A[] se no forem marcados. Ou considerar ambos/um deles, conforme o usurio selecione.

Tenho j um Cdigo em VB6 que cria uma string na varivel strComandoSQL e monta o sql conforme as opes selecionadas. Mas est feio o cdigo. E complexo.

Algum colega ajuda a criar um cdigo []limpo[] e eficiente para o caso?


Euzbio Cruz
Cricima - SC


#444149 - 30/01/2015 18:17:01

FFCOUTO
COM LEVY GASPARIAN
Cadast. em:Março/2005


Posta o cdigo para a gente analisar. Ficar bem mais fcil indicar o que est errado (se estiver errado) e o que de ser feito (se precisar ser feito).

Cursos de Excel e VB6:
cursoexcelvba.com.br


#444150 - 30/01/2015 18:22:47

SINCLAIR
CRICIUMA
Cadast. em:Janeiro/2001


Última edição em 30/01/2015 18:27:21 por ZEUZEBIO3

Ol, FFCOUTO

Segue o cdigo, conforme pediu.

Usei de outra situao no sistema antigo em VB6, mas o caso exatamente o mesmo. Tem os campos para exibir ou no proprietrio de uma torre, exibir ou no o fornecedor de energia de uma torre, exibir ou no ou demais clientes que tenham vinculo com a torre (excetuando proprietrio e fornecedor de energia) e se deve ou no exibir contas que j estejam quitadas (contas ainda no quitadas tm o campo dtquitacao = []01/01/1900[])

vw_ficontas uma View que junta dados da tabela ficontas (contas a receber/pagar) com dados de zxcadgrl (cadastros de clientes e fornecedores) e de pvtorres (cadastro de torres).

em vw_ficontas que fao o select.

        []------------------------------------------------------------------------------------------------
        []                                                                                               !
        []                                                                                               !
        [] FORMAR O COMANDO SQL QUE FAZ A FILTRAGEM DOS DADOS                                            !
        []                                                                                               !
        []                                                                                               !
        []------------------------------------------------------------------------------------------------

                []----------------------------------------------------------------
                []                                                               !
                [] Filtragem conforme opes marcadas                            !
                []                                                               !
                []----------------------------------------------------------------
                                                        
                        []-------------------------------------------------------------------------------------
                        [] Proprietrio e Fornecedor de energia                                               !
                        []-------------------------------------------------------------------------------------
                        
                                []Inicializao
                                str_Operador_IN = [] and (identregclifor in ([]
                                
                                []Proprietrio
                                str_Operador_IN = str_Operador_IN & IIf(Me.ck_Exibe_Contas_do_Proprietario.Value = 1, [][][] & NR_0022.txtIDENTREGPROPRIETARIO.Text & [][],[], [][][][])
                                
                                []Fornecedor de energia
                                str_Operador_IN = str_Operador_IN & IIf(Me.ck_Exibe_Contas_do_Proprietario.Value = 1, [][][] & NR_0022.txtIDENTREGFORNECEDORENERGIA.Text & [][][], [][][][])
                                        
                                []Remover caracteres separadores de IN que sobrarem no final
                                str_Operador_IN = RemoveSeparadorDePieceNoInicioOuFinal(str_Operador_IN, [],[], False, True)
                                
                                []Trmino
                                str_Operador_IN = str_Operador_IN & []))[]
                        
                                []Formar o comando SQL
                               str_Comando_SQL_Parte_01 = []select * from vw_ficontas where (codemp=[] & CodigoEmpresa & []) and (snexcluido=[]N[]) and (id_torre_vinculada=[][] & NR_0022.txtIDENTREG.Text & [][])[] & str_Operador_IN & IIf(Me.ck_Ocultar_Contas_Quitadas.Value = 1, [] and (dtquitacao=[]01/01/1900[])[], [][])
                        
                        []-------------------------------------------------------------------------------------
                        [] Exibir contas de demais cadastros que tenham vnculo com a torre                   !
                        []-------------------------------------------------------------------------------------
                        
                                If Me.ck_Exibe_Contas_demais_Cadastros.Value = 1 Then
                                
                                        []Para INSERIR todos os demais cadastros
                                       str_Comando_SQL_Parte_02 = []select * from vw_ficontas where (codemp=[] & CodigoEmpresa & []) and (snexcluido=[]N[]) and (id_torre_vinculada=[][] & NR_0022.txtIDENTREG.Text & [][])[] & [] and (identregclifor<>[]AZBXAZBXAZBXAZBX[]) and (identregclifor not in ([][] & NR_0022.txtIDENTREGPROPRIETARIO.Text & [][],[][] & NR_0022.txtIDENTREGFORNECEDORENERGIA.Text & [][]))[] & IIf(Me.ck_Ocultar_Contas_Quitadas.Value = 1, [] and (dtquitacao=[]01/01/1900[])[], [][])
                                                                    
                                    Else
                                        
                                        []Para SUPRIMIR todos os demais cadastros
                                       str_Comando_SQL_Parte_02 = []select * from vw_ficontas where (codemp=[] & CodigoEmpresa & []) and (snexcluido=[]N[]) and (id_torre_vinculada=[][] & NR_0022.txtIDENTREG.Text & [][])[] & [] and (identregclifor=[]AZBXAZBXAZBXAZBX[]) and (identregclifor not in ([][] & NR_0022.txtIDENTREGPROPRIETARIO.Text & [][],[][] & NR_0022.txtIDENTREGFORNECEDORENERGIA.Text & [][]))[] & IIf(Me.ck_Ocultar_Contas_Quitadas.Value = 1, [] and (dtquitacao=[]01/01/1900[])[], [][])
                                    
                                End If
                        
                []----------------------------------------------------------------
                []                                                               !
                [] Selecionar os dados                                           !
                []                                                               !
                []----------------------------------------------------------------
                        
                        Set Registros01 = Conect_PG_SQL_Local.Execute([]select [] & vbCrLf & _
                                                                      []          * [] & vbCrLf & _
                                                                      []from [] & vbCrLf & _
                                                                      []       ([] & vbCrLf & _
                                                                      []             [] & str_Comando_SQL_Parte_01 & vbCrLf & _
                                                                     []                        union all[] & vbCrLf & _
                                                                      []             [] & str_Comando_SQL_Parte_02 & vbCrLf & _
                                                                      []        ) as Query[] & vbCrLf & _
                                                                      []order by dtvencto asc, nome_cliente asc[] & vbCrLf _
                                                                      )
  


Tudo de bom.


Euzbio Cruz
Cricima - SC


#444157 - 30/01/2015 22:30:55

MARCELO-TREZE
SAO VICENTE
Cadast. em:Abril/2009


alguma coisa da pra melhorar vamos tentar

[]Inicializao
With Me.ck_Exibe_Contas_do_Proprietario
                                str_Operador_IN = [] and (identregclifor in ([] & IIf(.Value = 1, [][][] & _
                                                           NR_0022.txtIDENTREGPROPRIETARIO.Text & _
                                                  [][],[][] & NR_0022.txtIDENTREGFORNECEDORENERGIA.Text & [][][], [][][],[][][])
End With                                  
                                []Remover caracteres separadores de IN que sobrarem no final  <---- no sei como est esta funo mas acredito que um replace ajudaria
                                str_Operador_IN = RemoveSeparadorDePieceNoInicioOuFinal(str_Operador_IN, [],[], False, True)
                                
                                []Trmino
                                str_Operador_IN = str_Operador_IN & []))[]
                        
                                []Formar o comando SQL
                               str_Comando_SQL_Parte_01 = []select * from vw_ficontas where (codemp=[] & CodigoEmpresa & []) and (snexcluido=[]N[]) and (id_torre_vinculada=[][] & NR_0022.txtIDENTREG.Text & [][])[] & str_Operador_IN & IIf(Me.ck_Ocultar_Contas_Quitadas.Value = 1, [] and (dtquitacao=[]01/01/1900[])[], [][])
                        
                        []-------------------------------------------------------------------------------------
                        [] Exibir contas de demais cadastros que tenham vnculo com a torre                   !
                        []-------------------------------------------------------------------------------------
                        
                                With Me.ck_Exibe_Contas_demais_Cadastros
                                
                                        []Para INSERIR ou SUPRIMIR todos os demais cadastros
                                       str_Comando_SQL_Parte_02 = []select * from vw_ficontas where (codemp=[] & CodigoEmpresa & []) and (snexcluido=[]N[]) and (id_torre_vinculada=[][] & NR_0022.txtIDENTREG.Text & [][])[] & [] and (identregclifor[] & IIF(.Value = 1,[]<>[],[]=[]) &[][]AZBXAZBXAZBXAZBX[]) and (identregclifor not in ([][] & NR_0022.txtIDENTREGPROPRIETARIO.Text & [][],[][] & NR_0022.txtIDENTREGFORNECEDORENERGIA.Text & [][]))[] & IIf(Me.ck_Ocultar_Contas_Quitadas.Value = 1, [] and (dtquitacao=[]01/01/1900[])[], [][])
                                                                    
                                 End With
                        
                []----------------------------------------------------------------
                []                                                               !
                [] Selecionar os dados                                           !
                []                                                               !
                []----------------------------------------------------------------
                        
                        Set Registros01 = Conect_PG_SQL_Local.Execute([]select * from ([] & _
                                                                    [] & str_Comando_SQL_Parte_01 & []union all[] & _
                                                                    [] & str_Comando_SQL_Parte_02 & _
                                                                    [] ) as Query order by dtvencto asc, nome_cliente asc[])
                                                                  )
  

________________________________________________________________________________________
O orgulho cega at os sbios, ao ponto de no percebam que no so to sbios como pensam.



#444162 - 31/01/2015 07:34:45

SINCLAIR
CRICIUMA
Cadast. em:Janeiro/2001


Colegas,

Obrigado por terem respondido.

Antes de encerrar o tpico, vou fazer mais algumas tentativas de refatorao.

Caso mudanas sejam realmente feitas, postarei como ficou o cdigo.

Tudo de bom.

Euzbio Cruz
Cricima - SC


Resposta escolhida #444165 - 31/01/2015 12:20:28

FFCOUTO
COM LEVY GASPARIAN
Cadast. em:Março/2005


ZEUZEBIO3,

Neste fim de semana vou olhar seu cdigo mais a fundo.
Pelo que pude ver rapidamente, seu cdigo aplica vrios filtros num Select.
Aguarde pela minha resposta, ok.
Abraos


Cursos de Excel e VB6:
cursoexcelvba.com.br


#444166 - 31/01/2015 12:38:14

SINCLAIR
CRICIUMA
Cadast. em:Janeiro/2001


Última edição em 31/01/2015 13:44:04 por ZEUZEBIO3

Ol, Fabiano...

So 2 selects, sendo um para que insira na clusula IN o cdigo (chamado identreg) do proprietrio do terreno onde fica a torre e/ou do fornecedor de energia para a torre.

O outro select para incluir na resultset outros cadastros (de outras pessoas) que possam ter financeiro ligado torre, como o cidado que vai l capinar o terreno onde a torre est ou a prefeitura que pode cobrar IPTU.

No cadastro da torre sempre tem o identreg do proprietrio do terreno. Nem sempre tem o identreg do fornecedor de energia eltrica. No financeiro pode haver contas para os mesmos e para terceiros (contas lanadas manualmente) que quando do lanamento se escolhe alguma torre que tenha vnculo.

Ento a filtragem assim:

  • Incluir ou no o proprietrio no resultset
  • Incluir ou no o fornecedor de energia no resultset
  • Incluir ou no outros cadastros no resultset

    Eu fiz um select com IN para os identreg de proprietrio e fornecedor de energia (no campo identregclifor de vw_ficontas) e outro select para identregclifor se quaisquer outros cadastros (nenhum identreg igual a []AZBXAZBXAZBX[]). Neste segundo select eu coloco o NOT IN para os identreg do proprietrio e fornecedor de energia, porque se marcar somente esta opo (a terceira) o identregclifor <> []AZBXAZBXAZBX[] pegaria os identregclifor de proprietrio e fornecedor (que no deve pegar porque foram desmarcados).

    Aguardo sim, colega. E muito obrigado por sua ateno.

    Tudo de bom.


    Euzbio Cruz
    Cricima - SC


  • #444191 - 01/02/2015 17:26:56

    FFCOUTO
    COM LEVY GASPARIAN
    Cadast. em:Março/2005


    Última edição em 01/02/2015 17:35:29 por FFCOUTO

    ZEUZEBIO3,

    Como prometido aqui est o seu cdigo refatorado.
    Algumas observaes devem ser feitas:
    1) O ideal seria voc colar esse cdigo numa classe e alterar os controles checkbox e textbox para propriedades da classe. A partir da voc apenas instancia a classe, seta as propriedades, executa a consulta e destri a instacia.
    2) Ao usar um campo data e esta possuir a condio de no ser setada, como a data de quitao do seu exemplo, use null para preenche-la e desta forma voc poder usar o operador Is Null.
    3) Use parmetros no lugar de concatenar a string de sql, dessa forma voc evita ataques de sql injection.

    Qualquer dvida no novo cdigo s postar

    []Essas variveis devem ser declaradas na sesso Declarations para que fiquem visveis a todas as funes abaixo.
    Private strSqlComando1 As String
    Private strSqlComando2 As String

    []----------------------------------------------------------------
    [] REALIZA A FILTRAGEM DOS DADOS                                 !
    []----------------------------------------------------------------
    Public Sub Consultar()
       []----------------------------------------------------------------
       [] Filtragem conforme opes marcadas                            !
       []----------------------------------------------------------------
      
       []----------------------------------------------------------------
       [] Proprietrio e Fornecedor de energia                          !
       []----------------------------------------------------------------
       PrepararComandoBase strSqlComando1
       PrepararFiltroCadastroPrincipal strSqlComando1, False
       PrepararFiltroContasQuitadas strSqlComando1
      
       []-------------------------------------------------------------------
       [] Exibir contas de demais cadastros que tenham vnculo com a torre !
       []-------------------------------------------------------------------
       Dim bolOutrosCadastros As Boolean
      
       []Quando []True[] a consulta vai INSERIR todos os demais cadastros
       []Quanto []False[] a consulta vai SUPRIMIR todos os demais cadastros
       bolOutrosCadastros = (ck_Exibe_Contas_demais_Cadastros.Value = 1)
      
       PrepararComandoBase strSqlComando2
       PrepararFiltroOutrosCadastros strSqlComando2, IIf(bolOutrosCadastros, []<>[], []=[])
       PrepararFiltroCadastroPrincipal strSqlComando2, True
       PrepararFiltroContasQuitadas strSqlComando2
      
       []----------------------------------------------------------------
       [] Selecionar os dados                                           !
       []----------------------------------------------------------------
       Dim strSqlComando As String
      
       strSqlComando = []SELECT * FROM ([] & _
          strSqlComando1 & [] UNION ALL [] & strSqlComando2 & []) AS Query [] & _
          []ORDER BY dtvencto ASC, nome_cliente ASC;[]
      
       Set Registros01 = Conect_PG_SQL_Local.Execute(strSqlComando)
    End Sub

    Private Sub PrepararComandoBase(ByRef strSQL As String)
       []realiza a montagem do comando 1
       strSQL = []SELECT * FROM vw_ficontas []
       strSQL = strSQL & []WHERE (codemp = [] & CodigoEmpresa & []) []
       strSQL = strSQL & []AND (snexcluido = []N[]) []
       strSQL = strSQL & []AND (id_torre_vinculada = [][] & NR_0022.txtIDENTREG.Text & [][]) []
    End Sub

    Private Sub PrepararFiltroCadastroPrincipal(ByRef strSQL As String, ByVal bExcluir As Boolean)
       Dim inOper() As String
       Dim intCountFilter As Integer
      
       []nenhum filtro foi especificado
       intCountFilter = -1
      
       If (ck_Exibe_Contas_do_Proprietario.Value = 1) Then
          intCountFilter = intCountFilter + 1
          ReDim Preserve inOper(intCountFilter)
          inOper(intCountFilter) = NR_0022.txtIDENTREGPROPRIETARIO.Text
       End If
      
       If (ck_Exibe_Contas_do_Proprietario.Value = 1) Then
          intCountFilter = intCountFilter + 1
          ReDim Preserve inOper(intCountFilter)
          inOper(intCountFilter) = NR_0022.txtIDENTREGFORNECEDORENERGIA.Text
       End If
      
       If intCountFilter > -1 Then
          strSQL = strSQL & [] AND (identregclifor [] & IIf(bExcluir, []NOT[], [][]) & [] IN ([] & Join(inOper, [], []) & [])) []
       End If
    End Sub

    Private Sub PrepararFiltroOutrosCadastros(ByRef strSQL As String, ByVal operComparacao As String)
       []O ideal substituir a sequencia de caracteres por uma sequencia de 5 astericos
       []strSQL = strSQL & Replace([]AND (identregclifor %1 []*****[]) [], []%1[], operComparacao)
      
       strSQL = strSQL & Replace([]AND (identregclifor %1 []AZBXAZBXAZBXAZBX[]) [], []%1[], operComparacao)
    End Sub

    Private Sub PrepararFiltroContasQuitadas(ByRef strSQL As String)
       []O correto utilizar o campo com valor null e no uma data antiga para
       []informar o seu no preenchimento
      
       []Com null ficara dessa forma
       []If (ck_Ocultar_Contas_Quitadas.Value = 1) Then
       []   strSQL = strSQL & [] AND (dtquitacao IS NULL) []
       []End If
      
       []Usando um valor antigo
       If (ck_Ocultar_Contas_Quitadas.Value = 1) Then
          strSQL = strSQL & [] AND (dtquitacao = []01/01/1900[]) []
       End If
    End Sub


    Espero ter ajudado.


    Cursos de Excel e VB6:
    cursoexcelvba.com.br


    #444212 - 02/02/2015 09:41:49

    SINCLAIR
    CRICIUMA
    Cadast. em:Janeiro/2001


    Colega FFCOUTO.

    Maravilha.

    Cdigo Entendido e Refatorado.

    Vou colocar na parte de adies da verso no novo sistema.

    Grato e Tudo de bom!

    Euzbio Cruz
    Cricima - SC


     Tópico anterior Próximo tópico Novo tópico


    Tópico encerrado, respostas não sao permitidas
    Encerrado por SINCLAIR em 02/02/2015 10:13:18