Newsgroup: it.comp.appl.access
Titolo: unione record su stessa tabella

Buonasera.
Ho una tabella in cui inserisco sia i mandati di pagamento che le reversali, distinguendoli con il campo IdTipoDocumento. I campi delle due tipologie di documento sono uguali tranne che le reversali richiedono tre campi a parte (NReversale, NDistintaReversali e ImportoReversale).
Quando inserisco un mandato, se è prevista una reversale contestuale,creo un nuovo record assegnando i valori del mandato comuni alla reversale e inserendo i valori ai campi su descritti.  Il valore di questi tre campi però li devo riportare nello stesso record del mandato a cui si riferisce.
Pensavo potessi farlo con la query unione ma non è possibile unire record della stessa tabella; ho separato con due query i due tipi di documento ma l'idDocumento (chiave primaria, duplicati non ammessi), che non posso omettere, non mi permette di unire i due record in uno solo.
Forse mi sto perdendo in un bicchier d'acqua, sono tre giorni che sono bloccato. Come posso ottenere questo risultato?
Grazie 
Giuseppe.

Giuseppe has brought this to us :

Vediamo se ho capito qualcosa.
 
IdDoc  IdTipoDoc Altri Campi  NR  ND  IR
----------------------------------------
PK         M     ...........
...
...
PK         R     ...........  10  9   100
 
Il primo record (mandato) ha in comune con l'ultimo (reversale)
solo gli "Altri Campi".
 
Secondo te "unire i due record" significa ottere che cosa?
in aggiunta o in sostituzione dei due predetti?
 
Bruno

Ciao Bruno e grazie all’ennesima potenza, vista l’ora della tua risposta.
Su conferma reversale, se oltre all’idProgetto uguale, nel record è stato inserito il NMandato a cui si riferisce, il valore dei tre campi specifici della reversale devono essere copiati  anche nel record del mandato stesso. Se si può inserire direttamente nella tabella è meglio altrimenti credo con una query di unione. Giuseppe

Giuseppe formulated the question :

Penso inserirai e/o modificherai i dati della reversale
a mezzo di una scheda.
Quindi, AfterUpdate della medesima, se nel campo NMandato
esite un numero occorre ricercare nella tabella il
record che ha IdTipoDocumento = "M" AND NMandato = NMandato
(anche per i record mandato il campo che ne accoglie il
numero è NMandato?)
Fatto ciò occorre ricopiare i tre campi compilati
della reversale (NR, ND, IR) negli omologhi del record
"Mandati" che si è trovato.
Naturalmente occorre che che il numero mandato sia unico
per tipologia di documento (vale per un solo mandato e
per una soloa reversale).
 
Avendo a disposizione il database anche con pochi
dati signidficativi, è più complicato a dirsi che a farsi.
Puoi mettere online il file?
 
Bruno


Ecco il file
https://www.dropbox.com/s/m7uvtcfcjl7rry8/Database1.accdb?dl=0
 
il secondo record è la reversale, il suo numero e il suo importo devono essere riportati nel primo record nei rispettivi campi.
Grazie Bruno.

 essere riportati nel primo record nei rispettivi campi. Grazie Bruno.
 
1 - Non posso scrivere codice se quello già esistente non è
    corretto: manca la funzione fHandleFile.
 
2 - Come ti ho detto in AfterUpdate della scheda fmMandti dovrò
    ricercare il record corrispondente alla Reversale in oggetto.
    Se c'è un solo record Mandati come posso essere sicuro che il
    risultato sarà quello corretto anche quando i Mandati saranno
    più di uno?
 
3 - Vedi di trasmettere una tabella con almeno una decina di record
    fra mandati e reversali e di ristabilire le funzioni di
    ridimensionamento e chiusura della scheda in modalità FormView.
    Quest'ultima cosa non la so fare.
 
Bruno

 
 
quando inserisci la reversale, poi aggiungi:
 
insert into tblMandati (c1, c2, c3...sono i tre campi da copiare.. ...)
select c1, c2, c3
from tblMandati
where NMandato = numero


Dopo diversi giorni a provare e riprovare non ho ancora risolto.
L'ultimo codice che ho inserito è:
UPDATE tblMandati AS T1 INNER JOIN tblMandati AS T2 ON T1.IdDocumento = T2.IdDocumento SET T1.NReversale = T2.[NReversale], T1.ImportoReversale = T2.[ImportoReversale]
WHERE (((T1.IDProgetto)=[Forms]![frmMandati].[idprogetto]) AND ((T1.NMandato)=[forms]![frmMandati].[nmandato]));
ma la query mi restituisce i record con i campi NReversale e ImportoReversale così come ce li ho in tabella, senza che l'update abbia sortito nessun effetto. 
Cosa dovrei cambiare ancora?
Grazie
Giuseppe


1) prova ad eseguire la query di comando da qbe (a forms aperte), e consulta gli eventuali messaggi di errore 
Se non ci sono errori (regole non rispettate) 
considera bene DOVE (SU QUALE EVENTO) fai eseguire l'update
 
 
2) oggettivamente mi sembra che tu sia entrato in un giro pesca:
considera anche di effettuare TUTTE codeste registrazioni 
IN UN SOLO RECORD:
in fondo si tratta di completarlo in due tempi successivi
tramite un paio di forms di facile creazione
 
e infine, importante,
delinea e descrivi lo scopo e come hai intenzione di raggiungerlo
PRIMA di mostrare qualcosa che poi si rivela (anche a te) inefficace


Ciao Giorgio.
L'intento è proprio quello di evitare di creare diverse query, form e report identici per due tabelle che si differenziano solo per qualche campo. In pratica mandati e reversali sono come fatture e note credito.
In ogni caso su click del pulsante conferma, se il tipo documento è "Reversale", eseguo il codice vba che ora funziona e che mi copia il numero e l'importo della reversale nel record del mandato che ha lo stesso IdProgetto e lo stesso NMandato.
Il codice corretto è:
strSQL = "UPDATE  tblMandati T1 INNER JOIN tblMandati T2 ON (T1.NMandato=T2.NMandato) AND (T1.Idprogetto=T2.Idprogetto) SET 
T1.[NReversale] = T2.[NReversale],
T1.[ImportoReversale] = T2.[ImportoReversale] " & _
"WHERE T2.IdProgetto =" & Forms!frmMandati.IdProgetto & "
And T2.NMandato =" & Forms!frmMandati.NMandato
Ora sto verificando e testando la form per avere certezza che l'utente non possa sbagliare qualcosa.
Spero di aver risolto definitivamente.
Grazie a tutti.
Giuseppe


bene
ma questo invito:
... delinea e descrivi lo scopo e come hai intenzione di raggiungerlo 
PRIMA di mostrare qualcosa che poi si rivela (anche a te) inefficace ...
aveva una valenza più generale.
 
in estrema sintesi
(e desumendo, da quel che si vede, 
che era da ottenere la prima effettiva registrazione dati,
e quindi eri all'inizio dell'opera)
bastava chiedere chiarimenti per una registrazione con codeste caratteristiche
e se era opportuno procedere con:
--> UN SINGOLO RECORD 
(se è solo codesto da fare, e si parte da zero)
--> DUE RECORD SEPARATI per lo scopo dichiarato
inseriti in una sola tabella 
(si prospetta una dipendenza gerarchica)
o inseriti in due tabelle
(relazione classica)
 
Gli oggetti a corredo 
(form di inserimento e di consultazione dati, report)
sono poi quelli tipici
 
Risulta invece farraginoso ("sparacchioso") il modo di presentare
la situazione con un avvio di soluzione personale "da seguire bene"
(come hai potuto anche constatare dagli interventi "di sostegno")  


Ciao Giorgio.
Hai ragione nell'evidenziare che non ho rappresentato bene e subito che l'intento è quello di avere due record separati di tipologia differente nella stessa tabella e di conseguenza non avere più query, form e report identici ma basati su due tabelle diverse.
La precedente versione è strutturata con due tabelle distinte e le reversali presenti nei mandati vengono, con una query di accodamento, inserite nella tabella dove risiedono le reversali non dipendenti dai mandati.
Mi sembrava più facile di quanto pensassi copiare il valore di due/tre campi di un record in uno della stessa tabella e che fosse meglio non avere gli stessi dati in due tabelle diverse.
Adesso devo decidere per quale strada proseguire. Non posso sbagliare, perchè non utilizzerò io il programnino. 
Tu cosa faresti?
Grazie e chiedo scusa.


la prima considerazione è semplice:
per sostituire un qualsiasi strumento attivo e funzionante
occorre aver approntato e riscontrato un nuovo strumento "subito" funzionante
(che mantenga performance ed usabilità).
 
la seconda considerazione è dubitativa:
non so valutare il peso relativo
(da una parte) del minor numero di righe registrate 
e (dall'altra) della sostituzione di una relazione fra due tabelle
con una relazione intratabellare 
 
ma lascia perplesso (molto) l'eventualità 
che non si riesca più a definire la relazione a livello di struttura database
(una tabella può essere messa in relazione con se stessa,
ma come risultano ora i valori dei campi "figlio" ?):
in tal caso, per me, si avrebbe un indebolimento strutturale.
 
 


Il fatto che sto rivisitando il database per evitare gli errori di digitazione (ad es. date non progressive, record con campi vuoti, ecc.. ) non rilevati e segnalati dal software, mi permette di non avere fretta nel consegnarlo ma di testarlo sia con i dati esistenti che con quelli che vado ad inserire per fare i test.
Da ciò ne trarrò le dovute considerazioni.
Grazie tante a tutti.