Newsgroup: it.comp.appl.access
Titolo: copia incolla su stesso campo

Ho una form digito il nome di una ditta e puo capitare che la query trovi
dei record doppioni, quando li trovo di solito, anzi il 100% dei casi sono
sempre 2 record e il 100% dei casi sono ordinati per codice per cui dal
piu piccolo al piu grande.
Bene, ora io vorrei creare un comando che dica: copia i dati del campo
Mail e del campo Web del codice piu piccolo negli stessi campi del codice
piu grande.
E' possibile fare una cosa del genere o è impossibile?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Possibile è possibile, ma qui c'è qualcosa che non va...
I database relazionali sono stati pensati per evitare di inserire le stesse
informazioni + volte, mentre tu vorresti addirittura automatizzare la cosa?
Xchè non dici cosa deve fare la tua applicazione e come hai creato le tue
tabelle?
Indica per ogni tabella: Nome tabella, nome e tipo del Campo/i che
compongono la chiave primaria, altri campi (e tipo)+ significativi.
Inoltre indica quali sono le relazioni tra le tabelle.
Se non hai fretta gli diamo un'aggiustatina al tuo database.
Ciao.

Francesco R. ha scritto:

Avevo un DB di marketing pieno di informazioni, ad un certo punto abbiamo
acquisito una azienda che aveva un DB simile e allora ho importato i dati
da uno all'altro, adesso mi trovo che lo stesso nominativo può essere un
doppione e alcuni campi che su uno erano vuoti l'altro li ha pieni di
dati, ora... io volevo portare questi dati da un ID all'altro ID.
Per le tabelle collegate non c'è nessun problema, ho crato un automatismo
che cambia l'ID_Cliente, ma non ci sono riuscito per i dati in alcuni
campi perche non avevo da sostiuire un codice certo con un altro codice,
qua dovevo copiare del testo nel campo X di un ID e incollarlo nello
stesso campo X però con ID differente e stessa tabella



Secondo me ci sono 2 strade:
SOLUZIONE 1)
Premetto che non sono esperto in query e quindi questo è il meglio che sono
riuscito a fare/provare.
Dunque, la cosa è un pò articolata, in quanto il risultato finale di tutte
le operazioni, sarà che nella tua tabella non devono + esistere anagrafiche
duplicate, pena la possibilità di una gran confusione nella operatività di
tutti i giorni.
Ovviamente devi cambiare il nome dei campi ed adattare le query alla tua
situazione.
-Anzitutto per sicurezza copia la tabella o le tabelle in questione con un
altro nome.
-Aggiungi un campo nella tua tabella e chiamalo ad es. "RagSoc2".
-Crea una funzione in un modulo globale in questo modo:
Function StrCaratteriBase(StrPassata As String) As String
' Funzione che trasforma una stringa nei suoi caratteri/numeri base,
' in modo da facilitare le comparazioni
    Dim II As Integer
    Dim IMax As Integer
    Dim StrFinale As String
    Dim Codice As Integer
    StrFinale = ""
    IMax = Len(StrPassata)
    For II = 1 To IMax
        Codice = Asc(Mid$(StrPassata, II, 1))
        If Codice = 224 Then Codice = 65 'Trasforma à in A
        If Codice = 38 Or Codice = 232 Or Codice = 233 Then Codice = 69
'Trasforma &, è, é in E
        If Codice = 236 Then Codice = 73 'Trasforma ì in I
        If Codice = 242 Then Codice = 79 'Trasforma ò in O
        If Codice = 249 Then Codice = 85 'Trasforma ù in U
        If Codice >= 97 And Codice <= 122 Then Codice = Codice - 32
'Trasforma le minuscole in maiuscole
        'Se numero o lettera maiuscola accoda alla stringa
        If (Codice >= 48 And Codice <= 57) Or (Codice >= 65 And Codice <=
122) Then
            StrFinale = StrFinale & Chr$(Codice)
        End If
    Next II
    StrCaratteriBase = StrFinale
End Function
-Crea e lancia una query di aggiornamento che metta nel campo RagSoc2 la
ragione sociale filtrata dalla funzione.
Diciamo che la ns. tabella si chiami Anagrafica e contenga i campi:
CODICE          Intero lungo e chiave primaria
NOME              di 30 caratteri
RagSoc2         di 30 caratteri con la ragione sociale filtrata
DATI1               di 30 caratteri contiene i dati che vuoi copiare
Crea una tabella vuota 'Appoggio' così composta
CODICE          Intero lungo e chiave primaria
DATI1               di 30 caratteri contiene i dati che vuoi copiare
Crea una query 'QMinimiDuplicati' con questa istruzione SQL (cerca per ogni
duplicato il codice inferiore):
SELECT Anagrafica.RagSoc2, Min(Anagrafica.CODICE) AS MinDiCODICE,
Count(Anagrafica.RagSoc2) AS ConteggioDiRagSoc2
FROM Anagrafica
GROUP BY Anagrafica.RagSoc2
HAVING (((Count(Anagrafica.RagSoc2))>1))
ORDER BY Anagrafica.RagSoc2, Min(Anagrafica.CODICE);
Crea e poi esegui una query 'QGeneraAppoggio' che metterà nella tabella
Appoggio i codici dei record duplicati che hanno il campo dati vuoto, ed i
dati da inserirci dentro:
INSERT INTO Appoggio ( CODICE, DATI1 )
SELECT Anagrafica.CODICE, Anagrafica_1.CAMPODATI1
FROM (QMinimiDuplicati INNER JOIN Anagrafica ON QMinimiDuplicati.RagSoc2 =
Anagrafica.RagSoc2) INNER JOIN Anagrafica AS Anagrafica_1 ON
QMinimiDuplicati.MinDiCODICE = Anagrafica_1.CODICE
WHERE (((Anagrafica.CODICE)<>[QMinimiDuplicati].[MinDiCodice]) AND
((Anagrafica.CAMPODATI1) Is Null));
Ora crea ed esegui la query che leggerà la tabella Appoggio ed aggiornerà i
record nella tabella Anagrafica:
UPDATE Appoggio INNER JOIN Anagrafica ON Appoggio.CODICE = Anagrafica.CODICE
SET Anagrafica.CAMPODATI1 = [Appoggio].[DATI1];
Crea una tabella vuota 'AppoAnnulla' così composta
CODICE          Intero lungo e chiave primaria
Crea ed esegui una query 'QGeneraAppoAnnulla' che memorizzerà i codici dei
record da annullare in AppoAnnulla:
INSERT INTO AppoAnnulla ( CODICE )
SELECT QMinimiDuplicati.MinDiCODICE
FROM QMinimiDuplicati;
Crea una query 'QEliminaDuplicati'
DELETE Anagrafica.*
FROM AppoAnnulla INNER JOIN Anagrafica ON AppoAnnulla.CODICE =
Anagrafica.CODICE;
A questo punto la situazione della maggior parte dei record duplicati
dovrebbe essere risolta.
----------------------------------------------------------------------------
----
Per i record duplicati che le query non sono riuscite ad identificare per
differenze tra i nomi:
SOLUZIONE 2)
Creati due maschere (MasMaster, MasSlave) basandole sulla stessa
tabella/query, strutturandole per una visualizzazione dei campi principali a
righe, impostando la proprietà 'Visualizzazione predefinita' a 'Maschere
continue".
Su MasMaster crei un pulsante e nella routine associata all'evento "su
click" inserisci le seguenti istruzioni:
    Forms!MasSlave![TuoCampo1] = Me![TuoCampo1]
    Forms!MasSlave![TuoCampo2] = Me![TuoCampo2]
    ...
    Forms!MasSlave.Setfocus
    DoCmd.RunCommand acCmdSaveRecord
    Me.Setfocus
Le maschere dovranno stare affiancate sullo schermo.
Selezioni su "MasMaster" il record con i campi da copiare, selezioni su
"MasSlave" il record su cui copiare il contenuto dei campi.
Premi il pulsante di copia e quindi cancelli il record nella maschera
MasMaster.
Mi raccomando, ho fatto qualche prova su una decina di record, ma sul campo
potrebbero esserci dei problemi.
Ciao.

 potrebbero esserci dei problemi.
Sul campo inteso come "all'atto pratico".