It is currently 18 April 2026, 1:43 Advanced search

select into variables

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

select into variables

Postby r.bianco » 2 September 2025, 6:48

InDe 24.5

Mi capita, non spesso ma neanche così raramente, di avere un problema "logico" con le select into variables:
Per come è pensato l'algoritmo e la qry, mi aspetto che venga estratto un solo record, dal quale prendo i valori. Invece, per errori di logica o di scrittura della qry, in alcuni casi vengono estratti più record e quindi i valori ricavati possono essere scorretti. Ma io non lo so e l'esecuzione prosegue, magari creando danni da qualche parte.

C'è un modo, subito dopo la select into variables, di capire quanti record sono stati estratti in modo da gestire la casistica? in questo modo potrei tirare eccezione, un po' come fa la loadFromDb delle classi do.
only work and no play makes jack a dull boy
r.bianco
 
Posts: 5073
Joined: 8 November 2010, 16:46

Re: select into variables

Postby Thema » 2 September 2025, 11:50

non so se ho capito bene, ma io metto un count() nella select
Antonio Avitabile (freelance)
User avatar
Thema
 
Posts: 824
Joined: 6 February 2013, 13:46
Location: Parma

Re: select into variables

Postby r.bianco » 2 September 2025, 12:27

Sì, hai capito bene, grazie.
Così ottengo quello che voglio, ma al suo interno inde trasforma la qry in un group by, e a volte potrebbe essere oneroso.
Mi chiedevo se ci fosse un'istruzione come la For Each Count, che al suo interno viene tradotta in rs.RecordCount().

Forse Row Count() funziona allo stesso modo, non so.
only work and no play makes jack a dull boy
r.bianco
 
Posts: 5073
Joined: 8 November 2010, 16:46

Re: select into variables

Postby smuser » 2 September 2025, 12:36

All'inizio anche io non avevo ben capito, poi ho guardato il codice generato e ho capito.
In pratica la select into variables:
    1. apre un recordset
    2. si posiziona sul primo elemento
    3. legge i valori del recordset per valorizzare le variabili
    4. chiude il recordset

Se usi la select into recordset, il codice generato per la query è lo stesso ma fa solo gli step 1 e 2. L'ho citata perchè aprendo il recordset puoi usare il metodo RecordCount del recordset per sapere quante righe ottieni.

La cosa interessante è che per valorizzare la variabile "found" della select into variables il codice generato usa proprio il metodo RecordCount
Code: Select all
      QV = MainFrm.ISI2DBObject.DBO().OpenRS(SQL);
      if (!QV.EOF()) QV.MoveNext();
      v_FOUND = (QV.RecordCount()!=0 ? IDVariant.TRUE : IDVariant.FALSE);

Si potrebbe chiedere a Programma se possono mettere una seconda variabile oltre a found che indica il numero di righe selezionate.

Tieni presente però che quando usi la select into variables e il filtro della select non garantisce un risultato univoco dovresti chiederti perchè ti va bene leggere solo i dati del primo record.
Un caso d'uso che a volte mi capita è quando leggo da una tabella in cui ho uno storico di istanze di uno stesso dato e magari prendo la più recente o la più vecchia facendo un order by. In questo caso so che potenzialmente la query selezionerà più righe ma so già che a me serve il dato preso dalla prima riga restituita.
User avatar
smuser
 
Posts: 326
Joined: 3 May 2019, 10:41
Location: Milano

Re: select into variables

Postby r.bianco » 2 September 2025, 13:26

Yes, proprio così. In effetti il mio cruccio è: se c'è un errore e ne tira fuori più d'uno, come me ne accorgo (senza forzare un count)?
only work and no play makes jack a dull boy
r.bianco
 
Posts: 5073
Joined: 8 November 2010, 16:46

Re: select into variables

Postby smuser » 2 September 2025, 13:58

Si capisco.
Noi seguiamo più o meno questo principio: usare select into variables solo se puoi filtrare per chiave o su query che usano tabelle con vincoli relazionali ben definiti (così che i test in fase di sviluppo siano consistenti con i dati la fuori), in caso manchino i due requisiti e serve un controllo di cardinalità usiamo la select into recordset e di conseguenza utilizzo di recordcount.
Anche a me non piace inserire una count nella query per via della group by "nascosta" che INDE deve necessariamente fare per tutti i campi che selezioni.
User avatar
smuser
 
Posts: 326
Joined: 3 May 2019, 10:41
Location: Milano

Re: select into variables

Postby ljwilson » 2 September 2025, 14:56

Se vuoi che venga restituita solo una riga e sei sicuro che la prima riga vada bene se ce n'è più di una, puoi usare il trucco maxrows = 1 prima della query, come in
mydbname.MaxRows = 1
select into variables...

https://doc.instantdeveloper.com/?ARTID=C96E4D9D-41D1-4971-821A-4FEF8F1145D4&LANG=ita

...jack
ljwilson
 
Posts: 797
Joined: 26 November 2013, 14:15

Re: select into variables

Postby r.bianco » 2 September 2025, 15:01

Grazie
only work and no play makes jack a dull boy
r.bianco
 
Posts: 5073
Joined: 8 November 2010, 16:46

Re: select into variables

Postby dr_whiteriver » 3 September 2025, 7:42

Io me ne accorgo se nel debug vedo un warning in giallo...
Alessandro
User avatar
dr_whiteriver
 
Posts: 608
Joined: 3 September 2012, 13:44

Re: select into variables

Postby r.bianco » 3 September 2025, 9:46

Vero, ma non sempre nei test incappo nella casistica che poi in produzione genera il problema.

Detto in altri termini:
La loadFromDb() solleva eccezione se la qry di caricamento estrae più di un record, perché l'istanza può essere una sola.
Select into variables non lo fa perché la sua idea è: prendi i valori dal primo record.
Mi piacerebbe un pezzettino in più che mi permettesse di controllare la Select into variables nel caso volessi che si comportasse come la loadFromDb(), cioè nel caso in cui io voglia essere sicuro che l'estrazione sia di un solo record, altrimenti segnalare errore.
Aggiungere count() funziona, mi chiedevo se c'è qualcosa che mi permette di ottenerlo senza dover "manomettere" la qry.
Cmq, non è un gran problema.
Grazie a tutti.
only work and no play makes jack a dull boy
r.bianco
 
Posts: 5073
Joined: 8 November 2010, 16:46


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: No registered users and 51 guests