Newsgroup: it.comp.appl.access
Titolo: Funzione AccodaTabelle di Lorenzo Coronati - problemino!

Buon giorno, anzi buona sera ormai NG,
Rieccomi con nuovo problema... non odiatemi ve ne prego!
Sto usando le funzioni scritte da Lorenzo Coronati per: Generare
automaticamente una query di accodamento tra due tabelle con numero
diverso di campi (sito Comune)
Poiché non mi interessa salvare le query, passo alla funzione i nomi
delle tabelle associando ad un pulsante il codice:
DoCmd.RunSQL AccodaTabella("NomeTabellaDaAccodare",
"NomeTabellaInCuiAccodare")
Faccio partire il tutto ed esce il messaggio 
<<Il numero dei valori nella query non corrisponde a quello dei campi di
destinazione>>
Che, se non ho capito male, è proprio ciò che questa funzione dovrebbe
risolvere! Probabilmente c’è qualcosa di sbagliato nel modo in cui la
chiamo, ma non capisco cosa! é tutto il giorno che ci lavoro nel
tentativo di adattarla al mio caso specifico, alla fine ho deciso di
provarla così com'è su due tab di prova, ma... niente... sempre lo
stesso errore!
Copio per comodità la funzione:
Public Function AccodaTabella(TabDa As String, TabA As String) As String
'Autore: Lorenzo Coronati
'Ritorna una stringa sql per accodare i record della TabDa in TabA
'impostando a null eventuali campi presenti solo in TabA
   Dim d As Database
   Set d = CurrentDb
   Dim t As TableDef, t1 As TableDef
   Set t = d.TableDefs(TabDa)
   Set t1 = d.TableDefs(TabA)
   Dim s As String
   s = "INSERT INTO " & TabA & " (##) SELECT §§ FROM " & TabDa & ";"
   Dim f As Field
   For Each f In t1.Fields
      s = SostituisciStringa(s, f.Name & ", ##", "##")
      If EsisteCampo(t, f.Name) Then
         s = SostituisciStringa(s, TabDa & "." & f.Name & ", §§", "§§")
      Else
         s = SostituisciStringa(s, "null, §§", "§§")
      End If
   Next f
   s = EliminaStringa(s, ", ##")
   s = EliminaStringa(s, ", §§")
   AccodaTabella = s
End Function
Ho provato a sostituire questa riga 
s = SostituisciStringa(s, "null, §§", "§§")
con 
s = SostituisciStringa(s, "§§", "§§")
ma mi da lo stesso identico errore 
Grazie a tutti
Nadia
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

La Nadia ha scritto:


Prova a controllare l'SQL della query prima di eseguirla, così vedi subito
cos'è che non va e come eventualmente modificare la funzione.
Sostituisci il "DoCmd.RunSQL AccodaTabella...."
con "Debug.Print AccodaTabella...."
esegui il codice e vai nella finestra debug a vedere cosa c'è.
Namor
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Incredibile! Non ci credo.
Io in questo Ng non ci sono mai stato ma oggi ho avuto un problema.
Ho due tabelle di excel da 50000 record circa, stesse colonne con stessa
intestazione.
Devo incrociarla con un'altra tabella, e il vlookup non va bene. Deciso di
usare access ma non so unire le due tabelle di cui parlavo prima.
Quindi cerco questo ng per chiedere come si fa e trovo come primo tread
l'accodamento di tabelle.
Peccato che sia a campi "spaiati".
Vabbè comunque come si fa in access a fare una tabella sola fondendo due con
la stessa struttura?
Io di sql non so niente praticamente.
Grazie

 wrote in message
news:hCxnb.8573$
gA....@tornado.fastwebnet.it

Se hanno la stessa struttura non hai neppure bisogno di preoccuparti
dell'SQL,
Oltre alla normale query di selezione, ci sono anche quelle di
Accodamento, Aggiornamento, Eliminazione, A campi Incrociati...
L'help è molto chiaro; comunque, in sintesi:
Selezioni "crea un query in visualizzazione struttura" 
aggiungi la tabella DA CUI accodare
in "query" selezioni quesri di accodamento
e nella finestra che appare scelgi la tabella IN CUI accodare
scegli i campi da cui accodare e se hanno lo stesso nome ti vengono
selezionati automaticamente quelli in cui accodare, se no li scegli tu
uno a uno
...e benvenuto in Access!


 Namor
Grazie! era appunto la prova che volevo fare ma non spapevo di dover
scrivere Debug.Print (scrivevo solo Print) ed ero un po' cotta per
rimettermi a spulciare l'help
Dunque il risultato è che la differenza sostanziale tra l'SQL generato
dalla query che creo in visualizzazione struttura, non comprende i
vcampi della tabA (destinazione- qui Pippo)per i quali non ho una
corrispondenza nella TabDA (provenienza- qui Pluto)
mentre nella stringa SQL generata dal codice ci sono
quindi suppongo (ma non ne ho certezza!) che le possibilità siano due:
Agire sulle righe IF EsisteCampo THEN e fare in modo che se il campo non
esiste in TabDa non lo consideri neppure in TABA
Agire sulla riga 
s = SostituisciStringa(s, "null, §§", "§§")
aggiustandola in modo che "NULL" sia il valore che scrive nel campo e
non una "parola" scritta nella stringa SQL
(espressione poco tecnica ma che spero chiara!)
Ora provo a pensarci, anche se le mie conoscenze di VBA sono talmente
"basiche" che non so cosa riuscirò a combinare, (magri non ho neppure
centrato il problema!!!)
Ogni suggerimento e aiuto resta il benvenuto!
Scrivo qua sotto le stringhe SQL 
La stringa SQL nella Funzione Accoda
SQL = "INSERT INTO " & TabA & " (##) SELECT PPP.id_pippo, §§ FROM PPP
INNER JOIN " & TabDa & " ON PPP.id_pluto = " & TabDa & ".id_pluto;"
Query costruita in visualizzazione struttura
INSERT INTO Pippo ( id_pippo, uno, due, quattro, sei, sette )
SELECT Ppp.id_pippo, Pluto.uno, Pluto.due, Pluto.quattro, Pluto.sei,
Pluto.sette
FROM Ppp INNER JOIN Pluto ON Ppp.id_pluto = Pluto.id_pluto;
SQL generato con --> s = SostituisciStringa(s, "null, §§", "§§")
INSERT INTO Pippo (id_pippo, uno, due, tre, quattro, cinque, sei, sette)
SELECT Ppp.id_pippo, null, Pluto.uno, Pluto.due, null, Pluto.quattro,
null, Pluto.sei, Pluto.sette
FROM Ppp INNER JOIN Pluto ON Ppp.id_pluto = Pluto.id_pluto;
SQL generato con --> s = SostituisciStringa(s, "§§", "§§")
INSERT INTO Pippo (id_pippo, uno, due, tre, quattro, cinque, sei, sette)
SELECT Ppp.id_pippo, Pluto.uno, Pluto.due, Pluto.quattro, Pluto.sei,
Pluto.sette
FROM Ppp INNER JOIN Pluto ON Ppp.id_pluto = Pluto.id_pluto;
GRAZIE, GRAZIE


 Nadia

Non puoi mettere così un null in una SELECT, devi comunque dargli un alias
(nome di campo calcolato) con "AS". Prova a modificare la funzione in modo
che ti dia la stringa così
SELECT Ppp.id_pippo, null AS vuoto1, Pluto.uno, Pluto.due, null AS vuoto2,
Pluto.quattro,.....


 ha scritto nel messaggio
news:hCxnb.8573$gA....@tornado.fastwebnet.it...

Usa una normalissima query unione (vedi help).
-- 
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------