Export risultato maschera filtrata con campo "(Empty)"

Anonimo
2021-09-19T12:44:29+00:00

Ciao a tutti,

come al solito avrei bisogno di un aiuto per sistemare il mio database...

In una maschera ho alcune caselle combinate e caselle di testo che servono a filtrare i dati di una tabella, i risultati del filtro vengono visualizzati nel corpo della maschera. Ho aggiunto anche un pulsante che mi permette di esportare in un file Excel la tabella filtrata.

Tutto ha sempre funzionato molto bene fino a quando, qualche tempo fa, ho inserito nelle varie caselle combinate anche il campo "(Empty)" perché nella tabella a cui applico il filtro questi campi non sono necessariamente compilati.

La maschera filtrata viene visualizzata correttamente, ma l'export del risultato non funziona, ad esempio inserendo in una casella combinata il campo "(Empty)" il foglio Excel risulta vuoto. La domanda è questa:

Come faccio ad inserire il campo "(Empty)" anche nell'export?

Vi posto anche il codice che ho usato per inserire il campo "(Empty)" nelle caselle combinate:

  • Origine riga casella combinata:

SELECT Nz([Platform].[ID_platform],0) AS Espr2, IIf(IsNull([platform]),"(Empty)",[platform]) AS Espr1

FROM Report LEFT JOIN Platform ON Report.ID_platform = Platform.ID_platform

WHERE (((Nz([ID_discipline],0))=IIf([forms].[Search Report].[cboDiscipline] Is Null,Nz([ID_discipline],0),[forms].[Search Report].[cboDiscipline])) AND ((Nz([ID_division],0))=IIf([forms].[Search Report].[cbodivision] Is Null,Nz([ID_division],0),[forms].[Search Report].[cbodivision])) AND ((Nz([ID_work_task],0))=IIf([forms].[Search Report].[cboWorktask] Is Null,Nz([ID_work_task],0),[forms].[Search Report].[cboWorktask])) AND ((Nz([ID_Analyst],0))=IIf([forms].[Search Report].[cboAnalyst] Is Null,Nz([ID_Analyst],0),[forms].[Search Report].[cboAnalyst])) AND ((Nz([ID_component],0))=IIf([forms].[Search Report].[cboComponent] Is Null,Nz([ID_component],0),[forms].[Search Report].[cboComponent])) AND ((Nz([ID_vehicle_programcode],0))=IIf([forms].[Search Report].[cboVehicle] Is Null,Nz([ID_vehicle_programcode],0),[forms].[Search Report].[cboVehicle])))

GROUP BY Nz([Platform].[ID_platform],0), IIf(IsNull([platform]),"(Empty)",[platform])

ORDER BY IIf(IsNull([platform]),"(Empty)",[platform]);

  • Costruzione del filtro della maschera:

Private Sub btn_Search_Click()

strFilter = vbNullString

With Me

If Len(.cboPlatform & vbNullString) > 0 Then

If .cboPlatform = 0 Then 

   strFilter = strFilter & " and ID\_platform Is Null" 

Else 

   strFilter = strFilter & " and ID\_platform=" & .cboPlatform & "" 

End If 

End If

.

.

.

If Len(.txtKeyword & vbNullString) > 0 Then strFilter = strFilter & " and [Report name] like '*" & .txtKeyword & "*'"

If Len(.txtCTSid & vbNullString) > 0 Then strFilter = strFilter & " and [CTS id] like '*" & .txtCTSid & "*'"

If Len(.txtPdescription & vbNullString) > 0 Then strFilter = strFilter & " and [program_description] like '*" & .txtPdescription & "*'"

If Len(.txtFirstdate & vbNullString) > 0 Then strFilter = strFilter & " and [Release date]>=" & CLng(.txtFirstdate)

If Len(.txtSecondate & vbNullString) > 0 Then strFilter = strFilter & " and [Release date]<" & CLng(.txtSecondate) + 1

If Len(strFilter) &gt; 0 Then 

    strFilter = "1 = 1" + strFilter 

    .Filter = strFilter 

    .FilterOn = True 

Else 

    .FilterOn = False 

    .Filter = vbNullString 

End If

End With

End Sub

  • Export in excel alla pressione del pulsante:

Private Sub ExportExcel_Click()

Dim strSql As String

Dim strFilter As String

Dim qdf As DAO.QueryDef

Const queryFilter As String = "QExport"

On Error GoTo Errore

'Sostituisco nel filtro i nomi relativi alle caselle combinate per evitare l'errore Errore di run-time '3079

strFilter = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Me.Filter, "ID_division", "div.[ID_division]"), "ID_discipline", "disc.[ID_discipline]"), _

"ID_platform", "plat.[ID_platform]"), "ID_vehicle_programcode", "veh.ID_vehicle_programcode"), "ID_work_task", "WT.ID_work_task"), _

"ID_component", "comp.ID_component"), "ID_Analyst", "an.ID_Analyst")

If Len(strFilter) &gt; 0 Then 

strSql = "SELECT div.division as Division, disc.discipline as Discipline, plat.platform as Platform, veh.vehicle_programcode as ProgramCode, " _

& "WT.work_task as WorkTask, [CTS id], comp.component as Component, program_description as [Program Description], " _

& "an.Analyst AS Analyst, [Report name], [Release date], Repository, Note " _

& "FROM (((((((Report AS R INNER JOIN Division AS div ON R.[ID_division] = div.[ID_division]) " _

& "INNER JOIN Discipline AS disc ON R.[ID_discipline] = disc.[ID_discipline]) " _

& "INNER JOIN Platform AS plat ON plat.[ID_platform] = R.[ID_platform]) " _

& "LEFT JOIN Vehicle_ProgramCode AS veh ON veh.ID_vehicle_programcode = R.ID_vehicle_programcode) " _

& "INNER JOIN [Work task] AS WT ON WT.ID_work_task = R.ID_work_task) " _

& "LEFT JOIN Components AS comp ON comp.ID_component = R.ID_component) " _

& "INNER JOIN Analysts AS an ON an.ID_Analyst = R.ID_Analyst) " _

& "WHERE " & strFilter & " ORDER BY [Release date]"

Else 

strSql = "SELECT div.division as Division, disc.discipline as Discipline, plat.platform as Platform, veh.vehicle_programcode as ProgramCode, " _

& "WT.work_task as WorkTask, [CTS id], comp.component as Component, program_description as [Program Description], " _

& "an.Analyst AS Analyst, [Report name], [Release date], Repository, Note " _

& "FROM (((((((Report AS R INNER JOIN Division AS div ON R.[ID_division] = div.[ID_division]) " _

& "INNER JOIN Discipline AS disc ON R.[ID_discipline] = disc.[ID_discipline]) " _

& "INNER JOIN Platform AS plat ON plat.[ID_platform] = R.[ID_platform]) " _

& "LEFT JOIN Vehicle_ProgramCode AS veh ON veh.ID_vehicle_programcode = R.ID_vehicle_programcode) " _

& "INNER JOIN [Work task] AS WT ON WT.ID_work_task = R.ID_work_task) " _

& "LEFT JOIN Components AS comp ON comp.ID_component = R.ID_component) " _

& "INNER JOIN Analysts AS an ON an.ID_Analyst = R.ID_Analyst) " _

& " ORDER BY [Release date]"

End If 

Set qdf = CurrentDb.CreateQueryDef(Name:=queryFilter, sqlText:=strSql)

DoCmd.OutputTo acOutputQuery, "QExport", acFormatXLSX, "", False, , , acExportQualityPrint

CurrentDb.QueryDefs.Delete Name:=queryFilter

Set qdf = Nothing

Exit Sub

Errore:

DoCmd.DeleteObject acQuery, "QExport"

Exit Sub

End Sub

Ovviamente ho riportato solo il codice relativo ad una casella combinata con la costruzione del filtro.

Vi ringrazio in anticipo per l'aiuto. Buona domenica,

Claudio

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

5 risposte

Ordina per: Più utili
  1. Anonimo
    2021-09-20T09:47:14+00:00

    ciao Claudio,

    il filtro si aspetta ti individuare il valore empty nella tabella, invece trova null e quindi non restituisce nulla.

    Devi convertire empty in null nel filtro e convertire null in empty nell'estrazione.

    ciao, Sandro.

    Ciao Sandro,

    scusami, non essendo esperto di VBA e SQL non ho capito come procedere.

    Nell'origine riga della casella combinata ho convertito null in zero e la prima opzione di scelta della casella è la stringa "(empty)" quindi il filtro l'ho gestito così:

     If Len(.cboPlatform & vbNullString) > 0 Then
    
        If .cboPlatform = 0 Then
    
           strFilter = strFilter & " and ID_platform Is Null"
    
        Else
    
           strFilter = strFilter & " and ID_platform=" & .cboPlatform & ""
    
        End If
    

    End If

    E tutto funziona correttamente.

    Ora durante l'estrazione devo impostare il predicato sql in modo che quando l'indice della combo box sia pari a zero (cioè quando nella combo box seleziono "(empty)") mi esporti i record con i corrispondenti campi null, io ho provato in questo modo, ma non funziona:

    strFilter = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Me.Filter, "ID_division", "div.[ID_division]"), "ID_discipline", "disc.[ID_discipline]"), _ 
    
    "ID_platform", "plat.[ID_platform]"), "ID_vehicle_programcode", "veh.ID_vehicle_programcode"), "ID_work_task", "WT.ID_work_task"), _ 
    
    "ID_component", "comp.ID_component"), "ID_Analyst", "an.ID_Analyst")
    
        If Len(strFilter) > 0 Then 
    
    strSql = "SELECT div.division as Division, disc.discipline as Discipline, " _ 
    
    & "IIF (plat.platform = 0, plat.platform = Null, plat.platform) as Platform, " _ 
    
    & "veh.vehicle_programcode as ProgramCode, " _ 
    
    & "WT.work_task as WorkTask, [CTS id], comp.component as Component, program_description as [Program Description], " _ 
    
    & "an.Analyst AS Analyst, [Report name], [Release date], Repository, Note " _ 
    
    & "FROM (((((((Report AS R INNER JOIN Division AS div ON R.[ID_division] = div.[ID_division]) " _ 
    
    & "INNER JOIN Discipline AS disc ON R.[ID_discipline] = disc.[ID_discipline]) " _ 
    
    & "INNER JOIN Platform AS plat ON plat.[ID_platform] = R.[ID_platform]) " _ 
    
    & "LEFT JOIN Vehicle_ProgramCode AS veh ON veh.ID_vehicle_programcode = R.ID_vehicle_programcode) " _ 
    
    & "INNER JOIN [Work task] AS WT ON WT.ID_work_task = R.ID_work_task) " _ 
    
    & "LEFT JOIN Components AS comp ON comp.ID_component = R.ID_component) " _ 
    
    & "INNER JOIN Analysts AS an ON an.ID_Analyst = R.ID_Analyst) " _ 
    

    & "WHERE " & strFilter & " ORDER BY [Release date] DESC"

    Ciao,

    Claudio

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2021-09-20T06:19:36+00:00

    ciao Claudio,

    il filtro si aspetta ti individuare il valore empty nella tabella, invece trova null e quindi non restituisce nulla.

    Devi convertire empty in null nel filtro e convertire null in empty nell'estrazione.

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2021-09-19T20:48:39+00:00

    ciao Claudio,

    La maschera filtrata viene visualizzata correttamente, ma l'export del risultato non funziona, ad esempio inserendo in una casella combinata il campo "(Empty)" il foglio Excel risulta vuoto. La domanda è questa:

    non hai inserito un campo semmai un visualizzi un valore nella combo box convertendolo da null.

    Da quello che vedo il valore empty deve essere restituito nel predicato sql che utilizzi per l'export verso excel secondo me, sempre se ho capito il tuo intento, non serve nella combo.

    Presta comunque attenzione al significato specifico di empty in access che è diverso da null, nel tuo caso direi meglio null e non emprty

    Facci sapere.

    Ciao, Sandro.

    Ciao Sandro,

    grazie per la risposta, hai perfettamente ragione: visualizzo un valore testuale “(empty)” convertito da null (nel primo post mi sono espresso veramente male). In questo modo riesco a filtrare la maschera per un particolare campo che, nella tabella, non è compilato, come il valore “(vuote)” per il filtro Excel.

    Per ogni casella combinata, dovrei poter filtrare tutti i record che ad esempio hanno uno o più campi vuoti.

    Quello che non so fare è passare questo valore al predicato sql che utilizzo nell’export: se nella casella combinata seleziono un qualsiasi valore diverso da "(Empty)" devo passare l'id corrispondente alla selezione effettuata, se invece seleziono "(Empty)" devo poter esportare solo i record che hanno quel particolare campo vuoto.

    Grazie. Buona serata,

    Claudio

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Eliminata

    Questa risposta è stata eliminata a causa di una violazione del codice di comportamento. La risposta è stata segnalata manualmente o identificata tramite il rilevamento automatizzato prima dell'esecuzione dell'azione. Per ulteriori informazioni, fai riferimento al codice di comportamento.


    I commenti sono stati disattivati. Ulteriori informazioni

  5. Anonimo
    2021-09-19T18:06:40+00:00

    ciao Claudio,

    La maschera filtrata viene visualizzata correttamente, ma l'export del risultato non funziona, ad esempio inserendo in una casella combinata il campo "(Empty)" il foglio Excel risulta vuoto. La domanda è questa:

    non hai inserito un campo semmai un visualizzi un valore nella combo box convertendolo da null.

    Da quello che vedo il valore empty deve essere restituito nel predicato sql che utilizzi per l'export verso excel secondo me, sempre se ho capito il tuo intento, non serve nella combo.

    Presta comunque attenzione al significato specifico di empty in access che è diverso da null, nel tuo caso direi meglio null e non emprty

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento