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

Horus Sirius

Aktives Mitglied
9. März 2017
97
3
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
76
11
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

Gut bekanntes Mitglied
14. November 2007
304
14
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

Aktives Mitglied
9. März 2017
97
3
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

Gut bekanntes Mitglied
14. November 2007
304
14
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

Über uns

  • In unserem moderierten JTL-Forum könnt Ihr Euch themenbezogen mit der JTL-Community rund um die Produkte von JTL, passende Erweiterungen und den E-Commerce im Allgemeinen austauschen, Tipps und Tricks teilen sowie Verbesserungswünsche und Fehler diskutieren.

    Unsere Forumsnutzer helfen sich untereinander auch gerne weiter, wenn Sie mal nicht weiterkommen oder einen Ratschlag benötigen.

Schnell-Navigation

Benutzer Menü