Neu Kunde per Software hinzufügen - MS SQL Stored Procedure Kunde.spKundeInsert aufrufen .NET

Horus Sirius

Gut bekanntes Mitglied
9. März 2017
146
10
Oldenburg
Hallo,

ich möchte per Software einen Kunden hinzufügen.
Wie gehe ich vor?

Mein Problem diese stored procedure hat keine Parameter...

C#:
Dim cmd As SqlCommand = new SqlCommand("spKundeInsert", cn)
   cmd.CommandType = CommandType.StoredProcedure
   cmd.Parameters.AddWithValue("@cMail", "meineEmail@MeineEMail.de")


SQL:
;
DECLARE @retry INT;
DECLARE @CreatedTransaction INT;
DECLARE @ReturnValue INT;
SET @retry = 5;
WHILE @retry > 0
BEGIN
    -- Context Info
    IF(CONTEXT_INFO() IS NOT NULL)
    BEGIN
        SET @OldContextInfo = CONTEXT_INFO();
    END
    ELSE
    BEGIN
        SET @OldContextInfo = 0x0;
    END
    DECLARE @hash VARBINARY(128);
    SELECT @hash = HASHBYTES('SHA1', 'Kunde.spKundeInsert');
    SET CONTEXT_INFO @hash; -- ContextInfo festlegen
    BEGIN TRY
        IF (@@TRANCOUNT = 0)
        BEGIN
           SET @CreatedTransaction = 1;
           BEGIN TRANSACTION
        END;
        ELSE
        BEGIN
            SET @CreatedTransaction = 0;
            SAVE TRANSACTION Savepoint0;
        END;
            IF(OBJECT_ID('tempdb..#Daten_spkundeInsert') IS NOT NULL)
        BEGIN
            DROP TABLE #Daten_spkundeInsert;
        END
        CREATE TABLE #Daten_spkundeInsert(InternalId INT, kInetKunde INT, kKundenKategorie INT, cKundenNr VARCHAR(30),
            cFirma VARCHAR(128), cAnrede VARCHAR(30), cTitel VARCHAR(64), cVorname VARCHAR(126), cName VARCHAR(126),
            cStrasse VARCHAR(255), cPLZ VARCHAR(24), cOrt VARCHAR(64), cLand VARCHAR(64), cTel VARCHAR(30), cFax VARCHAR(30),
            cEMail VARCHAR(255), dErstellt DATETIME, cMobil VARCHAR(30),
            fRabatt DECIMAL(28, 14), cUSTID VARCHAR(20), cNewsletter CHAR(1), cZusatz VARCHAR(60),
            cEbayName VARCHAR(60), kBuyer INT, cAdressZusatz VARCHAR(255), cGeburtstag VARCHAR(10),
            cWWW VARCHAR(255), cSperre CHAR(1), cPostID VARCHAR(255), kKundenGruppe INT, nDrittland TINYINT, nZahlungsziel INT,
            kSprache INT, cISO VARCHAR(5), cBundesland VARCHAR(255), cHerkunft VARCHAR(255), cKassenKunde CHAR(1),
            cHRNr VARCHAR(255), kZahlungsart INT, nDebitorennr INT, cSteuerNr VARCHAR(255), nKreditlimit INT, kKundenDrucktext INT,
            nMahnstopp TINYINT, nMahnrhythmus INT, kFirma TINYINT, fProvision DECIMAL(28,14), nVertreter TINYINT,
            fSkonto DECIMAL(28,14), nSkontoInTagen INT);
        INSERT INTO #Daten_spkundeInsert(InternalId, kInetKunde, kKundenKategorie, cKundenNr, cFirma, cAnrede, cTitel, cVorname,
            cName, cStrasse, cPLZ, cOrt, cLand, cTel, cFax, cEMail,  dErstellt, cMobil, fRabatt,
            cUSTID, cNewsletter, cZusatz, cEbayName, kBuyer, cAdressZusatz, cGeburtstag, cWWW, cSperre, cPostID,
            kKundenGruppe, nDrittland, nZahlungsziel, kSprache, cISO, cBundesland, cHerkunft, cKassenKunde, cHRNr,
            kZahlungsart, nDebitorennr, cSteuerNr, nKreditlimit, kKundenDrucktext, nMahnstopp, nMahnrhythmus, kFirma, fProvision,
            nVertreter, fSkonto, nSkontoInTagen)
            SELECT Daten.kInternalId, Daten.kInetKunde, Daten.kKundenKategorie, Daten.cKundenNr, Daten.cFirma,
                Daten.cAnrede, Daten.cTitel, Daten.cVorname, Daten.cName, Daten.cStrasse, Daten.cPLZ, Daten.cOrt, Daten.cLand,
                Daten.cTel, Daten.cFax, Daten.cEMail, Daten.dErstellt, Daten.cMobil,
                Daten.fRabatt, Daten.cUSTID, Daten.cNewsletter, Daten.cZusatz,  Daten.cEbayName, Daten.kBuyer,
                Daten.cAdressZusatz, Daten.cGeburtstag, Daten.cWWW, Daten.cSperre, Daten.cPostID, Daten.kKundenGruppe,
                Daten.nDrittland, Daten.nZahlungsziel, Daten.kSprache, Daten.cISO, Daten.cBundesland, Daten.cHerkunft,
                Daten.cKassenKunde, Daten.cHRNr, Daten.kZahlungsart, Daten.nDebitorennr, Daten.cSteuerNr,
                Daten.nKreditlimit, Daten.kKundenDrucktext, Daten.nMahnstopp, Daten.nMahnrhythmus, Daten.kFirma, Daten.fProvision,
                Daten.nVertreter, Daten.fSkonto, Daten.nSkontoInTagen
            FROM @Daten AS Daten;
    --
    -- Hier kommt der Code rein vor dem INSERT/UPDATE/DELETE
    --
    IF(OBJECT_ID('tempdb..#Temp_spkundeInsert') IS NOT NULL)
    BEGIN
        DROP TABLE #Temp_spkundeInsert;
    END
    CREATE TABLE #Temp_spkundeInsert(InternalId INT IDENTITY(1,1), kKunde INT);
        -- Daten schreiben
    INSERT INTO dbo.tkunde(kInetKunde, kKundenKategorie, cKundenNr, dErstellt, fRabatt,
        cNewsletter, cEbayName, kBuyer, cGeburtstag, cWWW, cSperre, kKundenGruppe, nDrittland,
        nZahlungsziel, kSprache, cHerkunft, cKassenKunde, cHRNr, kZahlungsart, nDebitorennr, cSteuerNr,
        nKreditlimit, kKundenDrucktext, nMahnstopp, nMahnrhythmus, kFirma, fProvision, nVertreter, fSkonto, nSkontoInTagen)
        OUTPUT INSERTED.kKunde INTO #Temp_spkundeInsert
    SELECT kInetKunde, kKundenKategorie, cKundenNr, 
            dErstellt, fRabatt, cNewsletter, cEbayName, kBuyer, cGeburtstag,
            cWWW, cSperre, kKundenGruppe, nDrittland, nZahlungsziel, kSprache, cHerkunft, cKassenKunde, cHRNr,
            kZahlungsart, nDebitorennr, cSteuerNr, nKreditlimit, kKundenDrucktext, nMahnstopp, nMahnrhythmus, Daten.kFirma,
            Daten.fProvision, Daten.nVertreter, Daten.fSkonto, Daten.nSkontoInTagen
    FROM #Daten_spkundeInsert AS Daten;

    --
    -- tAdresse schreiben
    --
    DECLARE @adresse TYPE_spAdresseInsert;
    INSERT INTO @adresse ( kInternalId,
                            kInetAdresse,
                            kKunde,
                            cFirma,
                            cAnrede,
                            cTitel,
                            cVorname,
                            cName,
                            cStrasse,
                            cPLZ,
                            cOrt,
                            cLand,
                            cTel,
                            cZusatz,
                            cAdressZusatz,
                            cPostID,
                            cMobil,
                            cMail,
                            cFax,
                            cBundesland,
                            cISO,
                            nStandard,
                            nTyp,
                            cUstId )
        SELECT #Temp_spkundeInsert.InternalId,
                tinetadress.kInetAdress,
                #Temp_spkundeInsert.kKunde, 
                Daten.cFirma,
                Daten.cAnrede,
                Daten.cTitel,
                Daten.cVorname,
                Daten.cName,
                Daten.cStrasse,
                Daten.cPLZ,
                Daten.cOrt,
                Daten.cLand,
                Daten.cTel,
                Daten.cZusatz,
                Daten.cAdressZusatz,
                Daten.cPostID,
                Daten.cMobil,
                Daten.cEMail,
                Daten.cFax,
                Daten.cBundesland,
                Daten.cISO,
                1,
                1,
                Daten.cUstId
        FROM #Daten_spkundeInsert AS Daten
        JOIN #Temp_spkundeInsert ON #Temp_spkundeInsert.InternalId = Daten.InternalId
        LEFT JOIN dbo.tinetadress ON tinetadress.kKunde = #Temp_spkundeInsert.kKunde
        
    EXEC dbo.spAdresseInsert @Adresse = @adresse,
                            @callerKundeInsert = 1
    --
    -- Hier kommt der Code nach dem INSERT/UPDATE/DELETE rein
    --
    
    DECLARE @KundenToUpdate AS TYPE_spUpdateKundeSuche;

    INSERT INTO @KundenToUpdate (kKunde)
    SELECT DISTINCT kKunde
    FROM #Temp_spkundeInsert;
    
    EXEC Kunde.spUpdateKundeSuche @Kunden = @KundenToUpdate;


    -- Rückgabe des PK
    SELECT @ReturnValue = #Temp_spkundeInsert.kKunde
        FROM #Temp_spkundeInsert;
        
        IF(@CreatedTransaction = 1)
        BEGIN
            COMMIT-- Nur wenn kein Savepoint gesetzt
        END
        RETURN @ReturnValue;
    END TRY
    BEGIN CATCH
    -- Dedlock Catch
        IF(ERROR_NUMBER() = 1205)
        BEGIN
            SET @retry = @retry - 1;
            IF(@CreatedTransaction = 1)
            BEGIN
                ROLLBACK TRANSACTION;
            END
            ELSE
            BEGIN
                ROLLBACK TRANSACTION Savepoint0;
            END
            IF(@retry = 0)
            BEGIN
                SET CONTEXT_INFO 0x0;
                THROW;
                RETURN 0;
            END
            EXEC dbo.spWaitRandom;
        END
        ELSE
        BEGIN
            SET @retry = -1;
            IF(@CreatedTransaction = 1)
            BEGIN
                ROLLBACK TRANSACTION;
            END
            ELSE
            BEGIN
                ROLLBACK TRANSACTION Savepoint0;
            END
            SET CONTEXT_INFO @OldContextInfo;
            THROW;
            RETURN 0;
        END
    END CATCH
END
 

MartinK

Moderator
Mitarbeiter
5. Dezember 2013
79
14
Die SP bekommt einen Table Type übergeben. Den Typ TYPE_spKundeInsert. Der muss zuvor gefüllt werden und kann dann der SP als Parameter übergeben werden. Table Types sind quasi Tabellen mit denen Daten an eine Funktion oder Stored Procedure übergeben werden können.

So sieht es vom Prinzip in SQL aus. Man kann dann entweder mit VALUES oder einem SELECT die Daten einfügen. und dann die SP aufrufen mit dem Typen als Parameter.

SQL:
DECLARE @Kunde AS TYPE_spkundeInsert;
INSERT INTO @Kunde ( kInternalId ,
                     kInetKunde ,
                     kKundenKategorie ,
                     cKundenNr ,
                     cFirma ,
                     cAnrede ,
                     cTitel ,
                     cVorname ,
                     cName ,
                     cStrasse ,
                     cPLZ ,
                     cOrt ,
                     cLand ,
                     cTel ,
                     cFax ,
                     cEMail ,
                     dErstellt ,
                     cMobil ,
                     fRabatt ,
                     cUSTID ,
                     cNewsletter ,
                     cZusatz ,
                     cEbayName ,
                     kBuyer ,
                     cAdressZusatz ,
                     cGeburtstag ,
                     cWWW ,
                     cSperre ,
                     cPostID ,
                     kKundenGruppe ,
                     nDrittland ,
                     nZahlungsziel ,
                     kSprache ,
                     cISO ,
                     cBundesland ,
                     cHerkunft ,
                     cKassenKunde ,
                     cHRNr ,
                     kZahlungsart ,
                     nDebitorennr ,
                     cSteuerNr ,
                     nKreditlimit ,
                     kKundenDrucktext ,
                     nMahnstopp ,
                     nMahnrhythmus ,
                     kFirma ,
                     fProvision ,
                     nVertreter ,
                     fSkonto ,
                     nSkontoInTagen )
[HIER KOMMT DAS VALUES ODER EIN SELECT]
EXEC dbo.spKundeInsert @Daten = @Kunde;
 

zwitsch

Sehr aktives Mitglied
14. November 2007
419
37
Füge den Kunden mit der Ameise hinzu. Lässt sich gut in eigenem Programmen per Parameter aufrufen. Im eigenen Programm eine CSV-Datei mit den Kundendaten erzeugen, Ameise aufrufen. Danach CSV-Datei wieder löschen. Fehlerhandling nicht vergessen. Funktioniert sicherer als die Suche und Interpretation passender StoredProcedures.
 
  • Gefällt mir
Reaktionen: Horus Sirius

Horus Sirius

Gut bekanntes Mitglied
9. März 2017
146
10
Oldenburg
https://guide.jtl-software.de/jtl-wawi/jtl-ameise/cmd-line-version/

JTL-Ameise 0.984 (c) 2019 JTL-Software-GmbH Start von JTL-Ameise ohne Parameterangabe öffnet die GUI Version Pflichtparameter -s, --server=SERVER Datenbankverbindung wird zu SERVER hergestellt -d, --database=DATABASE Datenbank DATABASE wird angesprochen Datenbanknamen anderer Mandanten sind im Menü JTL-Wawi -> Mandanten zu finden. -u, --dbuser=USER Datenbankverbindung wird mit USER erstellt -p, --dbpass=PASSWORD Passwort des Datenbankbenutzers t, --templateid=ID Import/Exportvorlage mit dieser ID wird genutzt -i, --inputfile=FILE Importdatei. Pflicht, wenn importiert wird -o, --outputfile=FILE Exportdatei. Pflicht, wenn exportiert wird Optionale Angaben, falls nicht angegeben gilt der Wert mit (Std) dahinter --mode=MODE 'test' oder 'production' = Produktivmodus (Std) --loglevel=NUM 1 = ausführlich (Std) 3 = Kompakt 5 = Nur Fehler/Warnungen -- log=FILE Logdatei für Hauptbericht --log_errors=FILE Logdatei für Fehler --log_warnings=FILE Logdatei für Warnungen --log_imported=FILE Logdatei für importierte Datensätze --log_updated=FILE Logdatei für aktualisierte Datensätze --log_other=FILE Logdatei für Sonstiges --csv_errors=FILE Datei, die fehlerhafte Datensätze enthalten soll --csv_warnings=FILE Datei, die Datensätze mit Warnungen enthalten soll --nostdout Keine Konsolenausgabe --no_workflows Es werden keine Workflows ausgeführt --writeLogAtEnd Für eine höhere Importgeschwindigkeit werden die Logdateien erst am Ende des Imports geschrieben. Daher ist bei einem Absturz / Abbruch des Imports nicht gewährleistet, dass Logdateien erstellt werden. In Dateinamen FILE können folgende Variablen verwendet werden: %y Jahr, %m Monat, %d Tag, %H Stunde, %i Min, %s Sek %db Datenbank, %id VorlagenID Bitte beachten, dass % in Batch Dateien zu %% gewandelt werden müssen. Beispiel 1 JTL-wawi-ameise.exe -s (local)\JTLWAWI -d eazybusiness -u sa -p sa04jT14 -t IMP3 -i import.csv Beispiel 2 JTL-wawi-ameise.exe server=(local)\JTLWAWI --database=eazybusiness --dbuser=sa --dbpass=sa04jT14 --templateid=IMP5 --inputfile=import.csv --log="bericht_%db_%y%m%d-%H%i%s.txt" Weitere Dokumentation siehe http://guide.jtl-software.de/
 

zwitsch

Sehr aktives Mitglied
14. November 2007
419
37
Meine Programmierumgebung ist Clarion for Windows.

ImportID enthält die ID eines definierten Imports für die Ameise. Muss also vorher erstellt werden, kann aber immer wieder aufgerufen werden. Importdefinitionen lassen sich exportieren und importieren. Können also zu einem Kunden geschickt werden, falls hier Bedarf besteht.

PROGPATH enthält den Pfad der JTL-Wawi (und Ameise), SERVER enthält den SQL-Servernamen

Parameter1 enthält die Datenbank, User und Passwort
Parameter1 = ' -d ' & Datenbank & ' -u ' & Name & ' -p ' & Passwort

Mit der Datei Protokoll. LOG kann man Informationen bzw. Fehler beim Import erkennen, darstellen und darauf reagieren.

SetClipboard schreibt den Ameisenaufruf in die Zwischenablage. Kann man gut verwenden während der Entwicklungsphase, um diesen Befehl manuell per BAT-Datei auszuprobieren.

vuRun(LOC:AufrufAmeise, 0, 1) startet dann die Ameise. Der User bekommt davon nichts mit; also keine Bildschirmaktivitäten.

LOC:AufrufAmeise: diese Anweisung muss in einer Zeile stehen

!Daten für JTL-Ameise vorbereiten
IF LEN(CLIP(LOC:IMPORTID)) > 0
LOC:AufrufAmeise = PROGPATH & 'JTL-wawi-ameise.exe -s ' & SERVER &|
Parameter1 & ' -t ' & IMPORTID & ' -i ' &|
& ImportFile & ' --loglevel=1 --log=Protokoll.LOG &|
--log_warnings=Protokoll.LOG &|
--log_imported=Protokoll.LOG &|
--log_updated=Protokoll.LOG &|
--log_errors=Protokoll.LOG &|
--nostdout'
!LogFile kopieren
COPY('Protokoll.LOG', GLO:LogFileAmeise)

SetClipboard(LOC:AufrufAmeise)

IF vuRun(LOC:AufrufAmeise, 0, 1) = FALSE
MESSAGE('Fehler beim Aufruf der Ameise', 'Importfehler') !RUNCODE())
ELSE.........
 
  • Gefällt mir
Reaktionen: Horus Sirius

Tobi_G

Neues Mitglied
17. Dezember 2019
18
5
Sehr Schade.
Könnte man nicht die Funktion der JTL Ameise in JTLwawiExtern.dll übernehmen, dann könnte man Export und Import technisch wirklich alles.

Wie vielleicht auch bei dir schon mehrfach erwähnt wurde, ist es verständlicherweise keine gute Idee die Datenbank direkt anzusprechen, aufgrund zahlreicher Abhängigkeiten und
meiner Meinung nach auch einem etwas uneinheitlichem Design der Datenbank.
(manche Proceduren sind auf englisch, manche auf Deutsch und es werden 3 verschiedene Methoden benutzt die primary keys zu managen obwohl ich keine Notwendigkeit für überhaupt eine der drei sehe)

Ich glaube zudem, dass die Extern.dll nichts anderes macht als auf die stored procedures zurückzugreifen, nur eben etwas schöner und einheitlicher. (Beide bieten die Möglichkeiten XML Daten als Parameter zu übergeben).
Aber darüber hinaus laufen noch einige weitere SQL Statements ab vor und nach dem sp_KundeInsert.

Deshalb, falls du einen einfachen Import in JTL machen möchtest, dann kann ich dir auch nur die Ameise empfehlen, aufgerufen über die Kommandozeile. Das ist das Importwerkzeug erster Wahl.
 

charms.johannsson.de

Gut bekanntes Mitglied
31. Dezember 2008
200
3
Rendsburg
Ich stehe vor einem ähnlichem Problem und möchte einen Kunden uber die spKundeInsert zufügen

mir ist die "kInternalId" nicht klar
wenn ich die SP mit unten stehendem Code ausführe kommt die Meldung:

(1 Zeile betroffen)
Die spAdresseInsert-Prozedur hat versucht, den Status NULL zurückzugeben. Dies ist nicht zulässig. Stattdessen wird der Status 0 zurückgegeben.

und es wird kein Adressdatendatz angelegt ?

SQL:
DECLARE @Kunde AS TYPE_spkundeInsert;
                INSERT INTO @Kunde (
                     kInternalId ,
                     kInetKunde ,
                     kKundenKategorie ,
                     cKundenNr ,
                     cFirma ,
                     cAnrede ,
                     cTitel ,
                     cVorname ,
                     cName ,
                     cStrasse ,
                     cPLZ ,
                     cOrt ,
                     cLand ,
                     cTel ,
                     cFax ,
                     cEMail ,
                     dErstellt ,
                     cMobil ,
                     fRabatt ,
                     cUSTID ,
                     cNewsletter ,
                     cZusatz ,
                     cEbayName ,
                     kBuyer ,
                     cAdressZusatz ,
                     cGeburtstag ,
                     cWWW ,
                     cSperre ,
                     cPostID ,
                     kKundenGruppe ,
                     nDrittland ,
                     nZahlungsziel ,
                     kSprache ,
                     cISO ,
                     cBundesland ,
                     cHerkunft ,
                     cKassenKunde ,
                     cHRNr ,
                     kZahlungsart ,
                     nDebitorennr ,
                     cSteuerNr ,
                     nKreditlimit ,
                     kKundenDrucktext ,
                     nMahnstopp ,
                     nMahnrhythmus ,
                     kFirma ,
                     fProvision ,
                     nVertreter ,
                     fSkonto ,
                     nSkontoInTagen ) values (1,0,0,'R10000','','','','Test99','Test99','Test99 ','0','','Deutschland','','','',GetDate(),'',0,'','','','',0,'','','','','',3,0,0,1,'DE','','Rep','Y','',0,0,'',0,0,0,0,0,0,0,0, 0)

                     EXEC Kunde.spKundeInsert @Daten = @Kunde;
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu abgebrochene Auftragszahlung - Kunde bleibt ausgewählt Fragen rund um LS-POS 0
Neu Amazon Business Kunde Österreich mit USt in Wawi Amazon-Anbindung - Fehler und Bugs 1
Neu Freitexteingabe durch Kunde bei bestimmten Variationen User helfen Usern - Fragen zu JTL-Wawi 2
Neu Eigene Übersicht Kunde QR Code Kundennummer Eigene Übersichten in der JTL-Wawi 4
In Diskussion Kopieren oder Auslösen von Workflows in anderen Bereichen (Von Rechnung nach Kunde) JTL-Workflows - Ideen, Lob und Kritik 2
Neu Kunde zahlt bar bei Anlieferung, wie löse ich das? Arbeitsabläufe in JTL-Wawi 15
Neu Enddatum Sonderpreise per Ameise importieren User helfen Usern - Fragen zu JTL-Wawi 0
Beantwortet E-Mail Vorlage Versandbestätigung per Workflow ausführen, wie? JTL-Workflows - Ideen, Lob und Kritik 7
Neu Ameise-Vorlage per SQL abrufen und Daten als Ergebnis erhalten JTL Ameise - Eigene Exporte 1
Neu Erstattungen per Paypal bei Stornierungen wird öfter nicht ausgezahlt Arbeitsabläufe in JTL-Wawi 0
Neu Artikel per Dropshipping versenden und selbst versenden Arbeitsabläufe in JTL-Wawi 1
ebay Angebotsindividuelle Einstellungen setzen per Ameise? JTL-Wawi 1.9 1
Neu Rechnung automatisch per Mail versenden User helfen Usern - Fragen zu JTL-Wawi 9
In Diskussion Rechnungsentwurf per Workflow? JTL-Workflows - Ideen, Lob und Kritik 7
Neu Wie finde ich per SQL heraus welche Aufträge auf Teillieferbar stehen? JTL Ameise - Eigene Exporte 1
Neu Rechnung per Email aus LS-Pos Fragen rund um LS-POS 0
Lieferantenbestellung mit GLS Versandetikett an den Hersteller/Lieferanten per Mail Senden. JTL-Wawi 1.8 0
Neu Mollie Zahlung per Kreditkarte (25% Fehlschlag) User helfen Usern - Fragen zu JTL-Wawi 1
Neu Per WMS Workflow API Call ausführen Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 1
Neu Berichtscontainer per Formel sortieren Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Frage zur Kartonagen Verwaltung in JTL WMS 1.8 - Karton per Scan ersetzen? Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 1
Neu Ware direkt in ein Standardlager einbuchen per SQL StoreProcedure dbo.spWarenlagerEingangSchreiben Schnittstellen Import / Export 9
Neu JTL-Wawi Datenbank - wawi-db.jtl-software JTL-Wawi - Fehler und Bugs 2

Ähnliche Themen