Newsgroup: it.comp.appl.access
Titolo: Ennesimo errore di conversione fra tipi. (o come direbbe Emyr: patate in un campo di carote [07/2002])

Ho costruito una frmFilm per l'inserimento dei dati, basata sulla
qryFILM, fotocopia, per ora, della tblFILM.
Tra i vari controlli vi è il txtTitolo che invia i dati al sottostante
tblFilm.TitoloFilm.
Devo inoltre inserire le Nazioni che hanno partecipato alla produzione;
per questo ho una tblNazioni legata alla tblFilm con relazione molti a
molti, tramite la [tblFilm+Nazioni].
Le Nazioni vengono ricavate da un sito web tramite codice ed una
variabile, in un ciclo for next, viene impostata ad ogni passaggio, ad
un valore differente, fino a comprendere tutte le Nazioni produttrici.
Il codice (grazie Sergio per le dritte) è il seguente:
    DoCmd.RunSQL "INSERT INTO [tblFilm+Nazioni] ([IDFilm], [IDNazione])
VALUES ('" & TitoloFilm & "', '" & DatoNazione & "');"
Non avendo ancora inserito il codice per ovviare al classico "Il testo
immesso non corrisponde ad una voce dell'elenco", ho già inserito
nella tblFilm il titolo del film, in modo da ritrovarmelo in elenco
nella casella di riepilogo presente in [tblFilm+Nazioni].IDFilm.
A questo punto:
- con la Nazione posso inserire il nome della nazione nel campo
IDNazione che automaticamente viene fatto l'abbinamento,
- con il titolo del Film, se faccio l'input in tabella (digitando o
copincollando) non ho problemi, se invece delego il compito alla riga
di codice sopra descritta ricevo un beffardo "Numero di campi impostati
a Null per un errore di conversione tra tipi: 1; numero ... [omissis]
Perchè questa cosa?
Come posso ovviare?
Grazie ancora una volta!
leev (A00/WXP)

leev ha scritto:

Scusa ma per Emyr cosa intendi....?
@Alex

 @Alex
Azz, alex, speravo di avere una risposta e va tu che mi chiedi.....
Emyr ha risposto ad una vecchia discussione (luglio 2002, appunto) che
verteva proprio sulla conversione fra tipi. Cercando una soluzione ho
trovato questo topic che "spiegava" che il problema stava nel voler
inserire CAROTE nel campo PATATE.
Più o meno lo so che il messaggio significa quello, ma non mi
aspettavo uscisse nel mio caso. Era solo una citazione.
Ora puoi darmi un...."aiutino"....     :-S     ...per favore?


IDFilm e IDNazione sul db di che tipo sono?
  TitoloFilm & "', '" & DatoNazione  Questi sono testo
Acqua ed Olio non si mescolano
--
ac

leev ha scritto:

Ho chiesto perchè siccome è molto tempo che non sento più Emyr
speravo
fossi in contatto con lui, ne avrei approfittato per fartelo
salutare...!
DoCmd.RunSQL "INSERT INTO [tblFilm+Nazioni] ([IDFilm], [IDNazione])
VALUES ('" & TitoloFilm & "', '" & DatoNazione & "');"
Da come hai scritto si evince che:
IDFilm----> Campo di tipo Testo
IDNazione---->Campo di tipo Testo
Lo si capisce dalla formattazione che hai applicato ai VALUES con
l'apicetto...!
Nel caso siano Numerici devi togliere gli apicetti.
@Alex

Alessandro Cara ha scritto:
[CUT]
Rispondo sotto ad alex ma vale anche per te, grazie!

 IDNazione---->Campo di tipo Testo
Dunque:
IDFilm -> Campo Numerico
IDNazione -> Campo testo
Però i dati che copincollo sono dati testo perchè non sono gli ID ma
le relative descrizioni; è per quello che ho messo gli apici.
So che si tratta di ...culinaria, cioè acqua nell'olio o carote nelle
patate, ma avendo impostato la visualizzazione del "TitoloFilm" nel
campo "IDFilm", non so se mi spiego,  se li inserissi manualmente nella
tabella o in una sottomaschera (uno a molti), accetterebbe i dati, pur
essendo di tipi differenti, o meglio, inserendo il titolo, lui
memorizzerebbe il relativo ID.
Con del codice non è possibile ottenere la stessa cosa?
PS: se tolgo gli apicetti mi dà "Errore di sintassi, operatore
mancante", ma quello probabilmente, perchè non si tratta di numeri, ma
di testo, o no?

 di testo, o no?
Secondo me stai facendo una grossa confusione....!!!!
Se nella tabella vanno gli ID di tipo Numerico con un Testo ci fai
poco(anzi nulla).
Solitamente oltre alla descrizione è buona cosa avere un controllo
nascosto associato
all'Indice, quindi passare quello....!
Se invece hai usato una Combo, dovrai puntare come BoundColumn alla
colonna che ha l'Indice e non la descrizione...!
Insomma non si tratta di culinaria, ma di errato concetto di struttura,
se poi vuoi fare
salti acrobatici per recuperare quello che non hai previsto in partenza
con KG di codice
è una tua scelta....!
@Alex

Le varie sub frm erano Produttori, Distributori, Attori, Generi, ecc. ognuna collegata all frm principale tramite l'IDTitolo.
Ora fammi aprire una parentesi: non so come si definisca questa
procedura, ma nelle tabelle avevo impostato, come hai detto tu, una
combo per visualizzare le descrizioni e, clickandone un valore della
lista, impostare l'ID.
La maschera funzionava (anzi funziona perchè è quella che sto ancora
usando) benissimo.
Apro la pagina web dalla quale prendo i dati, copincollo uno per uno i
vari attori, distributori, ecc. e tutto procede per il meglio,
senonchè il lavoro è un po' noioso e lungo. Allora mi son
detto:"Perchè non farlo fare al PC?"
Così con un po' di codice e funzioni di testo sono riuscito ad
"isolare" i vari dati dalla pagina web, ora però devo trovare il modo
di inserirli nelle relative tabelle, ed è qui che non so come
procedere (considera che le sottomaschere non devono più apparire, i
dati devono andare direttamente in tabella).
Consideriamo, per semplicità, solo il caso delle Nazioni, io ho il mio
TitoloFilm, isolato dalla pagina, che va ad inserirsi in una casella di
testo, dopodichè ho una variabile (DatoNazione = nome della nazione
cioè testo) , che assume in un ciclo for next, ad ogni passaggio un
valore diverso, corrispondente ad ogni nazione che ha contribuito alla
produzione del film.
Anche supponendo che sia una sola nazione, come la inserisco nella
[tblFilm+Nazioni] che contiene, a parte l'ID-campochiave della tabella,
solo gli ID di Film e Nazioni?
Da inesperto pensavo di far fare al codice ciò che io facevo
manualmente, cioè copincollavo nel campo IDFilm (di tipo Numerico), il
nome della Nazione (di tipo testo), e ovviamente funzionava, anche se
poteva sembrare patate e carote, ma ora? Come faccio?
Sono riuscito a farmi capire?

 lista, impostare l'ID.
Chissa' perche' avevo immaginato che tu avessi fatto questa cosa.
Perdonami per il turpiloquio. Questa e' una delle piu' grosse "troiate" 
che fa access.
Ne ho pagato lo scotto quando mi sono trovato a trasferire una tabella 
si conciata su una tabella sqlServer (l'mdb era stato fatto da altri. 
Per principio non uso questa tecnica) . Il maledetto trasferisce la 
"decodifica" e la tabella non mi veniva mai caricata perche', 
giustamente, avevo definito il campo di arrivo come "numerico" e non 
come testo e la export continuava a propormi il testo (e non l'ID)
A te la decisione del caso. Personalmente consiglio di non usare questa 
"possibilita'". E' chiara la comodita' che si ha. Il cbx bello pronto. 
Talvolta, pero', queste scelte si pagano nel tempo.
--
ac

 Talvolta, pero', queste scelte si pagano nel tempo.
A parte il fatto che sto diventando pazzo, ma questo è marginale, a
questo punto, scusami ma, per tagliare la testa al toro, e cercare di
risolvere il mio problema, devo cambiare l'impostazione della domanda.
Per comodità, ti propongo un riassunto:
Io ho una relazione molti a molti e le 3 tabelle sono:
[tblfilm]
   IDFilm (Numerico)
   Film (testo)
[tblNazioni]
   IDNAzione (testo)
   Nazione (testo)
[tblFilm+Nazioni]
   IDFilm+Nazioni
   IDFilm
   IDNazioni
Ho una maschera con una casella di testo che riporta il titolo del Film
e, nel codice, una variabile contenente la nazione.
Devo abbinare, sempre e solo tramite codice,  il titolo alla nazione
nella [tblFilm+Nazioni], c'è un sistema?
Grazie ancora.


si, nella insert devi passare gli ID. Come dato numerico per l'IDFilm, 
quindi senza apici, e come dato alfanumerico per l'IDNazione e quindi 
con apici.
i.e.
  DoCmd.RunSQL "INSERT INTO [tblFilm+Nazioni] ([IDFilm], [IDNazione])
VALUES (IDfilm & ", '" & IDNazione& "');"
Non ho capito il senso di questa: IDFilm+Nazioni
[tblFilm+Nazioni] e' una tabella di relazione. Se ti serve l'indice 
univoco togli il campo IDFilm+Nazioni e definisci l'indice univoco 
comprensivo dei due attributi IDFilm e IDNazioni (si puo' fare)
Da come hai messo le cose e' perche' vuoi gestire le "coproduzioni"?
Che significato vuoi dare alla tabella [tblFilm+Nazioni]?
Sconsiglio sempre di usare caratteri speciali nei nomi degli oggetti del DB
i.e. tblFilm_Nazioni sarebbe meglio
--
ac


Hai ragione, come ti ho detto in precedneza la prossima volta non mi
frega più. Ormai non sto a cercare tutte le occorrenze per
modificarle.
Grazie ac

 indicavano sempre un ID a parte per la tabella e forse (ma non so)
perche' gli "accessaroli" non imparerenno mai
[cut]

 perche' gli "accessaroli" non imparerenno mai
Beh dai, io non posso ancora considerarmi un
accessorio...ehm...accessarolo, ma terrò conto del tuo suggerimento,
promesso, e diventerò un accessarolo controcorrente con 2 soli campi
nelle tabelle per le relazioni molti a molti ed entrambi,
contemporaneamente, chiave primaria.
E concludo:
Alessandro, può bastare il solito grazie?
[Lo sapevo che avresti cominciato a chiedere soldi,....era retorica, la
domanda...retorica...]
^_*
(PS grazie davvero)

 brevemente, ad un report.
Quando uno e'troppo grosso gli si puo' sempre girare intorno
1) cbx nascosto (ducolonne)
2) text visibile e sei furbo riesci ad ottenere sia il controllo (vs la 
lista combo) che il completamento automatico. Su qust'ultima cosa c'e' 
pero' da lavoricchiare un po.
E perche' le sottomaschere non la facevano assomigliare a un report?
--
ac

 E perche' le sottomaschere non la facevano assomigliare a un report?
Si, ma i dati (per esempio le varie nazioni produttrici) devono essere
presentati non uno sotto l'altro, ma separati da virgole e quindi credo
sia d'obbligo una casella di testo.
___________ . . . . _____________ . . . . ______________
Uff, oggi sono morto, tra access e il negozio, non so cosa è stato
peggio, vabbeh
Buona Domenica Alessandro, grazie ancora di tutto.
^___^

 aggiornare un po' in qua e in la, di primo acchito. Vedremo...
...Ho accettato il tuo suggerimento dei controlli nascosti, quindi ho
rimesso (una sola per prova) la mia bella subform -nascosta- che mi
accetta i dati e li ho visualizzati, prima ancora di passare i dati
alla subform, con una casella di testo,  separati da virgole, così
come presi dal web.
[CUT]
Adesso però ho un "evento" inaspettato. In poche parole (ti informo
solamente, prima voglio provarci da solo, stasera, poi al limite ti
chiedo) immettendo i dati non mi rileva l'evento non in lista e mi
salva i dati nella tabella film+nazioni (lato 1 della relazione molti a
molti), anche se la nazione non è compresa nella tabella nazioni (lato
molti). Cosa ci sarà di sbagliato?
Sssssssssssssssss, non dire niente, fammece prova', tanto....e 'un ce
riesco!
sempre grato,
leev
PS: Allora, si CAP, cosa ne facciamo?.... ok ok, scherzavo....
^____^

 aggiornare un po' in qua e in la, di primo acchito. Vedremo...
...Ho accettato il tuo suggerimento dei controlli nascosti, quindi ho
rimesso (una sola per prova) la mia bella subform -nascosta- che mi
accetta i dati e li ho visualizzati, prima ancora di passare i dati
alla subform, con una casella di testo,  separati da virgole, così
come presi dal web.
[CUT]
Adesso però ho un "evento" inaspettato. In poche parole (ti informo
solamente, prima voglio provarci da solo, stasera, poi al limite ti
chiedo) immettendo i dati non mi rileva l'evento non in lista e mi
salva i dati nella tabella film+nazioni (lato 1 della relazione molti a
molti), anche se la nazione non è compresa nella tabella nazioni (lato
molti). Cosa ci sarà di sbagliato?
Sssssssssssssssss, non dire niente, fammece prova', tanto....e 'un ce
riesco!
sempre grato,
leev
PS: Allora, 'sti CAP, che ne facciamo?.... ok ok, scherzavo....
^____^

 PS: Allora, si CAP, cosa ne facciamo?.... ok ok, scherzavo....
Per come sono fatto dovrei avere la possibilita' di mettere in una busta 
non intestata e le Poste dovrebbero consegnare la missiva al posto 
giusto nei tempi giusti e inviarmi anche una nota di ringraziamento per 
aver usufuito dei loro servizi. Ovviamente non pretendo facilitazioni 
per quanto riguarda il francobollo.
;<)
--
ac

 ;<)
ghghghghghghghghgghgh
Eternamente grato!
(non sto sviolinando, ma probabilmente non potrò mai ricambiare questo
Vostri aiuti, quindi mi pare il minimo)
leev
Buona serataaaaaaaaaaaaaaaaaaaaaaaa!!!

 Adesso però ho un "evento" inaspettato. [CUT]
Allora, riepiloghiamo:
- tblFilm (IDFilm; TitoloFilm)
  tblNazioni (IDNazione;Nazione)
- relazione molti a molti fra tblFilm e tblNazioni, che da vita alla
[tblFlm+Nazioni] (+: arrrrrrrgh, ormai me lo porto appresso)
- frmFilm con txtTitoloFilm e sfrmNazioni (con cmbIDNazione)
Provo un Film coprodotto da 3 nazioni.
Se utilizzassi normalmente la sfrm inserendo o copiandovi i dati tutto
andrebbe per il meglio (testato): al manifestarsi dell'evento "non in
elenco" il mio codice mi avvisa e richiede l'inserimento del nuovo dato
nella tblNazioni.
Nel mio caso però la sfrmNazioni dovrebbe essere Hidden, quindi devo
delegare al codice il compito di inserire i dati nel suo unico
controllo: cmbIDNazione. Premesso che i 3 dati sono contenuti, uno dopo
l'ìaltro, in un'unica variabile (Dato) che, in un ciclo for next, li
passa uno per volta , ho provato in 3 modi:
- DoCmd.RunSQL "INSERT INTO [...]       per inserire l'IDNazione
direttamente nella tblFilm+Nazioni
- [...] sfrmNazioni.IDNazione = Dato      per impostare il campo
IDNazione al valore della variabile
- [...] sfrmNazioni.cmbIDNAzione = Dato       per impostare il
controllo al valore della variabile
Tutti e tre funzionano, ma nessuno mi attiva l'evento "su non in
elenco"; quindi mi trovo con 3 nazioni nella tblFilm+Nazioni che non
sono presenti nella tblNazioni.
Se la strada è giusta e la cosa fattibile, avrei bisogno uno spunto
sul codice da utilizzare ora per proseguire.
Riassumendo, la necessità, è questa:
Inserire dati in una sfrm (lato molti) tramite codice, attivando
l'evento "NotInList", o comunque bloccando l'esecuzione nel caso il
dato non sia presente nella tblNazioni.
Dovrei forse aggiungere un If-Then prima di inserire il dato e fargli
cercare la corrispondenza nella tblNazioni, ricalcando le orme del
"NotInList"?
Si ottiene con la funzione In?
O la strada da percorre è un'altra?
Eternamente grato.
^__^
Leev
PS: (Mi manca la formula "Colmo di gratitudine" e poi le ho esaurite;
non lamentatevi, mi toccherà ricominciare dal comune "Grazie")

 controllo al valore della variabile
[CUT]
Ieri ho dovuto sintetizzare le 3 istruzioni sopra riportate per
problemi di tempo (sono al lavoro); oggi riporto per completezza
l'intero codice utilizzato:
_______________________CASO 1
Invio_Dati:
    Forms![frmInserimentoFilmNewMethod].sfrmNazioni.Form.IDNazione =
Trim(Dato)
    Me.sfrmNazioni.Form.Recordset.AddNew
    Me.sfrmNazioni.Requery
    Dato = ""
    Return
- inserisce i dati nella tabella, non li visualizza nella sottomaschera
se non dopo aver cambiato record e ritorno, non attiva l'evento
NonInElenco
_______________________CASO 2
Invio_Dati:
    Me.sfrmNazione.form.cmbbox = Trim(Dato)
    Me.sfrmNazioni.Form.Recordset.AddNew
    Me.sfrmNazioni.Requery
    Dato = ""
    Return
- inserisce i dati nella tabella, non li visualizza nella sottomaschera
se non dopo aver cambiato record e ritorno, non attiva l'evento
NonInElenco
_______________________CASO 3
Invio_Dati:
    DoCmd.RunSQL "INSERT INTO [tblFilm+Nazioni](IDNazione) VALUES ('" &
Dato & "')"
    Me.sfrmNazioni.Requery
    Dato = ""
    Return
- inserisce i dati nella tabella, non li visualizza nella sottomaschera
se non dopo aver cambiato record e ritorno, non attiva l'evento
NonInElenco
Scusate il ritardo e grazie (torno a lavorare).