Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: andy60 - 15 Febbraio 2008, 06:09:53

Titolo: Uso del filtro nelle query
Inserito da: andy60 - 15 Febbraio 2008, 06:09:53
Devo fare una query parametrica che estragga solo alcuni record ma non trovo la sintassi da usare per le date. Esempio banale:

Codice: [Seleziona]
dim miasql as string
miasql="SELECT * FROM nometabella WHERE campodata='12/02/08'"


in questo formato la query mi da' errore
Titolo: Re: Uso del filtro nelle query
Inserito da: leo72 - 15 Febbraio 2008, 14:46:56
I parametri delle query ai metodi EXEC, FIND, ecc.. degli oggetti CONNECTION non vanno mai passati tal quali nella query stessa ma vanno usati sempre gli argomenti.

Così la tua query deve diventare:
Codice: [Seleziona]

DIM Connessione as NEW CONNECTION
DIM Risultato AS RESULT

  Connessione.Name = ....
  Connessione.Type = ....
  Connessione.OPEN
  Risultato = Connessione.Find ("SELECT * FROM nometabella WHERE campodata= &1", DataOperazione)
Titolo: Re: Uso del filtro nelle query
Inserito da: md9327 - 15 Febbraio 2008, 16:55:05
E comunque, il formato dipende dal database che si stà usando, tra quelli previsti dal motore o, a volte dalla configurazione del server (vedi per Oracle e PostgreSQL).
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 15 Febbraio 2008, 17:49:46
infatti....in access ad esempio le date nelle query parametriche sono inserite tra cancelletti...#mm/dd/aaaa#....provate ad aprire il database di gambas e ad inserire una sql da linea di testo con una data...tipo il mio esempio..volevo cche qualcuno riuscisse ad estrarre il recordset
Titolo: Re: Uso del filtro nelle query
Inserito da: leo72 - 15 Febbraio 2008, 18:15:02
Le date sono un tipo di.... dato ostico da trattare in Gambas. Se non si usano i metodi con i parametri non si ottengono mai i risultati sperati.
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 15 Febbraio 2008, 18:34:21
proviamo a vedere no? un bel db da creare direttamnte con il database di gambas, una tabella con un campo data e una query...io non riesco ad estrarre, secondo me c'è una sintassi. se non riusciamo chiedo direttamente attraverso la mailing list di gambas
Titolo: Re: Uso del filtro nelle query
Inserito da: tornu - 15 Febbraio 2008, 20:05:06
SELECT * FROM nometabella WHERE campodata = '2007-09-23'

Funziona, l'ho provata nel mio DB Mysql.
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 15 Febbraio 2008, 20:18:31
con sqlite non va
Titolo: Re: Uso del filtro nelle query
Inserito da: fsurfing - 15 Febbraio 2008, 20:30:27
tempo fa realizzando un programma di fatturazione per la mia ditta mi sono imbattuto nello stesso problema ,
io lo risolto in modo molto brutale ....
il campo del tatabase lo inditato come stringa è ho trattato la data come tale.
certo non è molto elegante
Titolo: Re: Uso del filtro nelle query
Inserito da: leo72 - 15 Febbraio 2008, 20:41:47
Con la sintassi che vi ho dato funziona benissimo.
Basta usare i parametri nelle query Sql al posto dei valori nudi e crudi.

Il DB del mio gestionale contiene anche date e lo gestisco senza problemi.
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 15 Febbraio 2008, 20:49:14
attenzione...trovata l'alchimia: e funziona

Codice: [Seleziona]
SELECT campodata FROM nometabella WHERE datetime(campodata) = '2008-02-15 00:00:00'


io per abitudine preferisco costruire la stringa sql e poi mandarla in pasto alla conenssione
Titolo: Re: Uso del filtro nelle query
Inserito da: md9327 - 17 Febbraio 2008, 10:54:59
Ho letto in ritardo i vostri post, e purtroppo sono arrivato tardi a dare una mano.
A questo punto, scrivo solo una nota a livello generale.
Le date negli rdbms sono, come ha giustamente scritto il webmaster, un tipo di dato molto ostico; in realtà il valore ciene memorizzato in formato binario, e tradotto a livello leggibile tramite algoritmi. Il formato di traduzione, però, è di norma, nello standard, in formato inverso ovvero 'YYYY-MM-DD', il fatto poi che un'applicazione client lo visualizzi in formato diverso dipende dall'impostazione che gli viene data.
E' da ricordare che, nei dbms relazionali di oggi, una data viene sempre memorizzata in un formato contenente anche le informazioni orarie 'HH:MM:SS.CCC'.
In oracle, per fare un esempio, esiste un solo tipo: date, che è un tipo particolare che contiene tutto di una data, e deve essere trattato come tale, dall'altra parte postgresql gestisce ulteriori particolarità sul tipo 'data' di base, dando la possibilità di esclusione della parte oraria; queste opzioni però non sono altro che trattamenti particolari che lavorano comunque su data intera.
Come ha scritto leo, probabilmente sqlite non rispetta integralmente questo standard; infatti, dopo una letta veloce alla doc, sono arrivato a capire che sqlite tratta tutto (numeri stringhe e date) in un tipo unico: testo.
L'unica cosa che non sò' è se poi sqlite agisce in qualche modo, tramite appositi algoritmi, a eseguire qualche trasformazione durante l'estrazione di un dato.
Secondo me, in sqlite, forse potrebbe essere conveniente trattare le date proprio come stringhe, come suggerito da fsurfing, anche non elegante, potrebbe ovviare alle mancanze di sqlite.

Scusate per l'intervento in ritardo... :-(

Bye
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 17 Febbraio 2008, 11:19:16
ciao, nel formato che ho postato funziona benissimo. Quando creo la sql tratto la data come una stringa, utilizzando quel formato.
Titolo: Re: Uso del filtro nelle query
Inserito da: md9327 - 17 Febbraio 2008, 11:44:45
Ciao andy, vedo che anche tu la domenica... insomma matto come me... (senza offessa ovviamente :-) ).

Sì, il formato che hai trovato è giusto, se lo provi con altri db (es. MySQL e PostgreSQL) funziona.

Buona domenica!!!
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 17 Febbraio 2008, 14:28:28
In effetti sto realizzando un software misto (nutrizionale+gestione attività sportiva) e quindi mi sono imbattuto nel problema. In particolare mi fa piacere mettere a disposizione di tutti gli amici questo codice:
Codice: [Seleziona]
PUBLIC Currdate as String

PUBLIC SUB DateChooser1_Change()
  '============================================
  'Info: formatta la data corrente nel modo
  '      corretto per essere inserita nella
  '      query di lettura dei dati.
  '      Es. di formato accettato:
  '      2008-02-12 00:00:00
  '============================================
Currdate = Str(Year(DateChooser1.Value)) & "- "
Currdate=Currdate & "Format$(Month(DateChooser1.Value), "0#") & "- "
Currdate=Currdate & Str$(Day(DateChooser1.Value)) & " 00:00:00"
........... altro codice .............
END


da notare che il mese è formattato con lo zero davanti quindi il mese di Febbraio è trattato come '02' e non '2'. Es. di stringa sql:

Codice: [Seleziona]
sql="SELECT * FROM nometabella WHERE datetime(campodata) = '" & currdate & "' " 


Buona Domenica :-)
Titolo: Re: Uso del filtro nelle query
Inserito da: md9327 - 17 Febbraio 2008, 20:00:05
Prova con:

   curdate &= "stringa"

scrivi un pò di meno :-)

Puoi anche usare la Subst(), che ti sostituisce i parametri inseriti ad hoc in una stringa con i valori che hai deciso di inglobare...

Non ricordo se l'anno inserita, ma credo che una piccola funzione o classe, apposita per le date sarebbe una cosa carina.
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 17 Febbraio 2008, 23:08:13
Grazie x la dritta. Una cosa collegata alla routine che ho notato pochi minuti fa: il mio orologio faceva le 23.02 e il componente DateChooser gia' mi evidenziava come data corrente il giorno 18 (con la funzione DateChooser.value=date(now)..)...come mai anticipa di un'ora? allego a titolo di esempio la form in cui uso le routine delle date.
Titolo: Re: Uso del filtro nelle query
Inserito da: leo72 - 18 Febbraio 2008, 11:10:05
Torno un attimo sul problema delle date e di SQLite3.

Vorrei invitarvi ad usare i parametri nelle query, a discapito magari di un'abitudine personale.

Questo perché Gambas "traduce" nel corretto formato i parametri prima di comporre la query in SQL da passare al DB.
Come ho scritto, usando

Codice: [Seleziona]

Connessione.EXEC("SELECT * FROM nome_tabella WHERE campo_data = &1", Data)


si ottiene il risultato voluto senza codici extra di conversione.



Per quanto concerne il tuo problema, Andy: forse c'entra qualcosa il fuso orario del tuo sistema con Linux?
Linux ha un sistema di gestione del tempo molto complesso: infatti, in fase di installazione di qualunque distro, viene chiesto sempre se l'orologio interno funziona con il tempo universale o con l'ora locale. Mi viene da pensare che ci sia nel tuo sistema qualcosa di conflittuale che fa sbagliare DateChooser.
Penso a questo perché anch'io uso il componente DateChooser con Date(Now) e non ho di questi problemi.
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 18 Febbraio 2008, 11:53:53
Grazie di cuore, sto approntando la versione beta del sofware di cui ho postato una form. Il codice non è sistemato al meglio. La razionalizzazione sara' il passo successivo e conto di utilizzare il metodo che te gentilmente hai suggerito.

Per l'orologio verifico. Il mio sistema faceva le 11 pm quando DateChooser mi ha cambiato la data in 18, quindi un'ora prima.
Titolo: Re: Uso del filtro nelle query
Inserito da: md9327 - 18 Febbraio 2008, 17:11:16
E quindi giustamente il fuso orario italiano
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 18 Febbraio 2008, 20:57:25
per il momento la cosa è marginale, dovro risolverla quando vado a rifinire il software
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 19 Febbraio 2008, 06:14:31
usando EXEC, se il filtro è composto da due campi con che sintassi passo la richiesta? grazie x l'aiuto..

es. filtro formato da una certa data e da un altro campo avente un certo id..
Titolo: Re: Uso del filtro nelle query
Inserito da: leo72 - 19 Febbraio 2008, 07:03:44
Non hai un limite sul n° dei parametri.
Esempio:
Codice: [Seleziona]

Connessione.EXEC("SELECT * FROM nome_tabella WHERE CAMPO1 = &1 AND CAMPO2 = &2 AND CAMPO3 = &3 ORDER BY &4", Dato1, Dato2, Dato3, Dato4)


Per la questione orologio, dando "date" da terminale cosa ottieni?
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 19 Febbraio 2008, 10:53:05
Ti faccio sapere in giornata. Sono in uff...ciao
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 20 Febbraio 2008, 07:46:36
oggi alle 07:45 mi da': mer feb 20 07:45:46 CET 2008
Titolo: Re: Uso del filtro nelle query
Inserito da: md9327 - 20 Febbraio 2008, 20:07:55
Prova a formattarlo, il fatto che ti stampa direttamente in quel formato vuol dire solo che per default le date vengono codificate in quel modo.
Credo che, e di solito è così, la rappresentazione visuale di una data dipende dalle impostazioni date a livello generale sul sistema (es. basta la lingua scelta).
A meno di non modificare tali impostazioni, penso tu debba agire convertendo la data da codice.
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 23 Febbraio 2008, 07:19:59
ci provo sicuro, appena risolvo la questione dei grafici su gambas :roll:  grazie...ps vado off topic...ho inserito il link al tuo sito sul mio blog
Titolo: Re: Uso del filtro nelle query
Inserito da: md9327 - 25 Febbraio 2008, 00:23:05
Grazie!!!
Titolo: Re: Uso del filtro nelle query
Inserito da: andy60 - 10 Marzo 2008, 09:31:32
questo tipo di utilizzo funziona anche per i comandi sql UPDATE e INSERT? Ancora, se funziona con il comando INSERT, come devo trattare la variabile che va ad aggiornare un campo stringa?

es.

Codice: [Seleziona]
dim res as result
res= mMAIN.$con.Exec("UPDATE tabella SET campotesto=&1",textBOX1.text)


oppure
Codice: [Seleziona]
res= mMAIN.$con.Exec("UPDATE tabella SET campotesto='&1'",textBOX1.text)


Con questo tipo di comando ho problemi
Titolo: Re: Uso del filtro nelle query
Inserito da: leo72 - 11 Marzo 2008, 09:22:43
Ad occhio credo che sia corretta la prima, senza gli apici.