{"id":744,"date":"2015-08-03T07:34:25","date_gmt":"2015-08-03T05:34:25","guid":{"rendered":"http:\/\/blog.systemconnect.dk\/?p=744"},"modified":"2015-05-13T16:08:16","modified_gmt":"2015-05-13T14:08:16","slug":"pas-paa-de-globale-variabler-ved-eksportimport","status":"publish","type":"post","link":"https:\/\/scblog.lynge.org\/?p=744","title":{"rendered":"Pas p\u00e5 de globale variabler ved eksport og import"},"content":{"rendered":"<p>En godt skjult\u00a0fejl vi ind imellem ser i Klassisk C5 (og XAL)\u00a0er forkert brug af:<\/p>\n<ul>\n<li>&amp;OutFldDel: Udg\u00e5ende\u00a0felt-separator (dvs. tegn mellem felter ved skrivning af eksportfiler)<\/li>\n<li>&amp;OutRecDel: Udg\u00e5ende\u00a0record terminator\u00a0(dvs. tegn i slutningen af linjen (recorden)\u00a0ved skrivning af eksportfiler)<\/li>\n<li>&amp;InFldDel: Indg\u00e5ende felt-separator\u00a0(dvs. tegn mellem felter ved\u00a0l\u00e6sning af eksportfiler)<\/li>\n<li>&amp;InRecDel: Indg\u00e5ende record terminator\u00a0(dvs. tegn i slutningen af linjen (recorden)\u00a0ved\u00a0l\u00e6sning af eksportfiler)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Med andre ord &#8211; hvis der skrives en fil med fx\u00a0WRITE &#8220;&lt;filnavn&gt;&#8221;\u00a0AS COMMA FROM&#8230; eller l\u00e6ses en fil med READ &#8220;&lt;filnavn&gt;&#8221; AS COMMA INTO&#8230; s\u00e5 benyttes disse variable til at definere hvilke tegn, der er hhv. mellem felterne og i slutningen af linjen.<\/p>\n<p>&nbsp;<\/p>\n<p>Jamen hvordan kan de felter bruges forkert?<\/p>\n<p>Jo &#8211; det mange overser er at felterne faktisk er globale variable og derfor IKKE returneres til deres defaultv\u00e6rdier n\u00e5r en k\u00f8rsel afsluttes. S\u00e5 har du en eksportk\u00f8rsel A.xal der s\u00e6tter &amp;OutFldDel = &#8216;;&#8217; og &amp;OutRecDel = &#8216;&lt;br&gt;&#8217;, ja s\u00e5 overlever disse v\u00e6rdier n\u00e5r k\u00f8rslen afsluttes. S\u00e5 har du samtidigt en eksportk\u00f8rsel B.xal der forventer at v\u00e6rdieren er standard (hhv. &#8216;,&#8217; og &#8216;\\r\\n&#8217;), s\u00e5 afh\u00e6nger dens resultat lige pludselig af om A.xal afvikles f\u00f8r (eller af om Klassisk C5 genstartes mellem A.xal og\u00a0 B.xal k\u00f8res).<\/p>\n<p>&nbsp;<\/p>\n<p>Problemet kan naturligvis l\u00f8ses ved\u00a0ALTID at s\u00e6tte begge felter korrekt inden hhv. skrivning og l\u00e6sning af filer &#8211; men du kan jo kun v\u00e6re herre over din egen kode &#8211; og er der fx indl\u00e6st moduler fra 3. part, ja s\u00e5 kan du komme ud for at din kode alligevel &#8220;\u00f8del\u00e6gger&#8221; noget hvis 3. part antager at felterne har nogle defaultv\u00e6rdier.<\/p>\n<p>&nbsp;<\/p>\n<p>En bedre l\u00f8sning er derfor f\u00f8lgende logik:<\/p>\n<ol>\n<li>Definer lokale variabler til at gemme v\u00e6rdierne og s\u00e6t disse lig variablernes v\u00e6rdi ved k\u00f8rselsstart<\/li>\n<li>S\u00e6t de globale variable som du \u00f8nsker det\u00a0og k\u00f8r din eksport-\/import-kode<\/li>\n<li>S\u00e6t de globale variable tilbage til de gemte v\u00e6rdier i de lokale variable i slutningen af k\u00f8rslen<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Hvis du indf\u00f8rer ovenst\u00e5ende som &#8220;best practice&#8221; i det du laver, s\u00e5 er du sikker p\u00e5 at dine k\u00f8rsler ikke \u00f8del\u00e6gger andres antagelser om hvad felt- og record-separatorerne er &#8211; og du sikrer at selv andres d\u00e5rlige eksport-kode afvikles korrekt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En godt skjult\u00a0fejl vi ind imellem ser i Klassisk C5 (og XAL)\u00a0er forkert brug af: &amp;OutFldDel: Udg\u00e5ende\u00a0felt-separator (dvs. tegn mellem felter ved skrivning af eksportfiler) &amp;OutRecDel: Udg\u00e5ende\u00a0record terminator\u00a0(dvs. tegn i slutningen af linjen (recorden)\u00a0ved skrivning af eksportfiler) &amp;InFldDel: Indg\u00e5ende felt-separator\u00a0(dvs. &hellip; <a href=\"https:\/\/scblog.lynge.org\/?p=744\">L\u00e6s resten <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,6,4],"tags":[15,43,13,11,54,29,23,53,14,24],"class_list":["post-744","post","type-post","status-publish","format-standard","hentry","category-klassisk-c5","category-klassisk-c5-support","category-klassisk-c5-teknik","tag-business-solutions","tag-c5","tag-damgaard-data","tag-dynamics","tag-dynamics-c5","tag-fejl","tag-hint","tag-klassisk-c5","tag-microsoft","tag-xal"],"_links":{"self":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=744"}],"version-history":[{"count":6,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/744\/revisions"}],"predecessor-version":[{"id":752,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/744\/revisions\/752"}],"wp:attachment":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}