Aggiornamento del valore di un campo con condizione

Anonimo
2019-11-28T13:38:01+00:00

Ciao a tutti. Da molto tempo non scrivo dei codici vba ed ho perso un po' la mano. Ho un problema da risolvere per il quale chiedo supporto.

Ho una tabella di migliaia di record in cui ho questa situazione.

Ho un campo con valore 0 (valore errato) che vorrei aggiornare con il valore corretto. Il valore corretto è presente nel record precedente a quello errato.

Dovrei fare un ciclo sulla tabella che legge un campo chiave, memorizza il valore del campo corretto, se il chiave successiva è la stessa legge il campo "errato" e se trova il valore 0 lo modifica con il valore precedentemente memorizzato. Nello screen ho messo l'esempio.

In sostanza la routine deve leggere il campo "chiave" e memorizzare il valore del campo "etbestnr", entrare in un ciclo per la "chiave", testare il valore del campo "etbestnr" e se uguale a 0 sostituirlo con quello memorizzato.

Sicuramente è un banale codice di 10 righe ma al momento non mi viene ...... Se qualcuno mi dà una dritta lo ringrazio già da ora.....

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-11-28T14:09:38+00:00

Ciao,

prova ad utilizzare le seguenti due query:

Query1:

SELECT Tabella1.Chiave, Tabella1.etbestnr

FROM Tabella1

WHERE (((Tabella1.etbestnr) Is Not Null And (Tabella1.etbestnr)<>0));

Query2:

UPDATE Query1 INNER JOIN Tabella1 ON Query1.Chiave = Tabella1.Chiave SET Tabella1.etbestnr = [Query1].[etbestnr]

WHERE (((Tabella1.etbestnr)=0 Or (Tabella1.etbestnr) Is Null));

Facci sapere

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-11-28T16:45:17+00:00

    Ok fa il lavoro che mi serviva. Grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-11-28T15:54:31+00:00

    ciao Tos58,

    [...]

    Grazie per la tempestiva risposta. 

    [...]

    prego!

    [...]

    Spero sia chiaro.

    [...]

    non molto....

    [...]

    La tabella è ordinata sul campo "chiave" decrescente in modo che il record con il valore del campo da modificare uguale a 0 segua quello corretto di cui prendere il valore e in questo modo con un ciclo ci si posiziona correttamente.

    [...]

    non si parla di ordine nelle tabelle....

    data la tabella tabella1 :

    ottengo quello che segue :

    con il predicato sql :

    UPDATE

             tabella1 as T

    INNER JOIN

            tabella1 as t1 ON t.chiave = t1.chiave

    SET t.valoreArt = t1.ValoreArt

    WHERE 

             t1.valoreArt=(SELECT MAX(valoreArt) as MVA FROM tabella1 as t1 WHERE t1.chiave=t.chiave) and t.chiave is not null;

    il predicato presuppone che il valore da sostituire sia univoco, da qui la domanda sul valore precedente.

    L'aggregazione con Max esclude le righe a valore zero.

    Precedente, ultimo, primo, successivo dipendono sempre dall'ordine specifico e come detto non non si parla ordinamento in una tabella per definizione.

    I loop e i cursori si usano quando non ci sono alternative e quando si e' certi che non ce ne siano per certo la soluzione esce da qualche parte.

    Nei database si predilgoono sempre soluzioni set based e non quelle iterative based.

    Testa il predicato su una copia della tabella...mi raccomando!!!!! e per fare questo modifica il nome della tabella e dei campi con quelli propri del tuo scenario.

    Facci sapere.

    Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-11-28T14:58:47+00:00

    Grazie per la tempestiva risposta. La tabella è ordinata sul campo "chiave" decrescente in modo che il record con il valore del campo da modificare uguale a 0 segua quello corretto di cui prendere il valore e in questo modo con un ciclo ci si posiziona correttamente.

    La logica dovrebbe essere:

    ciclo eof sulla tabella

    ciclo sul campo "chiave"

    all'interno del ciclo test sul campo da modificare nel caso sia pari a 0 con il valore memorizzato

    Spero sia chiaro.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2019-11-28T14:07:37+00:00

    ciao Tos58,

    prima di pensare che serva un loop vediamo un attimo come procedere.

    nelle righe evidenziate mostri l'articolo 500321536 con due valori a 106717 e uno a 0. 

    Ovviamente da come spieghi vuoi che il valore 0 diventi 106717.

    Come facciamo a identificare il record precedente? in una tabella non c'e' un ordine per definizione perche' si tratta di un set.

    Oppure ti e' sufficiente sostituire il valore 0 con quello non zero dello stesso articolo indipendentemente che sia quello precedente?

    in questo caso 106717 e' lo stesso valore per tutti gli articoli con chiave finale 536 ( ho indicato le tre cifre finali).

    Facci sapere.

    Ciao e grazie, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento