• User Newbie

    Istruzioni sql non riconosciute da mysql

    Salve a tutti, premetto che sono novizio di sql, mysql, ecc.. stò realizzando un database scolastico con mysql che gestisco tramite libreoffice, il problema che mi è sorto è nell'aggiornare, tramite una serie di istruzioni sql, una tabella che ho definito CORSO SCOLASTICO ALUNNO con i dati dei ragazzi promossi nell'ultimo anno , non mi dilungo su questi particolari, vorrei solo sapere da qualche esperto di mysql se nella istruzione che ho scritto c'è qualcosa di incompatibile con mysql, in quanto se lancio l'istruzione su un database creato da zero con libreoffice tutto funziona, ma se la lancio sul database che mi comunica con mysql mi dà questo errore 1: [MySQL][ODBC 5.2(a) Driver][mysqld-5.5.27-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"corso_scolastico_alunno" ("id_alunno", "id_data_anno", "Classe", "Sezione") SEL' at line 1

    Le istruzioni che voglio dare sono queste:

    INSERT INTO "corso_scolastico_alunno" ("id_alunno", "id_data_anno", "Classe", "Sezione") SELECT "id_alunno", "id_data_anno"+1, "Classe"+1, "Sezione" FROM "corso_scolastico_alunno" WHERE "Classe" < '3' AND "id_alunno" IN (SELECT "id_corso_scolastico_alunno" FROM "scrutini" WHERE "promosso" = TRUE AND "id_data_anno" IN (SELECT "id_data_anno" FROM "date_anni" WHERE YEAR("data_2quad") = YEAR( CURRENT_DATE )))

    C'è per caso qualcosa di scorretto nella sintassi? mi potete dare una mano magari correggendo l'errore che ho fatto?

    Altra cosa, queste istruzioni sql le devo poi inglobare in un codice macro che collegherò ad una azione di un pulsante in un formulario per attivare l'istruzione sql.... la macro è questa:

    Sub INSERT (oEvent As Object) 'Button > Execute > event
    oForm = oEvent.Source.Model.Parent 'MainForm from Button
    oStatement = oForm.ActiveConnection.createStatement() 'Create an SQL statement object
    sSQL = "INSERT INTO ""corso_scolastico_alunno"" (""id_alunno"", ""id_data_anno"", ""Classe"", ""Sezione"") SELECT ""id_alunno"", ""id_data_anno""+1, ""Classe""+1, ""Sezione"" FROM ""corso_scolastico_alunno"" WHERE ""Classe"" < '3' AND ""id_alunno"" IN (SELECT ""id_corso_scolastico_alunno"" FROM ""scrutini"" WHERE ""promosso"" = TRUE AND ""id_data_anno"" IN (SELECT ""id_data_anno"" FROM ""date_anni"" WHERE YEAR( ""data_2quad"" ) = YEAR( CURRENT_DATE )))"
    oStatement.executeUpdate( sSQL ) 'Execute the SQL command
    oForm.reload
    End Sub

    Come vedete ho usato la doppia virgolettatura e su database interamente fatto con libreoffice funziona.... dovrei usare la doppia virgolettatura anche su database collegato a mysql?

    Grazie...spero tanto di trovare qualcuno che può aiutarmi....:(


  • ModSenior

    Ciao,
    gli apici non sono corretti, per i campi si usa questo particolare apice ` e non ". Può comunque essere omesso l'apice.


  • User Newbie

    ah...grazie... adesso provo come mi hai indicato...


  • User Newbie

    Allora, seguendo il suggerimento di thedarkita sono riuscito a fare eseguire l'istruzione, però i dati nella tabella non sono stati inseriti :mmm: .... forse mysql non elabora per la funzione INSERT INTO subquery annidate?
    Io vorrei fare questo... semplificando il concetto, ho due tabelle:

    CORSO_SCOLASTICO_ALUNNO

    con i seguenti campi

    id_corso_scolastico (chiave primaria autoincrementante)
    id_alunno
    id_data_anno
    Classe
    Sezione

    SCRUTINI

    con questi campi:

    id_scrutinio (chiave primaria)
    id_corso_scolastico
    promosso
    data_scrutinio

    Io vorrei dare una istruzione dove mi si vada cercare nella tabella SCRUTINI gli id_anno_scolastico che hanno l'anno della data_scrutinio uguale all'anno corrente, tra questi chi nel campo promosso ha valore "si" ed infine chi tra questi ha il valore della Classe < di 3, quindi inserire gli id_alunno relativi ad ogni corso scolastico trovato, nella tabella CORSO SCOLASTICO ALUNNO, oltre all'id_alunno mi dovrà anche inserire l'id_data_anno aumentato di 1, la Classe aumentata di 1 e la stessa Sezione.

    L'Sql che avevo provato io era questo:

    INSERT INTO corso_scolastico_alunno (id_alunno, id_data_anno, Classe, Sezione) SELECT id_alunno, id_data_anno+1, Classe+1, Sezione FROM corso_scolastico_alunno WHERE Classe < '3' AND id_alunno IN (SELECT id_corso_scolastico FROM scrutini WHERE promosso = 'si' AND id_data_anno IN (SELECT id_data_anno FROM date_anni WHERE YEAR( data_scrutinio ) = YEAR( CURRENT_DATE )))

    però non mi funziona... ma io in sql non sono tanto esperto... c'è qualche anima buona che mi può aiutare? Se riesco a risolvere questo problema mi si spianerebbe di parecchio la strada per il database che stò realizzando....
    Se non si capisse da quello che ho messo sopra, detto in parole povere io vorrei fare la ricerca di chi ha dato l'esame nell'anno corrente, poi trovare chi è stato promosso e tra tutti questi chi faceva la prima e la seconda classe, poi questi valori andrebbero a popolare la tabella del corso scolastico relativo all'anno prossimo (ecco perchè andrebbe messo id_data_anno +1), con il valore della Classe aumentato di uno (se faceva la 1 andra in 2 ecco perchè Classe +1) mentre la sezione sara riportata pari pari (se faceva la sezione A farà ancora la sezione A)
    In pratica se un Alunno nel 2013 fa il corso scolastico con classe 1, sezione C, se verrà promosso il corso scolastico l'anno prossimo dovrà riportare anno 2014, classe 2, sezione C.
    Linserimento dei nuovi corsi per i promossi dovranno riguardare chiaramente le classi 1 e 2 perchè i promossi delle classi 3 non faranno più la scuola media e quindi nessun nuovo corso scolastico ma andranno alle superiori.

    Riuscite a darmi una mano in questa cosa? Pleaseeeee 🙂


  • User Newbie

    Scusate, ho trovato l'errore in una relazione errata delle tabelle.... ora funziona tutto l'sql e quindi con mysql è possibile realizzare funzioni INSERT che contengono subquery nidificate!