Newsgroup: it.comp.appl.access
Titolo: applicare filtro a docmd.outputto

buongiorno a tutti, 
 
ho una form associata ad una query che mi mostra 100 record
durante l'utilizzo della form in modalità datasheet applico altri filtri ottenendo un numero inferiore di record rispetto i 100 iniziali
 
quando però eseguo docmd.outputo della form mi esporta tutti i 100 record
ignorando i filtri applicati successivamente
 
sapete aiutarmi a impostare il filtro prima del comando
docmd.outputto?
 
Grazie a tutti.


Una miriade di anni fa, incontrando il tuo stesso problema con le SubForms, buttai giù quanto segue.
Funziona abbastanza bene ma è stato scritto per Access 97, quindi è senz'altro migliorabile (all'epoca le Forms non esponevano la proprietà .RecordSet)
Prova un pò.
 
 
'Esportazione delle Form/SubForm attive, in Excel o Word
Public Function EsportaForm(Formato As String)
 
  Dim ActFrm As Form, ActCtr As Control
  Dim FormAperta As Boolean
 
  On Error GoTo GestErr:
 
  Set ActFrm = Screen.ActiveForm      'Si riferisce SEMPRE alla Form Principale
  Set ActCtr = Screen.ActiveControl    'Il Controllo attivo può appartenere (anche) ad una Sottomaschera...
 
  If ActFrm.RecordSource = vbNullString And ActCtr.ControlSource = vbNullString Then
         MsgBox "La Maschera non contiene dati da esportare!", vbInformation, "Errore"
 
         Set ActCtr = Nothing
         Set ActFrm = Nothing
 
         Exit Function
  End If    
 
  Application.Echo False
 
  'Nel caso il Focus sia in una SOTTOMASCHERA la esporta ... prima però deve aprila come Form ordinaria.
  'Il codice sottostante è necessario perchè (dannato lui)  DoCmd.RunCommand acCmdOutputTo  NON esporta il
  'contenuto delle Sottomaschere.
  If 
ActCtr.Parent.Name
 <> ActFrm.Name Then   'Constata che il FOCUS è all'interno di una maledetta Sottomaschera
 
         Dim Ctr As Control, NomeCorniceSubFrm As String
         Dim CampoMaster As String, CampoChild As String, strFilter As String
         Dim ActSubFrm As Form, NewFrm As Form
 
         'Ricerca <NomeCorniceSubFrm> che contiene Forms(
Screen.ActiveControl.Parent.Name
)
         For Each Ctr In ActFrm.Controls
                If Ctr.ControlType = acSubform Then
                        If Ctr.SourceObject = 
ActCtr.Parent.Name
 Then
                                NomeCorniceSubFrm = Ctr.Name
                                'Memorizza campi Master/Secondario (se non impostati, le Link...Fields = VbNullString)
                                CampoMaster = Ctr.LinkMasterFields
                                CampoChild = Ctr.LinkChildFields
                        End If
                End If
         Next Ctr
 
         'Apre la Sottomaschera come Form ordinaria (in modalità Foglio Dati perchè la migliore per esportare in Excel)
         DoCmd.OpenForm 
ActCtr.Parent.Name
, acFormDS
 
         FormAperta = True
 
         Set ActSubFrm = ActFrm.Controls(NomeCorniceSubFrm).Form
         Set NewFrm = Forms(
ActCtr.Parent.Name
)
 
         '--------------------------------------------------------------------------------------------------------------------------------------------------
         'Applica alla nuova Form aperta le proprietà della SubForm che determinano il Set di Dati (Filter e OrderBy non
         'è detto che siano presenti)
         NewFrm.RecordSource = ActSubFrm.RecordSource
 
         'Se presenti campi Master/Child costruisce stringa di Filtro da applicare a NewFrm
         If CampoMaster <> vbNullString Then
                strFilter = "[" & CampoChild & "]" & "=" & "Forms!" & ActFrm.Name & "!" & "[" & CampoMaster & "]"
 
                If ActSubFrm.FilterOn = True And ActSubFrm.Filter <> vbNullString Then
                       strFilter = strFilter & " AND " & ActSubFrm.Filter
                End If
         Else
                strFilter = ActSubFrm.Filter
         End If
 
         NewFrm.Filter = strFilter
         NewFrm.FilterOn = IIf(CampoMaster <> vbNullString, True, ActSubFrm.FilterOn)
         NewFrm.OrderBy = ActSubFrm.OrderBy
         NewFrm.OrderByOn = ActSubFrm.OrderByOn
         '------------------------------------------------------------------------------------------------------------------------------------------------
 
         'Attiva visualizzazione eventuali Colonne nascoste, se associate a un Campo presente nell'origine Dati
         For Each Ctr In NewFrm.Controls
                If VarType(Ctr.Value) <> vbObject And Ctr.ColumnHidden = True Then
                       Ctr.ColumnHidden = False
                End If
         Next Ctr
 
         For Each Ctr In NewFrm.Controls
                If VarType(Ctr.Value) = vbObject Then
                        Ctr.ColumnHidden = True
                End If
         Next Ctr         
 
         Set NewFrm = Nothing
         Set ActSubFrm = Nothing
 
  End If
 
 
  'Esporta i dati contenuti nella Form aperta in Excel, RTF o Text
  If Formato = "Excel" Then
         DoCmd.RunCommand acCmdOutputToExcel
  ElseIf Formato = "Word" Then
         DoCmd.RunCommand acCmdOutputToRTF
  Else
         DoCmd.RunCommand acCmdOutputToText
  End If
 
 
  If FormAperta = True Then DoCmd.Close acForm, 
ActCtr.Parent.Name
 
 
  Set ActCtr = Nothing
  Set ActFrm = Nothing
 
  Application.Echo True
 
  Exit Function
 
GestErr:
 
  Application.Echo True
 
  MsgBox Err.Number & "   " & Err.Description, vbCritical
 
End Function


Apperò, e quelli della Microsoft prevedere un filtro nel comando docmd.OutPutTo magari no è?????? voi che ne dite?
 
 

Cosa leggi nella proprietà Filter di Maschera... prima di lanciare Outputto...?
 
Se va bene usa quella stringa per ricostruire la query on the fly.
 
@Alex


Il filtro in qualche modo lo posso recuperare
 
ma la query on the fly? come?
scorrendo poi il recordset con un ciclo for ed esportando in un file con il comando print "stringa"??
 
 
 
 
 
 
 
 


Ammesso che dentro 'me.filter' si trovi il criterio di selezione che 
vuoi usare:
 
num_file=freefile()
Open "c:\esportassione_righe.csv" for output as num_file
 
' prima riga per titolo colonna Excel
print #num_file,"CODICE;DESCRISSIONE;CODICE IVA;PREZZO"
 
Set MyRs=currentdb.openrecordset("select Codice, Descrisssione, 
Codice_Iva, Prezzo from ARTICOLI where " & me.filter)
 
Do until Myrs.eof
   print #num_file,MyRs("Codice") & ";"
   Print #num_file,Myrs("Descrisssione")	& ";"
   .........
   MyRs.movenext
   Loop
 
Da provare, correggere le sdimenticanse, ma il concetto e' questo


ok, se non trovo una via più semplice nativa Access è sicuramente una soluzione.