Italian Sql Insert

Star-Dust

Expert
Licensed User
Longtime User
Assegna a JobName un valore per identificare il Job ad esempio prima.di chiamare la query remota
JobName = "Job1"
Oppure se vuoi distinguere le richieste
JobName = "Job" & N
N sarà un numero progressivo

Ma adesso compila o da errori ?
 

Nikeddy

Active Member
Licensed User
Longtime User
si ho capito, ma non riesco ad associare nel mio codice, mi sto perdendo alla grande.

devo creare un case , gli assegno un nome (ad esempio inserimento) e .... poi?

Sub Fetchinserimento
Dim scassaobanca As String
If RadioButton1.Checked = True Then
scassaobanca = "cassa"
Else
scassaobanca ="banca"
End If
entrata =""
entrata = "entrata"
ExecuteRemoteQuery("INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('" & EditText7.text & "','" & EditText8.text & "', '" & scassaobanca & "', '" & entrata & "','" & Spinner3.GetItem & "', " & EditText9.text & ")", JobDone)
End Sub


e poi ho il job

Sub ExecuteRemoteQuery(Query As String, JobName As String)
Dim job As HttpJob
job.Initialize(JobName, Me)
job.PostString("https://www.xxxxx.com/gestionale/executing.php", Query)
End Sub

Sub JobDone(Job As HttpJob)
ProgressDialogHide
If Job.Success Then
Dim res As String
res = Job.GetString
Log("Response from server: " & res)
Dim parser As JSONParser
parser.Initialize(res)
Select Job.JobName
Case entrate
Dim COUNTRIES As List
COUNTRIES = parser.NextArray
For i = 0 To COUNTRIES.Size - 1
Dim m As Map
m = COUNTRIES.Get(i)
Dim tl As TwoLines
tl.First = m.Get("data")
tl.Second = m.Get("euro")
ListView1.AddTwoLines2(tl.First, tl.Second, tl)
Next
Case uscite
Dim COUNTRIES As List
COUNTRIES = parser.NextArray
For i = 0 To COUNTRIES.Size - 1
Dim m As Map
m = COUNTRIES.Get(i)
Dim tl As TwoLines
tl.First = m.Get("data")
tl.Second = m.Get("euro")
ListView2.AddTwoLines2(tl.First, tl.Second, tl)
Next
End Select
Else
Log(Job.ErrorMessage)
ToastMessageShow("Error: " & Job.ErrorMessage, True)
End If
Job.Release
End Sub
 

udg

Expert
Licensed User
Longtime User
ExecuteRemoteQuery("INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('" & EditText7.text & "','" & EditText8.text & "', '" & scassaobanca & "', '" & entrata & "','" & Spinner3.GetItem & "', " & EditText9.text & ")", JobDone)

Cambia quel JobDone in "Speriamobene" o qualunque altra stringa tra virgolette visto che ExecuteRemoteQuery si aspetta un parametro stringa.
Poi nella sub JobDone dovresti avere un test se il job è proprio "Speriamobene" visto che la stessa sub è il punto di arrivo di ogni "Dim job As HttpJob" che potresti avere nel modulo.

udg

Edit: vedo ora nel tuo codice che hai già due possibili job name (entrate e uscite); basta usare allora "entrate" oppure "uscite" come secondo parametro di ExecuteRemoteQuery e mettere le virgolette nella select interna a JobDone.
 

Star-Dust

Expert
Licensed User
Longtime User
Cambia quel JobDone in "Speriamobene" o qualunque altra stringa tra virgolette visto che ExecuteRemoteQuery si aspetta un parametro stringa.
Poi nella sub JobDone dovresti avere un test se il job è proprio "Speriamobene" visto che la stessa sub è il punto di arrivo di ogni "Dim job As HttpJob" che potresti avere nel modulo.

udg

UDG sei stato grande !!!
 
  • Like
Reactions: udg

Nikeddy

Active Member
Licensed User
Longtime User
le due sono due select.
la insert e' una altra funzione.

quindi creo un case con il nome della sub dell'insert?
 

udg

Expert
Licensed User
Longtime User
Esatto. Ogni httpjob, qualunque sia l'azione sul db, terminerà in JobDone. Quindi, per distinguere una chiamata dall'altra, utilizzi nomi diversi per i vari job.

Una volta che tutto funzioni, cerca le string letterals (credo si chiamino così); in sostanza invece di avere dei concatenamenti di string, avresti un'unica stringa "magica" che può essere suddivisa su più righe (migliora la leggibilità) e contenere variabili ed operazioni.
Ad esempio qualcosa tipo:
B4X:
dim query as string =$"SELECT * FROM ${mytable}
                       WHERE id=${userid}
                       LIMIT 1;"$
tanto per avere un'idea; eventuali apici e virgolette richiesti dalle sintassi dei vari DB li puoi inserire dove necessario senza che questo "rompa" la stringa generale.

udg
 
Last edited:

Nikeddy

Active Member
Licensed User
Longtime User
a ok
quindi io creo una case (che chiamero' inserimento ad esempio) ma non capisco cosa devo metterci dentro al case.
 

Nikeddy

Active Member
Licensed User
Longtime User
B4A version: 6.50
Parsing code. (0.01s)
Compiling code. Error
Error compiling program.
Error description: Too many parameters.
Occurred on line: 194
ExecuteRemoteQuery("INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('" & EditText7.text & "','" & EditText8.text & "', '" & scassaobanca & "', '" & entrata & "','" & Spinner3.GetItem & "', " & EditText9.text & ")", inserisci)
Word: inserisci
 

udg

Expert
Licensed User
Longtime User
EditText9.text & ")", inserisci)
Ammesso che il resto della query sia scritto correttamente, devi sostituire inserisci con "inserisci". Sempre che ExecuteRemoteQuery si aspetti due parametri, entrambi di tipo stringa come si vede nel post #24
 

Nikeddy

Active Member
Licensed User
Longtime User
si le due variabili sono stringa. Difficilissimo l'insert!!!

cosi però da errore lo stesso , posto il codice aggiornato completo:

Sub Fetchinserimento
Dim scassaobanca As String
If RadioButton1.Checked = True Then
scassaobanca = "cassa"
Else
scassaobanca ="banca"
End If
entrata =""
entrata = "entrata"
ExecuteRemoteQuery("INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('" & EditText7.text & "','" & EditText8.text & "', '" & scassaobanca & "', '" & entrata & "','" & Spinner3.GetItem & "', " & EditText9.text & "),"inserisci")
End Sub


Sub ExecuteRemoteQuery(Query As String, JobName As String)
Dim job As HttpJob
job.Initialize(JobName, Me)
job.PostString("https://www.ixxxxxxa.com/gestixxxale/execute.php", Query)
End Sub
Sub JobDone(Job As HttpJob)
ProgressDialogHide
If Job.Success Then
Dim res As String
res = Job.GetString
Log("Response from server: " & res)
Dim parser As JSONParser
parser.Initialize(res)
Select Job.JobName
Case entrate
Dim COUNTRIES As List
COUNTRIES = parser.NextArray
For i = 0 To COUNTRIES.Size - 1
Dim m As Map
m = COUNTRIES.Get(i)
Dim tl As TwoLines
tl.First = m.Get("data")
tl.Second = m.Get("euro")
ListView1.AddTwoLines2(tl.First, tl.Second, tl)
Next
Case uscite
Dim COUNTRIES As List
COUNTRIES = parser.NextArray
For i = 0 To COUNTRIES.Size - 1
Dim m As Map
m = COUNTRIES.Get(i)
Dim tl As TwoLines
tl.First = m.Get("data")
tl.Second = m.Get("euro")
ListView2.AddTwoLines2(tl.First, tl.Second, tl)
Next
Case inserisci
End Select
Else
Log(Job.ErrorMessage)
ToastMessageShow("Error: " & Job.ErrorMessage, True)
End If
Job.Release
End Sub
 

udg

Expert
Licensed User
Longtime User
Case inserisci
In JobDone, anche questo inserisci va tra virgolette.

ps: quando posti del codice fallo precedere da [ code ] e seguire da [ /code ] senza spazi prima e dopo le quadre.
 

Nikeddy

Active Member
Licensed User
Longtime User
B4X:
B4A version: 6.50
Parsing code.    Error
Error parsing program.
Error description: Syntax error.
Occurred on line: 195 (Main)
ExecuteRemoteQuery("INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('" & EditText7.text & "','" & EditText8.text & "', '" & scassaobanca & "', '" & entrata & "','" & Spinner3.GetItem & "', " & EditText9.text & "), "inserisci")
 

udg

Expert
Licensed User
Longtime User
Spinner3.GetItem & "', " & EditText9.text & ")
Prova con
Spinner3.GetItem & "', '" & EditText9.text & "');"
in pratica mancano gli apici prima e dopo EditText9, sempre che per il db utilizzato siano necessari apici a racchiudere le stringhe, e le virgoletet di chiusura della query dopo aver chiuso la parentesi dei VALUES; aggiungerei anche il punto e virgola finale perchè farebeb parte del SQL standard come chiusura del comando.
 

udg

Expert
Licensed User
Longtime User
ok, una prima considerazione che non c'entra con l'errore di sintassi: passare la query "pronta" ad un modulo PHP che poi la esegue passivamente non è una buona idea dal punto di vista della sicurezza. Anche se sul forum hai sostituito il nome del server con delle x, non sarà difficile decompilare la tua app, ricavare il nome/indirizzo reale del server ed inviare comandi "pericolosi" (es. DROP TABLE). Meglio inviare al PHP un "codice comando" e la relativa lista parametri (misura che comunque non impedirà da sola l'inserimento di centinaia di record fasulli..).

B4X:
dim query as string
query=$"INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) 
VALUES ('${EditText7.text}', '${EditText8.text}', '${scassaobanca }',  '${entrata}' , '${Spinner3.GetItem }',  '${EditText9.text}');"$
log(query)
ExecuteRemoteQuery(query,"inserisci")
Assicurati che EditText7.text riporti la data nel formato atteso dal DB (es. MySql vuole yyyy-MM-dd).
Assicurati che EditText9.text rappresenti un double (o float, non ricordo) valido

In JobDone assicurati anche che sia il jobname "entrate" che quello "uscite" nei rispettivi Case statement siano tra virgolette così come hai fatto per inserisci.

Nota: ora devo andare, ma spero che tu riesca a risolvere presto.

bye
 

Nikeddy

Active Member
Licensed User
Longtime User
nono tanto e' solo inventato.
B4X:
    Dim scassaobanca As String
    Dim query As String
    If RadioButton1.Checked = True Then
        scassaobanca = "cassa"
    Else
        scassaobanca ="banca"
    End If
    entrata =""
    entrata = "entrata"
   
    query=$"INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('${EditText7.text}','${EditText8.text}','${scassaobanca }','${entrata}','${Spinner3.GetItem }','${EditText9.text}');"$ "inserisci")
    Log(query)
    ExecuteRemoteQuery(query,"inserisci")

sto impazzendo. ho provato anche con 1 solo valore...non va.
 

udg

Expert
Licensed User
Longtime User
Tre errori: scassaobanca e spinner3 hanno uno spazio di troppo prima della graffa ei chiusura e la query deveterminare con "$, quindi cassa "inserisci") dalla query perché fa parte della execute.
Se non funziona ancora, posta il risultato del log(query).
Un'ultima avvertenza. Ricorda di segnalare se il db è mysql, sqlserver, sqlite etcetc perché ci sono piccole differenze di cui tener conto.
 

Nikeddy

Active Member
Licensed User
Longtime User
e' mysql

B4X:
B4A version: 6.50
Parsing code.    Error
Error parsing program.
Error description: Invalid number of parentheses.
Occurred on line: 195 (Main)
query=$"INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('${EditText7.text}','${EditText8.text}','${scassaobanca}','${entrata}','${Spinner3.GetItem}','${EditText9.text}');"$ inserisci)

posto tutto il codice, assurdo non riesco a fare un semplice form.
B4X:
#Region Module Attributes
    #FullScreen: true
    #IncludeTitle: True
    #ApplicationLabel:formesempio
    #VersionCode: 1
    #VersionName: 1.0
    #SupportedOrientations: portrait
   
#End Region

'Activity module
Sub Process_Globals
    Private entrate = "entrate", uscite = "uscite" As String, inserisci = "inserisci" As String
    'Private entrate = "entrate", uscite = "uscite" As String,

End Sub

Sub Globals
    Type TwoLines (First As String, Second As String)
    Dim lblPopulation As Label
    Dim ListView1 As ListView
    Dim ListView2 As ListView
    Dim lblCountry As Label
    Private panel1 As Panel
    Private panel11 As Panel
    Private panel3 As Panel
    Private panel9 As Panel
    Private Spinner1 As Spinner
    Private Spinner3 As Spinner
    Private EditText7 As EditText
    Private EditText9 As EditText
    Private EditText8 As EditText
    Private EditText1 As EditText
    Private EditText2 As EditText
    Private EditText3 As EditText
    Private RadioButton1 As RadioButton
    Private RadioButton2 As RadioButton
    Private RadioButton3 As RadioButton
    Private RadioButton4 As RadioButton
    Dim entrata As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("1")
    'DateTime.DateFormat="dd/MM/yyyy"
    'DateTime.TimeFormat="HH:mm"
    panel1.SetLayout(0,0,100%x,100%y)
    panel11.SetLayout(0,0,100%x,100%y)
    panel9.SetLayout(0,0,100%x,100%y)
    panel3.SetLayout(0,0,100%x,100%y)
    panel9.Visible=True
    panel11.Visible=False
    panel3.visible=False
    panel1.Visible= False
    panel11.visible = False
    Spinner1.AddAll(Array As String("Quota associativa", "Erogazioni", "Raccolta Fondi", "Contributi", "Interessi attivi"))
    Spinner3.AddAll(Array As String("Cancelleria", "Utenze", "Postali", "Spese Bancarie", "Attrezzatura", "Compensi", "Pulizia", "Assicurazioni", "Altre spese"))
End Sub

Sub ExecuteRemoteQuery(Query As String, JobName As String)
    Dim job As HttpJob
    job.Initialize(JobName, Me)
    job.PostString("https://www.xxxx.com/xxxxx/xxxx.php", Query)
End Sub

Sub JobDone(Job As HttpJob)
    ProgressDialogHide
    If Job.Success Then
    Dim res As String
        res = Job.GetString
        Log("Response from server: " & res)
        Dim parser As JSONParser
        parser.Initialize(res)
        Select Job.JobName
            Case entrate
                Dim COUNTRIES As List
                COUNTRIES = parser.NextArray
                For i = 0 To COUNTRIES.Size - 1
                    Dim m As Map
                    m = COUNTRIES.Get(i)
                    Dim tl As TwoLines
                    tl.First = m.Get("data")
                    tl.Second = m.Get("euro")
                    ListView1.AddTwoLines2(tl.First, tl.Second, tl)
                Next
            Case uscite
                Dim COUNTRIES As List
                COUNTRIES = parser.NextArray
                For i = 0 To COUNTRIES.Size - 1
                    Dim m As Map
                    m = COUNTRIES.Get(i)
                    Dim tl As TwoLines
                    tl.First = m.Get("data")
                    tl.Second = m.Get("euro")
                    ListView2.AddTwoLines2(tl.First, tl.Second, tl)
                Next
            Case "inserisci"
   
End Select
    Else
        Log(Job.ErrorMessage)
        ToastMessageShow("Error: " & Job.ErrorMessage, True)
End If
    Job.Release
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub FetchentrateList
    ProgressDialogShow("Fetching list of anomalie")
    Dim sentrata As String
    sentrata = " & entrata &"
    'Gets all the available countries
    ExecuteRemoteQuery("SELECT * FROM librocontabile WHERE entratauscita ='" & sentrata & "' ORDER BY data ", entrate)
End Sub
Sub FetchusciteList
    'Gets all the available countries
    Dim suscita As String
    suscita = " & uscita &"
    ExecuteRemoteQuery("SELECT * FROM librocontabile WHERE entratauscita ='" & suscita & "' ORDER BY data ", uscite)
End Sub
Sub cmd_torna_Click
    panel1.Visible=True
End Sub

Sub Torna_Click
   
   

   

End Sub

Sub cmd_stat_Click
    panel1.Visible= False
End Sub


Sub cmd_indietro_Click

    panel1.Visible= False
End Sub

Sub cmd_anomalia_Click
    panel1.Visible=False
   
End Sub

Sub TIPO_Click
    panel1.Visible=False
   
End Sub




Sub cmd_tornatipologia_Click
    panel1.Visible= False
    panel9.Visible= True
End Sub



Sub cmd_tornascheda_Click
    panel1.Visible= False
End Sub





Sub cmd_tornaambito_Click
    panel1.Visible= False
End Sub



Sub Fetchinserimento
    Dim scassaobanca As String
    Dim query As String
    If RadioButton1.Checked = True Then
        scassaobanca = "cassa"
    Else
        scassaobanca ="banca"
    End If
    entrata =""
    entrata = "entrata"
   
    query=$"INSERT INTO librocontabile (data,descrizione,cassabanca,entratauscita,categoria,euro) VALUES ('${EditText7.text}','${EditText8.text}','${scassaobanca}','${entrata}','${Spinner3.GetItem}','${EditText9.text}');"$ inserisci)
    Log(query)
    ExecuteRemoteQuery(query,"inserisci")
   
End Sub



Sub cmd_incassomese_Click
   
    panel1.Visible= False

End Sub

Sub cmd_tornapanel8_Click
    panel1.Visible= False

End Sub

Sub Button1_Click
    panel11.Visible=True
    panel9.visible=False
    panel1.Visible=False
    panel3.Visible=False
    EditText7.text = ""
    EditText9.text =""
    EditText8.text =""
End Sub

Sub lbl_tipopark_Click
   
End Sub

Sub Button2_LongClick
    panel11.Visible=False
    panel9.visible=False
    panel3.visible=False
    panel1.Visible=True
    FetchusciteList
    FetchentrateList
   
End Sub

Sub Button2_Click
    panel11.Visible=False
    panel9.visible=False
    panel3.visible=False
    panel1.Visible=True
   
End Sub

Sub Button5_Click
    panel1.Visible=False

    panel1.Visible= False
   

    panel9.Visible= True
   
End Sub

Sub cmd_tornacerca_Click
    panel1.Visible=False
    panel1.Visible= False
    panel9.Visible= True
End Sub

Sub txt_cerca_TextChanged (Old As String, New As String)
       
End Sub



Sub Button3_Click
    panel3.visible=True
    panel11.Visible=False
    panel9.visible=False
    panel1.Visible= False
    EditText1.Text = ""
    EditText3.Text =""
    EditText2.Text =""
End Sub




Sub Button7_LongClick
   
End Sub

Sub Button7_Click
    panel11.Visible=False
    panel9.visible=True
    panel3.visible=False
    panel1.Visible= False
End Sub

Sub Button8_Click
    panel11.Visible=False
    panel9.visible=True
    panel3.visible=False
    panel1.Visible= False
End Sub

Sub Button9_Click
    panel11.Visible=False
    panel9.visible=True
    panel3.visible=False
    panel1.Visible= False
End Sub



Sub Button11_Click
    Fetchinserimento
End Sub
 
Top