Newsgroup: it.comp.appl.access
Titolo: Tabelle "al volo"

Ciao a tutti.
Premetto che č un problema preso da un messaggio su microsoft.public.it.office.excel:
(riepilogo)
http://groups.google.it/group/microsoft.public.it.office.excel/browse_thread/thread/1668fad8e07e82d3/4acd157f57d40885?q=esecuzione+query+%22insert+into%22+da+una+stringa+&rnum=1#4acd157f57d40885
(messaggio iniziale)
http://groups.google.it/group/microsoft.public.it.office.excel/browse_thread/thread/9c237acc63c6472f/9a1b69f6ac96ccc4?q=esecuzione+query+%22insert+into%22+da+una+stringa+&rnum=2#9a1b69f6ac96ccc4
La soluzione sembrava "alla portata" ma d'evessere la sinusite o la vecchiaia (ma sě anche l'ignoranza!) che mi sono impantanato e 
mi ci rode il "chiccherone".
Ora; lo scenario č: Excel, file di testo che contiene una serie di Insert into
es.
INSERT INTO `x_world` VALUES (54522,-7,150,1,16795,'sblif91 villaggio',16712,'sblif91',0,'',38);
INSERT INTO `x_world` VALUES (55028,-13,149,2,16593,'si si sion villaggio',16523,'si si sion',0,'',28);
etc. etc.
Il file di testo lo leggo tramite open, line input #1; quello che rimane appeso č come cacchio posso fare per inserire i valori 
VALUES nelle celle di excel. Mi "gasava" l'idea di far eseguire le insert into in un specie di database di celle ma come cacchio si 
crea/gestisce?
Certo potrei fare il parsing dei valori e scriverli ma ritengo sia una strunzata; ci deve essere un altro modo!
E qui entrate in gioco voi oh Guru di questa GuruLandia; che fareste voi?
Ciao.
-- 
Sergio MAZZA 

 Ciao.
Se non erro per poterlo fare sia in Excel che in WOrd devi avere delle
celle con il Nome del Campo.
Fai un esempio(ora non posso farlo io stò giocando con quello che
ti ho inviato), dai ad una cella il Nome del Campo da inserire
quindi prova ad eseguire la procedura descritta.
Io solitamente ho sempre fatto con i Bookmark in Word, ed anche in Excel
usavo nominare le Celle Omonimae ai Field della tabella e poi Facevo
il Merge via Code.
Si riempiva regolarmente.
La cosa è interessante ........... è un metodo alternativo.
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Ciao Sergio. Rimettiti.
Non ho capito un granche', non tanto dal tuo messaggio, ma di quello di
Ivan (mi sembra). L'ho letto, almeno il riepilogo.
Non entro nel merito del problema poiche' sono piuttosto (decisamente) 
"scarso" in Excel. La cosa, pero', mi sembra un classico UCAS (Ufficio 
Complicazioni Affari Semplici). Mi spiego.
Nel messaggio  ho letto che le insert le prende dal WEB. ????
Una pagina web che "spara" il testo delle insert? Bah e' una cosa che
ancora non avevo mai visto.
15000 Righe (a parte che gli ci vuole un po' per costruire il DOM sul 
client). Non faceva prima, se e' una applicazione "custom" a farsi
mettere il link ad un file di testo con i soli valori?
E se non e' una applicazione "custom".
Non faceva prima a fare un copia/incolla diretto su excel della
"probabile" tabella che gli fa vedere il Web?
O, se vuole automatizzare il tutto, attraverso la gestione della 
"Internet Explorer Application".
Oltretutto il problema, mi sembra e credo che excel sia in grado di
farlo, e' recuperare tutto cio che c'e' fra le parentesi tonde. Il
contenuto  e' nient'altro che un file di tipo csv. La funzione di
importazione di excel immagino sia abbastanza simile a quella di access
ed in grado di succhiarsi un "banale" file di testo delimitato.
--
a.cara
P.S.
Va bene l'interessamento di un "paria" ("sudra" in lingua, mi sembra)? 
Il post l'ho scritto un po' fa e poi messo nelle "bozze"   visto che 
chiedevi l'intervento  di qualche Sikk. ;<)
Secondo me ti sei "impantanato" proprio perche' e' un UCAS e la tua 
mente "logica" rifiuta a priori il problema. Ari ;<)
Visto le "celie" passate sulla tua grande capacita' di distruttore, 
anche a distanza, hai trovato un mago piu grande di te che ti ha fatto 
ammalare? ;<)
Entro stasera dovevo finire quattro attivita'. Non ho fatto un, come si 
suol dire "beneamato", e mo giocano pure quei "pipponi" della "maggica".
--


Sě avevo pensato alla definizione di una zona di celle con un nome ma ammesso che ci riesca, come faccio poi ad eseguire la insert 
into e scrivere i valori nel range di celle?
Pensavo ad ADOX; ho visto degli esempi su MSDN ma ancora non ho ben definito l'utilizzo dei sui oggetti...
Ciao.
-- 
Sergio MAZZA 

 Certo potrei fare il parsing dei valori e scriverli ma ritengo sia una
strunzata; ci deve essere un altro modo!
Ciao Sergio,
se il file di testo che devi importare č delimitato CSV , potresti
utilizzare il metodo CopyFromRecordset
es.
----
Dim cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
'Apro la connessinoe
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=C:\Dati;" & _
    "Extended Properties=Text;"
    .Open
End With
'Apro il recordset
Rs.Open "Select * From NomeFile#txt", cn
'Popolo le celle di excel
Application.Cells(1, 1).CopyFromRecordset Rs
Rs.Close
Set Rs = Nothing
cn.Close
Set cn = Nothing
----
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 > etc. etc.
acc.. ho capito adesso che il file di testo contiene una serie di istruzioni
SQL e non che č popolato da quella serie di istruzioni.
Come non detto


 ha scritto nel
messaggio news:43cab3c9$0$331$5fc...@news.tiscali.it...
Però con l'appoggio di un Db di Access si potrebbe fare così
----
Dim cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim Buffer As String
Dim Righe As Variant
'Apro un Db esistente
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "C:\Dati\Db1.Mdb"
    .Open
End With
'Creo la tabella
On Local Error Resume Next
cn.Execute "CREATE TABLE x_world " & _
   "(Campo1 int,Campo2 int," & _
   "Campo3 int,Campo4 int," & _
   "Campo5 int,Campo6 varchar(50)," & _
   "Campo7 int,Campo8 varchar(50)," & _
   "Campo9 int,Campo10 varchar(50)," & _
   "Campo11 int)"
On Local Error GoTo 0
Debug.Print Timer
'Cancello le righe dalla tabella
cn.Execute "Delete * From x_world"
'Apro il file con le DML
Open "C:\Dati\map.sql" For Input As #15
Line Input #15, Buffer
Close #15
Buffer = Replace(Buffer, "`x_world`", "x_world")
Righe = Split(Buffer, Chr(10))
Dim i As Integer
'Popolo la tabella
For i = 0 To UBound(Righe) - 1
    cn.Execute Righe(i)
Next
'Apro il recordset
Rs.Open "Select * From x_world", cn
'Popolo le celle di excel
Application.Cells(1, 1).CopyFromRecordset Rs
Rs.Close
Set Rs = Nothing
cn.Close
Set cn = Nothing
Debug.Print Timer
----
esempio provato con il file 
http://s2.travian.it/map.sql
  menzionato nel
post


 ha scritto nel 
messaggio news:43cac259$0$351$5fc...@news.tiscali.it...

mi inserisco anche io e ti ringrazio, adesso provo la soluzione e poi ti 
faccio sapere.
(tutta la procedura è anomala, perchè io leggo una pagina che in realtà 
dovrebbe essere letta da una applicazione di terze parti).
Ivan
(post originale : esecuzione query INSERT TO ..... su 
Microsoft.public.it.excel)


[....]
grazie Ivan 


ti allego l'esempio (leggermente adattato) inviatomi da MAZZA:
Dim oHttp As Object, strsql As String
Dim txtRequestString As String
' '--> apro la pagina web ed ottengo il contenuto
Set oHttp = CreateObject("MSXML2.XMLHTTP")
  sHttp = "
http://s2.travian.it/map.sql
"
txtRequestString = sHttp
oHttp.Open "GET", txtRequestString, False
oHttp.send
strsql = oHttp.responseText '<-- il contenuto lo salvo in una variabile 
stringa
'salvo il tutto su un file di appoggio
Open "C:\Dati\map.sql" For Output As #15
Print #15, strsql
Close #15
se esamino questo file, dalla riga 304 (oggi! ma domani chissa?) ci sono 
incongruenze dovute ai caratteri non alfa, che degradano la struttura degli 
undici campi, togliendo le virgole e amenità del genere.
sono ad un passo dalla soluzione, ma non ho gli strumenti(la preparazione) 
per superare questo sassolino!|
cmq grazie
Ivan 

 Close #15
[....]
funziona perfettamente! però(sich) come hai fatto ad ottenere il file di 
testo? c'è un metodo automatico per ottenerlo, o ha copincollato la pagina 
web?
Perchè io col codice suggeritomi da MAZZA:
'-------------------
Dim oHttp As Object, strsql As String
Dim txtRequestString As String
' '--> apro la pagina web ed ottengo il contenuto
Set oHttp = CreateObject("MSXML2.XMLHTTP")
  sHttp = "
http://s2.travian.it/map.sql
"
txtRequestString = sHttp
oHttp.Open "GET", txtRequestString, False
oHttp.send
strsql = oHttp.responseText '<-- il contenuto lo salvo in una variabile 
stringa
'Apro il file con le DML
Open "C:\Dati\map.sql" For Output As #15
Print #15, strsql
Close #15
'----------------------
ottengo un file 'sporco'. Tutte le accentate e i caratteri 'strani' vengono 
sostituiti o 'succhiati'.
Comunque fino alla primariga pulita tutto funziona perfettamente ... fino 
all' insert nel db!
grazie
 Ivan

 Perchč io col codice suggeritomi da MAZZA:
[CUT]
Ciao Ivan,
il link che hai mostrato 
http://s2.travian.it/map.sql
  a me non apre nessuna
pagina WEB.
Nel mio computer l'estensione *SQL* č associata al programma *Query
Analyzer*, quando premo sul link mi si apre la finestrella *Download File*
con le scelte Apri - Salva - Annulla ecc, quindi premo Salva e gli do il
percorso C:\Dati.
La stessa cosa posso ottenerla da Excel creando in una cella un collegamento
ipertestuale.
Prova ad associare l'estensione Sql ad un programma, forse č la via piů
semplice, con un click scarichi il file e con un'altro click lo importi in
Excel.


 ha scritto nel 
messaggio news:43cac259$0$351$5fc...@news.tiscali.it...

Già vedo che anche tu sei arrivato alla stessa mia conclusione; io cercavo 
di non creare un mdb ma una tabella "virtuale" da riempire tramite la insert 
into per poi popolare il foglio excel.
Beh! Intanto ho visto il metodo "CopyFromRecordset" che era quello che 
cercavo...
Ciao e grazie.
-- 
Sergio MAZZA 

 ha scritto nel 
messaggio news:43cb729f$0$347$5fc...@news.tiscali.it...

scusa Giorgio, ma io faccio click sul link e mi compare una bella pagina WEB 
piena di righe di testo, ma E' una pagina web!
se questa premessa non c'č, il resto del discorso cade. Ma io la vedo e .... 
vorrei usarla senza copia e incolla manuale.
Grazie lo stesso
Ivan 

 --
Ciao.
P.S. Vado a rimetter_mi
-- 
Sergio MAZZA 

 vorrei usarla senza copia e incolla manuale.
Ciao Ivan,
si, l'avevo capito :-)
Forse mi sono spiegato male, per scaricare il file segui questi passaggi:
Apri Risorse del computer, premi Strumenti-->Opzioni cartella-->Scheda Tipi
di File, premi Nuovo, nela casella *Estensione File* metti sql poi premi OK,
poi premi Avanzate quindi Nuovo, nella casella *Operazione* metti Open ,
nella casella *Applicazione* metti Notepad.exe premi OK e conferma il tutto.
A questo punto il tuo computer ha l'estensione Sql associata a notepad,
quando premi sul link si aprirà la finestrella per il DownLoad.
In questo modo non devi fare nessun Copia/Incolla.
Certo, un metodo eseguito tutto da codice sarebbe comodo, se lo trovo lo
posterò in seguito



sono io che non avevo capito il suggerimento ... e la soluzione.
Funziona benissimo!
E' un grandissimo passo avanti, visto che con la soluzione proposta da 
Giorgio Rancati, passando dal mdb, riesco a leggere ed inserire in tabella 
tutte le righe.
Probabilmente mi affiderò ad uno script per eseguire questa operazione e al 
VBA per le mossse in ambiente Office.
Grazie
Ivan
PS
devo confessare che il problema è futile. Travian è un gioco OnLine fi tipo 
MOGG, dove possono accedere migliaia di utenti. Voglio dare una mano a mio 
figlio, non a barare, ma a tenere sotto controllo la situazione della mappa.
Essendo una mappa a due dimensioni ho impostato un foglio di Excel per 
'mostrare' le posizioni dei giocatori e delle carie alleanze Però la mia 
anima programmatrice, mi impedisce di limitarmi ad un copia e incolla; 
domani lo stesso problema lo posso affrontare anche in ambito lavorativo. 
Quindi mi scuso per aver mosso tante acque, ma tutto questo mi allarga la 
conoscenza verso il Web e gli automatismi per 'interagirci'.
S'altronde spero che non sia tempo 'buttato' nemmeno per coloro che hanno 
seguito il 3D.


Io lo script lo utilizzo per simulare i percorsi di pacman... Gavo! Gavo! 
Gavo!
Ciao.
P.S. Per quanto mi riguarda il tempo impiegato a programmare non e mai tempo 
perso, di qualsiasi cosa si tratti.
-- 
Sergio MAZZA 


Allora. Mi sono collegato all'indirizzo che avevi segnalato a G. Rancati 
per vedere cosa restituiva. Da me si comporta come per te (non ho un 
programma di default associato all'estensione sql)
Ho richiuso IE.
Avevo una form di test (in Access) ed ho fatto cio'
----
Private Sub Collega_Click()
     Set objIE = CreateObject("InternetExplorer.Application")
     With objIE
         .Visible = True
         .navigate2 "
http://s2.travian.it/map.sql
"
     End With
End Sub
Private Sub Cattura_Click()
Dim oDoc As Variant
Dim oIt As Variant
Dim aArr As Variant
Dim aEl As Variant
Dim aVal As Variant
Dim aFld As Variant
On Error Resume Next
Set oDoc = objIE.Document
For Each oIt In oDoc.all
     If oIt.tagname = "PRE" Then
         aArr = Split(oIt.innerhtml, ";")
     End If
Next
For Each aEl In aArr
     aVal = Split(aEl, "(")
     aFld = Split(Replace(aVal(1), ")", ""), ",")
Next
End Sub
in aFld avevo tutti i miei bei campetti. Trasferirli in excel dovrebbe 
essere semplice e chiudere poi IE dovrebbe essere altrettanto semplice
Controindicazioni se c'e' il ";" e/o "(" e/o ")" e/o ","  fra i valori 
c'e' un problema (superabile)
da quello che ho visto in debug si potrebbe anche fare direttamente (non 
provato):
aArr = split(odoc.all(0).outertext,";")
continuo a non capire perche' non venga messo un link ad un file di 
testo. ;<)
--
a.cara

 Sergio MAZZA
lol
...e grazie
ivan
PS
adesso ho associato SQL -- evento Open a Notepad.exe e tutto č diventato piů 
semplice. 

> [....]

Hi Alessandro,
la prima sub funziona a meraviglia e si Collega correttamente.
La seconda sub non resco a 'legarla' a qualcosa (tabella?,campi?)
Se non ho capito male il secondo split ottiene in aFld i campi, mentre il 
primo split divide le righe  e toglie le parentesi?
A questo punto l'inserimento nei campi lo curo io.
ho preferito a questo punto le tre righe di Rancati
Dim i As Integer
'Popolo la tabella
For i = 0 To UBound(Righe) - 1
    cn.Execute Righe(i)
Next
che in realtŕ 'eseguono' ciň per cui le stringhe sono state create: Insert 
To.
Insomma mi manca solo il collegamento tra i questi due momenti : Collega 
(pagina a schermo) e Salva il file come testo(cosě come ce lo mostra il 
browser).
Seguendo i consigli di Rancati avevo 'associato' all'estensione .SQL per 
l'evento Open il prg Notepad.exe.
Fenomenale! Ma questo, nella tue prima routine, mi obbliga a scegliere una 
cartella ed un nome per il salvataggio al momento del
.navigate2, cioč una operazione manuale.
Ti faccio l'ultima domanda e non ti biasimo se non mi rispondi: nel momento 
che ho la pagina WEB aperta, c'č una proprietŕ dell'oggetto oIE che esponga 
il 'risultato'(che vediamo) oppure IE non ha cosienza di questo, ma solo del 
codice HTML per generarlo?
Se io potessi copiare 'il risultato'(della pagina web appena aperta) in un 
file di testo allora avrei risolto l'automatismo.
grazie
Ivan 

 
E perche' non dovrei risponderti? Se c'e' uno che e' stato "scortese" 
sono io.
In riferimento alla mia routine:
*oIt.innerHtml* contiene esattamente tutte le insert in una unica variabile.
*aArr* contiene in ciascun elemento la singola insert
*aVal* contiene due elemeni il primo che arriva fino alla apertura di 
parentesi tonda, il secondo i "values" della insert con una parentesi 
tonda chiusa di troppo (ultimo carattere)
se prendi oit.innerhtml e' ne fai la write e' esattamente il file con le 
insert. Quello che sostengo e' che la write la puoi fare come 
salvataggio di sicurezza ma se elabori l'array aArr puoi generarti 
direttamente il foglio excel.
Ripeto in Excel sono "scarso" e tutto cio' l'ho fatto via Access aprendo 
una Excel.Application e popolando le celle con i valori via via 
presentati dall'array aFld
Cmq ho rivisto il suggerimento di S. Mazza. La mia prima routine e 
quello che ti ha suggerito Sergio sono praticamente la stessa cosa. Le 
mie due routine sono separate perche' nella form di test che uso ho due 
bottoni uno di "start" ed uno di "cattura". Attenzione unirle insieme 
potrebbe comportare dei problemi poiche' si rischia di avviare la 
cattura quando IE non ha ancora completato il DOM  (Document Object 
Model) che e' l'ggetto su cui il browser agisce. Per evitare cio' e' 
necessario testare il *Ready_state*.
Riepilogando i passi che io vedo sono questi
1) Bottone di avvio
2) Collegamento al web
3) cattura di tutte le righe
4) scrittura del file di "backup"
5) Elaborazione della stringa e riempimento delle celle
6) Chiusura della connessione
Tutto cio' non prevede alcun intervento umano a meno del click sul 
bottone di avvio. se si vuole scrivere su tabella access non e' altro che
for each aEl in aArr
	cn.Execute aEl
next
in questo caso aEl non e' un array ma una stringa.
--
a.cara

>

ok il puzzle è chiuso!
Adesso rimetto tutto in ordine, ma stavolta ho tutti gli elementi per 
poterlo fare.
Comunque mi hai reso davvero un grosso favore, per la costanza con cui ti 
sei dedicato. Non sò se avrei la stessa tenacia!
grazie
Ivan


http://groups.google.it/group/microsoft.public.it.office.excel/browse_thread/thread/9c237acc63c6472f/9a1b69f6ac96ccc4?q=esecuzione+query+%22insert+into%22+da+una+stringa+&rnum=2#9a1b69f6ac96ccc4



In un mdb access colleghi la tabella excel, poi in vba leggi le INSERT
INTO dal file e le esegui con "currentdb.execute ComandoSQL" e ti popola
la tabella excel. Provato, funziona.
Ciao.
-Marco-
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Ciao.
Ciao Marco,
funziona con le vecchie versioni di Access, da Acc2002  (10.6771.6735) SP3
in avanti non va più.


 Ciao
Infatti ho provato col 2000. Come mai non va piů? Non si puň piů collegare
una tabella excel, o si collega ma non ci puoi scrivere?


 una tabella excel, o si collega ma non ci puoi scrivere?
http://support.microsoft.com/kb/904953/en-us
e qui la ragione:
http://news.com.com/Patent+ruling+costs+Microsoft+8.9+million/2100-1007_3-5735432.html
BTW Marco, sei diventato grande col nuovo anno perché non
usi piů uno di questi maledetti nick? :-)
-- 
cu
Karl
*********
Access FAQ: 
www.donkarl.com/it
+ Conferenza Italiana per Sviluppatori di Access (CISA) 

 usi piů uno di questi maledetti nick? :-)
Ciao Karl, tu sei austriaco e non conosci le usanze italiane..
qui si dice
"Casa nuova, nick nuovo"
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it

 usi più uno di questi maledetti nick? :-)
Mi sono stancato. Bisogna cambiare ogni tanto, no? E poi così è più
trasparente, se qualcuno ce l'ha con me perchè gli do un suggerimento
sbagliato mi può rintracciare più facilmente per venirmi a rigare la
macchina!
Ciao.


 "Casa nuova, nick nuovo"
Per la casa nuova ci vorranno ancora almeno 6 mesi. Intanto ho cominciato
col nick, che è più facile...
