Ricerca su date
viewtopic.php?f=5&t=979&p=3917&hilit=between
che purtroppo è stata chiusa (*).
La continuo aggiornandola.
In videata Table Oriented una clausola di selezione cronologica in query source value (campo Aggregatore) produce erroneamente in ricerca un insieme vuoto di elementi.
Il codice SQL di query eseguito direttamente
[§]
- Code: Select all
select A.AGGREGATORE as AGGREGAGGREG
, A.AGGREGATORE || ' - ' || A.DESCRIZIONE as AGGRDESCAGGR
from AGGREGATORI A
where ((NVL( null /* <- Param 1 = null */
, NVL(A.DATA_FINE_VALIDITA, TO_DATE('2200-12-31', 'YYYY-MM-DD'))
)
BETWEEN
A.DATA_INIZIO_VALIDITA
AND
NVL(A.DATA_FINE_VALIDITA, TO_DATE('2200-12-31', 'YYYY-MM-DD'))
)
)
Param 1 = Null
produce invece l'insieme corretto di valori.
Stesso problema riprodotto
o - in query di lookup e decodifica costruita su nuovo campo di pannello ad hoc
o - su videata di lookup assemblata al volo, sempre per test

La sostituzione di between() con confronto tra date (>=, <=) non corregge il malfunzionamento.
Rimozione parziale delle clausole cronologiche non corregge il malfunzionamento.
Problema di passaggio date? (cfr. viewtopic.php?f=5&t=979&p=3917&hilit=between, appunto)
E' intervenuto Matteo Sirri, vorrei riportare qui i risultati interessanti dell'intervento.
1) Verifica del malfunzionamento
Primo giro di test. Matteo ha verificato che a tempo di esecuzione la combo associata ad Aggregatore erroneamente non presentava alcun valore per la scelta.
2) Verifica del comportamento diretto in base dati
Ha estratto dal tracer la query source value generata per il campo aggregatore e l'ha eseguita direttamente da IDE In.De (v. § sopra).
Ha chiesto se variassimo la base dati connessa in corso di esecuzione e a risposta negativa ha aperto una videata della base dati So4. La tecnica è quella di selezionare una tabella qualsiasi in albero di progetto, menù contestuale, Wizard – Mostra Dati

e di incollare, nella finestra creata, il testo della query ed eseguirla.

La query così eseguita recuperava, correttamente, i due record attesi.
3) Driver JDBC?
Matteo ha sospettato che potesse essere un problema di driver JDBC.
4) Verifica driver JDBC via codice In.De: con iniezione
In una qualche procedura (Matteo ha scelto per rapidità l'evento Initialize() dell'applicazione) egli
o - ha creato un PreparedStatement
o - gli ha impostato come comando l'istruzione di query (v. q sopra)
o - ha iniettato (via add()) il parametro nullo
o - ha eseguito il comando, recuperandone il record set
o - ha tracciato via DTTLogMessage il numero di record in esso contenuti.

Il tracer riportava zero come valore ottenuto in output (zero record caricati).
Il codice esercitava l'iniezione del valore null nella istruzione SQL.

5) Verifica driver JDBC via codice In.De: senza iniezione
A questo punto Matteo ha verificato il comportamento senza inizione del parametro null, cablando direttamente questo valore nella query.

Il risultato è stato che il record set era popolato dei due record come avrebbe dovuto essere.

6) Diagnosi
Il driver JDBC in questo caso ha problemi con l'iniezione del parametro null.
7) Soluzione
Riscrivere la query in modo alternativo
Ad esempio la clausola di selezione cronologica come
- Code: Select all
isNull(AUO.Al) and isNull(DataFine)
or
not isNull(AUO.Al) and isNull(DataFine) and DatraInizio <= AUO.Al
or
not isNull(AUO.Al) and not isNull(DataFine) and AUO.Al between DataInizio and DataFine