Benutzer mit den meisten Antworten
SSIS Flatfile-Import - Nachkommastellen werden nicht erkannt

Frage
-
Moin.
Ich habe ein englischen SQL-Server 2008 Standart auf einem englischen Betriebssystem Windows Server 2008 Standart. Ich importiere Daten aus einer csv-Datei. In dieser Datei sind die Zahlen mit Nachkommastellen im deutschen Format. beim Erstellen des Packets habe ich die deutsche Codepage für die Quelle ausgewählt, trotzdem wird aus 19,99 in der csv-Datei, 1999,00 in der Tabelle.
Ich habe das SSIS-Packet auf der Platte abgelegt und nachträglich mit dem Designer geöffnet. Habe dort aber nichts gefunden. Auch habe ich versucht die Datei mit einem Texteditor zu bearbeiten, aber auch kein Erfolg gehabt.
Gibt es eine Möglichkeit dem SSIS-Packet klarzumachen, dass Quelle und Ziel unterschiedliche Zahlen/Währungsformate haben?
Danke im Voraus.
Antworten
-
Hallo Richard,
Codepage 1252 Windows (http://en.wikipedia.org/wiki/Windows-1252) ist für den westeuropäischen völlig ok, sofern die Daten auch so geliefert werden. Daten von alten Großrechnern oder anderen alten Systemen werden teils noch mit CP 850 geliefert; z.B. von Banken.
An den Fehlermeldungen siehst Du es schon, SSIS nimmt alles penibel genau. Wenn Du irgendwo im Datenfluß etwas änderst, muss Du durchgängig alles entsprechend anpassen, sonst gibt es eben Warnungen/Fehler....Aber wo kann ich Quellcode in das Packet einfügen?
In Bids die Solution mit dem Paket öffnen, den betroffene Datenflusstask auswählen und in Datenfluß wechseln.
Zwischen Datenquelle und Datenziel einen Task "Abgeleitete Spalte" einfügen und auf "Bearbeiten" gehen.
Unten kannst Du einen neue abgeleitete Spalte mit Namen anlegen und den Formel gibst Du in der Spalte "Ausdruck" ein.
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort markiert Richard Martens Donnerstag, 20. Mai 2010 13:58
-
Hi Richard,
ich meinte nicht die Codepage bei der Connection sondern die LocaleID - sorry.
Eigentlich steuert die Locale bei der Connection die Umwandlung von Dezimalzahlen.Wenn dort German steht sollte es eigentlich klappen.
Gruß
Helge- Als Antwort markiert Richard Martens Donnerstag, 20. Mai 2010 14:03
Alle Antworten
-
Hi Richard,
kannst Du mal die Einstellungen Deiner Datenquelle im Advanced Editor überprüfen?
Was steht da in den Properies für eine Locale?
Und was für ein Datentyp wird für Deine numerischen Spalten angegeben?Was steht im Connection Manager für Deine Flat File Connection als CodePage drin?
-
Hallo Richard,
eine andere Möglichkeit wäre, das Format selbst zu wandeln, also es als Text einzulesen, den Punkt durch ein Komma ersetzten und dann in Numeric zu wandeln. Füg dazu im Datenfluß nach der Datenquelle eine "Abgeleitete Spalte" ein. Als "Ausdruck" kannst Du etwas in folgender Art verwenden:
TRIM(Prozentwert_txt) == "" ? NULL(DT_NUMERIC,5,2) : (DT_NUMERIC,5,2)TRIM(REPLACE("0" + Prozentwert_txt,".",","))
Eingabespalte ist hier "Prozentwert_txt", der dann nach numeric(5, 2) gewandelt wird. Der vordere Teil dient nur dazu, das leere Werte als NULL weiter verarbeitet werden.
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort vorgeschlagen Christoph Muthmann Donnerstag, 20. Mai 2010 07:14
-
Moin.
Ich habe im Advance Editor die Eigenschaften der Tasks angesehen. Dort steht "German(Germany)" bei LocaleId. Die Spalten haben die Typen "money" und "numeric(18,2)". Bei Input und Output Properties steht bei Codepage "0", die Felder sind aber deaktiviert.
Ich habe allerdings bei der Connection "SourceConnectionFlatFile" die Codepage "1252" gesehen. Ich setzte es auf "0". Dann hatte ich Fehler:
TITLE: Editing Component
------------------------------The component is not in a valid state. The validation errors are:
Error at Data Flow Task 1 [Source - fakturen_csv [1]]: The code page on output column "Faktura_VBELN" (10) is 1252 and is required to be 0.Error at Data Flow Task 1 [Source - fakturen_csv [1]]: The code page on output column "Fakturaart_FKART" (14) is 1252 and is required to be 0.
Error at Data Flow Task 1 [Source - fakturen_csv [1]]: The code page on output column "Auftraggeber_KUNAG" (18) is 1252 and is required to be 0.
Error at Data Flow Task 1 [Source - fakturen_csv [1]]: The code page on output column "Verkaufsorganisation_VKORG" (22) is 1252 and is required to be 0.
Error at Data Flow Task 1 [Source - fakturen_csv [1]]: The code page on output column "Vertriebsweg_VTWEG" (26) is 1252 and is required to be 0.
Error at Data Flow Task 1 [Source - fakturen_csv [1]]: The code page on output column "Sparte_SPART" (30) is 1252 and is required to be 0.
Error at Data Flow Task 1 [Source - fakturen_csv [1]]: The code page on output column "Buchungskreis_BUKRS" (38) is 1252 and is required to be 0.
Warning at {ECFB4999-CD31-4160-B241-E9B445D574DB} [Source - fakturen_csv [1]]: The external columns for component "Source - fakturen_csv" (1) are out of synchronization with the data source columns. The external column "Faktura_VBELN" needs to be updated.
The external column "Fakturaart_FKART" needs to be updated.
The external column "Auftraggeber_KUNAG" needs to be updated.
The external column "Verkaufsorganisation_VKORG" needs to be updated.
The external column "Vertriebsweg_VTWEG" needs to be updated.
The external column "Sparte_SPART" needs to be updated.
The external column "Buchungskreis_BUKRS" needs to be updated.
Do you want the component to fix these errors automatically?------------------------------
BUTTONS:&Yes
&No
Cancel
------------------------------Das betätigen des Button "Ja". Wurde mit anderer Fehlermeldung quittiert.
-
Hallo Richard,
Codepage 1252 Windows (http://en.wikipedia.org/wiki/Windows-1252) ist für den westeuropäischen völlig ok, sofern die Daten auch so geliefert werden. Daten von alten Großrechnern oder anderen alten Systemen werden teils noch mit CP 850 geliefert; z.B. von Banken.
An den Fehlermeldungen siehst Du es schon, SSIS nimmt alles penibel genau. Wenn Du irgendwo im Datenfluß etwas änderst, muss Du durchgängig alles entsprechend anpassen, sonst gibt es eben Warnungen/Fehler....Aber wo kann ich Quellcode in das Packet einfügen?
In Bids die Solution mit dem Paket öffnen, den betroffene Datenflusstask auswählen und in Datenfluß wechseln.
Zwischen Datenquelle und Datenziel einen Task "Abgeleitete Spalte" einfügen und auf "Bearbeiten" gehen.
Unten kannst Du einen neue abgeleitete Spalte mit Namen anlegen und den Formel gibst Du in der Spalte "Ausdruck" ein.
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort markiert Richard Martens Donnerstag, 20. Mai 2010 13:58
-
Hi Richard,
ich meinte nicht die Codepage bei der Connection sondern die LocaleID - sorry.
Eigentlich steuert die Locale bei der Connection die Umwandlung von Dezimalzahlen.Wenn dort German steht sollte es eigentlich klappen.
Gruß
Helge- Als Antwort markiert Richard Martens Donnerstag, 20. Mai 2010 14:03
-
GELÖST
Moin Olaf.
Danke Ich hab es.
Du hast mich auf die richtige Richtung gebracht. Allerdings bin ich mir nicht sicher ob ich es so gelöst habe, wie du vorgeschlagen hast. Ausserdem habe ich entdeckt wo das eigentliche Problemm ist. Ich bin davon ausgegangen das in meiner Datei die Zahlen im deutschem Format sind, das war falsch. Ich habe Spalten mit deutschem Text und Zahlen im englischen Format. Wenn das anders wäre hätte wahrscheinlich die Umstellung der LocaleId auf Englisch, wie HCR69 es vorgeschlagen hat, gegangen.
Hier mein Lösungsweg:
Ich habe das Paket auf der Festplatte abgelegt. Im Windows-Explorer habe ich die Datei über das Kontext-Menü zum Editieren geöffnet. Visual Studion wurde gestarted und zeigte den Inhalt des Pakets als Task-Diagramm(ähnlich wie Maintaince Plan im Management Studio). Ich wechselte auf den Tab "Data Flow". Dort waren drei Tasks eins für Quelle eins für Konvertierung und eins für das Ziel. Ich zog ein neuen Task vom Typ "Script Component" in das Diagramm und setzte es zwischen Quelle und Konvertierung ein. Über Kontext-Menü habe ich diesen Task zum Editieren geöffnet. Dort wählte ich die Import-Spalte, die mich interresiert hat und fügte eine neue Ausgabe-Splate hinzu. Auf der erste Splate gab es unten ein unauffälligen Butten "Edit Script". Nach der Betätigung des Buttons öffnete sich eine neue Instanz von Visual Sutdio, wo ich mein Quellcode für die Konvertierung reinhacken konnte.
using System; using System.Data; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper; [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { public override void Input0_ProcessInputRow(Input0Buffer Row) { if(string.IsNullOrEmpty(Row.NETWR)) { Row.NETWR1 = decimal.Zero; } else { Row.NETWR1 = decimal.Parse(Row.NETWR, System.Globalization.CultureInfo.GetCultureInfo("en-US")); } } }
Noch mal vielen Dank! -
Moin.
Sorry, ich denke du hast Recht es ist aber etwas komplizierter. Die Zahlen sind nicht im deutschen sondern im englischen Format. Ich habe aber auch Text-Spalten mit deutschen Texten. Deswegen kann ich an der Stelle nicht die richtige Einstellung vornehmen. Ich konnte allerdings eigene Konvertierungsroutine einfügen s.u.
Trotzdem Danke, Es wäre sicher auch ein Lösungsweg.
Gruß Richard
-
Hallo Richard,
was da gestartet war, ist das BIDS = Business Intelligence Developer Studio = Visual Studio mit speziellen Projekttypen für SSIS, SSRS und SSAS.
Deine Lösung mit dem C# Scripttask stellt auch eine abgeleitete Spalte da, also im Prinzip die gleiche Lösung.
Kleiner Tipp: Task können erfolgreich/mit Fehler ausgeführt werden, davon abhängig kann es im Ablauf/Datenfluß weitergehen, das sind diese "Reihenfolgeeinschränkungen" (Verbindunsgpfeile); grün = erfolgreich, rot = fehlerhaft, blau = egal. Dieses Ergebnis kannst Du aus demn Scripttask auch zurückliefern, um zum Beispiel fehlerhafte Daten in eine Datei zur Überarbeitung umzuleiten. Das geht ganz einfach über Dts.TaskResult, siehe auch MSDN: Codieren und Debuggen des Skripttasks
Dts.TaskResult = Dts.Results.Success
Dts.TaskResult = Dts.Results.Failure
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de