Suggerimenti su query

di il
9 risposte

Suggerimenti su query

Ciao a Tutti!
Vi scrivo per chiedervi un suggerimento su come costruire una query, ho una tabella con delle anagrafiche e una tabella che serve per descrivere la tipologia di documento consegnato da un determinato soggetto in anagrafica, quindi sulla tabella documenti ho una colonna "IDAnagrafica" con il relativo campo per registrare la data di consegna. Ora devo costruire una query di verifica nel senso che in base a un periodo di tempo o altri valori deve tirarmi fuori tutte le anagrafiche che non hanno ad esempio consegnato documenti in quel lasso di tempo.

Come la posso impostare?
Sto usando la funzione "IN" è quella che fa al caso mio?

Ciao e buon anno a tutti!

9 Risposte

  • Re: Suggerimenti su query

    Se non mostri la query, come facciamo a saperlo???

    A 'naso' non mi pare che l'operatore IN (non è una funzione) non serva al caso tuo.
  • Re: Suggerimenti su query

    Ciao,
    scusami ho provato a farla sulla base dell'operatore "IN" che indicavo e penso che faccia al caso mio correggetemi se sbaglio, di seguito il mio esempio:
    SELECT dbo_Anagrafica.IDAnagrafica, dbo_Anagrafica.Denominazione, dbo_RegDoc.Anno, dbo_RegDoc.Mese, dbo_RegDoc.IDTipoDoc, dbo_RegDoc.Data
    FROM dbo_RegDoc RIGHT JOIN dbo_Anagrafica ON dbo_RegDoc.IDAnagrafica = dbo_Anagrafica.IDAnagrafica
    WHERE dbo_Anagrafica.IDAnagrafica NOT IN (SELECT dbo_RegDoc.IDAnagrafica FROM dbo_RegDoc WHERE dbo_RegDoc.Mese=3);
    Questa query sembra che mi restituisce quello che volevo cioè tutte le anagrafiche che non hanno consegnato documenti nel mese "3", ora secondo voi la query posta in questo modo è il modo migliore per la verifica sui dati che intendo fare?
    In più ora che devo costruire la maschera di ricerca come è meglio procedere? fin ora associavo la maschera con visualizzazione a "maschere continue" una mia query di base ad esempio:
    SELECT dbo_Anagrafica.IDAnagrafica, dbo_Anagrafica.Denominazione, dbo_RegDoc.Anno, dbo_RegDoc.Mese, dbo_RegDoc.IDTipoDoc, dbo_RegDoc.Data
    FROM dbo_RegDoc RIGHT JOIN dbo_Anagrafica ON dbo_RegDoc.IDAnagrafica = dbo_Anagrafica.IDAnagrafica
    poi da codice costruivo una stringa di filtro che applicavo alla query ora per un codice pulito e ottimizzato come è meglio procedere?
    Lavoro sulla stringa di query direttamente?

    Vi ringrazio per il Vs tempo.
    Ciao!
  • Re: Suggerimenti su query

    Io faccio fatica a leggere le query attraverso il loro SQL. Se posso darti una mano anch'io, gradirei una descrizione così:
    - tutti i campi di entrambe le tabelle
    - tutti i campi della query con i vari criteri, in base a quello che si vede in VISUALIZZAZIONE STRUTTURA. In alternativa potresti allegare o linkare una immagine della stessa.

    Per quel poco che riesco a leggere, non capisco perchè hai i campi Anno, Mese e poi Data. Basta il solo campo Data, dal quale puoi estrapolare tutte le sue parti interne (anno, mese, giorno...).
  • Re: Suggerimenti su query

    OsvaldoLaviosa ha scritto:


    Io faccio fatica a leggere le query attraverso il loro SQL.
    @pizio
    Anch'io faccio fatica a leggere le query SQL, quando non sono formattate con i tag CODE, come previsto dal REGOLAMENTO.
    Formatta la query come si deve , poi ne riparliamo.
  • Re: Suggerimenti su query

    Ciao,
    scusami ho provato a farla sulla base dell'operatore "IN" che indicavo e penso che faccia al caso mio correggetemi se sbaglio, di seguito il mio esempio:
    
    SELECT dbo_Anagrafica.IDAnagrafica, dbo_Anagrafica.Denominazione, dbo_RegDoc.Anno, dbo_RegDoc.Mese, dbo_RegDoc.IDTipoDoc, dbo_RegDoc.Data
    FROM dbo_RegDoc RIGHT JOIN dbo_Anagrafica ON dbo_RegDoc.IDAnagrafica = dbo_Anagrafica.IDAnagrafica
    WHERE dbo_Anagrafica.IDAnagrafica NOT IN (SELECT dbo_RegDoc.IDAnagrafica FROM dbo_RegDoc WHERE dbo_RegDoc.Mese=3)
    
    Questa query sembra che mi restituisce quello che volevo cioè tutte le anagrafiche che non hanno consegnato documenti il cui contenuto fanno riferimento al mese "3", ora secondo voi la query posta in questo modo è il modo migliore per la verifica sui dati che intendo fare?
    In più ora che devo costruire la maschera di ricerca come è meglio procedere? fin ora associavo la maschera con visualizzazione a "maschere continue" una mia query di base ad esempio:
    
    SELECT dbo_Anagrafica.IDAnagrafica, dbo_Anagrafica.Denominazione, dbo_RegDoc.Anno, dbo_RegDoc.Mese, dbo_RegDoc.IDTipoDoc, dbo_RegDoc.Data
    FROM dbo_RegDoc RIGHT JOIN dbo_Anagrafica ON dbo_RegDoc.IDAnagrafica = dbo_Anagrafica.IDAnagrafica
    
    poi da codice costruivo una stringa di filtro che applicavo alla query ora per un codice pulito e ottimizzato come è meglio procedere?
    Lavoro sulla stringa di query direttamente?

    Di seguito vi indico in modo parziale la composizione delle due tabelle:
    Tabella "Anagrafica"
    IDAnagrafica -> Num. automatica
    Denominazione -> Testo breve
    Posto -> Testo breve
    Email -> Testo breve
    PEC -> Testo breve
    Telefono -> Testo breve
    Cellulare -> Testo breve
    Fax -> Testo breve
    Note -> Testo lungo

    Tabella "RegDoc"
    IDDoc -> Num. automatica
    IDAnagrafica -> Numerico
    IDTipoDoc -> Numerico
    Anno -> Numerico
    Mese -> Numerico
    Data -> Data
    Note -> Testo lungo

    Attenzione! Mi sono accorto che mi sono espresso male nel primo post "Anno" e "Mese" identificano anno e mese a cui fanno riferimento i dati del documento mentre "data" è la data di consegna del documento e presa in carico.

    Vi ringrazio per il Vs tempo.
    Ciao!
  • Re: Suggerimenti su query

    Provo a esplicitare un mio ragionamento in base a quello che ho capito. Correggimi dove sbaglio.

    pizio ha scritto:


    Tabella "RegDoc"
    IDDoc -> Num. automatica
    IDAnagrafica -> Numerico
    IDTipoDoc -> Numerico
    Anno -> Numerico
    Mese -> Numerico
    Data -> Data
    Note -> Testo lungo

    Attenzione! Mi sono accorto che mi sono espresso male nel primo post "Anno" e "Mese" identificano anno e mese a cui fanno riferimento i dati del documento mentre "data" è la data di consegna del documento e presa in carico.
    Questa tabella potrebbe avere tranquillamente i seguenti campi:
    IDDoc -> Num. automatica
    IDAnagrafica -> Numerico
    IDTipoDoc -> Numerico
    DataDoc -> Data
    DataConsegna -> Data
    Note -> Testo lungo

    Riguardo la query, io preferisco ragionare con la "visualizzazione struttura" (non mi trovo tanto con l'SQL).

    Per filtrare un "periodo arbitrario" ti basterebbe scrivere il seguente Criterio nella colonna DataDoc:
    Between [Digita la DataDoc iniziale] And [Digita la DataDoc finale]

    Per filtrare i Documenti non consegnati basta impostare il Criterio Is Null sotto la colonna DataConsegna.

    Ora immaginiamo che l'anagrafico "Rossi Mario" abbia prodotto 10 Documenti, di cui 7 consegnati e 3 no. A te interessa sapere quali sono tali 3 documenti non consegnati? Oppure ti interessa solo "capare" Rossi Mario perchè ha almeno un documento non consegnato?
  • Re: Suggerimenti su query

    Ciao,
    il mese e anno non sono riconducibili a una data di consegna o altro poiché fa riferimento ai dati contenuti nel documento, nel senso che se vengono consegnati documenti che fanno riferimento o hanno dati per tutto l'anno verrà indicato il solo anno o a un mese specifico quindi verrà indicato mese e anno, mentre la data che ho indicato è una data di consegna del documento che è variabile (non legata al mese o hanno dei dati contenuti nel documento). Ora quello che mi interessa avere è ad esempio dal 01/01/2015 al 01/01/2016 (data consegna) quali aziende non mi hanno inviato documenti che fanno riferimento a marzo del 2015 (indicherò mese 3 anno 2015)? oppure ... chi per il periodo X non mi ha consegnato nessun documento del tipo Y (IDTipoDoc)?

    Spero di aver chiarito il tipo di ricerca che devo implementare.
    Ciao e grazie!
  • Re: Suggerimenti su query

    pizio ha scritto:


    il mese e anno non sono riconducibili a una data di consegna o altro poiché fa riferimento ai dati contenuti nel documento, nel senso che se vengono consegnati documenti che fanno riferimento o hanno dati per tutto l'anno verrà indicato il solo anno o a un mese specifico quindi verrà indicato mese e anno, mentre la data che ho indicato è una data di consegna del documento che è variabile (non legata al mese o hanno dei dati contenuti nel documento).
    OK. Che così sia.

    pizio ha scritto:


    Ora quello che mi interessa avere è ad esempio dal 01/01/2015 al 01/01/2016 (data consegna) quali aziende non mi hanno inviato documenti che fanno riferimento a marzo del 2015 (indicherò mese 3 anno 2015)?
    Sì. Potresti pensare a 2 Like:
    Like [Digita l'Anno]
    Like [Digita il Mese]
    se quest'ultimo non è importante, quando apparirà la piccola finestra per inserire il parametro Mese, gli scriverai * (asterisco)

    pizio ha scritto:


    chi per il periodo X non mi ha consegnato nessun documento del tipo Y (IDTipoDoc)?
    Vale il mio primo suggerimento con l'aggiunta di un altro
    Like [Digita il IDTipoDoc]

    Tutte le tue domande sono accomunate da un unico argomento che trovi anche sulla guida in linea. Si chiama "query con parametri".
  • Re: Suggerimenti su query

    pizio ha scritto:


    Ciao....
    Vi ringrazio per il Vs tempo.
    Ciao!
    Faccio alcune considerazioni giusto perchè tu non prenda strade sbagliate.
    Prima cosa, valuta se l'idea di aver diviso Mese/Anno come campi di una Tabella, avendo come riferimento un campo data completo, sia una cosa intelligente che porta vantaggi...
    Ricorca che sono dati che puoi estrarre con un campo Calcolato in una Query.

    Seconda cosa stai usando SQLServer, quindi devi fare veramente MOLTA attenzione, perchè se non consenti al SERVER di interpretare le Query che scrivi, costringi a farti sparare tutto il Recordset in locale vanificando la potenza di un Server...
    L'esempio più chiaro che emerge è proprio l'utilizzo di quello che è stato definito query Parametriche..!

    Mai scrivere all'interno del predicato riferimenti ad Oggetti di Form o Istruzioni che il DBEngine non è in grado di interpetare...!

    Ricorda che i parametri si inseriscono solo con un'adeguata interfaccia utente che consente sia la validazione che la gestione di SQL INJECTION...
    Quindi non usare MAI cose di questo tipo se non completamente gestita via CODICE:
    
    SELECT * FROM T1 WHERE Campo LIKE [Parametro]

    Ovvero il Parametro non lo devi passare da Popup MOdale, ma al fine di gestirlo utilizza un'InputBox su cui poi applichi validazione e di conseguenza valorizzi il Parametro della Query passandolo all'Oggetto Parameter, membro della Collection Parameters di QueriDef... preposto a questo scopo.

    Ora vedi tu, le soluzioni più o meno mi pare siano già in corso, ma se non hai chiaro come lavora un Server e come si deve fa interagire l'utente con il sistema rischi di orientarti su uno sviluppo decisamente limitato e non sicuro.
Devi accedere o registrarti per scrivere nel forum
9 risposte