Newsgroup: it.comp.lang.c++
Titolo: riprovo: sistema di ricerca

Allora tenterò questa volta di essere chiaro e preciso:
Oggetto: Creare un "wrapper" sopra un altro linguaggio: caso specifico sql"
Uno pseudo-flusso per far capire dove e come usare quello che voglio fare :
1) interfaccia GIU ->
2) richiesta dati tramite controlli (combo,edit,check ecc.)->
3) costruzione stringa di richiesta nel mio linguaggio interno ->
4) conversione dal mio linguaggio al linguaggio target (sql, o altri)
5) recupero risultato
6) mostrare risultato
Più in dettaglio
l'utente imposta una dato di ricerca trami un controllo (GUI)
il programma prende i valori e converte le informazioni di input in 
codice(nel mio linguaggio) :
pdata = controllogui->dammidataimposta();
string ricerca = "cerca elementox che ha data = " +pdata;
risultato = motorelinguaggio->eseguiricerca(ricerca); //internamente 
converte questa string in codice sql valido carica i dati e li ritorna
mostra risultato nella finestra .
*I punti 1,2,5,6 non sono un problema.
Spero di essermi spiegato, sicuramente non del tutto perchè avrete mille 
dubbi perlomeno credo si sia capito il risultato che voglio ottenere ora 
bisognerebbe discutere sul come.
Nel mio esempio ho utilizzato una stringa quindi come concetto molto simile 
ad sql ma nulla mi vieterebbe di fare le stesse cose tramite classi.
Mostro un esempio pratico di una società che ha implementato una cosa 
simile, è un libreria che io ho anche usato.
Il programma è Un CAD ed ogni suo file è strutturato come una collezzione di 
oggetti quindi ogni ogni file ha ne oggetti ed ogni oggetto ha degli 
attributi, tramite questo linguaggio
(è c++ con oggetti com) potevi impostare delle ricerche ed avere come 
risultato i rifermenti ad tutti gli oggetti dentro il file che soddisfavano 
la ricerca.
_ElementEnumeratorPtr m_Enumerator;
//need to initialize the ElementScanCriteria
_ElementScanCriteriaPtr m_SCanCriteria(__uuidof (ElementScanCriteria));
m_SCanCriteria->ExcludeNonGraphical ();  //CON QUESTA CLASSE IMPOSTAVI I 
PARAMETRI DI RICERCA
//dispone di metodi del tipo
IncludeOnlyWithinRang,
IncludeLineStyle,
ExcludeGraphical,
IncludeOnlySolid,
IncludeType
ecc. ecc.
m_Enumerator = m_spApp->ActiveModelReference->Scan (m_SCanCriteria);
while (m_Enumerator->MoveNext())
{
_ElementPtr const oElement = m_Enumerator->Current;
DLong const iElementID = oElement->ID;
MsdElementType const EleType = oElement->Type;
HRESULT hr;
oElement->Redraw (msdDrawingModeHilite);
counter++;
}
grazie ciao
 

 bisognerebbe discutere sul come.
Se permetti, il come, è un problema tuo...

 ha scritto nel messaggio 
news:41f550e0$0$8202$5fc...@news.tiscali.it...

Io ci ho provato :-) concordo comunque ....

 6) mostrare risultato
Ciao,
Quello che non e' chiaro e': perche' passare da un linguaggio
intermedio ?
potresti avere invece un insieme di classi/oggetti che alla fine
generano direttamente l'sql.
Qualcosa tipo:
Query q();
q.addSource("table1", "t1");
q.addSource("table2","t2");
q.addData("t1","col1");
q.addData("t2","col2");
q.Join("t1","t2","id");
q.addCondition("t1.col > t2.col");
q.execute();
che esegue ad esempio:
"SELECT t1.col1, t2.col2
FROM tbvle1 t1, table2 t2
WHERE 
t1.id
 = 
t2.id
AND t1.col > t2.col;"
I vari metodi faranno eventuali controlli (per es. addData()
verifichera' che la tabella sia stata aggiunta come Source etc.)
Questa soluzione non ha la flessibilita' dell SQL, ma almeno lo
nasconde senza ricorrere a un secondo linguaggio di interrogazione.
Se invece la struttura del tuo DB e' abbastanza statica, puoi
salire di livello e modellare direttamente le entita' rappresentate
nelle tabelle con classi e oggetti.
Per esempio: (classico esempio biblioteca/libri/autori etc).
Crieteria c.
c.add( Author("Manzoni"));
c.add( Range<Year>(1835,1845));
DBList<Book> result(c);
e bl conterra' il risultato di una interrogazione del tipo
"SELECT * FROM book
WHERE author="Manzoni"
AND ( year >= 1830 AND year =< 1840);"
Insomma devi decidere il giusto compromesso tra
leggibilita'/semplicita' d'uso e flessibilita' (con
l'aumentare della prima diminuisce la seconda),
con a un estremo una serie di funzioni pre-definite
che fanno delle interrogazioni fisse e all'altro
l'utilizzo "libero" di SQL nel tuo codice client.
--
Fabio

 q.addCondition("t1.col > t2.col");
per struttura intendo qualcosa degno di essere chiamato così concatenare 
metodi uno dietro l'altro è facile :-)
Mi servirebbe quache esempio qualche input , non sono un newbie programmo da 
parecchio ed una cosa che mi piace e fare le cose per bene
quindi il non classico  improvisato (giusto per chiarire il profilo)

 quindi il non classico  improvisato (giusto per chiarire il profilo)
Beh, do per scontato che hai gia' un astrazione per accedere al DB
(qualcosa che ti permetta di gestire una connessione, eseguire delle queries
SQL, usare i cursori per leggere i risultati etc..)
Puoi cominciare con semplice classe come quella dell'esempio (che astrae
ulteriormente da connessione, query, cursore etc) avra' dei contenitori per
le colonne, le tabelle, le condizioni etc. e che nel metodo execute()
costruisce la stringa sql, la esegue, apre il cursore etc.
Inizia con qualcosa di molto semplice e via via rendila piu' sofisticata
(per es. gestendo gli errori, rifacendo la connessione in caso di problemi
etc.)
Uno dei problemi piu' difficili potrebbe essere la gestione dei risultati
(saranno liste di che tipo?) puoi iniziare considerando tutte stringhe, poi
magari ampli addData() specificando il tipo delle colonne (magari usando un
po' di template meta-programming) etc.
Alla fine, potresti anche leggerte a run time dal DB la struttura stessa
delle tabelle e fare del type-checking dinamico.
Insomma, fai un passo alla volta, partendo dalla cosa piu' semplice e
aggiungendo il resto a poco a poco.
--
Fabio


I problemi che mi creano più difficoltà (attualmente) sono :
1) il sistema per costruire le query sql in base alla chiamata a dei metodi 
come ho fatto vedere nell'esempio e come hai scritto tu
2) trovare il modo una volta ottenuti i dati di fare delle ricerche 
confronti ecc. fra le varie entità
Da notare che adesso non sto assolutamente prendendo in considerazione il 
fattore prestazioni.
...