Importazione file testo EDI

di il
9 risposte

Importazione file testo EDI

Buonasera,
chiedo consiglio sul corretto approccio per importare in una tabella Access, riga per riga, un file di testo come questo:

UNA:+.? '
UNB+UNOC:3+BRANDEUROPE+ANYCODE+180206:1121+5439'
UNH+5439-1+DESADV:D:99B:UN'
BGM+351+0089430043+9'
DTM+11:20180205:102'
DTM+137:20180205:102'
MEA+WT+AAD+KGM:2126.100'
MEA+CT+SQ+NMP:00000'
NAD+DP+0017309707++NameStreet 22+Rome++00100+IT'
CTA+DL'
NAD+SU+DE++BRAND Systems+Rome+Rome++00100+IT'
CTA+DL'
TOD+6++CIP'

CPS+1'
PAC+2++BX'
MEA+WT+G+KGM:88'
PCI+24'
GIN+ML+AL7B009435+AL7B009438'
LIN+1++46550705:VP'
PIA+1+4114793:BP'
IMD+A++:::C833dn-EURO'
QTY+12:2'
RFF+OP:44CKV07S:000001'

CPS+2'
PAC+1++BX'
MEA+WT+G+KGM:0.01'
PCI+24'
LIN+1++01182907:VP'
PIA+1+4113617:BP'
IMD+A++:::RAM-256MB-C3/C5/C6/C7/MC3/MC5/C8'
QTY+12:1'
RFF+OP:44CKV07S:000003'

CPS+3'
PAC+4++BX'
MEA+WT+G+KGM:43.2'
PCI+24'
LIN+1++46361802:VP'
PIA+1+4114805:BP'
IMD+A++:::Tray-C5x2/MC5x3'
QTY+12:4'
RFF+OP:44CKV07S:000006'
UNT+167+5439-1'
UNZ+1+5439'

Prima di importare il record GIN con i numeri di serie devo acquisire il record LIN con il codice prodotto,
ho provato con .MoveNext per poi tornare indietro con 2 .MovePrevious ma mi da errore (necessario oggetto)...

Come risultato sto cercando di importare in una tabella in questo modo, per poi darlo in pasto al gestionale che non supporta EDI:
BGM.........DTM..........LIN........GIN............Quantità (=1 se SN (GIN) not null)
0089430043 05/02/2018 46550705 AL7B009435....1
0089430043 05/02/2018 46550705 AL7B009438....1
0089430043 05/02/2018 01182907 ..................1
0089430043 05/02/2018 46361802 ..................4
etc...

Grazie

9 Risposte

  • Re: Importazione file testo EDI

    Ciao. Quindi presumo tu abbia un recordset.
    Prova ad usare absoluteposition per spostarti ad un record specifico.
  • Re: Importazione file testo EDI

    Devi spiegare meglio... personalmente non trovo l'importazione diretta in una Tabella, quindi un Recordset, come una soluzione ottimale stando le premesse di ricerca NON SEQUENZIALE.
    La soluzione più adatta sarebbe importare riga per riga in un Array... di tipo String.
    A quel punti cicli Array e gestisci la sequenza di inserimento nella Tabella con i Criteri che hai esposto.

    Se hai invece una Tabella devi pensare ad una TEMP_TABLE in cui caricare i dati e poi su qyesta fai una ricerca del valore GIN al momento di inserimenti di LIN... ma devi distinguere le 2 fasi.
  • Re: Importazione file testo EDI

    Visto che il file EDI (Electronic Data Interchange) è strutturato per riga, puoi procedere con le istruzioni per leggere sequenzialmente un file (con le istruzioni per aprire, leggere ciascuna linea, e chiudere il file interessato, effettuando la elaborazione in base al contenuto acquisito, da assegnare alle tabelle interessate siano esse fatture, magazzino ecc.):
    https://bytes.com/topic/access/insights/953655-vba-standard-text-file-i-o-statements
    https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/line-inputstatement
    https://www.devhut.net/2012/05/14/vba-read-file-into-memory/
    http://codevba.com/office/read_text_file_line_by_line.htm#.WphCftThBkg
  • Re: Importazione file testo EDI

    @Alex ha scritto:


    Devi spiegare meglio... personalmente non trovo l'importazione diretta in una Tabella, quindi un Recordset, come una soluzione ottimale stando le premesse di ricerca NON SEQUENZIALE.
    La soluzione più adatta sarebbe importare riga per riga in un Array... di tipo String.
    A quel punti cicli Array e gestisci la sequenza di inserimento nella Tabella con i Criteri che hai esposto.

    Se hai invece una Tabella devi pensare ad una TEMP_TABLE in cui caricare i dati e poi su qyesta fai una ricerca del valore GIN al momento di inserimenti di LIN... ma devi distinguere le 2 fasi.
    Scusate.... Come risultato sto cercando di importare in una tabella in questo modo:
    BGM.........DTM..........LIN........GIN
    0089430043 05/02/2018 46550705 AL7B009435
    0089430043 05/02/2018 46550705 AL7B009438
    etc...

    Quindi mi consigli la 2° opzione?
    Dovrei appoggiare i dati su una tabella temp così come appaiono sul file? Ogni record in un campo testo?
    Puoi spiegarmi meglio come fare? Scusa ma non ci sto capendo granché...
  • Re: Importazione file testo EDI

    Ma quello che esponi ora come lo rapporti al File di cui parlavi prima...?
    Secondo me, il file del primo POST ha una formattazione tale da rendere meglio l'approccio SEQUENZIALE, magari tramite un Array di Stringhe, cosa che ti ho già esposto precedentemente... questo tuttavia, è un concetto estremamente semplice che non richiede molte spiegazioni..., ma deve esser chiaro a te cosa significa... altrimenti il suggerimento non è sul METODO ma sul MERITO del codice.

    Importare quel File in una Tabella così come lo vedo ha veramente poco senso... anche in una Tabella TEMP, perchè poi la manipolazione che ne deriva sarebbe al medesima che daresti co un Array...
    I Link che ti ha riportato Willy, sono già chiari di cosa significhi... questo richiede ovviamente delle basi di VBA abbastanza consolidate, per comprendere come manipolare il file e come scrivere delle routine di PARSING adeguate.

    Suggerisco l'uso del Metodo sottoriportato di cui nel Link trovi codice di Importazione già sviluppato, ovviamente la MANIPOLAZIONE poi è a carico tuo, e solo tu sai che di che dimestichezza disponi...
    
    Open strFile For Binary....
  • Re: Importazione file testo EDI

    Paccatore,
    non appare chiaro quale sia lo scenario complessivo, in quanto in base ai dati presentati nel primo post, se si analizza il file con un EDI Viewer come quello seguente:
    http://www.edifactviewer.com
    otteniamo la scomposizione del contenuto del file con le descrizioni di ciascuna riga:
    
    1.	Service String advice	UNA:+.?
    2.	Interchange Header	UNB+UNOC:3+BRANDEUROPE+ANYCODE+180206:1121+5439
    3.	Message Header	UNH+5439-1+DESADV:D:99B:UN
    4.	Beginning of message	BGM+351+0089430043+9
    5.	Date/time/period	DTM+11:20180205:102
    6.	Date/time/period	DTM+137:20180205:102
    7.	Measurements	MEA+WT+AAD+KGM:2126.100
    8.	Measurements	MEA+CT+SQ+NMP:00000
    9.	Name and address	NAD+DP+0017309707++NameStreet 22+Rome++00100+IT
    10.	Contact information	CTA+DL
    11.	Name and address	NAD+SU+DE++BRAND Systems+Rome+Rome++00100+IT
    12.	Contact information	CTA+DL
    13.	Terms of delivery or transport	TOD+6++CIP
    14.	Consignment packing sequenze	CPS+1
    15.	Package	PAC+2++BX
    16.	Measurements	MEA+WT+G+KGM:88
    17.	Package identification	PCI+24
    18.	Goods identity number	GIN+ML+AL7B009435+AL7B009438
    19.	Line item	LIN+1++46550705:VP
    20.	Additional product id	PIA+1+4114793:BP
    21.	Item description	IMD+A++:::C833dn-EURO
    22.	Quantità	QTY+12:2
    23.	Reference	RFF+OP:44CKV07S:000001
    24.	Consignment packing sequence	CPS+2
    25.	Package	PAC+1++BX
    26.	Measurements	MEA+WT+G+KGM:0.01
    27.	Package identification	PCI+24
    28.	Line item	LIN+1++01182907:VP
    29.	Additional product id	PIA+1+4113617:BP
    30.	Item description	IMD+A++:::RAM-256MB-C3/C5/C6/C7/MC3/MC5/C8
    31.	Quantità	QTY+12:1
    32.	Reference	RFF+OP:44CKV07S:000003
    33.	Consignment packing sequenze	CPS+3
    34.	Package	PAC+4++BX
    35.	Measurements	MEA+WT+G+KGM:43.2
    36.	Package identification	PCI+24
    37.	Line item	LIN+1++46361802:VP
    38.	Additional product id	PIA+1+4114805:BP
    39.	Item description	IMD+A++:::Tray-C5x2/MC5x3
    40.	Quantità	QTY+12:4
    41.	Reference	RFF+OP:44CKV07S:000006
    
    Di questi, in base al tuo ultimo post, ne vengono estratti solo alcuni e non si comprende quale sia l'effettiva esigenza, dal momento che attraverso EDI (Electronic Data Interchange) vi è lo scambio dati in forma elettronica tra sistemi eterogenei attraverso VAN (Value Added Network).
    Ne consegue che devi aver chiaro quale sia:
    - l'obiettivo della automazione che si vuole ottenere;
    - le informazioni da trattare:
    - le funzionalità che vuoi assicurare da Access.
  • Re: Importazione file testo EDI

    Scusate, ho modificato il post aggiungendo le info mancanti...
  • Re: Importazione file testo EDI

    Credo che tu non abbia compreso i suggerimenti forniti e non è che variando il primo post si migliora la situazione, anzi appare sempre più la confusione (ad esempio le istruzioni MoveNext e MovePrevious sono applicabili ad un Recordset e non ad un file di testo, quale essere uno di tipo EDI, in quanto deve essere acquisito con apposite istruzioni).
    Pertanto, ti consiglio di:
    - leggere, più attentamente, le informazioni già fornite in merito alla lettura di un file sequenziale;
    - approfondire la documentazione relativa al tracciato EDI (Electronic Data Interchange) con cui vengono costruiti i file per lo scambio dati (in forma elettronica) tra sistemi, in modo da poterli elaborare; in tal caso, magari, iniziando da questi link:

    http://www.datainterchange.com/Downloads/Brochures/WhitePaper-What-is-EDI.pdf

    http://gs1it.org/assistenza/standard-specifiche/gs1-eancom-standard-edi/
  • Re: Importazione file testo EDI

    Finalmente ho risolto (Non so davvero come ho fatto), ecco il mio codice:

    Public Function Importa()

    Dim FSO As Object, objFile, objFolderIN, objFolderOUT As Object
    Dim i As Integer
    'Dim strFilename As String: strFilename = "C:\DESPATCH.txt"
    Dim strTextLine, CodPro, DataDoc As String
    Dim SNarray() As String

    Dim NumDoc As Long
    Dim nPAC, NumRig, intCount As Integer
    Dim iFile As Integer: iFile = FreeFile

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set objFolderIN = FSO.GetFolder("C:\IN")
    Set objFolderOUT = FSO.GetFolder("C:\Archivio")

    i = 1
    For Each objFile In objFolderIN.Files
    If Right(objFile.Name, 3) = "txt" Then

    DoCmd.SetWarnings False
    DoCmd.OpenQuery "001: Svuota DESADV" 'empty the DESADV table
    DoCmd.SetWarnings True

    Open objFile For Input As #iFile

    Do Until EOF(1)
    Line Input #1, strTextLine
    strTextLine = Replace(strTextLine, "'", "")

    'BGM
    If Left(strTextLine, 3) = "BGM" Then
    NumDoc = Mid(strTextLine, 9, 10)
    End If

    'DTM
    If Left(strTextLine, 6) = "DTM+11" Then
    DataDoc = Mid(strTextLine, 14, 2) & "/" & Mid(strTextLine, 12, 2) & "/" & Mid(strTextLine, 8, 4)
    End If

    'CPS = numero record
    If Left(strTextLine, 3) = "CPS" Then
    NumRig = Val(Mid(strTextLine, 5, 3))
    End If

    'PAC = Qta
    If Left(strTextLine, 3) = "PAC" Then
    nPAC = Val(Mid(strTextLine, 5, 3))
    End If

    'LIN
    If Left(strTextLine, 3) = "LIN" Then
    CodPro = Mid(strTextLine, 8,
    Else
    CodPro = ""
    End If

    DoCmd.SetWarnings False
    DoCmd.RunSQL "INSERT INTO DESADV (Record, NumDoc, DataDoc, NumRiga, CodProd, Qta)" & "Values ('" & strTextLine & "', '" & NumDoc & "', '" & DataDoc & "', '" & NumRig & "', '" & CodPro & "', '" & nPAC & "');"
    DoCmd.SetWarnings True

    'GIN
    If Left(strTextLine, 3) = "GIN" Then

    SNarray = Split(Mid(strTextLine, , "+")

    For intCount = LBound(SNarray) To UBound(SNarray)
    'Debug.Print NumDoc & " " & DataDoc & " " & NumRig & " " & CodPro & " " & SNarray(intCount)

    DoCmd.SetWarnings False
    DoCmd.RunSQL "INSERT INTO DESADV (Record, NumDoc, DataDoc, NumRiga, NumSerie)" & "Values ('" & strTextLine & "', '" & NumDoc & "', '" & DataDoc & "', '" & NumRig & "', '" & SNarray(intCount) & "');"
    DoCmd.SetWarnings True

    Next
    End If

    Loop

    Close #iFile

    DoCmd.SetWarnings False
    DoCmd.OpenQuery "002: Crea CodiceProdotto-LIN" 'This is a simple query to get a table containing CPS (Row Number) and his relative MaxOfCodProd
    DoCmd.OpenQuery "010: Aggiorna CodiceProdotto su DESADV" 'This query update all the records that didn't get before the CPS number
    DoCmd.SetWarnings True

    Else
    'esce
    MsgBox ("File non di testo")
    End If

    'Archive just processed file
    Name objFolderIN & "\" & objFile.Name As objFolderOUT & "\" & objFile.Name

    i = i + 1
    Next objFile

    ' Empty variables
    Set objFile = Nothing
    Set objFolderIN = Nothing
    Set objFolderOUT = Nothing
    Set FSO = Nothing

    End Function
Devi accedere o registrarti per scrivere nel forum
9 risposte