Autore Topic: classe per controllo parametri query  (Letto 734 volte)

Offline swan

  • Gamberetto
  • *
  • Post: 11
    • Mostra profilo
classe per controllo parametri query
« il: 01 Luglio 2009, 00:53:45 »
è 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

Codice: [Seleziona]

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

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: classe per controllo parametri query
« Risposta #1 il: 01 Luglio 2009, 12:53:21 »
Ti ho corretto il post...quando scrive del codice inseriscilo tra i tag di codice....così eviti di occupare troppo spazio...