Query aggiornamento "parziale"

lunedì 03 gennaio 2011 - 10.45
Tag Elenco Tags  Access (.mdb)  |  Office 2003

emilio86 Profilo | Newbie

Salve, avrei bisogno di un aiuto per la realizzazione di una query di aggiornamento che deve avere una
caratteristica ben precisa.
Spero possiate aiutarmi.

Questa query deve aggiornarmi un quantitativo (indicato da me) di record.
Io sono riuscito a realizzare la query che mi aggiorna TUTTI i record.

In poche parole dovrei realizzare una query che mi permetta di scegliere quanti record aggiornare.


Ho cercato di riassumere in modo veloce, se mi sono spiegato male o volete precisazioni più dettagliate, ditelo ^^
Vi ringrazio anticipatamente.

Emilio.

boccia75 Profilo | Junior Member

Forse (è ironico) dovresti dare qualche informazione in piu', tipo....
struttura tabelle, esempio di dati presenti in tabella, risultato che vorresti ottenere dalla query.
Senza di questi, dubito che tu possa trovare risposta alla tua domanda.
Ciao

emilio86 Profilo | Newbie

in effetti hai ragione.
E' solo che credevo fosse davvero semplicissima la soluzione (visto che non sono un "master" nel campo access)

Allora nella tabella ci sono campi del genere
ragione sociale - città - categoria - telefono - esito - note - operatrice (a cui è assegnato) ecc.ecc.

la query che ho creato io mi fa aggiornare il campo "operatrice" in base alla città e alla categoria che scelgo.
Il problema è che questa query mi fa assegnare un nome di un operatrice a TUTTI i record di quella precisa città e con quella precisa categoria.

tipo se ci sono 500 record con città "VERONA" e categoria "BAR" me li aggiorna tutti con la stessa operatrice.
Io invece vorrei assegnarne solo un quantitativo parziale.
Dopo le domande "INSERISCI CITTA" e "INSERISCI CATEGORIA" vorrei anche un ipotetico "QUANTI NE VUOI ASSEGNARE?"

spero di esser stato più chiaro adesso.
grazie.

speedx Profilo | Junior Member

Scusa, ma sulla base di quale criterio scegli a quale bar assegnare l'opertaore?
Mi sembra poco funzionale senza una regola
//// Marcello C.

emilio86 Profilo | Newbie

ah ecco,
mi hai fatto ricordare che il criterio è "aggiorna solo quando il campo OPERATRICE è vuoto (isNull)"

speedx Profilo | Junior Member

Quindi direi che ti sei risposto

UPDATE nometabella
SET campo_operatore = OPERATORE
WHERE....
AND campo_operatore IS NULL



//// Marcello C.

emilio86 Profilo | Newbie

si, ma così aggiorna TUTTI i record vuoti, no?

io vorrei far sì che vengano aggiornati solo un numero limitato di record.
Numero di record scelto da me.

speedx Profilo | Junior Member

Posto che non capisco l'utilita della cosa....
Poteresti fare una cosa

UPDATE R_DATABASE
SET SERVERNAME=""
WHERE NAME IN
(
SELECT NAME
FROM [SELECT T1.NAME,
(
SELECT COUNT(*) + 1
FROM R_DATABASE AS T2
WHERE T1.NAME > T2.NAME
) AS RANK
FROM R_DATABASE AS T1
]. AS [%$##@_Alias]
WHERE RANK< @Parametro);
//// Marcello C.

emilio86 Profilo | Newbie

grazie

non esiste una versione "visuale"?
perchè io le query non le faccio usando l'SQL

questo pezzo di programma non saprei dove inserirlo.

boccia75 Profilo | Junior Member

Allora ci spieghi come le fai?
SQL=query, diversamente non saprei come utilizzarlo

emilio86 Profilo | Newbie

da access con "crea query in visualizzazion struttura" oppure con "crea query mediante una creazione guidata"

boccia75 Profilo | Junior Member

Allora da access crea una query come vuoi tu (magari vuota) e poi entri nel codice sql (mi sembra che ci sia scritto proprio così), copi e incolli la query che ti hanno postato.
Ciao

emilio86 Profilo | Newbie

capito.

però immagino che quella query si debba adattare ai parametri delle mie tabelle, no?

ecco, si potrebbe avere una spiegazione riguardo i singoli passaggi che compie quella query?
Thanks.

speedx Profilo | Junior Member

Spiegazione:

SELECT NAME
SELECT T1.NAME,
(
SELECT COUNT(*) + 1
FROM R_DATABASE AS T2
WHERE T1.NAME > T2.NAME
) AS RANK
FROM R_DATABASE AS T1

Questo pezzo crea un numero progressivo che server come contatore e questo va sotto il nome di RANK....
Nella WHERE T1.NAME > T2.NAME dovresti mettere la condizione che identifica il cambio di record (ovvero il/i campo/campi della chiave primaria)

Questo pezzo di query viene rinominato con un alias come se fosse una tabella "AS [%$##@_Alias]". (Penso che tu qui possa mettere il nome che ti pare)

Adesso aggiungi la clausola parametrica che ti permette di estrarre solo 1,2,3,4,5,6,...n record quanti tu vuoi assegnare al tuo operatore

WHERE RANK< @Parametro

E fin qui hai fatto solo una select per selezionare i tuoi negozi (se non ricordo male il tuo caso parlava di negozi).

Adesso metti la parte che fa l'update sulla tabella....

UPDATE R_DATABASE
SET SERVERNAME= campo_di interesse o valore
WHERE NAME IN (query precedente).

Nekl tuo caso penso sia una cosa tipo

UPDATE "tabella negozzi"
SET CampoOperatore = "campo operatore preso da tabella o variabile"
WHERE NomeNegozio IN (Query precedente che ristituisce n nomi negozio)


UPDATE R_DATABASE
SET SERVERNAME=""
WHERE NAME IN
(
SELECT NAME
FROM [SELECT T1.NAME,
(
SELECT COUNT(*) + 1
FROM R_DATABASE AS T2
WHERE T1.NAME > T2.NAME
) AS RANK
FROM R_DATABASE AS T1
]. AS [%$##@_Alias]
WHERE RANK< @Parametro);
//// Marcello C.
//// Marcello C.

emilio86 Profilo | Newbie

è molto più complicata di quanto pensassi!

io non ho capito T1 e T2 quali tabelle sono.

ora ti spiego la mia semplice tabella com'è composta

si chiama "tabella" ed ha i seguenti campi:
-OPERATRICE
-CATEGORIA
-RAG.SOC.
-CITTA'
-ECC.ECC.

io avevo già creato la seguente query:
UPDATE prova SET tabella.OPERATRICE = [inserisci OPERATRICE]
WHERE (((tabella.OPERATRICE) Is Null) AND ((tabella.CATEGORIA)=[scegli CATEGORIA]));

questa query mi fa apparire a video prima il nome dell'operatrice a cui voglio assegnare questi nominativi, e poi mi chiede quale categoria voglio assegnare. La terza domanda che vorrei è "[quanti vuoi assegnarne?]"

Ovviamente voglio che assegni a chi non ha già il campo OPERATRICE occupato (senò sarebbe già assegnato) quindi ho messo WHERE (((prova.OPERATRICE) Is Null)

Questa query mi fa aggiornare TUTTI i record vuoti che trova di quella specifica categoria, io vorrei semplicemente scegliere quanti record aggiornare.

speedx Profilo | Junior Member

Appunto... per aggiornare solo un tot di record devi contarli, da qui devi fare l'operazione sopra,
altrimenti l'operazione devorebbe essere fatta nell'applicazione scorrendo il recordset ed aggiornando i valori fino al numero messo in input...
Ma, se posso chiederti sulla base di quale criterio associ ad un operatore solo a 10 cose che saranno scelte casualmente quando viene estratto il dato?


UPDATE SOCIETA
SET OPERATRICE=[@Operatore]
WHERE [RAG.SOC] IN
(
SELECT NAME
FROM [SELECT T1.[RAG.SOC], (SELECT COUNT(*) + 1 FROM SOCIETA AS T2 WHERE T1.[RAG.SOC] > T2.[RAG.SOC] AND NZ(T1.OPERATORE,"NULL") = NZ(T2.OPERATORE,"NULL") AND T1.CATEGORIA = T2.CATEGORIA ) AS RANK FROM SOCIETA AS T1]. AS [TAB_RANK]
WHERE RANK< [@Parametro]
AND T1.CATEGORIA [@Categoria]
AND T1.OPERTORE IS NULL
);


NON E' TESTATA, MA DOVREBBE FUNZIONARE


//// Marcello C.

emilio86 Profilo | Newbie

in base ai 2 criteri che sono:
- categoria scelta da me
- campo OPERATRICE vuoto

ora la testo

edit:
mi dice errore di sintassi nella query "NAME IN ecc.ecc.ecc.

immagino di non aver sostituito bene i parametri con quelli miei.

Ma T1 e T2 a cosa corrispondono?

T1 è la mia tabella principale, quindi devo sostituirlo con il nome che ho messo io,
ma T2?

speedx Profilo | Junior Member

Ho aggiornato la query dove era sbagliata (nome campo NAME probabilmente)
Cmq T1 e T2 sono alias della tabella che io ho chiamato SOCIETA e che se non ho capito male e' effettivamente la tua tabella principale.

Sostituisci SOCIETA con il nome della tua tabella ovunque.
//// Marcello C.

emilio86 Profilo | Newbie

la tabella principale l'ho chiamata "prova"

allora, ho fatto le sostituzioni ma mi da sempre l'errore di sintassi dal "WHERE [RAGSOC] IN" in poi.

ti incollo la query con le mie sostituzioni:

UPDATE prova
SET OPERATRICE=[@Operatore]
WHERE [RAGSOC] IN
(
SELECT NAME
FROM [SELECT T1.[RAGSOC], (SELECT COUNT(*) + 1 FROM prova AS T2 WHERE T1.[RAGSOC] > T2.[RAGSOC] AND NZ(T1.OPERATRICE,"NULL") = NZ(T2.OPERATRICE,"NULL") AND T1.CATEGORIA = T2.CATEGORIA ) AS RANK FROM prova AS T1]. AS [TAB_RANK]
WHERE RANK< [@Parametro]
AND T1.CATEGORIA [@Categoria]
AND T1.OPERTRICE IS NULL
);

secondo me ci sarà qualche dettaglio di sintassi che ci sfugge.
Forse le parentesi (visto che ce ne sono tante) oppure qualche punto.
Tipo c'è quel punto prima di AS [TAB_RANK], è normale?

Una domanda:
ma [RAGSOC] è la domanda di immissione che mi appare a video?

speedx Profilo | Junior Member

No, puo essere operatore o rank o un altro dei paramtri con la @.
Non la ragione sociale.

riesci ad allegare qui il file mdb che stai usando così che posso capire come e' costruito il tutto e replicare l'errore...
Mi interessa con solo quella tabella e magari solo 2 record di prova.

Grazie

//// Marcello C.

emilio86 Profilo | Newbie

ma grazie a te!

la query in questione l'ho rinominata "query da fare".
Al suo interno c'è quella che postasti tu inizialmente, l'ultima non me la fa nemmeno salvare sempre per quell'errore (ancora ignoto) di sintassi.

NB: alcuni campi li hai chiamati OPERATORE e non OPERATRICE, ma anche se sostituisco non funziona.

speedx Profilo | Junior Member

Ecco qui la soluzione....
Testata fuziona...

Le query sono 2:
qrySelect_Soc_Upd --> Selezione delle societa che voglio aggiornare per categoria e numero (n record, quindi 10 = 10 societa)
qryUpd_Operatore_Soc --> query che effettua l'update del campo operatore suelle societa recuperate dalla query precedente....

Tu devi eseguire solo qryUpd_Operatore_Soc la quale richiama in automatico quella della selezione.

A video ti apparirano delle box da riempire con i valori dei parametri
@Categoria -> Categoria Societa
@N_Societa -> (n record, quindi 10 = 10 societa)
@Operatrice -> Nome dell'operatrice

Quindi per provare puoi valorizzare così, (ho aggiunto un po' di record per test)

@Categoria -> avvocato
@N_Societa -> 10
@Operatrice -> TEST

e vedrai che solo 10 che avevo il campo operatore vuoto vengono valorizzati con il valore TEST





//// Marcello C.

emilio86 Profilo | Newbie

l'ho testata velocemente da casa.
GRANDIOSO!
funziona!!!

domani la importo nel db principale avendo cura di fare le giuste sostituzioni.

intanto GRAZIE MILLE!!

domani ti faccio sapere.

emilio86 Profilo | Newbie

bene, funziona!

ma se volessi aggiungerci di richiedere la CITTA' oltre alla CATEGORIA?

devo aggiungere un " and T1.CITTA=[@Città] " dopo il WHERE nlle query ___qryRank e qrySelect_Soc_Upd ?

ho detto CITTA per dire un qualunque altro campo tipo CAP, PROVINCIA, ESITO ecc.ecc.ecc.

speedx Profilo | Junior Member

E' risultato un po' più incasinato del previsto, solo per che non gestiste query lunghe...
Cmq te l'ho fatto...

Attenzione se aggiungi clausole devi metterle anche dove fa la numerazione dei record...
Guarda il codice
//// Marcello C.

emilio86 Profilo | Newbie

eh sì, noto che è complicato da aggiornare ^^

non si può fare che se lascio una richiesta vuota (premendo direttamente invio) mi da lo stesso il risultato bypassando la richiesta?

tipo assegnando solo la città senza digitare la categoria e viceversa.

speedx Profilo | Junior Member

Quelle che chiedi tu si chiamano query dinamiche e sono realizzate in altro modo...
Direi però che ti serve un buon libro di SQL e Database prima.
//// Marcello C.

emilio86 Profilo | Newbie

infatti, hai ragione.
Beh queste dritte mi sono state comunque molto utili (=

confermo e accendo la tua risposta
Grazie per l'aiuto costante!

santi.costa Profilo | Newbie

Ciao Speedx,
sono nuovo del Forum, mi sono imbattuto su questo articolo cercanco una soluzione ad un mio problema che è identico a quello che hai risolto riguardo l'aggiornamento Query Parziale.
Però non riesco a scaricare il file di esempio (1527_NEW_1525_prova.zip) xchè mi ritorna un errore ... me lo puoi, per favore, inviare così lo posso verificare ed utilizzare?. Grazie anticipatamente.
Santi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5