Oslo, 1. oktober 2023

Importrestriksjoner

I dag skriver jeg ikke om problemer med varehandel over landegrensene, men om muligheter og begrensninger ved import av informasjon til tabeller i Visma Business (VBus).

Det finnes flere import-funksjoner i VBus. Mest kjent er kanskje EDI og det interne EDI-formatet til VBus er regnet som gammeldags, mens EDI-klokka som ble laget for å importere EDI-meldinger har fått et ufortjent dårlig rykte. Men EDI-formatet er godt dokumentert i hjelpeteksten til VBus og det er enkelt i sin struktur. For ikke å gå rundt grøten: Det handler om å importere ordre med ordelinjer. En helt enkel EDI-melding kan se slik ut:

H;;;;;;10005

L;;221;;10

L;;222;;25

Resultatet er en salgsordre med 10005 som kunde og to ordrelinjer; den ene med 10 stk av produktnr 221, den andre med 25 stk av produktnr 222.

For å forstå hvordan meldingen skal leses bruker VBus en fil som har slik struktur

a,1,;,1,,,,,,,,,,,,,,,,,,,,,,,,,,

b,OrderHead,1,,1,

c,RecType,1,1,0,,,,,,,,,S,

c,Ord.CustNo,7,40,0,,,,,,,,,S,

b,OrderLine,1,,1,

c,RecType,1,1,0,,,,,,,,,S,

c,OrdLn.ProdNo,3,40,0,,,,,,,,,S,

c,OrdLn.NoInvoAb,5,40,0,,,,,,,,,F,

b,DummyLayout,1,,1,

c,RecType,1,1,0,,,,,,,,,S,

Filen kalles en imp-fil og plasseres i en egnet mappe. Første linje forteller noen om hvordan resten av linjene i imp-filen skal leses. I det tredje feltet på første linje står det at EDI-meldingen bruker semikolon som skilletegn. Andre linje forteller at her kommer beskrivelse av ordrehodet. Først kommer en recordtype. Denne er fast og det brukes alltid H for Head (eller Hode om du vil). Så kommer kundenummer i felt 7 på EDI-meldingen. I imp-filen er det SQL-navnene som brukes. Formen Ord.CustNo forstås som tabellnavn.kolonnenavn, altså Ordre.Kundenr. Deretter kommer beskrivelsen av ordrelinje. Første felt skal alltid være recordtype. Denne er fast og det brukes alltid L for Line (eller Linje om du vil). Så kommer produktnummer i felt 3 og Antall i felt 5 på EDI-meldingen.

I tabellen EDI-melding angis hvor filen er plassert og hva den heter:

Et bilde som inneholder tekst, skjermbilde, nummer, Font

Automatisk generert beskrivelse

Dersom det ikke er angitt full fil-sti, er filen plassert i samme mappen som VismaBusiness.exe; altså …\Visma\Business\Imp.

En standard imp-fil for å lese inn ordre er langt mer omfattende enn i eksempelet over. EDI-import og eksport er godt beskrevet i hjelpeteksten, så jeg skriver ikke mer om dette her. Eller bare søk etter ordet import i hjelpen.

Men det er et par muligheter som man må lete lenge etter for å få øye på, som jeg tenker at det kan være nyttig å skrive om.

EDI-meldingen kan skrives som en helt enkel XML-melding, slik:

<?xml version="1.0" encoding="windows-1252"?>

<ORDRSR>

<OrderHead>

<Ord.CustNo>12345</Ord.CustNo>

</OrderHead>

<OrderLine>

<OrdLn.ProdNo>221</OrdLn.ProdNo>

<OrdLn.NoInvoAb>10</OrdLn.NoInvoAb>

</OrderLine>

<OrderLine>

<OrdLn.ProdNo>222</OrdLn.ProdNo>

<OrdLn.NoInvoAb>25</OrdLn.NoInvoAb>

</OrderLine>

</ORDRSR>

Fordelen med dette er at du ikke trenger en imp-fil for å lese XML-filer. Men du trenger slike definisjonsfiler for å skrive EDI- og XML-filer. De kalles da exp-filer og har samme oppbygging som imp-filene. Skal du skrive slike enkle EDI- eller XML-filer, så angir du det i Sendemåte for dokument; kryss av for EDI:

Et bilde som inneholder tekst, skjermbilde, display, nummer

Automatisk generert beskrivelse

Filene blir på dette enkle EDI-formatet om det ikke er krysset av for XML-format i ut-fil:

Et bilde som inneholder tekst, skjermbilde, programvare, Font

Automatisk generert beskrivelse

Opprinnelig, da EDI-formatet til VBus ble laget, rett etter tidenes morgen i forrige århundre, var tanken at virksomheter kunne sende bestillinger, ordrebekreftelser og fakturaer til hverandre. Det er nok ingen som gjør det på disse formatene lenger. For en eller annen gang for 10 – 15 år siden (jeg husker ikke helt) kom Visma med et helt nytt konsept som fremdeles går under navnet Visma XML. Søk etter XML i hjelpeteksten, så finner du mye informasjon om denne type meldingsutveksling. Og for seks år siden (med versjon 12.01 som kom 1. oktober 2027) kom mulighet for å sende og lese inn produkt-katalog og ordreutveksling med AutoInvoice. En begrensning i alle formatene, fra det eldste til det nyeste, er at man bare kan utveksle standard-felt. DME-felt kan ikke utveksles på denne måten og det er en logikk i dette: DME felt er felt som er laget spesielt for en virksomhet. Det er ikke rimelig å tenke at handelspartnerne (kunder og leverandører) kjenner til disse. Det er ikke alle standardfelt som kan importeres heller. I mappen …\Visma\Business\Imp finnes en fil med navnet «New Orders Imp.xls». Navnet er misvisende, for spesielt nytt er det ikke. Men det kan være nyttig allikevel; her er det listet opp hvilke felt som kan brukes i imp/exp-filer.

Det gamle EDI-formatet brukes nok nå mest til å lese inn ordre fra egen webshop og selv her har de fleste endret innlesingen til bruk av VBS og API’et til VBus.

 

En av de mulighetene som er lite omtalt i hjelpeteksten, er at det kan importeres nye kunder i EDI-meldingen. Imp-filen må utvides med en Actor-seksjon, slik:

a,1,;,1,,,,,,,,,,,,,,,,,,,,,,,,,,

b,Actor,1,,1,

c,RecType,1,1,0,,,,,,,,,S,

c,Actor.CustNo,2,40,0,,,,,,,,,S,

c,Actor.Nm,3,80,0,,,,,,,,,S,

c,Actor.Ad1,4,60,0,,,,,,,,,S,

c,Actor.Ad2,5,60,0,,,,,,,,,S,

c,Actor.PNo,6,40,0,,,,,,,,,S,

c,Actor.PArea,7,60,0,,,,,,,,,S,

c,Actor.Ctry,8,10,0,,,,,,,,,S,

c,Actor.Lang,9,11,0,,,,,,,,,S,

c,Actor.MailAd,12,60,0,,,,,,,,,S,

c,Actor.MobPh,13,20,0,,,,,,,,,S,

b,OrderHead,1,,1,

c,RecType,1,1,0,,,,,,,,,S,

c,Ord.CustNo,7,40,0,,,,,,,,,S,

b,OrderLine,1,,1,

c,RecType,1,1,0,,,,,,,,,S,

c,OrdLn.ProdNo,3,40,0,,,,,,,,,S,

c,OrdLn.NoInvoAb,5,40,0,,,,,,,,,F,

b,DummyLayout,1,,1,

c,RecType,1,1,0,,,,,,,,,S,

Legg merke til at tallet bak feltnummeret er maksimal lengde på teksten i meldingen. I VBus har navn-kolonnen 80 tegn, mens flere av adresse-feltene er på 60 tegn. EDI-meldingen kan se slik ut:

A;12345;Frode Antun;Kirkeveien 75A;;0364;OSLO;47;47;frode@antun.no;911 46 751

H;;;;;;12345

L;;221;;10

L;;222;;25

Merk at det bare er nye kunder som kan importeres på denne måten. Dersom kunden finnes fra før, blir linjen ignorert. Og Actor-segmentet er ikke tilgjengelig i XML-format.

Dersom man skal endre eksisterende kunder, må det lages en standard import-fil som legges i IMPORTS-mappa. Den kan se slik ut

@FIRM_BEGIN (1)

@IMPORT_METHOD (1)

@Actor (=CustNo, Nm, Ad1, Ad2, PNo, PArea, Ctry, Lang, MailAd, MobPh)

12345 "Frode Antun" "Kirkeveien 75A" "" "0364" "OSLO" 47 47 "frode@antun.no" "911 46 751"

@FIRM_BEGIN (1) betyr at det skal importeres til bedrift nr 1. Det må være en @FIRM_BEGIN i EDI-meldingen, selv om den ligger i rett IMPORTS-mappe. @IMPORT_METHOD (1) betyr Overskriv oppgitte felter og er strengt tatt unødvendig, siden dette er default. Så kommer SQL-navn til tabell og kolonner (felt i tabellen). Merk at om en tekstverdi inneholder en blank (slik som adresselinje 1 og mobiltelefon i eksempelet over), så må den omsluttes av ". Alle felt (også tallfelt) kan omsluttes av " og det kan være enklere å sette opp EDI-filen slik at alle felt (eller alle tekstfelt) omsluttes av ". Dersom verdien faktisk skal inneholde en ", må det brukes to " i stedet.

Legg merke til =CustNo og at det ikke er oppgitt primærnøkkel til tabellen, som er ActNo. =CustNo betyr at VBus skal gjøre oppslag i aktørtabellen, finne den aktøren med det oppgitte kundenr og endre Navn, adresse, etc. på denne kunden. Funksjonen er ikke beskrevet i hjelpeteksten, men nevnt som eksempel to steder. Denne formen, hvor det gjøres oppslag i annen kolonne enn primærnøkkel, kan brukes på alle tabeller hvor det er tillatt å legge inn en ny rad uten å oppgi primærnøkkel. Det gjelder de fleste tabeller hvor primærnøkkel består av ett heltall. Det gjelder altså alle de seks første ansvarsenhetene, men ikke de seks siste. Det gjelder de tre Fri informasjonstabellene, men ikke Produkt, Lagersaldo eller Vareparti. Merk at dersom den oppgitte verdien som det søkes etter ikke finnes, så legges det til en ny rad – hvor VBus tildeler primærnøkkel (som 1 høyere enn høyeste verdi før import).

Denne formen ble laget først og fremst for å kunne importere endrede opplysninger om kunde, leverandør, ansatt og/eller bruker – altså hvor det bare finnes én av hver. Når det importeres med oppslag mot kolonner hvor samme verdi kan finnes flere ganger, så er det bare første forekomst som blir endret. Altså om du har en kunde som har endret adresse, kan du bruke denne formen for å oppdatere adressen på Aktør-tabellen, men om du forsøker å gjøre det samme på Ordre-tabellen, så er det bare den første ordren til den valgte kunden som blir endret.

På pluss-siden kan denne formen brukes også på DME-felt (dog ikke slike med lengde over 1000 tegn).

 

Men skal du importere produkter, priser, leveringsalternativ og/eller strekkoder, finnes et bedre alternativ: Vare&pris-import.

 

 

Resten av min blogg kan du lese her: frode.antun.no/VBus/blogg 

 

frode@antun.no