Quesito da principiante su importazione tabelle

di il
9 risposte

Quesito da principiante su importazione tabelle

Ciao a tutti, sono un nuovo utente. Saluto tutti voi e vi ringrazio anticipatamente per la pazienza.
Vi illustro il mio piccolo problema. Ho una fattura, in XML, che riesco ad importare tramite una macro.
Dopo il processo di importazione vengono generate una serie di tabelle, ad esempio Tab1, Tab2 e così via.
In alcune di esse ho dati che mi interessano (Fornitore, data e importo fattura, ecc.) in altre no.
Vorrei automatizzare il processo di importazione, caricando in alcune mie tabelle (Fornitore, Pagamento, Fattura) i dati "utili" e distruggendo le tabelle appena importate subito dopo.
Per far questo ho creato una Form con un pulsante e all'evento "Su click" ho associato una routine. In questa routine eseguo qualcosa del tipo:

For Each tbl In db.TableDefs --> con questo ciclo cancello tutte le tabelle che avevo
già importato
If tbl.Name = "DatiOrdineAcquisto" Then
db.Execute ("DROP TABLE DatiOrdineAcquisto")
End If

if tbl.Name = "DettaglioLinee" Then
db.Execute ("DROP TABLE DettaglioLinee")
End If
...
Next tbl

DoCmd.RunCommand acCmdImportAttachXML --> con questo importo le nuove tabelle dal file XML

Fin qui va "bene" (o almeno fa quello che mi aspetto).

Adesso vorrei, in questa routine, copiare nelle MIE TABELLE alcuni campi contenuti in certe tabelle importate . Ad esempio, esiste una tabella importata "ANAGRAFICA" che contiene un campo "Denominazione" e vorrei importare quel campo nella tabella FORNITORE (creata da me) e metterlo nel corrispondente campo "Denominazione", e fare lo stesso con gli altri campi che mi interessano. Il tutto tramite istruzioni VBA all'interno della stessa routine evento di cui sopra.

In questo modo "popolo" le tabelle del mio database solo con i campi che mi interessano delle fatture importate e cestino tutto il resto.
Volevo farlo con istruzioni del tipo:

Fornitore!Denominazione = Anagrafica!Denominazione

ma ottengo dei runtime-error. Scusate la banalità del quesito... Se mi riuscite a dare una dritta ve ne sarei grato, poi me la smazzo io e cerco di stressarvi solo per questioni più importanti. Ma sono un principiante... Grazie mille e scusate di nuovo!
E' una scemenza, sicuramente.

9 Risposte

  • Re: Quesito da principiante su importazione tabelle

    Ciao.

    Per essere un principiante hai un approccio abbastanza elegante al problema.

    Di soluzioni ce ne potrebbero essere molte.
    Sono secoli che non faccio importazioni di tabelle, ma mi sembra di ricordare che dovrebbe esistere il modo di fare quello che dici, tramite il wizard di importazione tabelle.

    Quello che non capisco però sono due cose.
    Cosa intendi per incollare (devi accodare dei records o devi aggiornare un campo di un record già esistente?) e sopratutto, la tabella che hai creato tu, è vuota oppure contiene già dei dati e devi aggiungere il campo desiderato e poi aggiornarlo?

    Perchè se è vuota, potresti risolvere con una semplice query dove prendi i valori da varie tabelle e poi creare una nuova tabella con i valori che hai selezionato.

    Se invece la tabella da te creata contiene già record e devi aggiornare un campo, con i dati provenienti da un'altra tabella, la cosa è un po' più rognosa.

    Anche se poi secondo me, avrai problemi per le relazioni tra tabelle.
  • Re: Quesito da principiante su importazione tabelle

    Mi sembra molto simile a questa
    https://www.iprogrammatori.it/forum-programmazione/access/fatturazione-elettronica-t48598.html
    prova a vedere lì se trovi già qualche appiglio
  • Re: Quesito da principiante su importazione tabelle

    Grazie mille muttley005. Il terreno è quello. Mi leggo la discussione per vedere se ne posso ricavare qualcosa di utile. Il mio approccio è molto più semplificato rispetto a quanto ho capito dando una rapida scorsa ai primi post, ma potrebbe essere una buona pista. Grazie di nuovo della segnalazione, ciao!
  • Re: Quesito da principiante su importazione tabelle

    Ciao fratac, grazie delle risposta, inanzitutto, e dell'"approccio elegante".
    Cerco di spiegarmi meglio.
    Le tabelle in cui voglio salvare i dati importati dalla fattura XML sono costruite per "mimare" alcuni campi che trovo nell'XML.
    Ovviamente su queste tabelle poi costruirò il mio database vero e proprio.
    L'idea è quella di poter importare una fattura XML in un database e poi lavorarci sopra.

    Quindi ad esempio io ho tre tabelle: Fornitore, Fattura, Pagamento che mi sono creato io, i campi si possono immaginare perchè è proprio il database classico da esercizietto con gli ID, la data, le anagrafiche e gli IBAN.
    Le tabelle importate dalla fattura XML contengono, sparsi in giro, questi dati. Sto effettivamente usando un comando di importazione sfruttando l'import XML di Access, e sembra funzioni bene. Vorrei raccogliere questi dati importati "pescandoli" dalle tabelle importate, inserirli in uno o più record all'interno delle tabelle create da me (che quindi sono vuote solamente appena create, poi i vari dati verranno accodati se serve farlo). Quindi, normalmente, farei degli accodamenti.

    Quindi la risposta alla prima domanda è: la tabella che creo io è normalmente popolata, ha una sua struttura determinata e contiene dei dati. Dopo aver importato i dati da XML le aggiungo dei record (se serve) ma non ne modifico la struttura (non devo aggiungere nuovi campi al record, cha ha un tracciato già definito). Per "incollare" intendevo in realtà "accodare" un record (per ogni fattura, quindi, accodo sicuramente un record alla tabella fattura, uno o più record alla tabella pagamenti, nessuno o un record alla tabella Fornitori in base al fatto che questo fornitore sia già registrato o meno).

    Magari usare istruzioni SQL inserite nella mia routine di evento che facciano una SELECT dalle varie tabelle importate e un APPEND sulle tabelle create da me? E' percorribile come soluzione secondo te?

    Sul discorso delle relazioni tra tabelle me le devo in qualche modo mantenere io "a mano", nel senso che se per ogni fattura posso avere un solo Fornitore, se per ogni Fornitore posso avere più fatture, se per ogni fattura posso avere uno o più pagamenti... non sarà sufficiente importare in modo acritico i dati ma come dici giustamente tu bisogna badare anche alle relazioni... ma alla fine lo scopo è quello di gestire uno scadenziario e niente più, quindi è tutto molto semplificato rispetto ad un programma che gestisca una fatturazione...

    Grazie di nuovo!
  • Re: Quesito da principiante su importazione tabelle

    Ciao.

    vediamo se ho capito.
    L'importazione non è una tantum, ma avviene periodicamente.
    le tabelle importate non hanno nessun elemento univoco da poter usare come chiave primaria da poter sfruttare.
    Non conosco le tue attuali competenze con access e vb.
    Da quello che ho visto però ti giostri bene con la logica del VB.

    Ti propongo la soluzione del garzone.
    Soluzione sicuramente non elegante e che con tantissimi record, potrebbe risultare un po' lenta nell'esecuzione (questioni di pochi millesimi), ma al momento più funzionale rispetto alla creazione di una query unica per recuperare i dati su tabelle scollegate. Fattibile, ma diciamo un pochino più ostica.

    Per ogni tabella a livello di codice crei una singola query con cui prelevi il campo che ti occorre e salvi il valore in una variabile.
    Ripeti la cosa per ogni singola tabella e per ogni valore.
    Quando hai recuperato tutto quello che ti occorre per creare il record, l'accodi, nella tua tabella.
    azzeri tutte le variabili e ripeti il ciclo, portandoti al record successivo delle tabelle importate.
    Ricordati di far ogni volta che recuperi i dati di controllare se ti trovi all'inizio della tabella o alla fine (altrimenti ti da errore).
    Poi rimane il problema di collegare con le relazioni la tua tabella ad eventuali altre tabelle.
    Ma in quel caso, senza andare ad impantanarsi con la modifica degli chiave primarie, si potrebbe costruire una tabella esterna che contenga gli ID delle varie tabelle e sfruttare quella per le modifiche, le stampe e le ricerche dei dati.
  • Re: Quesito da principiante su importazione tabelle

    Ok fratac, grazie mille per il tuo suggerimento! Sì, il programma ha come scopo quello di importare una fattura elettronica e ricavare, dai dati presenti, le informazioni necessarie per avvisare l'utente che entro x giorni è necessario procedere al pagamento y intestato al fornitore Z che ha un certo IBAN. La tua soluzione mi sembra la più percorribile per il mio livello. Se riesco posto qualcosa così, magari, mi segnalate dove le ho combinate troppo grosse.. ciao e a risentirci a presto, grazie mille!
  • Re: Quesito da principiante su importazione tabelle

    Eccomi. Non ho avuto molto tempo a disposizione ma ho seguito le indicazioni fornitemi. Ho associato al mio pulsante di importazione questa Sub. Per adesso fa il lavoro solamente su una tabella (quella dei Fornitori) pescando i dati dalle tabelle di importazione ma se funziona su questa funzionerà anche sulle altre. Certo, ad ogni fattura potrei avere un fornitore duplicato, ma non mi interessa, sarebbe differenziato in base al campo ID e a me interessa solo che quell'ID compaia in fattura e nei pagamenti connessi alla fattura (e farò in modo, in fase di importazione, di costruire i record correttamente nelle tabelle). Per fare in modo che ID sia sempre crescente ho fatto una query con un COUNT(*) e ho passato all'ID il risultato della query incrementato di 1. Braccia rubate all'agricoltura.. volevo ringraziarvi per le dritte che spero di aver recepito correttamente, mi siete stati molto utili! Ciao a tutti!

    Private Sub Importa_XML_Click()
    Dim db As Database
    Dim rst As Recordset
    Dim querySql As String
    Dim F_Denominazione, F_Indirizzo, F_Tel, F_Fax, F_Email As String
    Dim F_ID As Integer
    Dim Indirizzo, comune, cap, prov, naz As String

    On Error Resume Next

    Set db = CurrentDb

    ' cancellazione tabelle rimaste da ultima importazione

    db.Execute ("DROP TABLE Anagrafica")
    db.Execute ("DROP TABLE DatiOrdineAcquisto")
    db.Execute ("DROP TABLE DettaglioLinee")
    db.Execute ("DROP TABLE ErroriImportazione")
    db.Execute ("DROP TABLE Allegati")
    db.Execute ("DROP TABLE IdTrasmittente")
    db.Execute ("DROP TABLE ContattiTrasmittente")
    db.Execute ("DROP TABLE IdFiscaleIVA")
    db.Execute ("DROP TABLE DatiAnagrafici")
    db.Execute ("DROP TABLE Sede")
    db.Execute ("DROP TABLE IscrizioneREA")
    db.Execute ("DROP TABLE Contatti")
    db.Execute ("DROP TABLE DatiGeneraliDocumento")
    db.Execute ("DROP TABLE DatiTrasmissione")
    db.Execute ("DROP TABLE DatiDDT")
    db.Execute ("DROP TABLE CodiceArticolo")
    db.Execute ("DROP TABLE ScontoMaggiorazione")
    db.Execute ("DROP TABLE DatiRiepilogo")
    db.Execute ("DROP TABLE DettaglioPagamento")
    db.Execute ("DROP TABLE DatiPagamento")

    ' importazione tabelle da XML

    DoCmd.RunCommand acCmdImportAttachXML
    On Error GoTo Handler

    ' importazione dati per riempimento tabella Fornitore

    querySql = "SELECT COUNT (*) FROM Fornitore"
    Set rst = db.OpenRecordset(querySql)
    ' campo ID
    F_ID = rst.Fields(0).Value + 1
    querySql = "SELECT DISTINCT Denominazione FROM Anagrafica"
    Set rst = db.OpenRecordset(querySql)
    ' campo Denominazione
    F_Denominazione = rst.Fields(0).Value
    querySql = "SELECT DISTINCT Indirizzo FROM Sede"
    Set rst = db.OpenRecordset(querySql)
    Indirizzo = rst.Fields(0).Value
    querySql = "SELECT DISTINCT CAP FROM Sede"
    Set rst = db.OpenRecordset(querySql)
    cap = rst.Fields(0).Value
    querySql = "SELECT DISTINCT Comune FROM Sede"
    Set rst = db.OpenRecordset(querySql)
    comune = rst.Fields(0).Value
    querySql = "SELECT DISTINCT Provincia FROM Sede"
    Set rst = db.OpenRecordset(querySql)
    prov = rst.Fields(0).Value
    querySql = "SELECT DISTINCT Nazione FROM Sede"
    Set rst = db.OpenRecordset(querySql)
    naz = rst.Fields(0).Value
    ' campo indirizzo
    F_Indirizzo = Indirizzo & " " & cap & " " & comune & " - " & " " & "(" & prov & ")" & " " & naz
    querySql = "SELECT DISTINCT Telefono FROM Contatti"
    Set rst = db.OpenRecordset(querySql)
    ' campo telefono
    F_Tel = rst.Fields(0).Value
    querySql = "SELECT DISTINCT Fax FROM Contatti"
    Set rst = db.OpenRecordset(querySql)
    ' campo fax
    F_Fax = rst.Fields(0).Value
    querySql = "SELECT DISTINCT Email FROM Contatti"
    Set rst = db.OpenRecordset(querySql)
    ' campo e-mail
    F_Email = rst.Fields(0).Value

    ' compongo il record da salvare in tabella Fornitori usando una query di accodamento
    ' tolgo apici per evitare problemi di dati troncati
    F_Denominazione = Replace(F_Denominazione, "'", " ")
    F_Indirizzo = Replace(F_Indirizzo, "'", " ")
    F_Tel = Replace(F_Tel, "'", " ")
    F_Fax = Replace(F_Fax, "'", " ")
    F_Email = Replace(F_Email, "'", " ")

    ' costruisco il record da accodare
    querySql = "INSERT INTO Fornitore(ID, Denominazione, Indirizzo, Telefono, email, Fax) VALUES(" & _
    F_ID & "," & _
    "'" & F_Denominazione & "'" & "," & _
    "'" & F_Indirizzo & "'" & "," & _
    "'" & F_Tel & "'" & "," & _
    "'" & F_Fax & "'" & "," & _
    "'" & F_Email & "'" & ")"

    DoCmd.RunSQL querySql

    On Error GoTo 0
    Exit Sub

    Handler: MsgBox Err.Description

    End Sub
  • Re: Quesito da principiante su importazione tabelle

    Ciao a tutti voi. Piccolo riepilogo: sto costruendo uno scadenziario (molto rudimentale) che importi una fattura in XML, estragga i campi che servono e popoli una tabella che contiene tutti i pagamenti da fare per saldare queste fatture. Ho costruito una maschera continua, i cui dati derivano dalla tabella "Pagamenti" (ogni record di tabella corrisponde ad un pagamento da effettuare). In questa maschera indico il numero di giorni mancanti al pagamento e vorrei impostare un allarme ad esempio modificando il colore di sfondo di una casella di testo (ma va bene anche qualsiasi altra strategia). Nella mia maschera ho il campo Data_Scadenza (formato data/ora) che confronto con il risultato della funzione Date() ricavando quanti giorni manchino alla scadenza o hanno superato la scadenza, scrivendo questo valore in un campo calcolato (fin qui funziona, ma non è che ci voglia un genio). Premetto che ho dato un'occhiata al forum con la funzione "cerca" e ho visto che non sono il primo ad avere bisogno di usare la formattazione condizionale o qualcosa di simile, ma confesso che non ho capito benissimo se le soluzioni indicate sono applicabili al mio caso (soprattutto per il fatto che sto usando una maschera continua e che sono un principiante, soprattutto). Mi era venuta voglia di utilizzare codice da mettere in una routine evento, ma facendo qualche prova mi sembra di vedere che gli eventi che ritengo dovrebbero scatenarsi quando apro la mia maschera continua non vengono triggerati (ho messo un breakpoint nel codice ma sono certo che sbaglio qualcosa perchè non scatta, quindi l'evento "prima aggiornamento" o "dopo aggiornamento" sembra non verificarsi). Grazie dell'aiuto, spero di essere stato sufficientemente chiaro. Ciao a tutti e grazie in anticipo a chi potrà spiegarmi
  • Re: Quesito da principiante su importazione tabelle

    Scusate, ho risolto grazie alla formattazione condizionale sul campo contenente il numero di giorni mancanti. Scheda Formato, impostazione di tre regole con gli intervalli di scadenza e colore di sfondo diverso. Era banale. Grazie mille.
Devi accedere o registrarti per scrivere nel forum
9 risposte