Esportare memo in xml

di il
23 risposte

Esportare memo in xml

Buongiorno,
mi trovo davanti ad un problema, sto esportando in xml una query access contenente vari dati, il problema da cui non riesco ad uscire lo trovo su un campo chiamato "descrizione" che è un campo memo (superiore a 255), sto cercando di capire come poterlo importare in quanto se attivo la routine legata alla tabella ed alla riga mi da errore,

act.WriteLine ("<description><![CDATA[" & tb!Descrizione & "]]></description>")

se invece utilizzo la stringa senza tb! dove(tb = DBCorrente.OpenRecordset(SQL)), in quel caso funziona ma mi da sempre il primo valore

act.WriteLine ("<description><![CDATA[" & Descrizione & "]]></description>")

Qualcuno riesce ad aiutarmi

grazie

23 Risposte

  • Re: Esportare memo in xml

    segretoautomobili ha scritto:


    ... esportando in xml una query access contenente vari dati, il problema da cui non riesco ad uscire lo trovo su un campo chiamato "descrizione" che è un campo memo (superiore a 255)
    A volte i campi memo con più di 255 caratteri, vengono troncati


    Che versione di Access usi?

    segretoautomobili ha scritto:


    sto cercando di capire come poterlo importare
    Esportare, intendi.

    segretoautomobili ha scritto:


    in quanto se attivo la routine legata alla tabella ed alla riga mi da errore,
    act.WriteLine ("<description><![CDATA[" & tb!Descrizione & "]]></description>")
    Che tipo di errore dà?

    segretoautomobili ha scritto:


    se invece utilizzo la stringa senza tb! dove(tb = DBCorrente.OpenRecordset(SQL)), in quel caso funziona ma mi da sempre il primo valore
    act.WriteLine ("<description><![CDATA[" & Descrizione & "]]></description>")
    Serve un po' più di quella riga per inquadrare meglio la questione. Ad esempio non sappiamo cosa contiene SQL in apertura del recordset (cosa che potrebbe riportare ad una delle situazioni riassunte nelle pagine del sito di Allen Browne) e/o come ti muovi tra i record per vedere perché restituisce sempre il primo valore (credo che con primo valore tu intenda quello contenuto nel primo record).
    Il campo memo contiene sempre più di 255 caratteri o il problema si verifica solo quando supera quella soglia?
    Può contenere caratteri "particolari" come lettere accentate, apice singolo, doppio apice, parentesi angolari, e commerciale (questa = &), ritorni a capo ecc?
  • Re: Esportare memo in xml

    Di seguito l'xml

    Private Sub Comando458_Click()

    Dim ds As DAO.Recordset
    Dim SQL As String
    Dim fso
    Dim act
    Dim oAC As New Access.Application

    Set fso = CreateObject("scripting.filesystemobject")

    'Apertura DB
    Set DBCorrente = CurrentDb

    SQL = "ANNUNCI X SITO"

    'Apertura tabella
    Set tb = DBCorrente.OpenRecordset(SQL)

    Set act = fso.CreateTextFile("C:\Users\Asus\Desktop\dealer_ads.xml", True)

    act.WriteLine ("<?xml version=""1.0"" encoding=""utf-8""?>")
    act.WriteLine ("<cars>")
    While Not tb.EOF
    act.WriteLine ("<element>")
    act.WriteLine ("<supply_number></supply_number>")
    act.WriteLine ("<external_id>" & tb!ID & "</external_id>")
    act.WriteLine ("<sub_title><![CDATA[" & tb!Sottotitolo & "]]></sub_title>")
    act.WriteLine ("<make><![CDATA[" & tb!Marca & "]]></make>")
    act.WriteLine ("<model><![CDATA[" & tb!Modello & "]]></model>")
    act.WriteLine ("<description><![CDATA[" & tb!Descrizione & "]]></description>")
    act.WriteLine ("</element>")

    tb.MoveNext
    DoEvents
    Wend
    tb.Close
    act.WriteLine ("</cars>")
    End Sub


    l'errore che mi da è "errore di run-time '5'

    ho notato che se il campo descrizione è minore di 255 funziona se è superiore da errore.
    inoltre come scritto precedentemente se non inserisco il "tb!" allora funziona ma mi da sempre il valore della prima riga


    nel campo descrizione della query ci sono vari valore come ": , . - + - ecc.." però ho notato che nonostante questi valori se sto sotto i 255 non mi crea errori
  • Re: Esportare memo in xml

    segretoautomobili ha scritto:


    inoltre come scritto precedentemente se non inserisco il "tb!" allora funziona ma mi da sempre il valore della prima riga
    Questo forse è dovuto al fatto che c'è un controllo associato con quello stesso nome e/o il codice in assenza di specifiche va alla ricerca nell'origine dati della maschera. Non è lì quindi che bisogna indagare.
    Indica il datatype di queste variabili, fosse anche Object
    Dim fso
    Dim act
    
    A cosa ti serve questa riga?
    Dim oAC As New Access.Application
    Non la si vede usata nel resto della routine. Se non serve toglila, se serve non scriverla così ma "spezza" la dichiarazione dall'assegnazione (prima Dim e poi Set)
    Annunci X Sito è una tabella o una query? Per essere sicuri di aver a che fare con un recordset di un certo tipo (dynaset), esplicita, altrimenti se è una tabella è table-type e potrebbe comportarsi in modo diverso (sinceramente non lo so, però siamo sicuri che è di un determinato tipo)
    'Apertura tabella
    Set tb = DBCorrente.OpenRecordset(SQL, dbOpenDynaset)
    Ma la cosa più importante è: che valore ha tb!Descrizione quando c'è l'errore? Posta quello che restituisce il codice (magari con un debug.print) e quanto invece è presente "materialmente" nella tabella. Non fare alcuna modifica al quanto incollato (per non togliere ritorni a capo e/o caratteri di tabulazione). Se fosse un Null come verrebbe trattato? Può accadere? L'altra cosa da verificare è se contiene l'apice singolo o il doppio apice.
    Guarda tu per primo con un copia-incolla magari su notepad++ (o altro editor di testo con più funzioni rispetto al classico blocco note) se sono presenti caratteri strani (attivando la visualizzazione di tutti i caratteri e simboli nascosti).
  • Re: Esportare memo in xml

    Ti chiedo scusa ma non purtroppo sono un principiante sui linguaggi, quindi sto cercando di creare il file in base ad indicazioni che riesco a trovare online ed ha vecchi programmi che avevo creato.

    annunci x sito è una query

    l'errore che viene fuori quando avvio l'azione con tb!descrizione è:

    Errore di run-time '5'
    Chiamata di routine o argomento non validi

    il campo non può essere mai vuoto
  • Re: Esportare memo in xml

    segretoautomobili ha scritto:


    Ti chiedo scusa ma non purtroppo sono un principiante sui linguaggi...
    Io non ho mai creato xml "seriamente" ma è un pallino che ogni tanto mi torna, quindi sto "lavorando" insieme a te perché così evito il problemi in anticipo se mai dovesse succedere.
    Allora: prima fai le correzioni al codice come ho detto, poi aggiungi una gestione dell'errore, in modo che in quel momento vediamo il contenuto di tb!Descrizione.
    Nell'intestazione del modulo, sotto Option Compare Database, aggiungi Option Explicit
    Option Compare Database
    Option Explicit
    Questo ti aiuterà a dichiarare le variabili e ad usare solo quelle dichiarate (mettendo mano al codice ho visto un po' di confusione in merito)

    La tua routine, riscritta, potrebbe essere
    Private Sub Comando458_Click()
    On Error GoTo Err_Comando458_Click
    
    Dim tb As DAO.Recordset
    Dim SQL As String
    Dim fso As Object
    Dim act As Object
    'Dim oAC As New Access.Application
    
    Set fso = CreateObject("scripting.filesystemobject")
    
    'Apertura DB
    Set DBCorrente = CurrentDb
    
    SQL = "ANNUNCI X SITO"
    
    'Apertura tabella
    Set tb = DBCorrente.OpenRecordset(SQL, dbOpenDynaset)
    
    Set act = fso.CreateTextFile("C:\Users\Asus\Desktop\dealer_ads.xml", True)
    
    act.WriteLine ("<?xml version=""1.0"" encoding=""utf-8""?>")
    act.WriteLine ("<cars>")
    Do While Not tb.EOF
    	act.WriteLine ("<element>")
    	act.WriteLine ("<supply_number></supply_number>")
    	act.WriteLine ("<external_id>" & tb!ID & "</external_id>")
    	act.WriteLine ("<sub_title><![CDATA[" & tb!Sottotitolo & "]]></sub_title>")
    	act.WriteLine ("<make><![CDATA[" & tb!Marca & "]]></make>")
    	act.WriteLine ("<model><![CDATA[" & tb!Modello & "]]></model>")
    	act.WriteLine ("<description><![CDATA[" & tb!Descrizione & "]]></description>")
    	act.WriteLine ("</element>")
    
    	tb.MoveNext
    	'DoEvents
    Loop
    tb.Close
    act.WriteLine ("</cars>")
    act.Close
    Set tb = Nothing
    Set act = Nothing
    Set fso = Nothing
    
    Exit_Comando458_Click:
        Exit Sub
    
    Err_Comando458_Click:
        Debug.Print tb!Descrizione
        Stop
    
    End Sub
    Al momento dell'errore il codice si interromperà (ti troverai alla riga "Stop") e nella finestra immediata ci sarà il contenuto di tb!Descrizione. Se non visualizzi la finestra immediata premi CTRL+G
  • Re: Esportare memo in xml

    Adesso mi da come errore su
    Set DBCorrente = CurrentDb (evidenziandomi DBCorrente)

    mi viene fuori un pop-up con scritto
    errore di compilazione
    variabile non definita
  • Re: Esportare memo in xml

    segretoautomobili ha scritto:


    Adesso mi da come errore su
    Set DBCorrente = CurrentDb (evidenziandomi DBCorrente)
    Giusto, effetto di Option Explicit
    Devi aggiungere una riga nelle dichiarazioni delle variabili
    Dim DBCorrente As DAO.Database
    (io sto scrivendo direttamente qui, non sto lavorando su Access e non mi accorgo di tutto)
    Alla fine, tra i vari Set ... = Nothing aggiungi una riga con
    Set DBCorrente = Nothing
  • Re: Esportare memo in xml

    Adesso mi da Errore di run-time '91'
    Variabile oggetto o variabile del blocco With non impostata

    su campo
    Err_Comando458_Click:
    Debug.Print tb!Descrizione (viene evidenziato questo)
    Stop
  • Re: Esportare memo in xml

    segretoautomobili ha scritto:


    Adesso mi da Errore di run-time '91'
    Variabile oggetto o variabile del blocco With non impostata
    Uffa! Cancella quelle due righe, il Debug.print e Stop; togli la gestione degli errori, mettendo un apice singolo prima di On Error GoTo...
    ' On Error GoTo ...
    Poi fa' questa aggiunta
       act.WriteLine ("<model><![CDATA[" & tb!Modello & "]]></model>")
       Debug.Print tb!Descrizione.Value '<== riga da aggiungere
       act.WriteLine ("<description><![CDATA[" & tb!Descrizione & "]]></description>")
    Quando va in errore guarda cosa c'è nell'ultima riga della finestra immediata. Ricordati di cancellarne ogni volta il contenuto, prima di rilanciare l'operazione, così evitiamo di avere un eccesso di informazioni fuorvianti.
  • Re: Esportare memo in xml

    Ti chiedo scusa ma facendo quanto sopra adesso mi da errore sulla stringa

    Set tb = DBCorrente.OpenRecordset(SQL, dbOpenDynaset)

    sempre con Errore di run-time '91'
    Variabile oggetto o variabile del blocco With non impostata

    su immediata è sempre vuota
  • Re: Esportare memo in xml

    segretoautomobili ha scritto:


    Ti chiedo scusa ma facendo quanto sopra adesso mi da errore sulla stringa
    è un massacro, quel codice!
    Verifica nel menù Strumenti - Riferimenti che non ci sia alcuna libreria indicanta come "mancante" e che ci sia il riferimento a "Microsoft DAO 3.6 Object Library" o "Microsoft Office xx.x Access Database Engine"
    Riscrivo il codice completo, sperando di non lasciare altri refusi (ho fatto altre piccole modifiche per ridurre le possibilità di errore su cose che non c'entrano niente con la creazione del file xml ed il campo memo)
    Private Sub Comando458_Click()
    'On Error GoTo Err_Comando458_Click
    
    Dim tb As DAO.Recordset
    Dim SQL As String
    Dim fso As Object
    Dim act As Object
    'Dim oAC As New Access.Application
    Dim DBCorrente As DAO.Database
    
    Set fso = CreateObject("scripting.filesystemobject")
    
    'Apertura DB
    Set DBCorrente = CurrentDb
    
    'SQL = "ANNUNCI X SITO"
    
    'Apertura tabella
    Set tb = DBCorrente.OpenRecordset("[ANNUNCI X SITO]", dbOpenDynaset)
    
    Set act = fso.CreateTextFile("C:\Users\Asus\Desktop\dealer_ads.xml", True)
    
    act.WriteLine ("<?xml version=""1.0"" encoding=""utf-8""?>")
    act.WriteLine ("<cars>")
    Do While Not tb.EOF
       act.WriteLine ("<element>")
       act.WriteLine ("<supply_number></supply_number>")
       act.WriteLine ("<external_id>" & tb!ID & "</external_id>")
       act.WriteLine ("<sub_title><![CDATA[" & tb!Sottotitolo & "]]></sub_title>")
       act.WriteLine ("<make><![CDATA[" & tb!Marca & "]]></make>")
       act.WriteLine ("<model><![CDATA[" & tb!Modello & "]]></model>")
       Debug.Print tb!Descrizione & vbNullString
       act.WriteLine ("<description><![CDATA[" & tb!Descrizione & "]]></description>")
       act.WriteLine ("</element>")
    
       tb.MoveNext
       'DoEvents
    Loop
    tb.Close
    act.WriteLine ("</cars>")
    act.Close
    Set tb = Nothing
    Set act = Nothing
    Set fso = Nothing
    Set DBCorrente = Nothing
    
    End Sub
  • Re: Esportare memo in xml

    Inserendo il codice inviato mi da errore dicendomi che non trova la tabella o la query, potrei avere risolto modificando la stringa

    Set tb = DBCorrente.OpenRecordset("[ANNUNCI X SITO]", dbOpenDynaset)
    in
    Set tb = DBCorrente.OpenRecordset("ANNUNCI X SITO", dbOpenDynaset)

    così va avanti ma mi da sempre lo stesso errore sul campo
    act.WriteLine ("<description><![CDATA[" & tb!Descrizione & "]]></description>")

    e funziona sempre senza "tb!"
  • Re: Esportare memo in xml

    Ho riprovato di nuovo a fare alcune modifiche alla query è l'errore da come vedo è sempre dato dal fatto che il campo descrizione è superiore ai 255 caratteri, perchè se sono meno caratteri funziona tranquillamente mantenendo il "tb!"
  • Re: Esportare memo in xml

    segretoautomobili ha scritto:


    Ho riprovato di nuovo a fare alcune modifiche alla query è l'errore da come vedo è sempre dato dal fatto che il campo descrizione è superiore ai 255 caratteri, perchè se sono meno caratteri funziona tranquillamente mantenendo il "tb!"
    Prova a modificare l'estrazione del campo "Descrizione" usando un alias e aggiungendo una stringa vuota.
    In QBE diventa
    Descrizione_nuova: Descrizione & ""
    In SQL dovrebbe essere
    SELECT varicampi, ([Descrizione] & "") AS Descrizione_nuova, altricampi FROM ...
    Ho letto un suggerimento di questo tipo per far "perdere" alla query la memoria sul fatto che si tratta di un campo memo e lo "tratta" come testo (mi si passi questa esposizione atecnica).
    Ovviamente nel codice poi dovrai indicare tb!Descrizione_nuova.
Devi accedere o registrarti per scrivere nel forum
23 risposte