Daten importieren

Wie man seine Daten nach AvERP einlesen kann.

Moderator: SYNERPY

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Daten importieren

Beitrag von jamesplate » Fr Dez 08, 2006 12:06 pm

Hallo,

hoffentlich kann mir jemand helfen!

Ich möchte Daten, die bereits im CSV Format sind, mit dem EMP-Tool importieren.

Wenn das mache und abschließend auf Import klicke, kommt folgende Fehlermeldung:

Code: Alles auswählen

Import gestartet
11:58:03:466 - Import von C:\Programme\EMS\SQL Studio for MySQL\Data Export\AFS_WAWI_DB\Adressen.csv
in /opt/firebird/AvERP/AvERP.fdb.BADR wurde gestartet
Fehler - 08.12.2006 11:58 - Line 3: InsertQuery:
Can't format message 13:375 -- message file C:\Programme\EMS\SQL Studio for InterBase & Firebird\firebird.msg not found.
Validation error for column BSPRA_ID_DRUSPRA, value "*** null ***".

0 Datensätze importiert von C:\Programme\EMS\SQL Studio for MySQL\Data Export\AFS_WAWI_DB\Adressen.csv
0 Zeilen verarbeitet
20 fehler aufgetreten
11:58:03:950 - Importprozess mit Fehlern beendet

miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe » Fr Dez 08, 2006 12:33 pm

Du hast beim Import vergessen dem Feld BSPRA_ID_DRUSPRA einen Wert zuzuweisen.

Da das darauf hindeutet, daß Deine Importtabelle da keinen sinnvoll verwendbaren Wert enthält (war bei uns auch so), bietet sich die Möglichkeit, daß Du im EMS-Import auf der Seite wo Du für die Felder feste Werte eingeben kannst, die ID des entsprechenden Datensatzes der Tabelle BSPRA eingibst. Für Deutsch war das glaube ich die 1 und für Englisch die 2

Du solltest dann auch noch prüfen, ob Du für alle anderen Felder der Tabelle BADR die auf "NotNull" gesetzt sind, Werte beim Import vorgesehen hast. Entweder per Datenimport aus Deiner Tabelle oder per im EMS-Tool vergebenem festem Wert

BTW: welches SQL-Tool benutzt Du denn. IBexpert oder dem EMS-Manager?

Hoffe, das hilft Dir weiter.

Gruß
Michael

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Fr Dez 08, 2006 2:30 pm

Hallo miboe!!

Vielen Dank, dass wahr es!!

Jetzt funktioniert es einwandfrei, hatte zwar noch paar Probleme mit der PLZ zuordnung, aber das habe ich dann über das Notizfeld und einen UPDATE Befehl, der die Werte (zwischen Notizfeld und der PLZ-Adresstabelle) vergleicht!

Ich verwende EMP und Ibexpert, aber zum importieren EMP!
Wie kann ich denn mit Ibexpert importieren?

Wir sind nämlich momentan in der Testphase von AvERP zum Aufbau einer Warenwirtschaft, deswegen benutze ich die Testversion von EMP, dass Importtoll kostet aber 30,- €, wär cool wenn es auch mit Ibexpert geht.

Gruß Philipp und nochmal vielen Dank

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Fr Dez 08, 2006 2:31 pm

Sorry, es heißt natürlich EMS-Manager und nicht EMP!!!
Ja, ja die arbeit, man ist schon ganz wirr... :wink:

miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe » Fr Dez 08, 2006 3:59 pm

Hallo Philipp,

ich habe mich für einen auf den ersten Blick "harten" aber im Detail sehr leistungsfähigen Weg entschieden.

Ich bereite die Daten extern in der Tabellenkalk vor, so wie Du es mit Sicherheit auch gemacht hast. Dann kopiere ich mir die Daten in eine zuvor in Access mit passender Spaltenbreite definierte Tabelle und speichere sie von dort aus als einfache TXT-Datei mit fester Breite ab. Dieser Umweg ist notwendig, weil Du die genaue Spaltenbreite wissen mußt, Excel beim Speichern nach Text aber eben nicht die eingestellte Spaltenbreite verwendet, sondern irgendeine die gerade paßt :( . Access macht das im Gegensatz dazu richtig.

Die so gewonnene Textdatei kannst Du dann im IBexpert mit einem Code in der Art wie der hier:

Code: Alles auswählen

CREATE TABLE EXT_BADR EXTERNAL 'D:\AVERP\ADRESSIMPORT.PRN' (
    NR       CHAR(8),
    NAME     CHAR(40),
    BEZEICH  CHAR(10),
    STRASSE  CHAR(40),
    LAND     CHAR(5),
    PLZ      CHAR(6),
    ORT      CHAR(40),
    TELVOR   CHAR(10),
    TEL      CHAR(15),
    FAXVOR   CHAR(10),
    FAX      CHAR(15),
    PARTNER  CHAR(40),
    KDNR     CHAR(15),
    NRALT    CHAR(8),
    TRENNER  CHAR(1),
    EOL      CHAR(2)
);
an die Datebank "andocken". Im Beispiel ist unsere exportierte Adresstabelle aus der alten Software gezeigt. Ich denke, genau jetzt siehst Du auch, warum die exakte Spaltenbreite wichtig war.

Von da weg, kannst Du dann diese Tabelle mit allen üblichen SQL-Anweisungen bearbeiten. Du kannst Dir z.B. eine Stored_Procedure schreiben, die sich in einer Schleife durch alle Datensätze dieser externen Tabelle durcharbeitet und damit "irgendwas" macht. Für den Import unserer Adresstabelle sah das ungefähr so aus:

Code: Alles auswählen

SET TERM ^ ;

CREATE PROCEDURE P_BADR_IMPORT 
AS
DECLARE VARIABLE NNR VARCHAR(8);
DECLARE VARIABLE NNAME VARCHAR(40);
DECLARE VARIABLE NBEZEICH VARCHAR(10);
DECLARE VARIABLE NSTRASSE VARCHAR(40);
DECLARE VARIABLE NLAND VARCHAR(2);
DECLARE VARIABLE NPLZ VARCHAR(6);
DECLARE VARIABLE NORT VARCHAR(40);
DECLARE VARIABLE NTELVOR VARCHAR(10);
DECLARE VARIABLE NTEL VARCHAR(15);
DECLARE VARIABLE NFAXVOR VARCHAR(10);
DECLARE VARIABLE NFAX VARCHAR(15);
DECLARE VARIABLE NPARTNER VARCHAR(40);
DECLARE VARIABLE NKDNR VARCHAR(15);
DECLARE VARIABLE NRALT VARCHAR(8);
DECLARE VARIABLE NPLZSUCH VARCHAR(15);
DECLARE VARIABLE NPLZKEY INTEGER;
DECLARE VARIABLE NBSPRAKEY INTEGER;
DECLARE VARIABLE NBLAND_ID INTEGER;
BEGIN
    FOR SELECT
        F_rtrim(va.nr),
        F_rtrim(va.name),
        F_rtrim(va.bezeich),
        F_rtrim(va.strasse),
        F_rtrim(va.land),
        F_rtrim(va.plz),
        F_rtrim(va.ort),
        F_rtrim(va.telvor),
        F_rtrim(va.tel),
        F_rtrim(va.faxvor),
        F_rtrim(va.fax),
        F_rtrim(va.partner),
        F_rtrim(va.nralt)
    FROM EXT_BADR va ORDER BY NR
    INTO :nnr, :nname, :nbezeich, :nstrasse, :nland, :nplz, :nort, :ntelvor, :ntel, :nfaxvor, :nfax, :npartner, :nralt
    DO
    BEGIN
        nplzkey = 0;
        nbland_id = 0;
        nplzsuch = nland || ' ' || nplz;
        SELECT MIN(ID) FROM BPLZ WHERE (MASKENKEY = :nplzsuch) INTO :nplzkey;
        SELECT BSPRA_ID_SPRACHKENN FROM BLAND WHERE (MASKENKEY = :nland) INTO :nbsprakey;
        SELECT ID FROM BLAND WHERE (MASKENKEY = :nland) INTO :nbland_id;
        IF (((nplzkey=0) OR (nplzkey IS NULL)) AND (:nplz <> '') AND (:nplz IS NOT NULL)) THEN
        BEGIN
            INSERT into bplz (ORT, PLZ, VORWAHL, BLAND_ID_LANDKENNZ) VALUES (:nort, :nplz, :ntelvor, :nbland_id);
            SELECT MIN(ID) FROM BPLZ WHERE (MASKENKEY = :nplzsuch) INTO :nplzkey;
        END
        INSERT INTO BADR (
            BEZ,
            ILN,
            BSPRA_ID_DRUSPRA,
            FAXANSCH,
            FAXVOR,
            BPLZ_ID_LANDPLZ,
            NAME,
            NOTIZ,
            STRASSE,
            TELANSCH,
            TELVOR,
            TELANSCH4)
        VALUES (:nbezeich, :nnr, :nbsprakey, :nfax, :nfaxvor, :nplzkey, :nname, :npartner, :nstrasse, :ntel, :ntelvor, :nralt);
    END
END
^
Wie Du anhand der ersten IF Abfrage siehst, kannst Du auf die Art z.B. auch fehlende Postleitzahlen in der bestehenden BPLZ ergänzen. Das erspart dann einiges an Handarbeit, an diesen reinen "Vordefinitions"-Tabellen

Als "einfacheren" Weg, der eher auf die Richtung EMS-Import hinausläuft, bietet sich noch der Befehl INSERTEX an, der aber im Vergleich zum EMS-Tool eher bescheiden in seinem Funktionsumfang ist. Solche Dinge wie "festen Wert setzen" oder so hat der nicht, das muß man mit INSERTEX alles schon vorher im Excel/OpenCalc ... machen. Bei den Adressen geht das noch, aber bei einer Tabelle wie dem Artikelstamm (BSA) mit über 100 Spalten wird es dann böse und im Excel auch elend unübersichtlich.

Gerade beim Import solch komplexer Tabellen kannst Du mit dem zuerst beschriebenen Weg SEHR (!) viel mehr erreichen. Z.B. den Artikel beim Import auf die Lager verteilen, die Lieferanten zuordnen, Stücklistenkopf anlegen, Arbeitsstammplan (evtl. sogar mit Arbeitsgängen anlegen ...)

Gruß
Michael

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Fr Dez 08, 2006 4:09 pm

Hallo miboe,

werde ich dann mal versuchen! Weiß nicht, ob ich heut noch dazu komme, kann sein, dass es erst am Montag klappt.

Vielen Dank aber, scheint mir sehr plausibel und auf den ersten Blick wirklich "hart".

Noch schnell ´ne andere Frage:

Hab jetzt nochmal zwanzig Daten importieren wollen und obwohl ich alles genauso gemacht habe wie vorher, beschwert er sich jetzt folgendermaßen:

Code: Alles auswählen

Error - 08.12.2006 15:58 - Line 8: InsertQuery:
Violation of FOREIGN KEY constraint "".
Violation of FOREIGN KEY constraint "REF_BADR_BSPRA_DRUSPRA" on table "BADR".
Wär nett, wenn du das noch schnell beantworten könntest.
Ok miboe ansonsten schönes WE, vielen Dank für die Antworten, man ist ohne Hilfe manchmal wirklich "aufgeschmissen".

Gruß Philipp

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Fr Dez 08, 2006 4:26 pm

Ok, heut steh ich echt neben mir!!

Hab die andere Datenbank genommen und da ist die ID für Deutsch = 5 und die für Englisch = 2, sodass ich mit meiner Eingabe, der 1, natürlich nicht viel weitergekommen bin.

Sorry.....
Werd jetzt dann Feierabend machen, is glaub besser so.... :?

Gruß Philipp

miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe » Fr Dez 08, 2006 4:39 pm

Jepp, ebenso ... irgendwann sind es halt doch nur noch Zahlen und Linien ... und das am Freitag nachmittag 8)

Dir auch ein angenehmes WE
Michael

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Mo Dez 11, 2006 10:00 am

Hallo Michael,

also jetzt hab ich schon das nächste Problem, die Relationen gehen irgendwie doch nicht!! Wie gesagt, Freitag war nicht mein Tag!!

Wie bekomme ich in einer Firebird Datenbank so was hin?

Wenn ich in BADR was importiere, so ist leider eine Verbindung zwischen der BPLZ_ID_LANDPLZ in Tabelle BADR und BPLZ_ID in Tabelle BPLZ, d.h wie kann ich der Tabelle sagen, wenn die PLZ in BADR mit der in BPLZ übereinstimmt, dann nehme genau diese ID von BPLZ und setze sie ins Feld BPLZ_ID_LANDPLZ der Tabelle BADR?
In MySQL und MS SQL ist das kein Problem, da kann man sowas mit dem UPDATE Befehl machen und schon hat man die Verbindung, aber das geht hier nicht, da auf manche Felder nicht mit dem UPDATE Befehl zugegriffen werden kann.

Noch was: Was ist eigentlich ein Trigger genau und was ist der Unterschied zwischen einer Tabelle und einem View?
Mühselig ist so eine Firebird Datenbank, bis jetzt war ich absoluter MySQL, MS SQL Spetzialist, aber Firebird/Interbase läuft da wirklich anders!
Was eigentlich ist genau der Vorteil von Firebird?

Hoffe du kannst mir noch mal weiterhelfen! Werd wohl noch mal ein neues Thema eröffen.

Gruß Philipp

admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin » Mo Dez 11, 2006 10:28 am

(Ich bin zwar nicht Michael, aber antworte dennoch :p)

1. Bezüglich der PLZ:
Hier kann man die PLZ aus der temporären Tabelle mittels Updates zuordnen. Hat man keine Temp-Tabelle, dann eben irgendwo im Adressstamm zwischenspeichern (notfalls ein Feld einfügen und später wieder löschen).

Dann eine Prozedur drücber laufen lassen:

Code: Alles auswählen

FOR SELECT ID, BADR_TEMP_FELD
FROM BADR
WHERE BPLZ_ID_LANDPLZ IS NULL
INTO :BADR_ID, :TEMP_FELD
DO 
BEGIN
  BPLZ1_ID = NULL;

  SELECT A.ID
  FROM BPLZ A
  WHERE A.ID > 0 AND
        A.MASKENKEY = :TEMP_FELD AND
        A.BLAND_ID_LANDKENNZ = :BLAND1_ID
  INTO :BPLZ1_ID;
  
  IF (BPLZ1_ID IS NULL) THEN
  BEGIN
    BPLZ1_ID = GEN_ID(GEN_BPLZ,1);
    INSERT INTO BPLZ (
      ID,
      MASKENKEY,
      BLAND_ID_LANDKENNZ,
      ORT,
      PLZ,
      VORWAHL,
      GEBIET)
    VALUES (
      :BPLZ1_ID,
      'D ' || :TEMP_FELD,
      :BLAND1_ID,
      'Test-Inland' || 1,
      :TEMP_FELD,
      '0921',
      NULL);
  END 

  UPDATE BADR
  SET BPLZ_ID_LANDPLZ = :BPLZ1_ID
  WHERE ID = :BADR_ID;
END
2. Ein Trigger beinhaltet eine Aktion (oder mehrere) die ausgeführt wird, wenn eine Aktion (ein INSERT, UPDATE oder DELETE) bei der Tabelle auftritt. Beispiel: Ein Artikel wird angelegt, und das System ordnet automatisch das Standardeingangslager zu. Anderes Beispiel: Eine Auftragsposition wird angelegt oder verändert. Die Summe der Gesamtpreise wird automatisch in der Auftragskopf übernommen.

3. In einer Tabelle werden Daten gespeichert. Eine VIEW ist eine Anzeige von einer oder mehreren Tabellen. Gearbeitet werden kann mit einer View wie mit einer Tabelle, also auch INSERTs, UPDATEs und DELETEs. Die Aktionen müssen aber an die entsprechenden Tabellen weitergereicht werden (über Trigger), da eine VIEW keine Daten speichert sondern nur anzeigt (daher auch der Name -> View = Anzeige).

admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin » Mo Dez 11, 2006 10:30 am

Die Vorteile von Firebird? Abgesehen von serverseitiger Programmierung, genialer Stabilität und Geschwindigkeit? :p

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Mo Dez 11, 2006 10:52 am

Hallo Admin!

Erstmal vielen Dank für die schnelle Antwort! Werde das jetzt mal sofort ausprobieren!!

Ok der Unterschied ist mir schon klar, aber was ist der Vorteil von einem View gegenüber einer Tabelle bzw. warum gibt es diesen View?

Hoffe ich werde nicht lästig mit meiner Fragerei, aber muss es halt lernen um am Ende eine saubere und einwandfrei Warenwirtschaft zu haben.

Wo gibt es zu diesen Grundlagen weiterführende Informationen? (kostenlos, wenn möglich, bin ja eigentlich Student im Praxissemster und muss halt für die Firma eine komplette Warenwirtschaft erstellen, sind grad am Testen von allenmöglichen WaWi/ESP programme und es scheint als sei AvERP wirklich das beste unter den 6 getesteten! Nur habe ich eigentlich keine Interbase/Firebird Erfahrung, aber umso mehr in MySQL, wo ich noch nie Trigger benutzen musste) Nur so zur Info :)

Gruß Philipp

admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin » Mo Dez 11, 2006 11:10 am

Natürlich sind wir die Besten. Da hättet ihr nicht lange testen müssen. So eine Frage lässt sich schnell beantworten. :)

Der Vorteil einer View ist, dass man verschiedene Tabellen miteinander verbinden kann. Sonst müsste man dafür immer SELECTs schreiben und eine ordentliche Verwaltung und Trigger-Steuerung wäre auch nur mit sehr viel Aufwand verbunden.

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Mo Dez 11, 2006 11:58 am

Hallo Admin,

irgendwie funktioniert das nicht!

Habe es im SQL Editor und in der Skript Exekutive in IBexpert ausprobiert.
Es kommt folgende Fehlermeldung:

Code: Alles auswählen

 invalid token: Dynamic sql error = -104. Token unknown - line 1 char, For. 

Folgendes hab ich eingegeben:

Code: Alles auswählen

For SELECT ID, BADR_Notiz
FROM BADR 
WHERE BPLZ_ID_LANDPLZ IS NULL 
INTO :BADR_ID, :Notiz
DO 
BEGIN 
  BPLZ1_ID = NULL; 

  SELECT A.ID 
  FROM BPLZ A 
  WHERE A.ID > 0 AND 
        A.MASKENKEY = :A.Notiz AND
        A.BLAND_ID_LANDKENNZ = :BLAND1_ID 
  INTO :BPLZ1_ID; 
  
  IF (BPLZ1_ID IS NULL) THEN 
  BEGIN 
    BPLZ1_ID = GEN_ID(GEN_BPLZ,1); 
    INSERT INTO BPLZ ( 
      ID, 
      MASKENKEY, 
      BLAND_ID_LANDKENNZ, 
      ORT, 
      PLZ, 
      VORWAHL, 
      GEBIET) 
    VALUES ( 
      :BPLZ1_ID, 
      'D ' || :Notiz,
      :BLAND1_ID, 
      'Test-Inland' || 1, 
      :Notiz,
      '0921', 
      NULL); 
  END 

  UPDATE BADR 
  SET BPLZ_ID_LANDPLZ = :BPLZ1_ID 
  WHERE ID = :BADR_ID; 
END 
Habe als temporäres Feld, dass schon vorhandene Notiz Feld genommen!
Ist doch hoffentlich möglich, wenn man nach diesem Vorgang die Werte wieder löscht, oder?

Gruß Philipp

jamesplate
Beiträge: 17
Registriert: Di Dez 05, 2006 3:00 pm

Beitrag von jamesplate » Mo Dez 11, 2006 4:47 pm

Also,

ich hab jetzt "New Procedure" angeklickt und wie oben beschrieben rein kopiert.

Folgende Fehlermeldung kommt:

Code: Alles auswählen

Error  Unknown Variables BLAND1_ID
Error  Unknown Variables BPLZ1_ID
Error.....
Das mit dem SQL Skript war schwachsinn. Sorry wusste ich am Anfang nicht, dachte ich muss es da rein schreiben.

Gruß Philipp

Antworten