Pagina 1 di 1

[SQL - VB] Aggiornamento di più record

MessaggioInviato: ven nov 10, 2006 12:54 pm
da DilanDog
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?

MessaggioInviato: ven nov 10, 2006 1:05 pm
da Ices_Eyes
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!

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

MessaggioInviato: ven nov 10, 2006 1:06 pm
da Robby78
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").

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

MessaggioInviato: ven nov 10, 2006 2:53 pm
da DilanDog
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]

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

MessaggioInviato: ven nov 10, 2006 3:03 pm
da Robby78
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)

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

MessaggioInviato: ven nov 10, 2006 4:33 pm
da DilanDog
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]

MessaggioInviato: ven nov 10, 2006 4:54 pm
da Robby78
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...

MessaggioInviato: ven nov 10, 2006 4:59 pm
da Robby78
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

MessaggioInviato: ven nov 10, 2006 6:50 pm
da DilanDog
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]