Italian Query ricorsiva

marcellissimo

Member
Licensed User
Longtime User
Salve a tutti
Ho un problema con una query ricorsiva che nell'editor di sqlLiteStudio funziona ma quando la passo da b4a va in errore



B4X:
Sub popolaListaCatGroup
    Dim dbCursor As Cursor
    Dim q As String ="WITH RECURSIVE " &  _
    " cat_group(id_macro, desc, id,seq, level, abilitato) As ( " & _
    " VALUES("""","""", '-1',0, """", """") "  & _
    " UNION ALL " & _
    " Select categorie_menu.macro_cat, categorie_menu.descrizione, " & _
    " categorie_menu.id_Cat,categorie_menu.sequenza, cat_group.level+1, " & _
    "    categorie_menu.abilitato " & _
    "    FROM categorie_menu JOIN cat_group ON categorie_menu.macro_cat=cat_group.id " & _
    "    ORDER BY  5 desc, 4 Asc    ) " & _
    " Select * FROM cat_group "
    dbCursor= cnSql.dbsql.ExecQuery(q)
   
   
    For i = 0 To dbCursor.RowCount - 1
        DoEvents
        dbCursor.Position=i
        Dim cat_group As cat_group
       
        cat_group.id_macro=dbCursor.GetInt("id_macro")
        cat_group.desc=dbCursor.GetString("desc")
        cat_group.id=dbCursor.GetInt("id")



L'errore è questo

B4X:
Error occurred on line: 133 (ClsMenu)
android.database.sqlite.SQLiteException: near "WITH": syntax error: , while compiling: WITH RECURSIVE  cat_group(id_macro, desc, id,seq, level, abilitato) As (  VALUES("","", '-1',0, "", "")  UNION ALL  Select categorie_menu.macro_cat, categorie_menu.descrizione,  categorie_menu.id_Cat,categorie_menu.sequenza, cat_group.level+1,     categorie_menu.abilitato     FROM categorie_menu JOIN cat_group ON categorie_menu.macro_cat=cat_group.id     ORDER BY  5 desc, 4 Asc    )  Select * FROM cat_group
    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:73)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1502)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1470)
    at anywheresoftware.b4a.sql.SQL.ExecQuery2(SQL.java:167)
    at anywheresoftware.b4a.sql.SQL.ExecQuery(SQL.java:155)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:710)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:339)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:249)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:134)

Qualche anima pia può aiutarmi ?
 

MarcoRome

Expert
Licensed User
Longtime User
oppure:
B4X:
$"WITH RECURSIVE 
    cat_group(id_macro, desc, id,seq, level, abilitato) As ( 
    VALUES("""","""", '-1',0, """", """") 
     UNION ALL
     Select categorie_menu.macro_cat, categorie_menu.descrizione,
     categorie_menu.id_Cat,categorie_menu.sequenza, cat_group.level+1,
        categorie_menu.abilitato
        FROM categorie_menu JOIN cat_group ON categorie_menu.macro_cat=cat_group.id
        ORDER BY  5 desc, 4 Asc    )
     Select * FROM cat_group "$
 

marcellissimo

Member
Licensed User
Longtime User
Grazie ad entrambi
ho fatto un po di prove usando i vostri suggerimenti ma non passa ugualmente.
proverò ad ottenere lo stesso risultato della query da codice anche se non mi piace.
 

marcellissimo

Member
Licensed User
Longtime User
ok... ho risolto creando una view direttamente sul db e da b4a la userò come una normale tabella.
grazie ancora

----
Rettifico, nemmeno così funziona, il motivo per il quale funziona sull'editor di sqlitemanager è perchè uso l'ultima versione di sqlite ...
I device che sto usando per prova hanno le versioni 3.7.11 e 3.7.2 ;
la clausola "WITH" non è supportata sino alla versione 3.8.3...
Per concludere il problema non credo sia risolvibile mantenendo la compatibilità con vecchi device .
Pace
 
Last edited:
Top