Newsgroup: it.comp.appl.access
Titolo: query di accodamento con sovrascrittura

>>>>  
http://www.bb2002.it
 :)  <<<<<
........... [ al lavoro ] ...........

 vecchi quelli che esistono in quella nuova (ho un campo id, ovvio)
 
https://i.imgur.com/ZIsG81M.png
 
 
che significa "Cannot join on Memo, OLE, or Hyperlink Object" se il campo 
che sto utilizzando A00015 è un normale campo di testo?


 
 
pardon, ho scoperto che SAP me lo trasforma in MEMO :/


Il concetto che hai esposto è RELATIVAMENTE corretto...!
Ovvero, è corretto se le PK dal vecchio al nuovo sono coerenti.
Avere il campo PK(che tu chiami ID) non è indice che ID=2450 nella Tabella Nuova e Vecchia sia riferito allo stesso Record...
Questa è una condizione INDISPENSABILE per poter fare quello che hai pensato.
 
Sinceramente la vedo poco probabile, ad esempio se il NUOVO hai Compattato... il campo progressivo si è azzerato... ecc...!
 
Se però sei estremamente certo puoi procedere...!
 
Altra considerazione che devi analizzare è se la TABELLA in cui Cancelli ha dei Record Correlati in una Tabella lato Molti...
In questo caso se hai abilitato il DELETECASCADE fai un disastro... ma se non lo hai abilitato non potrai cancellare nulla per violazione delle regole referenziali, quindi dovrai rimuovere la Relazione, cancellare lato 1 poi ripristinare...
 
Devi sperare di non aver lasciato dei Figli ORFANI altrimenti non potrai ripristinare la relazione senza aver cancellato i FIGLI lato Molti.
 
Insomma... il lavoro che prospetti a mio avviso è tutto meno che banale, e come lo hai pensato è estremamente rischioso.
 
@Alex

 banale, e come lo hai pensato Ã¨ estremamente rischioso. 
 
ripeto, nessun rischio, si lavora su tabelle importate da altri sistemi e 
scollegate dagli originali
 
ora, tornando a quanto pensato, ho messo in pista la query che dovrebbe 
trovare nella tabella A i record che sono presenti anche nella tabella B e 
di conseguenza eliminarli
 
SELECT A.*
FROM A 
LEFT JOIN B ON A.A00015 = B.A00015
WHERE (((B.A00015) Is Not Null));
 
mi restituisce i 180 record che dovrei eliminare
 
la stessa SELECT fatta sugli "altri" record ( ... Is Null) infatti me ne 
trova 7320
 
Ora, se cambio SELECT in DELETE:
 
DELETE A.*
FROM A 
LEFT JOIN B ON A.A00015 = B.A00015
WHERE (((B.A00015) Is Not Null));
 
mi dice
 
"Could not delete from specified tables."
 
"Tables.", plurale, perché plurale? e perché non può cancellare? è una 
normalissima tabella, se provo a cencellare a mano i record me li elimina 
senza fiatare... :/
 
Uffa...


però c'è anche la possibilità inversa (complementare)
 
-SE ci si trovasse in ambito SOLO ACCESS
-E SE fosse possibile imporre un indice univoco ai campi 
che sono "veri indici di riconoscimento" della unità di registrazione
 
non è necessario cancellare il vecchio:
mi sembra proprio che sia sufficiente accodare il vecchio al nuovo
(in ambito SOLO ACCESS è Access stesso che scarta i doppioni ...)
 
ad ogni buon conto: manovra da fare su una copia dati
 

 
 
DoCmd.RunSQL ("
DELETE Exists (select A00015 from SAP y where x.A00015 = y.A00015), * 
FROM VP AS x 
WHERE (((Exists (select A00015 from SAP y where x.A00015 = 
y.A00015))<>False));
")
 
questa funziona... :) :/
