Long Integer anstatt Double bei PROC EXPORT nach Access?

Hallo zusammen!

Ich habe folgendes Problem: beim Export eines Datasets in eine Access-Datenbank mittels PROC EXPORT werden die Zahlenfelder in Access als Double gespeichert. Ich hätte aber gerne Long Integer. Der Standardwert bei Zahlenfelder in Access ist auch auf "Long Integer" eingestellt, aber offensichtlich wird diese Einstellung nicht übernommen!? Ich verwende SAS 9.1.3 SP4 auf XP Pro, MS-Access 2003 und freue mich über jede Hilfe.

Gruß

Felix

Format verwenden

Wenn den Variablen vor dem Export ein Format zugewiesen wird, dann ermittelt PROC EXPORT daraus den Datentyp.

data integers;
   
input int long dec double char $;
   
format int 1. long 6. dec 12.;
datalines;
1 1 1 1 eins
2 2 2 2 zwei
3 3 3 3 drei
;

proc export table=integers dbms=access replace;
   database=
"c:\temp\db1.mdb";
run;
Die Zuordnung von Formaten zu Datentypen ist ansatzweise hier dokumentiert.

Hilfe!

Hallo nochmal!

Plötzlich habe ich wieder dieses Problem. Und zwar möchte ich eine XML-Datei importieren und in eine Access-Datenbank exportieren, wobei alle Zahlenspalten als Long Integer eingelesen/exportiert werden sollen. Mit 6. klappt es auch, aber nur, wenn auch die ersten Zellen der jeweiligen Spalte Zahlen enthalten. Spalten ohne Werte in den ersten Zellen werden zu Textspalten (evtl. vorhandene Zahlen im unteren Teil der Spalte natürlich auch). :-( Woran könnte es liegen? Danke schon mal!

Felix

Beim Import oder Export

Offensichtlich importieren Sie eine XML-Datei in eine SAS-Datei und exportieren diese wieder nach Microsoft Access. Tritt das Problem nun beim Import oder beim Export auf? Stimmt der Datentyp nach dem Import noch? Das kann man z.B. mit PROC CONTENTS auf die beim Import entstandene SAS-Datei herausfinden.

Danke für die Antwort. Die

Danke für die Antwort. Die Daten werden schon falsch eingelesen (s. erste Zeile):

TEILBW Alphanumerisch 4 $4. 6. TEILBW
SCHUFREI Numerisch 8 F8. F8. SCHUFREI

numerisch nach alphanumerisch

Dann ist es ja ein anderes Problem als beim letzten Mal. Wenn die Daten in der SAS-Datei schon alphanumerisch sind, werden Sie auch beim Export nach Access dort alphanumerisch angelegt. Also: entweder schauen, was beim Import schiefgeht (wie importieren Sie denn?) oder in SAS alphanumerisch nach numerisch umwandeln, zum Beispiel so:

data eins;
   var =
' '; output;
   var =
'1'; output;
   var =
'2'; output;
run;

data zwei (drop=charvar);
   
set eins (rename=(var=charvar));
   var = input(charvar,
1.);
run;

numerisch nach numerisch

Hallo!

Ja, mit INPUT lassen sich die alphanumerischen Spalten umwandeln. Das funktioniert aber nicht, wenn die Spalte schon numerische Werte enthält (numerisch nach numerisch). In diesem Fall werden in dieser Spalte gar keine Werte angezeigt:

AGS = alphanumerisch, soll auch so bleiben (funktioniert!).
TEILBW = numerisch ohne Werte im oberen Bereich, wird als alphanumerisch eingelesen, gewünscht ist aber eine numerische Ausgabe (funktioniert!)
SCHULRUH = numerisch mit Werten in allen Zellen, numerische Ausgabe funktioniert nicht!

libname gesuxml xml 'G:\p-Bbs\daten\GESU\DATABASE\XMLALT\DAT321.xml';
libname gesu 'G:\p-Bbs\daten\GESU\DATABASE\';
data dat321;
     
set gesuxml.dat321;
     
rename AGS = xAGS
            TEILBW = xTEILBW
            SCHULRUH = xSCHULRUH;
run;
data dat321(drop = xAGS xTEILBW xSCHULRUH);
length AGS $8;
     
set dat321;
     ags = put(xags,
z8.);
     TEILBW = input(xTEILBW,
6.);
     SCHULRUH = input(xSCHULRUH,
6.);
run;
proc export data= dat321
            
outtable= "DAT321"
            
dbms=access replace;
     database=
"G:\p-Bbs\daten\GESU\DATABASE\DAT321.mdb";
run;

XMLMAP?

Ich kenne jetzt nicht Ihre XML-Daten, aber eine XMLMAP könnte hier helfen. Dabei kann man unter anderem den Datentyp der Spalten angeben.

XMLMAP

Sorry für das späte Feedback. Mit Hilfe der XMLMAPs lassen sich die Daten im gewünschten Format einlesen, auch wenn die ersten Zellen keine Werte enthalten. Die Erstellung der XMLMAPs dauert einige Zeit, aber das macht man nur einmal, die Arbeit lohnt sich. Vielen Dank für den Tipp.

Vielen Dank, es funktioniert

Vielen Dank, es funktioniert einwandfrei! Ich verstehe aber nicht, aus welchem Grund man gerade das Format "6." für Long Integer oder "12." für Kommazahlen verwenden soll.

Grenzen zwischen INT und LONGINT

Ich habe das nicht eingehend untersucht und auch keine weitere Dokumentation gefunden. Ich verstehe es so: wenn sich aus dem Format ableiten lässt, dass es sich um Ganzzahlen handelt (keine Nachkommastellen), die größer als 2 hoch 15 (größter 2-Byte-INT) und kleiner oder gleich 2 hoch 31 (größter 4-Byte-INT) sind, dann wird ein LONGINT(4-Byte INT) genommen. Vermutlich dürfte 4. noch INT ergeben und 5. schon LONGINT. Welches Format man zuweist, ist letztlich egal (PROC EXPORT nimmt ja einen passenden Datentyp), man muss aber darauf achten, dass die Zahlen von dem betreffenden Datentyp auch tatsächlich dargestellt werden können. Folgendes Programm führt beispielsweise zu einem Fehler, weil PROC EXPORT LONGINT erzeugt, die Zahlen aber nicht in ein LONGINT passen.

data integers;
   
input long;
   
format long 6.;
datalines;
1000000000
2000000000
3000000000
;

proc export table=integers dbms=access replace;
   database=
"c:\temp\db1.mdb";
run;

SAS-Format lässt zu wenig Platz

Noch ein Hinweis: Das SAS-Format 6. im obigen Beispiel lässt für die Darstellung der 10-stelligen Zahlen zu wenig Platz. Für SAS ist das kein Problem, die Zahlen werden intern sowieso als Fließkommazahlen (double) gespeichert und dann nur bei der Darstellung ggfs. gerundet, in diesem Fall in Exponentialschreibweise (1.00E9). Das Problem entsteht erst beim Export nach MS ACCESS.

Das klingt

Das klingt plausibel...seltsamerweise konnte ich in den ganzen SAS Publishing Büchern, die mir vorliegen, keinen Hinweis auf diese Formate finden. Vielen Dank nochmal für die Hilfe.