Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Funzione analoga a DSum che lavori su campi testo/memo invece che su campi numerici?

  1. #1
    greeek27 non è in linea Novello
    Post
    6
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao a tutti,
    non riesco a trovare una strada per ottenere l'esatto corrispondente di una funzione di aggregazione come DSum solo che invece di sommare campi numerici dovrebbe concatenare campi di tipo Testo e/o Memo.
    Qualche suggerimento?

    Grazie
    Dario

  2. #2
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Post
    730
    Like Inviati  
    0
    Like Ricevuti  
    0
    Se l'obiettivo è la concatenzazione (a parità di ID) di tutte le sue occorrenze presenti, puoi vedere questa discussione nel forum di pochi giorni fa:
    http://forum.masterdrive.it/access-7...icolari-83690/
    ℹ️ Leggi di più su willy55 ...

  3. #3
    OsvaldoLaviosa non è in linea Topo di biblioteca
    Post
    3,091
    Like Inviati  
    0
    Like Ricevuti  
    1
    Per concatenare stringhe di testo devi usare il carattere &. Esempi:
    [Campo1] & [Campo2] & [Campo3] (concatenazione semplice ed essenziale)
    [Campo1] & " " & [Campo2] & " " & [Campo3] (concatenazione con l'utilizzo di spazi fra un campo e l'altro)
    ovviamente puoi trovare tante altre varianti, ecc...

  4. #4
    greeek27 non è in linea Novello
    Post
    6
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie Willy,
    mi metto a studiare i tuoi link e faccio sapere
    Ciao

  5. #5
    greeek27 non è in linea Novello
    Post
    6
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da OsvaldoLaviosa Visualizza il messaggio
    Per concatenare stringhe di testo devi usare il carattere &. Esempi:
    [Campo1] & [Campo2] & [Campo3] (concatenazione semplice ed essenziale)
    [Campo1] & " " & [Campo2] & " " & [Campo3] (concatenazione con l'utilizzo di spazi fra un campo e l'altro)
    ovviamente puoi trovare tante altre varianti, ecc...
    Grazie Osvaldo,
    per la verità quello che cerco è la concatenazione tra i valori di più record dello stesso campo (che è di tipo testo o memo) di una certa tabella, selezionati secondo opportuni criteri, in modo del tutto analogo a quanto fa la funzione DSum che però opera solo con valori numerici facendone la somma.

    Esempio:
    TABELLA ha i seguenti campi:
    IDtabella (numerazione automatica); Campo2 (testo); campo3 (Memo); ...
    Ad un certo momento runtime, applicando un opportuno criterio (ad esempio una query), poniamo che la selezione offra 2 record, dei quali i primi 3 campi sopra citati contengano:
    1; "Pippo"; "Stamattina ho fatto colazione";...
    2; "Pluto"; "Oggi sono andato al mare";...

    Quello che mi serve è che in quello stesso momento runtime possa costruire le stringhe (da assegnare per esempio ad un controllo di tipo Memo in una maschera):
    [MemoBox1] = "Pippo: Stamattina ho fatto colazione"
    [MemoBox2] = "Pluto: Oggi sono andato al mare"

    Mi sta venendo in mente una possibile strada, devo provare e vediamo...
    Ciao e grazie

  6. #6
    greeek27 non è in linea Novello
    Post
    6
    Like Inviati  
    0
    Like Ricevuti  
    0
    Scusa Osvaldo,
    ho sbagliato in tronco l'esempio di prima:

    Quote Originariamente inviato da greeek27 Visualizza il messaggio
    Quello che mi serve è che in quello stesso momento runtime possa costruire le stringhe (da assegnare per esempio ad un controllo di tipo Memo in una maschera):
    [MemoBox1] = "Pippo: Stamattina ho fatto colazione"
    [MemoBox2] = "Pluto: Oggi sono andato al mare"
    per cui sembrava che quello che mi serve è proprio quello che suggerivi tu.
    Invece quello che vorrei ottenere, seguendo l'esempio di prima, è del tipo:

    [MemoBox1] = "Pippo. Pluto"
    [MemoBox2] = "Stamattina ho fatto colazione. Oggi sono andato al mare"

    Scusa la svista
    Ciao

  7. #7
    Post
    1,833
    Like Inviati  
    0
    Like Ricevuti  
    6
    Quote Originariamente inviato da greeek27 Visualizza il messaggio
    Scusa Osvaldo,
    Invece quello che vorrei ottenere, seguendo l'esempio di prima, è del tipo:

    [MemoBox1] = "Pippo. Pluto"
    [MemoBox2] = "Stamattina ho fatto colazione. Oggi sono andato al mare"

    Scusa la svista
    Ciao
    Credo che si debba passare attraverso un ciclo di questo tipo

    Dim rs As DAO.Recordset
    Dim strMemoBox1 As String
    Dim strMemoBox2 As String
    
    Set rs = DBEngine(0)(0).OpenRecordset("non_ne_ho_la_minima_idea")
    
    If Not (rs.BOF and rs.EOF) Then
    rs.MoveFirst
    strMemoBox1 = rs.Fields("Campo2").Value
    strMemoBox2 = rs.Fields("Campo3").Value
    rs.MoveNext
    Do Until rs.EOF
            strMemoBox1 = strMemoBox1 & ". " & rs.Fields("Campo2").Value
            strMemoBox2 = strMemoBox2 & ". " & rs.Fields("Campo3").Value
            rs.MoveNext
    Loop
    End If
    rs.Close
    Set rs = Nothing
    Me.MemoBox1.Value = strMemoBox1
    Me.MemoBox2.Value = strMemoBox2
    
    Il primo record è trattato fuori da Do ... Loop
    rs.MoveFirst
    strMemoBox1 = rs.Fields("Campo2").Value
    strMemoBox2 = rs.Fields("Campo3").Value
    rs.MoveNext
    
    per non avere all'inizio della stringa il carattere ". " di separazione.

  8. #8
    greeek27 non è in linea Novello
    Post
    6
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie Phil,
    ho messo in pratica il tuo suggerimento cogliendo l'occasione per avvicinarmi ai recordset che non avevo mai utilizzato finora e ho creato la seguente funzione che effettua la concatenazione.
    In pratica è esattamente quello che suggerivi tu con un paio di piccole varianti (l'utilizzo della sintassi SQL che mi consentiva di definire comodamente un criterio di selezione dei record da utilizzare per la concatenazione e l'uso della funzione Nz() per evitare che venga sollevato un errore quando si cerca di concatenare campi contenenti valori Null).
    Ringrazio anche Willy55 che mi ha suggerito qualche link utile, OsvaldoLaviosa che ha iniziato un thread in cui si parlava di situazioni molto simili (e chi vi ha partecipato) e Dragone Bianco che ha scritto questo articolo che mi è stato utile: http://forum.masterdrive.it/access-7...vba-dao-13176/

    Public Function ConcRighe(IDofferta As Long) As String
    '(l'argomento IDofferta passato alla funzione serve per definire il criterio di selezione
    ' delle righe che mi interessano all'interno della tabella che sono quelle con un dato valore per il campo IDofferta)
        Dim DBcorrente As DAO.Database
        Dim TabRighe As DAO.Recordset
        Dim criterio As String 
        'definisce il criterio di selezione come stringa SQL:
        criterio = "SELECT * FROM tab_RigheOfferta WHERE (((tab_RigheOfferta.IdTestataOfferta)=" & Str(IDofferta) & "))"
        Set DBcorrente = CurrentDb
        Set TabRighe = DBcorrente.OpenRecordset(criterio, dbOpenDynaset)
    	ConcRighe = ""
        If Not (TabRighe.BOF And TabRighe.EOF) Then
            TabRighe.MoveFirst
            ConcRighe = Nz(TabRighe.Fields("DescrizioneArt"), "") 'Nz() evita errori quando si cerca di concatenare campi con valori Null
            TabRighe.MoveNext
            Do Until TabRighe.EOF
                ConcRighe = ConcRighe & ". " & Nz(TabRighe.Fields("DescrizioneArt"), "")
                TabRighe.MoveNext
            Loop
        End If
        TabRighe.Close
        DBcorrente.Close
    End Function
    
    Grazie e buon Forum a tutti!

  9. #9
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Post
    730
    Like Inviati  
    0
    Like Ricevuti  
    0
    Greeek27,
    dal momento che hai colto l'occasione per avvicinarti ai recordset, ti consiglio anche di affrontare la problematica della implementazione
    di una funzione in modo da valutare la sua riusabilità.
    Considera, ad esempio, che se dovrai impiegare la funzione da te realizzata su altri elementi (tabella, campo, criterio) dovrai variarne il codice interno; quindi è utile costruire una funzione a cui possano essere forniti, dall'esterno, i parametri necessari in modo da rendere versatile il suo funzionamento.
    Ad esempio se hai visto il primo link (da me indicato nell'altro thread) ove compare il codice seguente:
    ' Tratto da:
    ' http://www.access-programmers.co.uk/forums/showthread.php?t=64611
    
    Public Function Conc(Fieldx, Identity, Value, Source) As Variant
      Dim cnn As ADODB.Connection
      Dim rs As ADODB.Recordset
      Dim SQL As String
      Dim vFld As Variant
      
      Set cnn = CurrentProject.Connection
      Set rs = New ADODB.Recordset
      vFld = Null
      
      SQL = "SELECT [" & Fieldx & "] as Fld" & _
            " FROM [" & Source & "]" & _
            " WHERE [" & Identity & "]=" & Value
      
      ' open recordset.
      rs.Open SQL, cnn, adOpenForwardOnly, adLockReadOnly
      
      ' concatenate the field.
      Do While Not rs.EOF
        If Not IsNull(rs!Fld) Then
          vFld = vFld & ", " & rs!Fld
        End If
        rs.MoveNext
      Loop
      ' remove leading comma and space.
      vFld = Mid(vFld, 3)
      
      Set cnn = Nothing
      Set rs = Nothing
      
      ' return concatenated string.
      Conc = vFld
    End Function
    
    puoi notare che, seppure specifico è l'impiego di ADODB recorset è stata implementata per un uso generale (utilizzando parametri esterni).

    Quindi consiglio (quando si vuole implementare una funzione) di cercare di renderla il più versatile possibile.
    Rivedendo la tua funzione, un primo passo potrebbe essere il seguente:

    Public Function ConcatenaRighe(NomeCampo As String, NomeTabella As String, Optional Criterio As String, Optional Separatore As String) As String
    ' Funzione che concatena i valori di un campo (in una tabella/query) in base ad un criterio (se voluto)
    ' con un carattere di separazione che se non specificato è il punto e virgola fra le varie occorrenze.
    ' Uso:
    '   ? ConcatenaRighe("Field1", "tblData", "ID=1", ",")
    '   ? ConcatenaRighe("Field1", "tblData", "ID=1")
    '   ? ConcatenaRighe("Field1", "tblData")
    
        Dim DBcorrente As DAO.Database
        Dim TabRighe As DAO.Recordset
        Dim strSQL As String
        Dim strSeparatore As String
        Dim strRitorno As String
        'definisce il criterio di selezione come stringa SQL:
    
        If Len(Criterio) = 0 Then
            ' ricerca in tutta la tabella/query
            strSQL = "SELECT * FROM [" & LTrim(RTrim(NomeTabella)) & "]"
        Else
            ' Ricerca solo in base al criterio della condizione WHERE
            strSQL = "SELECT * FROM [" & LTrim(RTrim(NomeTabella)) & "] WHERE " & Criterio
        End If
        Set DBcorrente = CurrentDb
        Set TabRighe = DBcorrente.OpenRecordset(strSQL, dbOpenDynaset)
    
        If Len(Separatore) = 0 Then
            strSeparatore = ";"     ' separatore di default fra le occorrenze
        Else
            strSeparatore = Separatore
        End If
        strRitorno = ""
        If Not (TabRighe.BOF And TabRighe.EOF) Then
            TabRighe.MoveFirst
            strRitorno = Nz(TabRighe.Fields(NomeCampo), "") 'Nz() evita errori quando si cerca di concatenare campi con valori Null
            TabRighe.MoveNext
            Do Until TabRighe.EOF
                strRitorno = strRitorno & strSeparatore & Nz(TabRighe.Fields(NomeCampo), "")
                TabRighe.MoveNext
            Loop
        End If
        ConcatenaRighe = strRitorno
        TabRighe.Close
        DBcorrente.Close
        Set TabRighe = Nothing
        Set DBcorrente = Nothing
        
    End Function
    
    Da notare che la suddetta funzione presenta un vincolo, in quanto il campo (su cui si effetta la concatenazione) è di tipo stringa, qualora la si volesse impiegare con qualsiasi tipo di dato sarebbe da integrare con una operazione di conversione fra tipi dati.
    Può essere questa (vista l'esigenza di avvicinarsi ai recordset) una opportunità di approfondimento.
    ℹ️ Leggi di più su willy55 ...

  10. #10
    greeek27 non è in linea Novello
    Post
    6
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao Willy55,

    Considera, ad esempio, che se dovrai impiegare la funzione da te realizzata su altri elementi (tabella, campo, criterio) dovrai variarne il codice interno; quindi è utile costruire una funzione a cui possano essere forniti, dall'esterno, i parametri necessari in modo da rendere versatile il suo funzionamento.
    in effetti il problema della riusabilità del codice è spesso trascurato, specialmente dai "programmatori occasionali" come me, mentre meriterebbe comunque maggiore attenzione anche se al momento che si scrive il codice non si ritiene di doverlo riutilizzare, sia per una questione di stile di programmazione e anche per acquisire una pratica utile in generale.

    Da notare che la suddetta funzione presenta un vincolo, in quanto il campo (su cui si effetta la concatenazione) è di tipo stringa, qualora la si volesse impiegare con qualsiasi tipo di dato sarebbe da integrare con una operazione di conversione fra tipi dati.
    Ho provato ad aggiungere nella tua funzione la combinazione delle funzioni Trim(CStr() per forzare la conversione in tipo stringa anche dei valori numerici e sembra funzionare...:

    Public Function ConcatenaRighe(NomeCampo As String, NomeTabella As String, Optional Criterio As String, Optional Separatore As String) As String
    ' Funzione che concatena i valori di un campo (in una tabella/query) in base ad un criterio (se voluto)
    ' con un carattere di separazione che se non specificato è il punto fra le varie occorrenze.
    ' Uso:
    '   ? ConcatenaRighe("Field1", "tblData", "ID=1", ",")
    '   ? ConcatenaRighe("Field1", "tblData", "ID=1")
    '   ? ConcatenaRighe("Field1", "tblData")
    
        Dim DBcorrente As DAO.Database
        Dim TabRighe As DAO.Recordset
        Dim strSQL As String
        Dim strSeparatore As String
        Dim strRitorno As String
        'definisce il criterio di selezione come stringa SQL:
        If Len(Criterio) = 0 Then
            ' ricerca in tutta la tabella/query
            strSQL = "SELECT * FROM [" & Trim(NomeTabella) & "]" ' Ho sostituito la combinazione di LTrim(RTrim()) con Trim()
        Else
            ' Ricerca solo in base al criterio della condizione WHERE
            strSQL = "SELECT * FROM [" & Trim(NomeTabella) & "] WHERE " & Criterio
        End If
        Set DBcorrente = CurrentDb
        Set TabRighe = DBcorrente.OpenRecordset(strSQL, dbOpenDynaset)
        If Len(Separatore) = 0 Then
            strSeparatore = "."     ' separatore di default fra le occorrenze
        Else
            strSeparatore = Separatore
        End If
        strRitorno = ""
        If Not (TabRighe.BOF And TabRighe.EOF) Then
            TabRighe.MoveFirst
            strRitorno = Trim(CStr(Nz(TabRighe.Fields(NomeCampo), ""))) 'Nz() evita errori quando si cerca di concatenare campi con valori Null; CStr() forza la conversione in stringa anche di valori numerici e Trim() elimina lo spazio eventualmente aggiunto in testa alla stringa
            TabRighe.MoveNext
            Do Until TabRighe.EOF
                strRitorno = strRitorno & strSeparatore & Trim(CStr(Nz(TabRighe.Fields(NomeCampo), "")))
                TabRighe.MoveNext
            Loop
        End If
        ConcatenaRighe = strRitorno
        TabRighe.Close
        DBcorrente.Close
    End Function
    
    Grazie mille e ciao!

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Creazione Datagridview con campi numerici
    Da momodj20 nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 28-12-2020, 07:29
  2. Unione più campi numerici in uno
    Da Giginiello nel forum Microsoft Access
    Risposte: 12
    Ultimo Post: 19-02-2016, 19:50
  3. Risposte: 10
    Ultimo Post: 24-07-2014, 17:03
  4. [Access] Campi numerici
    Da matteo_77 nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 04-07-2007, 15:14
  5. Campi memo in CR8
    Da Carmen nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 25-05-2007, 08:10