Il linguaggio di programmazione Delphi
 

Questa query sbaglia

Stark 8 Dic 2016 00:36
Questa è la select:
UPDATE MOVIM M SET NOME= (select Nome from Titoli T where M.LINK=T.ID) where
M.TIPO="I"'

L'intenzione della query è di assegnare al campo NOME del datset MOVIM il
valore dell'omonimo campo del dataset TITOLI.

I due dataset sono legati dai campi LINK e ID. Solo i records di MOVIM che
hanno il Tipo "I" devono essere aggiornati.

Ci sono alcuni records di MOVIM che, pur essendo di tipo "I", non ci sono
nel dataset TITOLI. In questi è avvenuto il problema, e cioè la query ha
aggiornato anche il NOME di questi record, con il NOME da TITOLI assegnato
con un criterio sconosciuto.

Ci ho lavorato tutto il giorno, ma non sono riuscito a capire. C'è qualcuno
che ci capisce?
jugin 9 Dic 2016 11:04
On Thu, 8 Dec 2016 00:36:43 +0100, "Stark" <starkwedderr@gmail.com>
wrote:

>Questa è la select:
>UPDATE MOVIM M SET NOME= (select Nome from Titoli T where M.LINK=T.ID) where
>M.TIPO="I"'
>
>L'intenzione della query è di assegnare al campo NOME del datset MOVIM il
>valore dell'omonimo campo del dataset TITOLI.
>
>I due dataset sono legati dai campi LINK e ID. Solo i records di MOVIM che
>hanno il Tipo "I" devono essere aggiornati.
>
>Ci sono alcuni records di MOVIM che, pur essendo di tipo "I", non ci sono
>nel dataset TITOLI. In questi è avvenuto il problema, e cioè la query ha
>aggiornato anche il NOME di questi record, con il NOME da TITOLI assegnato
>con un criterio sconosciuto.
>
>Ci ho lavorato tutto il giorno, ma non sono riuscito a capire. C'è qualcuno
>che ci capisce?

Non so che database usi ma proverei, (non l'ho fatto)
cosi:
UPDATE movim m, titoli t
set m.nome=t.nome
where m.link=t.id
and m.tipo="I"

Non capisco perchè hai duplicato il nome del titolo
anche sui movimenti.
Nelle select su movim potevi far riferimento al nome
nell'archivio titoli.
E' necessario un indice Unique su titoli.id
Stark 9 Dic 2016 19:31
Non so che database usi ma proverei, (non l'ho fatto)
cosi:
UPDATE movim m, titoli t
set m.nome=t.nome
where m.link=t.id
and m.tipo="I"

Non capisco perchè hai duplicato il nome del titolo
anche sui movimenti.
Nelle select su movim potevi far riferimento al nome
nell'archivio titoli.
E' necessario un indice Unique su titoli.id
--
Uso il BDE e adesso provo il tuo suggerimento. Il nome del Titolo c'è nei
movimenti perchè a volte è comodo averlo lì. E' in fase di creazione del
movimento che l'utente fornisce il nome del titolo. Il riallineamento del
******* dei movimenti si è reso necessario per un errore che ha corrotto questo

dato e questa è la ragione della query di aggiornamento.
Stark 10 Dic 2016 18:20
Non so che database usi ma proverei, (non l'ho fatto)
cosi:
UPDATE movim m, titoli t
set m.nome=t.nome
where m.link=t.id
and m.tipo="I"
__
Risultato della prova: invalid use of keyword ','.

E' molto probabile che in un'espressione con UPDATE non si possano
specificare due dataset..
jugin 10 Dic 2016 18:53
On Sat, 10 Dec 2016 18:20:34 +0100, "Stark" <starkwedderr@gmail.com>
wrote:

>Non so che database usi ma proverei, (non l'ho fatto)
>cosi:
>UPDATE movim m, titoli t
>set m.nome=t.nome
>where m.link=t.id
>and m.tipo="I"
>__
>Risultato della prova: invalid use of keyword ','.
>
>E' molto probabile che in un'espressione con UPDATE non si possano
>specificare due dataset..

Io uso Mysql, il manuale riporta questo esempio:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

con il DBE dovresti avere a disposizione i metodi
della tabella come:

table.first
table.eof
table.fieldbyname(...).as...:=...
table.post
table.next

se non riesci con SQL ci vuole poco a fare un ciclo di aggiornamento.
Stark 10 Dic 2016 18:59
Grazie del tentativo di aiuto e si, posso fare l'aggiornamento in altro
modo, ma mi ero intestardito a far funzionare la select SQL che mi appariva
così semplice.
Giacomo Degli Esposti 12 Dic 2016 11:40
On Thursday, December 8, 2016 at 12:36:43 AM UTC+1, Stark wrote:
> Questa è la select:
> UPDATE MOVIM M SET NOME= (select Nome from Titoli T where M.LINK=T.ID) where
> M.TIPO="I"'
>
> L'intenzione della query è di assegnare al campo NOME del datset MOVIM il
> valore dell'omonimo campo del dataset TITOLI.
>
> I due dataset sono legati dai campi LINK e ID. Solo i records di MOVIM che
> hanno il Tipo "I" devono essere aggiornati.
>
> Ci sono alcuni records di MOVIM che, pur essendo di tipo "I", non ci sono
> nel dataset TITOLI. In questi è avvenuto il problema, e cioè la query ha
> aggiornato anche il NOME di questi record, con il NOME da TITOLI assegnato
> con un criterio sconosciuto.
>
> Ci ho lavorato tutto il giorno, ma non sono riuscito a capire. C'è qualcuno
> che ci capisce?

Se ho capito bene, hai alcuni record di MOVIM che hanno TIPO = 'I' ma
non hanno nessun record su TITOLI.

Tu che valore ti aspetti che venga messo in NOME in quel caso?

La select che hai messo va a fare un lookup su una tabella
e ti restituisce 0 record. Evidentemente il povero BDE non sa
come gestire la situazione e invece che dare un errore (come
invece dovrebbe fare!) ti assegna un valore "a caso" (immagino
che ci sia una logica, dipende da come funziona internamente BDE)

Se pensi che non debba assegnare nulla ma che debba aggiornare
solo i record che hanno un record su TITOLI... la risposta
e' b*****e: basta escludere dalla UPDATE anche i record che non
hanno un corrispondente su TITOLI.

Prova qualcosa del genere (sempre che il BDE lo supporti)

UPDATE ...
WHERE
M.Tipo = 'I'
AND EXISTS( select * from TITOLI T where M.LINK=T.ID)


ciao
Giacomo
Stark 12 Dic 2016 11:48
"Giacomo Degli Esposti" ha scritto nel messaggio
news:761476fe-a61e-4f30-a70c-d640abca5fee@googlegroups.com...
Se ho capito bene, hai alcuni record di MOVIM che hanno TIPO = 'I' ma
non hanno nessun record su TITOLI.

Tu che valore ti aspetti che venga messo in NOME in quel caso?

La select che hai messo va a fare un lookup su una tabella
e ti restituisce 0 record. Evidentemente il povero BDE non sa
come gestire la situazione e invece che dare un errore (come
invece dovrebbe fare!) ti assegna un valore "a caso" (immagino
che ci sia una logica, dipende da come funziona internamente BDE)

Se pensi che non debba assegnare nulla ma che debba aggiornare
solo i record che hanno un record su TITOLI... la risposta
e' b*****e: basta escludere dalla UPDATE anche i record che non
hanno un corrispondente su TITOLI.

Prova qualcosa del genere (sempre che il BDE lo supporti)

UPDATE ...
WHERE
M.Tipo = 'I'
AND EXISTS( select * from TITOLI T where M.LINK=T.ID)
ciao
Giacomo
---
Non avrei potuto spiegare meglio il problema. Infatti è così, avevo
subdorato anch'io che il BDE on sapesse gestire la situazione, ma non sapevo
come trovare il modo di escludere quei casi dall'update. La espressione che
mi suggerisci (EXTSTS) non sapevo che esistesse. La provo subito per vedere
se è accettata. Grazie
Stark 12 Dic 2016 11:57
FUNZIONA. Problema risolto !!
Grazie Giacomo

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.