Autore Topic: [RISOLTO]Test condizione Result.avalable  (Letto 768 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
[RISOLTO]Test condizione Result.avalable
« il: 17 Maggio 2010, 22:57:51 »
Ho sempre avuto difficoltà ad inserire istruzioni del formato seguente:
 
Codice: [Seleziona]
 TRY Result = DB_Connection.Exec(Sql)
  IF Result.Available = TRUE THEN
     print "Risultato non valido"
   ENDIF
all'esecusione della "if" ricevo sempre il messaggio di ERRORE "NULL Object"

però se utilizzo "TRY" nel modo seguente:
Codice: [Seleziona]
TRY Result.MoveNext
  IF Result.Available = FALSE THEN
     print "Risultato non valido"
   ENDIF
--- funziona benissimo ---
Personalmente entrambi i gruppi di istruzioni mi sembrano scritti correttamente, eppure nel primo esempio ottengo sempre un comportamento anomalo del programma; quindi devo aver scritto qualcosa di sbagliato, ma dove?
Cia a tutti.

« Ultima modifica: 19 Maggio 2010, 14:45:55 da Picavbg »
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Test condizione Result.avalable
« Risposta #1 il: 17 Maggio 2010, 23:55:18 »
e se fai

Codice: [Seleziona]
TRY Result.MoveNext
  IF NOT Result.Available = FALSE THEN
     print "Risultato non valido"
  ENDIF

come si comporta?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #2 il: 18 Maggio 2010, 06:57:43 »
il problema è proprio il try, nel primo caso non è necessario e nel caso in cui la query ritorni null hai un errore ad inizio IF . Togli pure il try che non serve

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #3 il: 18 Maggio 2010, 09:38:42 »
Grazie ad entrambi per il sollecito suggerimento, tuttavia, mi sono reso conto di avere sbagliato a  riportare la giusta citazione; riscrivo pertanto l'istruzione che ha prodotto l'errore:
 
Codice: [Seleziona]
Sql = "SELECT * FROM $_NomeTab;"            ' $_NomeTab contiene sempre il nome valido di una delle tabelle del DB
 TRY Result = DB_Connection.Exec(Sql)
  IF Result.Available = TRUE THEN
     print "Risultato non valido"
   ENDIF

@ fsurfing :
Citazione
il problema è proprio il try, nel primo caso non è necessario e nel caso in cui la query ritorni null hai un errore ad inizio IF . Togli pure il try che non serve
Originariamente avevo preparato l'istruzione
Codice: [Seleziona]
Result = DB_Connection.Exec(Sql)
senza il parametro "Try", ma ricevevo, proprio sulla query, il seguente errore: Query failed; SQL error or missing database.
Ecco perché aggiunto "Try", ma purtroppo non é cambiato, molto.

Avrei bisogno di gestire la condizione di tabella vuota, ma non ci riesco. Ho superato l'ostacolo in questo modo:
Result = DB_Connection.Find($_NomeTab)
i = Result.Count
IF i <> 0  THEN
   Esegui_Tabella_Popolata
ENDIF


Però sono rimasto ignorante e, quindi, rischio una solenne bocciatura.  :)
Ciao.
:ciao:

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #4 il: 18 Maggio 2010, 14:25:22 »
e se provi in questo modo:

Sql = "SELECT * FROM $_NomeTab;"            ' $_NomeTab contiene sempre il nome valido di una delle tabelle del DB
 TRY Result = DB_Connection.Exec(Sql)
 IF NOT IsNull(Result) THEN
   IF NOT Result.Available THEN
     print "Risultato non valido"
   ELSE
     print "Risultato valido"
   ENDIF
 ENDIF

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #5 il: 18 Maggio 2010, 21:58:31 »
 una query che dia errore deve essere corretta per prima cosa, mettere un try è solo una piccola pezza per tappare un buco enorme!
o metti un try e poi vai a ricevere l' errore con un cach oppure ancora meglio non lometti proprio e fai funzionare la query come si deve!

se hai un query failed su una query di questo tipo:

Codice: [Seleziona]
Sql = "SELECT * FROM $_NomeTab;" 

o non ti sei connesso al db oppure non esiste la tabella che vuoi leggere

potresti quindi prima verificarne l' esistenza con:

Codice: [Seleziona]
if DB_connection.tables.exist($_NomeTab)=true then
      Sql = "SELECT * FROM $_NomeTab;"            ' $_NomeTab contiene sempre il nome valido di una delle tabelle del DB
      Result = DB_Connection.Exec(Sql)
      IF Result.Available = FALSE THEN
            print "TABELLA VUOTA"
      ENDIF
ELSE
      PRINT "TABELLA NON ESISTENTE
END IF
 

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #6 il: 18 Maggio 2010, 22:19:49 »
e se provi in questo modo:
Sql = "SELECT * FROM $_NomeTab;"            ' $_NomeTab contiene sempre il nome valido di una delle tabelle del DB
 TRY Result = DB_Connection.Exec(Sql)
 IF NOT IsNull(Result) THEN
   IF NOT Result.Available THEN
     print "Risultato non valido"
   ELSE
     print "Risultato valido"
   ENDIF
 ENDIF

Grazie Milio, non avevo pensato di testare Result=NULL. Il ragionamento al quale mi hai portato col tuo suggerimento é:
"Result" contiene un valore "NULL" perché la tabella corrente è vuota, altrimenti sarebbe valorizzato con dati significativi. D'altronde, é lo stesso criterio seguito nella definizione dei campi interni ad una tabella, quando si attrubuisce NULL come valore di default ad un campo non valorizzato.
  :D :D :D
Ciao.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #7 il: 18 Maggio 2010, 22:53:30 »
una query che dia errore deve essere corretta per prima cosa, mettere un try è solo una piccola pezza per tappare un buco enorme!
o metti un try e poi vai a ricevere l' errore con un cach oppure ancora meglio non lometti proprio e fai funzionare la query come si deve!

se hai un query failed su una query di questo tipo:

Codice: [Seleziona]
Sql = "SELECT * FROM $_NomeTab;" 

o non ti sei connesso al db oppure non esiste la tabella che vuoi leggere

potresti quindi prima verificarne l' esistenza con:

Codice: [Seleziona]
if DB_connection.tables.exist($_NomeTab)=true then
      Sql = "SELECT * FROM $_NomeTab;"            ' $_NomeTab contiene sempre il nome valido di una delle tabelle del DB
      Result = DB_Connection.Exec(Sql)
      IF Result.Available = FALSE THEN
            print "TABELLA VUOTA"
      ENDIF
ELSE
      PRINT "TABELLA NON ESISTENTE
END IF
Scusa, non avevo ancora guardato la tua risposta, prima di rispondere a mia volta. Ho capito quello che mi suggerisci, ma ho verificato il passo di programma dov'é inserita la query incriminata e ti posso assicurare che la connessione è eseguita subito prima della query e correttamente (il path ed il nome del DB sono richiamati bene; la tabella esiste ed é vuota, perciò non riesco a capire perché, togliendo "TRY" debba produrre quell'errore, per me strano. Mi pare che l'inserimento della CATCH produca il suo  richiamo per qualsiasi errore che si manifesti all'interno della classe in cui è definita. Ricordo di averla provata già una volta e di averla poi abbandonata proprio per il suddetto effetto.
Ciao.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #8 il: 19 Maggio 2010, 09:07:31 »
@  fsurfing:
Penso di aver capito. Partendo dall'istruzione che da errore:
Codice: [Seleziona]
sql = "SELECT * FROM $_NomeTab"
RecTab = DB_Connection.Exec(sql)
ho rilevato che, sostituendo a $_NomeTab, cioé alla variabile-stringa, il nome effettivo della tabella, l'errore non si verifica più; allora ho pensato di portare il nome della variabile-stringa fuori dalla stringa SELECT, in questo modo:
sql = "SELECT * FROM " & $_NomeTab
Ecco, in queste condizioni l'errore "Query failed; SQL error or missing database" non si verifica più. In effetti, pensandoci bene, come avevo scritto prima, richiedevo una query su una tabella di nome $_NomeTab, inesistente.
Grazie per avermi acceso la lampadina. ;D
Ciao.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Test condizione Result.avalable
« Risposta #9 il: 19 Maggio 2010, 12:21:14 »
cavolo! è vero!!!! mi spiace non essermene accorto prima....ma sai a volte il copia e incolla genera queste sviste  :P