Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Query parametrica a campi incrociati con vba access

    Ciao ho un problema con una maschera e una sottomaschera basata su query parametrica

    In pratica la sottomaschera basata sulla query dovrebbe mostrare i record in base all' inserimento di uno o due criteri (intervallo date o cognome e nome)

    In realtà il tutto funzionava solo impostando l' intervallo date,una volta aggiunto come criterio il cognome e il nome il risultato è stato la moifica dei criteri della query (cancellati) oppure la cancellazione dell' intera query

    Questa è la query:
    codice:
    SELECT Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, Sum(([PagaOraNetta]*[OreLavorate])) AS Totale, PaghePromot.PagamEffettuato
    FROM Promotori INNER JOIN (PaghePromot INNER JOIN PaghePromVoci ON PaghePromot.ID_PagheProm=PaghePromVoci.ID_PagheProm) ON Promotori.ID_Promotore=PaghePromot.Promotore
    WHERE (((PaghePromot.DataRitAcconto) Between Forms!MostraPagaPromotori!DataInizio And Forms!MostraPagaPromotori!DataFine)) Or (((Promotori.CognomeNomePromotore)=Forms!MostraPagaPromotori!ControlloNome))
    GROUP BY Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, PaghePromot.PagamEffettuato;
    e questo è il codice che ho messo nella maschera principale
    codice:
    Private Sub MostraPagaPromotori_Click()
    
         'Verifica che la data di fine sia successiva alla data di inizio. 
        If DataFine < DataInizio Then
            MsgBox "La data di fine deve essere successiva alla data di inizio."
            DataInizio.SetFocus
            Exit Sub
        End If
    
         '  Crea una istruzione SQL utilizzando il criteri di ricerca immesso dall'utente 
         '  e imposta la proprietà OrigineRecord della ControlloPagamentiPromotori. 
        
    
        Dim strSQL
        Dim qdf As New QueryDef
        
    
    
          '  Crea l'istruzione SELECT. 
        strSQL = "SELECT Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, Sum(([PagaOraNetta]*[OreLavorate])) AS Totale, PaghePromot.PagamEffettuato "
        strSQL = strSQL & "FROM Promotori INNER JOIN (PaghePromot INNER JOIN PaghePromVoci ON PaghePromot.ID_PagheProm = PaghePromVoci.ID_PagheProm) ON Promotori.ID_Promotore = PaghePromot.Promotore "
        strSQL = strSQL & "WHERE (((PaghePromot.DataRitAcconto Between #" & Format(Me!DataInizio, "mm/dd/yyyy") & "#"
        strSQL = strSQL & " And #" & Format(Me!DataFine, "mm/dd/yyyy") & "#) "
        strSQL = strSQL & "OR ((Promotori.CognomeNomePromotore) = ([Forms]![MostraPagaPromotori]![ControlloNome]))) "
        strSQL = strSQL & "GROUP BY Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, PaghePromot.PagamEffettuato;"
          ' Ora salviamo la query come nuovo oggetto nel db corrente! 
           ' (prima ne eliminiamo l'eventuale istanza precedente! 
        On Error Resume Next
        DoCmd.DeleteObject acQuery, "ControlloPagamentiPromotori"
        qdf.Name = "ControlloPagamentiPromotori"
        qdf.SQL = strSQL
        CurrentDb.QueryDefs.Append qdf
        Set qdf = Nothing
            
          '  Imposta la proprietà OrigineRecord della SottomascheraMostraVendite. 
        Me!SottoMPagaPromotori.Form.RecordSource = "ControlloPagamentiPromotori"
        Me.Testo51.Requery
          
    
        
        
        '  Se i criteri non sono soddisfatti da alcun record, reimposta la proprietà OrigineRecord della sottomaschera, 
          '  visualizza un messaggio e attiva la casella di testo Data di inizio. 
        If Me!SottoMPagaPromotori.Form.RecordsetClone.RecordCount = 0 Then
            Me!SottoMPagaPromotori.Form.RecordSource = "SELECT CognomeNomePromotore FROM Promotori WHERE False;"
            MsgBox "Nessun record corrisponde ai criteri immessi.", vbExclamation, "Nessun record trovato"
            Me!DataInizio.SetFocus
        Else
              '  Attiva i controlli della sezione Corpo. 
            AttivaControlli Me, acDetail, True
              ' Sposta il punto di inserimento nella ControlloPagamentiPromotori. 
            Me!SottoMPagaPromotori!CognomeNomePromotore.SetFocus
            
        End If
      
      
     
     End Sub

  2. #2
    La condizione where è scritta male, non capisco se è un problema di spazi o di parentesi

    I criteri della query vengono cancellati (in questo caso la query non viene completamente eliminata) quando nella maschera principale scrivo così
    codice:
        strSQL = strSQL & "WHERE (PaghePromot.DataRitAcconto Between #" & Format(Me!DataInizio, "mm/dd/yyyy") & "#"
        strSQL = strSQL & " And #" & Format(Me!DataFine, "mm/dd/yyyy") & "#) "
        strSQL = strSQL & "OR ((Promotori.CognomeNomePromotore) = (Forms!MostraPagaPromotori!ControlloNome)) "
    Errore restituito quando provo ad aprire la query in visualizzazione struttura:
    <Nome> nell'espressione criterio. (3076).

    Qualche suggerimento?

  3. #3
    dopo che hai costruito la query, fattela stampare e postala

  4. #4
    Ciao grazie tante per la risposta

    questa è l' istruzione sql della query:
    codice:
    SELECT Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, Sum(([PagaOraNetta]*[OreLavorate])) AS Totale, PaghePromot.PagamEffettuato
    FROM Promotori INNER JOIN (PaghePromot INNER JOIN PaghePromVoci ON PaghePromot.ID_PagheProm=PaghePromVoci.ID_PagheProm) ON Promotori.ID_Promotore=PaghePromot.Promotore
    WHERE (((PaghePromot.DataRitAcconto) Between Forms!MostraPagaPromotori!DataInizio And Forms!MostraPagaPromotori!DataFine)) Or (((Promotori.CognomeNomePromotore)=Forms!MostraPagaPromotori!ControlloNome))
    GROUP BY Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, PaghePromot.PagamEffettuato;
    Il codice vba in pratica scrive nei criteri della query ciò che ho messo nella maschera principale
    Inoltre scrivendo così per la data nel vba : Me!DataInizio nessun problema
    Mentre per il criterio Cognome e nome sono costretto a sostituire Me! con il nome della maschera MostraPagaPromotori diversamente altrimenti la query non và perchè non trova la maschera

  5. #5
    forse invece di

    codice:
       strSQL = strSQL & "OR ((Promotori.CognomeNomePromotore) = (Forms!MostraPagaPromotori!ControlloNome)) "
    dovresti scrivere

    codice:
       strSQL = strSQL & "OR ((Promotori.CognomeNomePromotore) = ('" & Forms!MostraPagaPromotori!ControlloNome & "')) "

    facce sape'

  6. #6
    Ho provato a sostituire ma i criteri della query vengono cancellati comunque
    Ho provato a invertire i campi su setfocus, i criteri non vengono cancellati ma continua ad esserci la dipendenza dall' intervallo di date, cioè se seleziono un cognome e nome senza la data, mi viene restituito il record corrispondente, solo che poi vengono di nuovo cancellati i criteri dalla query una volta chiusa la maschera
    Se invece di chiudere la maschera aggiungo un intervallo date, allora mi vengono restituiti tutti i record per quell' intervallo, ignorando il criterio impostato di cognome e nome

  7. #7
    Ho aggiunto il tuo suggerimento alle modifiche che ho apportato a setfocus e alle parentesi tonde

    Pare che si inizi a intravedere la soluzione, solo che non viene accettato come campo vuoto l' intervallo di date: causa la cancellazione del rispettivo criterio nella query
    query:
    codice:
    SELECT Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, Sum(([PagaOraNetta]*[OreLavorate])) AS Totale, PaghePromot.PagamEffettuato
    FROM Promotori INNER JOIN (PaghePromot INNER JOIN PaghePromVoci ON PaghePromot.ID_PagheProm = PaghePromVoci.ID_PagheProm) ON Promotori.ID_Promotore = PaghePromot.Promotore
    WHERE (((PaghePromot.DataRitAcconto) Between #12/12/1212# And #12/12/1212#)) OR (((Promotori.CognomeNomePromotore)=('Cognome1 Nome1')))
    GROUP BY Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, PaghePromot.PagamEffettuato;
    mentre il vba della maschera principale è:
    codice:
    Private Sub MostraPagaPromotori_Click()
    
        'Verifica che la data di fine sia successiva alla data di inizio.
        If DataFine < DataInizio Then
            MsgBox "La data di fine deve essere successiva alla data di inizio."
            DataInizio.SetFocus
            Exit Sub
        End If
    
         '  Crea una istruzione SQL utilizzando il criteri di ricerca immesso dall'utente
         '  e imposta la proprietà OrigineRecord della ControlloPagamentiPromotori.
        
    
        Dim strSQL
        Dim qdf As New QueryDef
        
    
    
          '  Crea l'istruzione SELECT.
        strSQL = "SELECT Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, Sum(([PagaOraNetta]*[OreLavorate])) AS Totale, PaghePromot.PagamEffettuato "
        strSQL = strSQL & "FROM Promotori INNER JOIN (PaghePromot INNER JOIN PaghePromVoci ON PaghePromot.ID_PagheProm = PaghePromVoci.ID_PagheProm) ON Promotori.ID_Promotore = PaghePromot.Promotore "
        strSQL = strSQL & "WHERE (((PaghePromot.DataRitAcconto) Between #" & Format(Me!DataInizio, "mm/dd/yyyy") & "#"
        strSQL = strSQL & " And #" & Format(Me!DataFine, "mm/dd/yyyy") & "#)) "
        strSQL = strSQL & "OR ((Promotori.CognomeNomePromotore) = ('" & Me!ControlloNome & "')) "
        strSQL = strSQL & "GROUP BY Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto, PaghePromot.SPAssegno, PaghePromot.Assegno, PaghePromot.SPBonifico, PaghePromot.Bonifico, PaghePromot.Contanti, PaghePromot.PagamEffettuato;"
        ' Ora salviamo la query come nuovo oggetto nel db corrente!
         ' (prima ne eliminiamo l'eventuale istanza precedente!
        On Error Resume Next
        DoCmd.DeleteObject acQuery, "ControlloPagamentiPromotori"
        qdf.Name = "ControlloPagamentiPromotori"
        qdf.SQL = strSQL
        CurrentDb.QueryDefs.Append qdf
        Set qdf = Nothing
            
        '  Imposta la proprietà OrigineRecord della SottomascheraMostraVendite.
        Me!SottoMPagaPromotori.Form.RecordSource = "ControlloPagamentiPromotori"
        Me.Testo51.Requery
          
    
        
        
        '  Se i criteri non sono soddisfatti da alcun record, reimposta la proprietà OrigineRecord della sottomaschera,
        '  visualizza un messaggio e attiva la casella di testo Data di inizio.
        If Me!SottoMPagaPromotori.Form.RecordsetClone.RecordCount = 0 Then
            Me!SottoMPagaPromotori.Form.RecordSource = "SELECT Promotori.CognomeNomePromotore, PaghePromot.DataRitAcconto FROM Promotori INNER JOIN PaghePromot ON Promotori.ID_Promotore = PaghePromot.Promotore WHERE False;"
            MsgBox "Nessun record corrisponde ai criteri immessi.", vbExclamation, "Nessun record trovato"
            Me!CognomeNomePromotore.SetFocus
        Else
            '  Attiva i controlli della sezione Corpo.
            AttivaControlli Me, acDetail, True
            ' Sposta il punto di inserimento nella ControlloPagamentiPromotori.
            Me!SottoMPagaPromotori!DataInizio.SetFocus
            
        End If
      
      
     
     End Sub

  8. #8
    mentre costruisci la query controlla che i campi non siano vuoti

  9. #9
    Ciò che vorrei ottenere è questo:

    Se seleziono un intervallo di date lasciando vuoto il criterio per nome e cognome vorrei ottenere tutti i nomi e cognomi relativi a quell' intervallo

    Se seleziono un nome e cognome lasciando vuota la data vorrei ottenere tutti i record con quel nome e cognome a prescindere dall' intervallo date

    Se seleziono cognome e nome e intervallo date vorrei ottenere i record con quel nome e cognome riferito all' intervallo date

  10. #10
    Ho cercato query parametrica con criteri vuoti e ho trovato questa istruzione (esempio) da scrivere nel codice della maschera:

    codice:
       SELECT * FROM Prova
             WHERE (DESC=[Ricerca:])
    
       UNION
    
       SELECT * FROM Prova 
             WHERE ((DESC Is Null) And ([Ricerca:] Is Null))
    
       UNION
    
       SELECT * FROM Prova
             WHERE ((DESC="") And ([Ricerca:]=""""));
    L' unico particolare è che non sò come utilizzarlo, andrà riscritta pure la query?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.