MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    avatar
    Convidado
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidado 19/12/2012, 10:38

    Bem amigos, tentarei ser o mais claro possível.

    Estou utilizando uma SQL para carregar valores de varias tabelas, sendo que as tabelas serão aplicadas na SQL em um ciclo de loop's sendo modificada após cada loop.
    Como são tabelas diferentes, os nomes dos campos utilizados na cláusula Where são modificados a cada loop, bem como os valores do filtro.

    Nesta SQL abaixo (que está funcionando) utilizo 3 colunas como filtro, observe que os nomes das colunas estarão contidos nas variáveis: Coluna1, Coluna2, Coluna2. Estes nomes bem como os valores utilizados para filtrar eu consigo da seguinte maneira:


    'Aqui vou aplicado os valores de cada coluna na respectiva variável
    'Este valores serão utilizados para filtrar um Recordset por exclusão
    'Utilizando o Operador Not In

    Do While Not RsLocal.EOF
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(1), "") & "'"
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'"
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'"
    RsLocal.MoveNext
    Loop
    'Adicioo no nome respectivo da coluna
    Coluna1 = RsLocal(1).Name
    Coluna2 = RsLocal(2).Name
    Coluna3 = RsLocal(3).Name


    A SQL ficará da seguinte maneira:

    StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ") And " & Coluna3 & " Not in (" & StrWhere3 & ")"


    Onservem que serão atualizadas várias tabelas... e quando for modificada o nome da tabela contido na variável: NomeTabelaImp, serão modificados tambem os nomes dos campos e utilizado as variáveis StrWhere para filtrar o Recordset por exclusão


    Pergunto:


    Os três campos utilizados na SQL acima bem como as variáveis StrWhere estão configurados para filtrar valores do tipo texto, portanto os 3 primeiros campos após o campo Código na tabela devem ser obrigatoriamente do tipo Texto.

    Agora... como utilizar o operador In para conter datas e utilizá-los em uma campo do tipo data?

    Para número a utilização do operador fica:

    (1,2,3)
    Para texto a utilização do operador fica:
    ('Nome1','Nome2','Nome3')
    e para datas, é possível?

    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidado 19/12/2012, 11:00

    Bem, consegui da seguinte maneira:

    StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(3), ""), "mm/dd/yyyy") & "#"

    Observem que no lugar das aspas simples para texto, apliquei o #

    Portanto:

    Para número a utilização do operador fica:

    (1,2,3)
    Para texto a utilização do operador fica:
    ('Nome1','Nome2','Nome3')
    Para datas, é possível fica:
    (#Data1#,#Data2#,#Data2#)


    Para que isto? simples... estou tentando deixa a utilização o mais automática possivel.
    Na tabela que conterá o nome das tabelas que serão utilizadas na SQL colocarei sete tipo de configurações possíveis:

    1 Configuração da SQL >>> Texto, Texto, Texto
    2 Configuração da SQL >>> Texto, Texto, Data
    3 Configuração da SQL >>> Numero, Texto, Texto
    4 Configuração da SQL >>> Numero, Numero, Texto
    5 Configuração da SQL >>> Numero, Texto, Data
    6 Configuração da SQL >>> Data, Data, Numero
    7 Configuração da SQL >>> Data, Numero, Numero


    Se um dos colegas me ajudar a colocar a SQL em uma função... agradeço.

    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidado 19/12/2012, 11:31

    A SQL já com a facilidade citada acima. observe que os tipos dos campos serão checados..

    Numero = 4
    Texto = 10
    Data = 8



    'Faz um loop pela tabela local para colocar na variável StrWhere
    'Os códigos dos registros da tabela


    Do While Not RsLocal.EOF
    'Ordem das colunas por tipo de dados
    'Texto,Texto,Texto

    If RsLocal(1).Type = 10 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Texto,Texto,Data

    ElseIf RsLocal(1).Type = 10 And RsLocal(2).Type = 10 And RsLocal(3).Type = 8 Then
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(3), ""), "mm/dd/yyyy") & "#" 'Data
    'Ordem das colunas por tipo de dados
    'Numero,Texto,Texto

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Numero,Texto

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Texto,Data

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(3), ""), "mm/dd/yyyy") & "#" 'Data
    'Ordem das colunas por tipo de dados
    'Data, Data,Numero

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere2 = StrWhere2 & "," & "#" & Format(Nz(RsLocal(1), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere3 = StrWhere3 & "," & Nz(RsLocal(3), "") 'Numero
    'Ordem das colunas por tipo de dados
    'Data, Numro,Numero

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere2 = StrWhere2 & "," & Nz(RsLocal(2), "") 'Numero
    StrWhere3 = StrWhere3 & "," & Nz(RsLocal(3), "") 'Numero
    End If
    RsLocal.MoveNext
    Loop
    Coluna1 = RsLocal(1).Name
    Coluna2 = RsLocal(2).Name
    Coluna3 = RsLocal(3).Name

    'Retiro a última virgula da variável
    StrWhere1 = Mid(StrWhere1, 2)
    StrWhere2 = Mid(StrWhere2, 2)
    StrWhere3 = Mid(StrWhere3, 2)


    'Carrego a Variável StrSALImport com os dados da tabela externa excetuando os que tem os valores carregados nas variáveis StrWhere
    StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ") And " & Coluna3 & " Not in (" & StrWhere3 & ")"
    Set RsImport = dbImport.OpenRecordset(StrSQLImport)



    O Próximo passo agora é transformar isso em uma função...

    Cumprimentos.
    avatar
    Convidad
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidad 19/12/2012, 11:39

    utilize o Select Case para o RsLocal
    avatar
    Convidado
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidado 19/12/2012, 11:45

    Bom dia RIcardo!, vejo que entendeu o pretendido por mim.

    Em testes agora me surgiu mais um problema...

    Como pode observar faço utilização de 3 campos, está funcionando perfeitamente quando a tabela tem 4 campos ou mais (Rs(0),Rs(1),Rs(2),Rs(3),,,,,,,,)

    Mas quando a tabela possui menos de 4 campos irá dar erro pois não encontrará o campo.

    Estou tentando solucionar aqui.


    Explique-me mais sobre o select Case para este caso... não entendi (O Select Case eu sei) mas em que sentido aplica-lo ai?

    Abraços.
    avatar
    Convidado
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidado 19/12/2012, 12:28

    Bem.. para o caso do numero de campos nas tabelas utilizei o select case


    'Checo a quantidade de Campos para o RsLocal, direcionando ao Case específico
    Select Case RsLocal.Fields.Count
    'Nesta situação a tabela possui dois campos, e serão checados o primeiro (Campo Código)
    'e o segundo campo que poderá ser do tipo: Numero,texto ou Data

    Case Is = 2
    'Faz um loop pela tabela local para colocar na variável StrWhere
    'Os códigos dos registros da tabela

    Do While Not RsLocal.EOF
    ....
    ......
    Case Is = 3
    'Faz um loop pela tabela local para colocar na variável StrWhere
    'Os códigos dos registros da tabela

    Do While Not RsLocal.EOF
    ....
    ......
    Case Else
    'Faz um loop pela tabela local para colocar na variável StrWhere
    'Os códigos dos registros da tabela

    Do While Not RsLocal.EOF
    ....
    ......
    End Select


    Logo mais posto o código completo

    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidado 19/12/2012, 13:33

    O Código completo, sugestões serão bem vindas..

    Caso possível alguem se habilite a transformarmos isto em função....


    Private Sub btnImportar_Click()
    On Error GoTo Trataerro
    'Criado por Harysohn Pina em 10 de Dezembro de 2012
    'Fórum Maximo Access
    '*******************************************************************************
    'Popula o recordset com os dados importados para posterior comparação
    '*******************************************************************************

    Dim dbImport As DAO.Database
    Dim RsImport As DAO.Recordset, RsLocal As DAO.Recordset, RsTab As DAO.Recordset
    Dim Msg As String
    Dim StrSQLLocal As String, StrSQLImport As String
    Dim X As Integer, LInha As Integer, NumCampos As Integer
    Dim Y As Long
    Dim NomeTabela As String
    Dim N As Integer, Z As Integer, Count As Integer
    Dim StrWhere1 As String, StrWhere2 As String, StrWhere3 As String
    Dim NomeTabelaImp As String
    Dim Coluna1 As String, Coluna2 As String, Coluna3 As String
    '--------------------------------------------------------------
    'Para aviso ao usuário

    Me.RecebeFoco.SetFocus
    Me.btnImportar.Enabled = False
    Screen.MousePointer = 11
    Me.lbAviso.Caption = "Aguarde, a operação está em andamento!"
    Me.lbAviso.Visible = True
    Pause (2) 'Funcão que provoca pausa na execução do código
    '--------------------------------------------------------------
    'Aqui faço um loop pela lista e a cada loop atualiza a tabela selecionada


    For Count = 0 To Me.lstObjects.ListCount - 1
    If Me.lstObjects.Selected(Count) Then
    'Aplico o nome da tabela selecionada na lista à variável
    NomeTabelaImp = Me.lstObjects.Column(0, Count)
    Else
    GoTo Continua
    End If

    'Carrega o a variável com a SQL da tabela (Tabela Local)
    StrSQLLocal = "SELECT * From " & NomeTabelaImp & ""

    'Seta a variável dbImport com o banco externo
    Set dbImport = OpenDatabase(PastaBD & Arquivo, False, False, "MS Access;PWD=senha")

    'Carrega o Recordset com os dados da tabela no bd local
    Set RsLocal = CurrentDb.OpenRecordset(StrSQLLocal)
    'Set RsTab = CurrentDb.OpenRecordset("Select * From TbNomeTabelas")

    '==========================================================================================
    'Checo a quantidade de Campos para o RsLocal, direcionando ao Case específico

    Select Case RsLocal.Fields.Count
    '==========================================================================================
    'Nesta situação a tabela possui dois campos, e serão checados o primeiro (Campo Código)
    'e o segundo campo que poderá ser do tipo: Numero,texto ou Data

    Case Is = 2
    'Faz um loop pela tabela local para colocar na variável StrWhere
    'Os códigos dos registros da tabela

    Do While Not RsLocal.EOF
    'Ordem das colunas por tipo de dados
    'Numero,Texto

    If RsLocal(0).Type = 4 And RsLocal(1).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(0), "") & "'" 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Numero

    ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 4 Then
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(0), "") & "'" 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Numero
    'Ordem das colunas por tipo de dados
    'Numero,Data

    ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 8 Then
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(0), "") & "'" 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Data
    End If
    RsLocal.MoveNext
    Loop
    'Adiciono o nome das colunas à variável
    Coluna1 = RsLocal(0).Name
    Coluna2 = RsLocal(1).Name
    'Retiro a última virgula da variável
    StrWhere1 = Mid(StrWhere1, 2)
    StrWhere2 = Mid(StrWhere2, 2)
    'o Recordset RsImport será carregado apenas com os registros dos campos 0 e 1
    StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ")"
    Set RsImport = dbImport.OpenRecordset(StrSQLImport)
    RsImport.MoveLast
    RsImport.MoveLast
    '==========================================================================================
    'Nesta situação a tabela possui dois campos, e serão checados o primeiro (Campo Código)
    'e o segundo campo que poderá ser do tipo: Numero,texto ou Data

    Case Is = 3
    'Faz um loop pela tabela local para colocar na variável StrWhere
    'Os códigos dos registros da tabela

    Do While Not RsLocal.EOF
    'Ordem das colunas por tipo de dados
    'Numero,Texto,Texto
    If RsLocal(0).Type = 4 And RsLocal(1).Type = 10 And RsLocal(2).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Numero,Texto

    ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 4 And RsLocal(2).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
    StrWhere2 = StrWhere2 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Texto,Numero
    ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 10 And RsLocal(2).Type = 4 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    StrWhere3 = StrWhere2 & "," & Nz(RsLocal(2), "") 'Numero
    'Ordem das colunas por tipo de dados
    'Numero,Texto,Data

    ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 10 And RsLocal(2).Type = 8 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
    'Ordem das colunas por tipo de dados
    'Numero,Data,Texto

    ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 8 And RsLocal(2).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "#" & Format(Nz(RsLocal(1), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Data,Numero

    ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 8 And RsLocal(2).Type = 4 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "#" & Format(Nz(RsLocal(1), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere3 = StrWhere3 & "," & Nz(RsLocal(2), "") 'Numero
    'Ordem das colunas por tipo de dados
    'Numero,Numero, Data

    ElseIf RsLocal(0).Type = 4 And RsLocal(4).Type = 8 And RsLocal(2).Type = 8 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
    StrWhere2 = StrWhere2 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
    End If
    RsLocal.MoveNext
    Loop
    'Adiciono o nome das colunas à variável
    Coluna1 = RsLocal(1).Name
    Coluna2 = RsLocal(2).Name
    Coluna3 = RsLocal(3).Name

    'Retiro a última virgula da variável

    StrWhere1 = Mid(StrWhere1, 2)
    StrWhere2 = Mid(StrWhere2, 2)
    StrWhere3 = Mid(StrWhere3, 2)

    'o Recordset RsImport será carregado apenas com os registros dos campos 0, 1 e 2
    StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ") And " & Coluna3 & " Not in (" & StrWhere3 & ")"
    Set RsImport = dbImport.OpenRecordset(StrSQLImport)
    RsImport.MoveLast
    RsImport.MoveLast

    '==========================================================================================
    'Nesta situação a tabela possui dois campos, e serão checados o primeiro (Campo Código)
    'e o segundo campo que poderá ser do tipo: Numero,texto ou Data

    Case Else
    'Faz um loop pela tabela local para colocar na variável StrWhere
    'Os códigos dos registros da tabela

    Do While Not RsLocal.EOF
    'Ordem das colunas por tipo de dados
    'Texto,Texto,Texto

    If RsLocal(1).Type = 10 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Texto,Texto,Data

    ElseIf RsLocal(1).Type = 10 And RsLocal(2).Type = 10 And RsLocal(3).Type = 8 Then
    StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(3), ""), "mm/dd/yyyy") & "#" 'Data
    'Ordem das colunas por tipo de dados
    'Numero,Texto,Texto

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Numero,Texto

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
    'Ordem das colunas por tipo de dados
    'Numero,Texto,Data

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
    StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
    StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(3), ""), "mm/dd/yyyy") & "#" 'Data
    'Ordem das colunas por tipo de dados
    'Data, Data,Numero

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere2 = StrWhere2 & "," & "#" & Format(Nz(RsLocal(1), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere3 = StrWhere3 & "," & Nz(RsLocal(3), "") 'Numero
    'Ordem das colunas por tipo de dados
    'Data, Numro,Numero

    ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
    StrWhere1 = StrWhere1 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
    StrWhere2 = StrWhere2 & "," & Nz(RsLocal(2), "") 'Numero
    StrWhere3 = StrWhere3 & "," & Nz(RsLocal(3), "") 'Numero
    End If
    RsLocal.MoveNext
    Loop
    'Adiciono o nome da coluna à variável
    Coluna1 = RsLocal(1).Name
    Coluna2 = RsLocal(2).Name
    Coluna3 = RsLocal(3).Name

    'Retiro a última virgula da variável
    StrWhere1 = Mid(StrWhere1, 2)
    StrWhere2 = Mid(StrWhere2, 2)
    StrWhere3 = Mid(StrWhere3, 2)

    'o Recordset RsImport será carregado apenas com os registros dos campos 1, 2 e 3
    StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ") And " & Coluna3 & " Not in (" & StrWhere3 & ")"
    Set RsImport = dbImport.OpenRecordset(StrSQLImport)
    RsImport.MoveLast
    RsImport.MoveLast
    End Select
    '========================================================================================================================================================================================================

    'Se a contagem do RsImport for 0 é porque as tabelas tem o mesmo numero de registros
    'e não precisa ser atualizada
    If RsImport.RecordCount = 0 Then
    MsgBox "Não há registros a serem importados" _
    & "na tabela " & NomeTabelaImp & "", vbInformation, "ATENÇÃO"
    GoTo Continua
    Else
    RsImport.MoveLast
    RsImport.MoveFirst
    'continua o código
    NumCampos = RsImport.Fields.Count
    Do While Not RsImport.EOF
    RsLocal.AddNew

    For Z = 0 To (NumCampos - 1)
    RsLocal.Fields(Z) = RsImport.Fields(Z)
    Next Z

    RsLocal.Update
    RsImport.MoveNext
    Loop
    MsgBox "Registros da tabela: " & NomeTabelaImp & " importados com sucesso", vbInformation, "PRONTO"
    RsLocal.Close
    RsImport.Close
    End If
    Continua:
    'Limpa a variável para receber os códigos da outra tabela
    StrWhere1 = ""
    StrWhere2 = ""
    StrWhere3 = ""
    'Aqui vai para a próxima tabela
    Next

    '--------------------------------------------------------------
    'Para aviso ao usuário

    Me.lbAviso.Caption = "Operação Concluida!"
    Pause (3)
    Screen.MousePointer = 0
    Me.lbAviso.Visible = False
    Me.btnImportar.Enabled = True
    '--------------------------------------------------------------
    'Tratamento de Erros

    Exit Sub
    Exit_TrataErro:
    DoCmd.Hourglass False
    DoCmd.Echo True
    Exit Sub

    Trataerro:
    If Err.Number = 3024 Then
    MsgBox "Não foi encontrado o Banco de Dados no Caminho Indicado!", vbCritical, "ERRO"
    Exit Sub
    ElseIf Err.Number = 3021 Then
    Resume Next
    ElseIf Err.Number = 3131 Then
    MsgBox "Não fora selecionado nenhuma tabela", vbCritical, "ATENÇÃO"
    Else
    DoCmd.Hourglass False
    DoCmd.Echo True
    Msg = "Erro # " & Str(Err.Number) & " gerado na " & Err.Source _
    & vbNewLine & vbNewLine & "Descrição: " & Err.Description _
    & vbNewLine & vbNewLine & "Por favor contate o Administrador de Sistema."
    MsgBox Msg, vbMsgBoxHelpButton vbCritical, "Erro", Err.HelpFile, Err.HelpContext
    Resume Exit_TrataErro
    End If
    End Sub


    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Convidado 19/12/2012, 13:50

    Bem amigos este tópico está resolvido, a solução ficou interessante creio e pode ser utilizada para diversos fins.

    Caso algum de vocês se interessem gostaria de transformar no todo ou em parte em uma função.

    Cumprimentos.

    Conteúdo patrocinado


    [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica Empty Re: [Resolvido]Uso do Operador IN com campos do tipo data em uma SQL dinâmica

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 26/4/2024, 20:52