Dicas do OsmarJr

Concatenando detalhes em consultas


(Q) Como faço para extrair todos os valores de um campo em uma tabela relacionada a outra em um relacionamento 1:M em uma string?

Autor:Dev Ashish


(R) A função fConcatFilho abaixo pode ser usada em uma consulta:

SELECT Pedidos.*, fConcatFilho("Detalhes do Pedido","Número do Pedido","Quantidade","Long",[Número do Pedido]) AS ValDetPed FROM Pedidos;

Este exemplo é baseado nas tabela Pedidos e Detalhes do Pedido do banco de dados Northwind. As tabelas estão relacionadas 1 para muitos (1:M). A função fConcatFilho simplesmente concatena todos os valores no campo Quantidade da tabela detalhes do Pedido onde o campo vinculante é NúmeroDoPedido, do tipo inteiro longo para cada valor de [NúmeroDoPedido] passado pela tabela Pedidos.

CODE
'************ Início do Código **********
' Este código foi escrito originalmente por Dev Hashish
' Não pode ser alterado ou distribuído
' exceto como parte de um aplicativo.
' Use-o à vontade em qualquer aplicativo
' desde que esta nota de Copyright não seja alterada.
'
' Código cortesia de
' Dev Hashish (http://www.mvps.org/access/)
'
' Tradução e adaptação
' OsmarJr (jrosmar@yahoo.com.br)
'=========================================

Function fConcatFilho(strTabelaFilho As String, _
                   strNomeID As String, _
                   strCampoConcat As String, _
                   strTipoID As String, _
                   varValorID As Variant) _
                   As String

' Devolve o conteúdo de um campo da tabela Muitos de um
' relacionamento 1:M, concatenado e separados por ponto-e-vírgula
'
' Exemplo de uso:
'   ?fConcatFilho("Detalhes do Pedido", "NúmeroDoPedido", "Quantidade", _
'                "Long", 10255)
' Onde
'
‘ Detalhes do Pedido = Tabela Muitos
'       NúmeroDoPedido = Chave primária da tabela Um
'       Quantidade = Nome do campo a ser concatenado
'       Long = Tipo de dados da chave primária
'       10255 = Número do pedido que contém os detalhes
'
Dim db As Database
Dim rs As Recordset
Dim varConcat As Variant
Dim strCriteria As String
Dim strSQL As String
   
On Error GoTo Err_fConcatFilho
   
   varConcat = Null
   Set db = CurrentDb
   strSQL = "SELECT [" & strCampoConcat & "] FROM [" & strTabelaFilho & "]"
   strSQL = strSQL & " WHERE "
   
   Select Case strTipoID
       Case "String":
           strSQL = strSQL & "[" & strNomeID & "] = '" & varValorID & "'"
       Case "Long", "Integer", "Double":    'Autonumeração é tipo Inteiro Longo
           strSQL = strSQL & "[" & strNomeID & "] = " & varValorID
       Case Else
           GoTo Err_fConcatFilho
   End Select
   
   Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)

' Precisamos ter certeza que os registros Sub existem
   With rs
       If .RecordCount <> 0 Then
           ' Começa a concatenar os registros
           Do While Not rs.EOF
               varConcat = varConcat & rs(strCampoConcat) & ";"
               .MoveNext
           Loop
       End If
   End With
       
   ' Pronto… Já temos a string concatenada
   ' Agora limpamos o; no final da string
   fConcatFilho = Left(varConcat, Len(varConcat) - 1)

Exit_fConcatFilho:
   Set rs = Nothing
   Set db = Nothing
   Exit Function

Err_fConcatFilho:
   Resume Exit_fConcatFilho
End Function

'************ Final do Código **********
Home

Contato | Copyright©Osmar José Correia Júnior | 09-Mar-2006 17:38