Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[SQL - VB] Aggiornamento di più record

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[SQL - VB] Aggiornamento di più record

Messaggioda DilanDog » ven nov 10, 2006 12:54 pm

Lo scenario è il seguente: ho una tabella aperta tramite una datagrid, l'utente seleziona un tot di record, che potrebbero essere 2 ma anche un centinaio, ai quali applicare la modifica di un campo. Attenzione, non tutti i record presenti nella tabella, ma solo alcuni presi quà e là selezionandoli tramite li tasto CTRL (un po' come per i files di windows in gestione risorse), quindi impossibile applicare la modifica a tutti i record presenti in tabella.

La soluzione più semplice sarebbe quella di eseguire una query, ma per eseguirla solamente sui record selezionati dovrei aggiungere una clausola "where" dove specifico tutti gli ID dei record da modificare, tipo

Codice: Seleziona tutto
UPDATE table SET field=xxx WHERE (Id=1 OR Id=5 OR Id=20 OR.........)


quindi potrebbe diventare molto ma molto lunga, pensando ad esempio di aver selezionato centinaia di record.

Tutto questo giro di parole per arrivare ad una domanda molto semplice: esiste un limite di lunghezza delle query??
E qualcuno conosce un metodo alternativo per eseguire la modifica di cui sopra senza specificare gli ID dei record selezionati uno ad uno nella clausola where?
Ultima modifica di DilanDog il ven nov 10, 2006 4:35 pm, modificato 1 volta in totale.
Avatar utente
DilanDog
Senior Member
Senior Member
 
Messaggi: 208
Iscritto il: ven apr 15, 2005 9:13 am
Località: Milano

Messaggioda Ices_Eyes » ven nov 10, 2006 1:05 pm

Le query che sappia io non hanno limiti, e non esiste neanche un altro metodo. In temrini di tempo non credo sia molto dispendioso eseguire quella modifica anche se i record sono tanti...Comunque, se vuoi ridurre al limite le dimensioni della query puoi sempre, se hai a disposizione il numero di righe della tabella e quelle da modificare, fare una cosa del genere:
Codice: Seleziona tutto
if(nRigheMod > nRigheTab - nRigheMod) then SQL = (... WHERE Id != 20 AND id != 21...)
else SQL = (... WHERE Id = 20 OR id = 21...)

Anche se comunque non credo ti velocizzi molto la cosa!
Avatar utente
Ices_Eyes
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5543
Iscritto il: ven ott 24, 2003 10:37 am
Località: Prov. di Venezia

Re: [SQL - VB] Aggiornamento di più record

Messaggioda Robby78 » ven nov 10, 2006 1:06 pm

DilanDog ha scritto:Lo scenario è il seguente: ho una tabella aperta tramite una datagrid, l'utente seleziona un tot di record, che potrebbero essere 2 ma anche un centinaio, ai quali applicare la modifica di un campo. Attenzione, non tutti i record presenti nella tabella, ma solo alcuni presi quà e là selezionandoli tramite li tasto CTRL (un po' come per i files di windows in gestione risorse), quindi impossibile applicare la modifica a tutti i record presenti in tabella.

La soluzione più semplice sarebbe quella di eseguire una query, ma per eseguirla solamente sui record selezionati dovrei aggiungere una clausola "where" dove specifico tutti gli ID dei record da modificare, tipo

Codice: Seleziona tutto
UPDATE table SET field=xxx WHERE (Id=1 OR Id=5 OR Id=20 OR.........)


quindi potrebbe diventare molto ma molto lunga, pensando ad esempio di aver selezionato centinaia di record.

Tutto questo giro di parole per arrivare ad una domanda molto semplice: esiste un limite di lunghezza delle query??
E qualcuno conosce un metodo alternativo per eseguire la modifica di cui sopra senza specificare gli ID dei record selezionati uno ad uno nella clausola where?

[/code]


ti consiglio di fare un ciclo for next usando solo un parametro nella query, scorrendo uno a uno gli elementi selezionati; richiede più risorse, ma è decisamente più "pulito".

riguardo alla lunghezza della query, sinceramente non so; so solo che in VB devi "spezzare" le righe consecutive, perché dopo un tot di "a capo" ( _ ) vb va in errore; devi quindi a un certo punto spezzare la stringa (sSQL = sSQL & "bla bla bla").
Povera patria! Schiacciata dagli abusi del potere di gente infame, che non sa cos'è il pudore - Franco Battiato
ricordati di pensare! - mia mamma
Avatar utente
Robby78
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 3829
Iscritto il: gio gen 08, 2004 5:25 pm
Località: Emilia Romagna


Re: [SQL - VB] Aggiornamento di più record

Messaggioda DilanDog » ven nov 10, 2006 2:53 pm

Robby78 ha scritto:
ti consiglio di fare un ciclo for next usando solo un parametro nella query, scorrendo uno a uno gli elementi selezionati; richiede più risorse, ma è decisamente più "pulito".

riguardo alla lunghezza della query, sinceramente non so; so solo che in VB devi "spezzare" le righe consecutive, perché dopo un tot di "a capo" ( _ ) vb va in errore; devi quindi a un certo punto spezzare la stringa (sSQL = sSQL & "bla bla bla").


In effetti al momento sto ciclando su tutti i record selezionati apportando le varie modifiche, anche se ci sono dei casi in cui con una query si farebbe in pochi secondi mentre così ci si impiega parecchio tempo. Credo che adotterò una situazione "ibrida" in base al numero di record selezionati: sotto un tot numero eseguo una query, oltre vado di ciclo

Grazie comunque ad entrambi [8D]
Avatar utente
DilanDog
Senior Member
Senior Member
 
Messaggi: 208
Iscritto il: ven apr 15, 2005 9:13 am
Località: Milano

Re: [SQL - VB] Aggiornamento di più record

Messaggioda Robby78 » ven nov 10, 2006 3:03 pm

DilanDog ha scritto:adotterò una situazione "ibrida" in base al numero di record selezionati: sotto un tot numero eseguo una query, oltre vado di ciclo


beh, non discriminare in base al numero di record; fai semplicemente un ciclo for next step 10 ad esempio:



Codice: Seleziona tutto
for i = 1 to nRecords Step 10

sSQL ="..... Where ID = selezione(i) or ID = selezione (i+1) or ..... ID = selezione(i+9)"

next i


in questo modo ottieni lo stesso risultato in automatico (se record selezionati < 10 una sola query, altrimenti più query)
Povera patria! Schiacciata dagli abusi del potere di gente infame, che non sa cos'è il pudore - Franco Battiato
ricordati di pensare! - mia mamma
Avatar utente
Robby78
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 3829
Iscritto il: gio gen 08, 2004 5:25 pm
Località: Emilia Romagna

Re: [SQL - VB] Aggiornamento di più record

Messaggioda DilanDog » ven nov 10, 2006 4:33 pm

Robby78 ha scritto:beh, non discriminare in base al numero di record; fai semplicemente un ciclo for next step 10 ad esempio:



Codice: Seleziona tutto
for i = 1 to nRecords Step 10

sSQL ="..... Where ID = selezione(i) or ID = selezione (i+1) or ..... ID = selezione(i+9)"

next i


in questo modo ottieni lo stesso risultato in automatico (se record selezionati < 10 una sola query, altrimenti più query)


In effetti l'ho implementato proprio così, in modo da avere a codice un'unica query che eventualmente si ripete più volte.....VBThelepaty [applauso]
Avatar utente
DilanDog
Senior Member
Senior Member
 
Messaggi: 208
Iscritto il: ven apr 15, 2005 9:13 am
Località: Milano

Messaggioda Robby78 » ven nov 10, 2006 4:54 pm

hehe comunque mi sono accorto che in questa modo perdi i "rotti": se hai 35 records, ne aggiorneresti solo 30; i 5 in più escono dal for...
Povera patria! Schiacciata dagli abusi del potere di gente infame, che non sa cos'è il pudore - Franco Battiato
ricordati di pensare! - mia mamma
Avatar utente
Robby78
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 3829
Iscritto il: gio gen 08, 2004 5:25 pm
Località: Emilia Romagna

Messaggioda Robby78 » ven nov 10, 2006 4:59 pm

Puoi usare una sola query; Prova così:
Codice: Seleziona tutto
sSQL = "Update ..... Set .... Where "
For i = 1 To nrecords
    sSQL = sSQL & "ID = " & selezione(i)
    If nrecords > i Then
        sSQL = sSQL & " Or "
    End If
Next i
Povera patria! Schiacciata dagli abusi del potere di gente infame, che non sa cos'è il pudore - Franco Battiato
ricordati di pensare! - mia mamma
Avatar utente
Robby78
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 3829
Iscritto il: gio gen 08, 2004 5:25 pm
Località: Emilia Romagna

Messaggioda DilanDog » ven nov 10, 2006 6:50 pm

Robby78 ha scritto:Puoi usare una sola query; Prova così:
Codice: Seleziona tutto
sSQL = "Update ..... Set .... Where "
For i = 1 To nrecords
    sSQL = sSQL & "ID = " & selezione(i)
    If nrecords > i Then
        sSQL = sSQL & " Or "
    End If
Next i


Io l'ho risolta così:

Codice: Seleziona tutto
sSql="UPDATE table SET field=value"
For i = 1 To nRecord
    sWhere = sWhere & sOr & "Id=" & RecordSelected(i)
    sOr = " OR "
    If i Mod 20 = 0 Then
        'esegue la query sommando a sSql " where (" & sWhere & ")"
        sWhere = ""
        sOr = ""
    End If
Next i
If sWhere > "" Then
    'Esegue l'ultima query
End If


e va che è una meraviglia [8D]
Avatar utente
DilanDog
Senior Member
Senior Member
 
Messaggi: 208
Iscritto il: ven apr 15, 2005 9:13 am
Località: Milano


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising