Re: Passare a OpenReport filtro e ordinamento. Si puo'?

di il
8 risposte

Re: Passare a OpenReport filtro e ordinamento. Si puo'?

Faccio passare da una funzione pubblica tutte le generazioni di report
La richiesta di report parte da una form che visualizza gia' il risultato di una ricerca
con criteri multipli e ordinata secondo le richieste dell'utente.
Non trovo il modo di generare un report che risponde a entrambe le richieste
sia WHERE che ORDER
E' una cosa che si riesce a ottenere?

Public Function GeneraRepo2(x_NomeRepo, x_CondSQL, x_Order)

Dim myNomePDF As String
Dim myMsg
myNomePDF = DammiCartella() & DammiNomeFile() & Sequencer() & ".PDF"
myMsg = "Generato file" & vbCrLf & myNomePDF & vbCrLf & vbCrLf & "Vuoi aprirlo ?"
If x_CondSQL = "" Then
    If x_Order = "" Then
        DoCmd.OpenReport x_NomeRepo, acViewReport, , , acHidden
    Else
        DoCmd.OpenReport x_NomeRepo, acViewReport, , , acHidden, x_Order
    End If
Else
    If x_Order = "" Then
        DoCmd.OpenReport x_NomeRepo, acViewReport, , x_CondSQL, acHidden
    Else
        DoCmd.OpenReport x_NomeRepo, acViewReport, , x_CondSQL, acHidden, x_Order
    End If
End If
DoCmd.OutputTo acOutputReport, x_NomeRepo, acFormatPDF, myNomePDF
DoCmd.Close acReport, x_NomeRepo, acSaveNo
On Error Resume Next
If MsgBox(myMsg, vbYesNo) = vbYes Then
    Application.FollowHyperlink myNomePDF
End If
On Error Resume Next
If MsgBox(myNomePDF & vbCrLf & "Vuoi cancellare il file ?", vbYesNo) = vbYes Then
    Kill myNomePDF
End If
GeneraRepo2 = True
End Function

8 Risposte

  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    La funzione che hai scritto non serve a nulla... con tutte quelle condizioni veramente inuntili.
    Se la WHERE Condition è NullString non crea problemi, mentre x_Order, lo passi come OpenArgs, quindi lo gestirai poi da Report ad ancora una volta non genera problemi se lo passi come NullString.
    Il problema è che hai dichiarato male i parametri...
    
    Public Function GeneraRepo2(x_NomeRepo As String,Optional x_CondSQL As String=vbNullstring,Optional x_Order As String=vbNullstring)
    
    Dim myNomePDF As String
    Dim myMsg
    myNomePDF = DammiCartella() & DammiNomeFile() & Sequencer() & ".PDF"
    myMsg = "Generato file" & vbCrLf & myNomePDF & vbCrLf & vbCrLf & "Vuoi aprirlo ?"
    
    DoCmd.OpenReport x_NomeRepo, acViewReport, , x_CondSQL, acHidden, x_Order
    
    DoCmd.OutputTo acOutputReport, x_NomeRepo, acFormatPDF, myNomePDF
    DoCmd.Close acReport, x_NomeRepo, acSaveNo
    On Error Resume Next
    If MsgBox(myMsg, vbYesNo) = vbYes Then
        Application.FollowHyperlink myNomePDF
    End If
    On Error Resume Next
    If MsgBox(myNomePDF & vbCrLf & "Vuoi cancellare il file ?", vbYesNo) = vbYes Then
        Kill myNomePDF
    End If
    GeneraRepo2 = True
    End Function
    
    Ora delle cose che serviva controllare... il NomeReport passato come parametro è l'unico che non hai verificato...
    La gestione errori messa li a cosa serve poi, anceh se qualche cosa fallisce sempre TRUE...

    Detto questo, mostra che Valore passi alla funzione come x_CondSQL, altrimenti cosa possiamo dire del "Non funziona"...?
  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    La funzione che hai scritto non serve a nulla
    La funzione non e' un certo un gioiellino ma serve eccome sono io che non mi sono spiegato bene
    Tutti i report che genero da ogni parte della applicazione passano da questa funzione per un motivo preciso
    OpenReport genera un file in formato PDF che l'utente puo' decidere di aprire con il visualizzatore preferito (acrobat reader o altro e con quello se vuole lo stampa) e sempre l'utente decidera' poi se distruggere o conservare il file pdf generato.
    Ovviamente ho usato una funzione per non ripetere lo stesso codice decine di volte nel sorgente.
    La funzione (molto perfettibile ) per questo funziona egregiamente.
    I parametri che passo alla funzione sono variabili locali string in una form e gia' lavorano in una casella di riepilogo la quale ottiene gia' tutti i record rispondenti alla WHERE ed elencati nell'ordine che l'utente ha scelto.
    Per esempio possono essere
    1 il nome di un report esistente
    2 "Anagrafe.CORSO = 'B'"
    3 "DATA_ISCRIZIONE" (order by)
    A video ho i record rispondenti al 2' paramentro e ordinati secondo il 3' parametro
    quello che non ottengo e' che il report generato da OpenReport e' sempre e solo in ordine alfabetico ed e' questo che intendevo con 'non funziona'
    cioe' in buona sostanza non so come utilizzare OPENARGS per il criterio ORDER
    sempre che si possa perche' questa e' la riga SQL del report in questione
    SELECT Anagrafe.ID_ANAGRAFE, Anagrafe.NOME, Anagrafe.FASE_CORSO, Anagrafe.DATA_ISCRIZIONE, Anagrafe.CORSO, Anagrafe.EX_PATENTE, Anagrafe.TEORIA_END, Anagrafe.F_ROSA_END, Anagrafe.MATRICOLA, Anagrafe.REGISTRO_NUM, Anagrafe.ATTIVO, Anagrafe.STATINO, Anagrafe.REGISTRO_DATA, Anagrafe.VISITA_DOC, Anagrafe.VISITA_DATA, Anagrafe.SEX, Anagrafe.NATO_IL, Anagrafe.NATO_A, Anagrafe.NATO_PROV, Anagrafe.COD_FISCALE, Anagrafe.EXTRA_UE, Anagrafe.INDIRIZZO, Anagrafe.CAP, Anagrafe.CITTA, Anagrafe.PROV, Anagrafe.TELEFONO, Anagrafe.TEL_ALTRI, Anagrafe.EMAIL, Anagrafe.SOCIAL, Anagrafe.LISTINO, Anagrafe.PROMOZIONI, Anagrafe.NOTE_VELOCI, Anagrafe.LEZ_AULA, Anagrafe.TEO_VOTO, Anagrafe.APP_REG, Anagrafe.APP_MAIL, Anagrafe.APP_IOS, Anagrafe.ALTRE_SCUOLE, Anagrafe.FINANZIAMENTO, Anagrafe.CC_SCUOLA, Anagrafe.NOTE_LUNGHE, Anagrafe.CALENDARIZZATO, Anagrafe.COD_TURNI, Anagrafe.ULTIMO_TURNO, Anagrafe.TEORIA_START, Anagrafe.TEORIA_END, Anagrafe.F_ROSA_START, Anagrafe.F_ROSA_END, Anagrafe.PRIVATISTA, Anagrafe.ESTENSIONE, Anagrafe.RIPORTO_TEO, Anagrafe.GUI_VOTO, Anagrafe.PATENTE_NUM, Anagrafe.PATENTE_DATA, Anagrafe.PATENTE_SCAD, Anagrafe.SEI_GUI_A1_1, Anagrafe.SEI_GUI_A1_2, Anagrafe.SEI_GUI_A1_3, Anagrafe.SEI_GUI_A2_1, Anagrafe.SEI_GUI_A2_2, Anagrafe.SEI_GUI_A2_3, Anagrafe.SEI_GUI_B1_1, Anagrafe.SEI_GUI_B1_2, Anagrafe.SEI_GUI_B1_3, Anagrafe.SEI_GUI_B2_1, Anagrafe.SEI_GUI_B2_2, Anagrafe.SEI_GUI_B2_3, Anagrafe.SEI_GUI_C1_1, Anagrafe.SEI_GUI_C1_2, Anagrafe.SEI_GUI_C1_3, Anagrafe.SEI_GUI_C2_1, Anagrafe.SEI_GUI_C2_2, Anagrafe.SEI_GUI_C2_3, Anagrafe.FILEFOTO
    FROM Anagrafe
    ORDER BY Anagrafe.NOME;
    come faccio a sfruttare OpenArgs per usarlo nell'ultima riga SQL?
  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    Walter61 ha scritto:


    cioe' in buona sostanza non so come utilizzare OPENARGS per il criterio ORDER
    Prima di tutto sai come gestire OpenArgs lato report? Una volta imparato metti mano alla proprietà OrderBy del report. Non devi modificare nulla nella SQL, tanto per esser chiari.
  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    come gestire OpenArgs lato report?
    Forse forse qualcosina intuisco...
    praticamente devo andare a modificare le proprieta' del report
    precisamente in 'Su caricamento' e aggiungere il codice che sfrutta openargs
    E' corretto ?
  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    Private Sub Report_Load()
    
    ' PROBABILMENTE E' QUI CHE BISOGNA INSERIRE IL CODICE PER MODIFICARE ORDER BY
    
    Dim myOrder
    myOrder = "NESSUN ORDINE"   'questo solo per ispezionare le variabili locali in debug con una interruzione
    
    If Not IsNull(Me.OpenArgs) Then
        myOrder = Me.OpenArgs
        Me.OrderByOn = True
        Me.OrderBy = myOrder
    End If
    End Sub
    
    Questo dovrebbe essere il passaggio richiesto
    Con il punto di interruzione effettivamente verifico che il parametro passato e' 'CORSO'
    e vorrei generare il report in ordine di 'CORSO' ma viene generato sempre e soltanto in ordine di 'NOME'
    Dove sbaglio?
  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    Walter61 ha scritto:


    ...
    e vorrei generare il report in ordine di 'CORSO' ma viene generato sempre e soltanto in ordine di 'NOME'
    Attenzione che se hai l'ordinamento impostato a livello di struttura del report questo non funziona, o meglio bisogna cambiare strategia.
    Prima imposta a False la proprietà OrderByOn, modifichi la proprietà OrderBy e reimposti a True OrderByOn
    Occhio alla modalità di apertura del report acViewReport, può fare brutti scherzi.
  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    Ribadisco, e leggi bene la funzione che ti ho riscritto con più attenzione tecnica, che la funzione come l'hai scritta è piena di cose inutili tecnicamente da eliminare... come l'ho modificata va bene ma cerca di capire cosa ho fatto e perché prima di rispondere... altrimenti sembra non ti interessi capire ma solo controbattere e penso sia poco utile.. dal momento che sei tu a chiedere.

    Detto questo devi concentrarti su OpenArgs e come usarlo nel Report per passare il criterio di ordinamento... e Phil ti sta già dando suggerimenti.

    P.S. Credo tuttavia che il sistema che cerchi di flessibilizzare, per i Report, e parlo dell'Ordinamento, potrebbe rislutare deludente se nei Report hai operato dei RAGGRUPPAMENTI..., in quel caso l'OrderBy non funzionerebbe... andrebbe fatto nella query origine oppure nei GroupLevel...
  • Re: Re: Passare a OpenReport filtro e ordinamento. Si puo'?

    hai operato dei RAGGRUPPAMENTI
    Esattamente come mi suggerisci, c'era un raggruppamento nel report ed eliminato quello ora tutto fila liscio.
    Riveduta e corretta la funzione che genera il report in PDF che non ha bisogno di verificare se i parametri sono nulli essendo stati etichettati come opzionali
    Public Function GeneraRepo(x_NomeRepo As String, Optional x_CondSQL As String = vbNullString, Optional x_Order As String = vbNullString)
    
    Dim myNomePDF As String
    Dim myMsg As String
    myNomePDF = DammiCartella() & DammiNomeFile() & Sequencer() & ".PDF"
    myMsg = "Generato file" & vbCrLf & myNomePDF & vbCrLf & vbCrLf & "Vuoi aprirlo ?"
    DoCmd.OpenReport x_NomeRepo, acViewReport, , x_CondSQL, acHidden, x_Order
    DoCmd.OutputTo acOutputReport, x_NomeRepo, acFormatPDF, myNomePDF
    DoCmd.Close acReport, x_NomeRepo, acSaveNo
    On Error Resume Next
    If MsgBox(myMsg, vbYesNo) = vbYes Then
        Application.FollowHyperlink myNomePDF     ' qui conviene verificare l'esistenza dal file...
    End If
    On Error Resume Next
    If MsgBox(myNomePDF & vbCrLf & "Vuoi cancellare il file ?", vbYesNo) = vbYes Then
        Kill myNomePDF		' anche qui conviene verificare l'esistenza del file
    End If
    GeneraRepo = True
    End Function
    una volta impartito il docmd.openreport si verifica se e quale ordinamento si vuole
    Private Sub Report_Load()
    
    If Not IsNull(Me.OpenArgs) Then
        Me.OrderByOn = False
        Me.OrderBy = Me.OpenArgs
        Me.OrderByOn = True
    End If
    End Sub
    Grazie Alex e Phil
Devi accedere o registrarti per scrivere nel forum
8 risposte