è giusto la prima prova che faccio con il Gambas ed è inerente agli ultimi messaggi sulle query, ho provato a fare una piccola classe chiamata CParm
PRIVATE $Params AS String[]
PRIVATE $Values AS String[]
PRIVATE $Sql AS String
PUBLIC SUB _new(Query AS String)
ME.Reset()
$Sql = Query
END
PUBLIC SUB _free()
$Params.Clear()
$Params = NULL
$Values.Clear()
$Values = NULL
END
PUBLIC SUB Reset()
$Sql = ""
$Params = NEW String[]
$Values = NEW String[]
END
PUBLIC SUB Add(ParamName AS String, Valor AS String)
IF CheckAdd(ParamName) THEN
$Params.Add(UCase$(ParamName))
$Values.Add(Valor)
ENDIF
END
PRIVATE FUNCTION CheckAdd(ParamName AS String) AS Boolean
DIM P AS String
IF ParamName THEN
FOR EACH P IN $Params
IF P = UCase$(ParamName) THEN
Message.Warning("Parametro duplicato!")
RETURN FALSE
ENDIF
NEXT
RETURN TRUE
ELSE
Message.Warning("Il parametro deve avere un nome!")
RETURN FALSE
ENDIF
END
PUBLIC FUNCTION Query() AS String
DIM I AS Integer
DIM wSql AS String = $Sql
IF $Sql THEN
IF CheckParam() THEN
FOR I = 0 TO $Params.Count - 1
SELECT CASE TypeOf($Values[i])
CASE 2, 3, 4, 5
'Numero intero
wSql = Replace(wSql, "@" & $Params[i], $Values[i], gb.Case)
CASE 6, 7
'Numero decimale
wSql = Replace(wSql, "@" & $Params[i], Replace($Values[i], ",", "."), gb.Case)
CASE 8
'Data
wSql = Replace(wSql, "@" & $Params[i], "'" & $Values[i] & "'", gb.Case)
CASE 9
'Stringa
wSql = Replace(wSql, "@" & $Params[i], "'" & Replace($Values[i], "'", "''") & "'", gb.Case)
END SELECT
NEXT
RETURN wSql
ELSE
RETURN ""
ENDIF
ELSE
Message.Warning("Non è stata passata la query!")
RETURN ""
ENDIF
END
PRIVATE FUNCTION CheckParam() AS Boolean
DIM P AS String
IF InStr($Sql, "@") <> 0 THEN
IF $Params.Count > 0 THEN
FOR EACH P IN $Params
IF InStr($Sql, "@" & P, 0, gb.Case) = 0 THEN
Message.Warning("Il parametro " & P & " non è stato inserito nella query passata!")
RETURN FALSE
ENDIF
NEXT
RETURN TRUE
ELSE
Message.Warning("Non sono stati specificati i parametri!")
RETURN FALSE
ENDIF
ELSE
IF $Params.Count > 0 THEN
Message.Warning("Impostare nella query passata i parametri!")
ELSE
Message.Info("Non sono stati impostati i parametri.")
ENDIF
RETURN FALSE
ENDIF
END
utilizzata in questo modo:
DIM Parametri AS NEW CParm("UPDATE Articoli SET Desc = @Desc, Prezzo = @Pz, DataModifica = @DataM WHERE Cod = @Cod")
DIM Prezzo AS Float = 12.5
DIM wSql AS String
Parametri.Add("Cod", "Articolo1")
Parametri.Add("Desc", "DescrizioneArticolo")
Parametri.Add("Pz", Prezzo)
Parametri.Add("DataM", Format(Date(Now), "dd/mm/yyyy"))
wSql = Parametri.Query()
su wSql ho la query che 'dovrebbe' non aver problemi.
Visto che sono acerbo di Gambas ho visto negli esempi che con la sub _new e _free di dichiaravano costruttore e distruttore della classe, ma non sono riuscito a fare un'overload del _new.
Come si fanno l'overload?
ciao
max