Danke Musahi,
ich bekomme das leider nur nicht auf mein Scrkipt übertragen >.> was muss ich den genau und wie ändern damit das in meinem Script läuft
Danke Musahi,
ich bekomme das leider nur nicht auf mein Scrkipt übertragen >.> was muss ich den genau und wie ändern damit das in meinem Script läuft
Vielen dank.
Ich bekomme die Meldung Return 2 : 1 Error = 1 Flag = 9 ausgegeben. Und kopiert dabei leider nichts
"das Array mit den Quelldateien ist gar kein Array" ist zumindest Error 1 wenn ich das richtig gesehen hab.
Übernimmt der das Array nicht richtig ? weil dieses wird ja noch mal Umgewandelt oder ?
Würde ich gern nutzen. Nur hab ich es irgendwie noch nie geschaft sowas richtig einzubinden und zu nutzen.. Kannst du das vielleicht im handumdrehen machen?
Hallo zusammen
Ich hab da ein anliegen und hoffe mir kann jemand dabei helfen.
Ich habe folgendes Script:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Download.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <Excel.au3>
$BilderPfadA = "K:\Bild\"
DirCreate("c:\Temp\")
FileInstall ("C:\temp\7z.exe","C:\temp\7z.exe")
Auswahl()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Excel datei auswählen
Func Auswahl()
Local Const $sMessage = "Bitte die Artikelliste auswählen"
; Wo liegt die Excel
Local $sFileOpenDialog = FileOpenDialog($sMessage, @DesktopDir & "\", "Excel (*.xlsx) (*.xls)", $FD_FILEMUSTEXIST)
If @error Then
; Zeige bei fehler
MsgBox($MB_SYSTEMMODAL, "", "Keine Datei ausgewählt es wird abgebrochen.")
Exit
; Den Ordner Ändern beim öffnen
FileChangeDir(@DesktopDir)
Else
FileChangeDir(@DesktopDir)
$sFileOpenDialog = StringReplace($sFileOpenDialog, "|", @CRLF)
; Zeige ausgewählte Datei
MsgBox($MB_SYSTEMMODAL, "", "Folgende Datei wurde geladen:" & @CRLF & $sFileOpenDialog)
EndIf
Local Const $sMessage3 = "Bitte das Quell-Bildverzeichnis auswählen"
; Display an open dialog to select a file.
Local $sFileSelectFolder2 = FileSelectFolder($sMessage3,"")
If @error Then
; Display the error message.
MsgBox($MB_SYSTEMMODAL, "", "Es wurde kein Ordner gewählt. Es wird abgebrochen")
Exit
Else
; Display the selected folder.
MsgBox($MB_SYSTEMMODAL, "", "Folgendes Verzeichnis wurde gewählt:" & @CRLF & $sFileSelectFolder2)
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Ordner zum Kopieren
Local Const $sMessage2 = "Bitte ein Ausgabe-Bildverzeichnis auswählen"
; Display an open dialog to select a file.
Local $sFileSelectFolder = FileSelectFolder($sMessage2, "")
If @error Then
; Display the error message.
MsgBox($MB_SYSTEMMODAL, "", "Es wurde kein Ordner gewählt. Es wird abgebrochen")
Exit
Else
; Display the selected folder.
MsgBox($MB_SYSTEMMODAL, "", "Folgendes Verzeichnis wurde gewählt:" & @CRLF & $sFileSelectFolder)
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Excel Datei Auslesen
; Create application object and open an example workbook
Local $oExcel = _Excel_Open()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel Datei Einlesen", "Fehler: Excel konnte nicht gestartet werden!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
Local $oWorkbook = _Excel_BookOpen($oExcel, $sFileOpenDialog)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel Datei einlesen", "Fehler beim Öffnen der Excel Tabelle '" & @DesktopDir & $sFileSelectFolder & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Excel_Close($oExcel)
Exit
EndIf
; Read the formulas of a cell range (all used cells in column A)
Local $aResult = _Excel_RangeRead($oWorkbook, Default, $oWorkbook.ActiveSheet.Usedrange.Columns("A:A"), 2)
If @error Then MsgBox($MB_SYSTEMMODAL, "Excel Datei einlesen", "Error reading from workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
For $i = 0 To Ubound($aResult) - 1
FileCopy($sFileSelectFolder2 &"\" & $aResult[$i] & ".jpg", $sFileSelectFolder & "\" & $aResult[$i] & ".jpg")
next
$tmp = msgbox(4,"Fertig","Alle vorhandenen Bilder wurden kopiert!" & @CRLF & "Soll ein Zip-Archiv erstellt werden?")
$OrdnerFake = '"' & $sFileSelectFolder &'"'
$DektopFake = '"' & @DesktopDir &'"'
$scriptordnerFake = '"' & @scriptdir &'\7z.exe"'
Switch $tmp
Case 6
$Zipname = InputBox ("Zip Dateiname","Name der Zip Datei?")
$zipnamefake = '"' & $Zipname & '"'
RunWait (@ComSpec & " /c " & "C:\temp\7z.exe" & " a " & "C:\Temp" & "\" & $zipnamefake &".zip " & $OrdnerFake &"\" )
FileMove("C:\Temp\"& $Zipname &".zip",@DesktopDir )
msgbox(0,"Excel Kopierer","Zip-Datei wurde auf dem Desktop erstellt.")
; Code für JA
Case 7
msgbox (0,"Bilder kopieren","Bilder wurden Ohne ungezipt kopiert")
; Code für NEIN
Case 2 ; CANCEL
msgbox (0,"Bilder kopieren","Bilder wurden ungezipt kopiert")
Exit
EndSwitch
EndFunc
Alles anzeigen
Ich habe das irgendwie vor knapp nem jahr mal zusammen gezimmert mit viel Hilfe. Ich hab teilweise nicht das richtige Verständnis und Hintergrund wissen und versuche immer einfach mein glück Auf jeden fall hab ich schon viel gegoogelt aber nichts gefunden was ich wirklich verstehen würde wie ich das einbauen kann. Ich möchte eig nur ne Statusanzeige haben wie weit der Fortschritt des Kopierens grade ist. Vielleicht kann mit ja fix jemand dabei helfen und gerne auch 2-3 sätze dazu schreiben WIE das eingebaut wird.
Ich lerne eher von dem Doing als von der Theorie
Also mein Problem ist, das es auch Artikel gibt, die zwar verfügbar sind aber nicht mehr angezeigt werden da kein TerminTagBS drin steht dort steht einfach nur NULL drin. Eine Lösung wäre es ja das ganze mit Order by zu sortieren und mit Top 1 nur den ersten auszugeben. Aber ich weiß nicht genau wie ich VOR dem Where den Order by befehl ausführen soll.
Alles anzeigenDaher hatte ich in Beitrag #15 nach dem Datentyp gefragt, bzw. im Spoiler folgendes angegeben :
Auszug :
"Geben Sie nur das Datum vor, speichert SQL Server 00:00:00.000 als Zeit. Wenn Sie nur den Zeitanteil vorgeben, speichert SQL Server den 01.01.1900 als Datum."
Alle Angaben von Springstil hatten im Zeitanteil bisher immer 00:00:00.000 stehen.
Der Aufbau des Zeitanteils bei datetime ist hh:mm:ss:ms. Es fehlen m.M.n. die Sekunden -> 11:06:00.000
(Das muss jetzt aber nicht zwingend der Grund für 'einen/den' Fehler sein)
EDIT :
Ab MSSQL Server >= 2008 gibt es zusätzlich den Datentyp datetime2
-> Zeitanteil = 00:00:00.0000000 (Genauigkeit 100 Nanosekunden)
Gruß Musashi
Ja die Uhrzeit wird nicht mit festgehalten. Nur das Datum. Aber er gibt ja zur zeit 2 mal die Bestellungen aus. Wobei das aber auch völlig egal ist. Das kann so bleiben. Sind ja nur um die 80 Artikel. Allerdings ist mir was ganz anderes aufgefallen....
Er prüft ja mit MAX ob etwas drin steht, und gibt das höchste dann aus. Soll er ja auch. ABER es gibt ca 115 Artikel die nicht bestellt worden sind, aber verfügbar in der Spalte "AvailableTotal" sind. Das wäre natürlich eine Katastrophe wenn diese Artikel nicht mit aufgeführt werden. Aber das bedeutet ja auch das MAX das falsche wäre? Müsste man also doch mit dem "ORDER BY" regeln oder? Es steht in dem Termin Feld dann einfach nur NULL drin.
PS: Ja die waren wirtschaft von uns läuft seid 20 jahren oder so und ist eine reine Katastrophe... in ca einem halben Jahr bekommen wir endlich die neue
EDIT: Okay mit order by limit 1 gehts ja nicht. Wenn dann würde ich das mit Top hinbekommen. Wobei ich hier ja das gegenteil brauche da nicht der erste sondern der letzte angezeigt werden muss?
EDIT 2: Problem ist natürlich Top zeigt den ersten wert... Heist das es nicht das neuste Datum wäre. ABER wenn ich aber hingehe und in der Vorherigen View die alle Daten zusammen fasst den Order By DESC setze, und in der 2ten View die noch mal alles Filtert den Top Befehl gebe müsste es ja stimmen. Wobei ich dafür das Order by vor dem Where setzen muss. aber wie stelle ich das an?
Wo genau ist das Problem wenn du an einem Tag mehrere Bestellungen hast? Redest du von verschiedenen Artikeln oder vom selben Artikel?
Was soll zurückgegeben werden wenn du an einem Tag den selben Artikel 2x bestellst?
eine Artikelnummer kommt 2 mal vor. wurde beides z.b am 03.04.2019 bestellt. einmal mit der menge 260 und einmal mit 60. Sind ca 88 Einträge. Ich denke ich lasse es aber auch so. Ein wenig nachdenken sollen die Vertreter dann schon selber. Oder würde es eine einfache Möglichkeit geben das auch noch rauszufiltern?
Der Grund warum wir best2 brauchen ist die Aggregationsfunktion MAX() um datum herum. Würden wir diese schon bei der 1. Query nutzen, so würde nur das aktuellste Datum von allen Produkten zu einem User ausgegeben werden (also nur ein Datum, da das höchste von ALLEN Produkten ausgewählt wird), aber wir wollen ja das aktuellste Datum zu allen Produkten aller User (also höchstes Datum von Artikel 10000, höchstes Datum Artikel 30000...).
Deshalb starten wir eine Unteranfrage die sich nur auf den aktuellen Kunden und nur auf die aktuelle ArtikelNr bezieht.
Dort suchen wir das höchste Datum und fügen es in die WHERE-Klausel der 1. Query ein, dort steht ja best.datum = (SELECT ...).
Aus diesem Grunde müssen wir auch die Tabellen mit Bezeichnern instanziieren da du sonst ambivalente Spaltenbezeichnungen hast.
Lässt du die Bezeichner weg und nutzt nur kunde = kunde würden alle Tupel aus der Unterquery abgefragt werden (da das immer true ist) statt dem aktuellen Kunden.
Ahh okay Vielen dank. Das habe ich jetzt soweit hinbekommen. Mir war nur nicht klar wie ich den Bezeichner instantiiere. Allerdings habe ich das über einen kleinen umweg gemacht. Ich habe erst eine View erstellt und in dieser View dann die abfrage erstellt. Jetzt macht sich das 2te Problem auf... Es gibt bestellungen die an einem Tag mehr malig getätigt wurden -.- Das heißt ich müsste jetzt noch hinzufügen das er nach ArtikelNo bzw Itemno filtert. aber einfach eine neue Abfrage starten funktioniert nicht
Vielen dank für die mühe. Wahrscheinlich stelle ich mich gerade echt blöd an...
Ich verstehe noch nicht so ganz wie du aus best.kunde erstellst bzw daraus die best2 machst?
Dein Verweis auf die Tabelle ist ambivalent, es wundert mich dass MsSQL da keine Warnung schmeißt.
Du kannst ja wenn du Tabellen instanziierst ihnen Bezeichner geben: SELECT * FROM TABELLE1 t1, TABELLE2 t2 WHERE t1.id = t2.id (PostgreSQL).
Bei deinem ursprünglichen SELECT musst du der Tabelle einen Bezeichner geben. Wieso? In der Subquery forderst du die Tabellen dbo.view_ArtikelXXL und dbo.[VIEW_BESTELLÜBERSICHT] mittels JOIN nochmal neu an, allerdings musst du hier sagen, dass die BestellNr/ArtikelNr (was auch immer) die von der ursprünglichen Query sein soll, da er sonst die Tabellen einfach neu joint und alle Werte miteinander vergleicht statt nur die auszugeben, die mit der ArtikelNr deiner ursprünglichen Query übereinstimmen.
Okay das hab ich jetzt soweit verstanden. Nur habe ich ehrlich gesagt grade keine Ahnung wie ich die Instantiieren soll ? Habe auch was bei Google gefunden, allerdings steht dort der Code nur so:
select a.id, a.name, a.last_use
from doppeltest a
where a.last_use = (
select max(b.last_use)
from doppeltest b
where b.name = a.name
)
nur weiß ich nicht wie ich das bei mir anwenden soll geschweige den richtig Instantiieren soll. Ist damit die AS Bezeichnung gemeint ? Du hast nicht zufällig ein beispiel in MSSQL für mich ?
Alles anzeigenMal ganz blöd gefragt : Von welchem Datentyp ist TerminTagBS ?
Spoiler anzeigen
Auszug aus : http://www.insidesql.org/blogs/frankkal…time-datentypen
Beachten Sie, dass es keinen Datentypen gibt, der nur das eine oder das andere speichert. Beide der genannten Datentypen speichern stets sowohl einen Datumsanteil als auch einen Zeitanteil.
Vor SQL Server 2008 stehen zwei Datentypen für Datum und Zeit Werte zur Verfügung :
smalldatetime - z.B. 29.06.2019 23:59:59
datetime - z.B. 29.06.2019 23:59:59.997
Geben Sie nur das Datum vor, speichert SQL Server 00:00:00.000 als Zeit. Wenn Sie nur den Zeitanteil vorgeben, speichert SQL Server den 01.01.1900 als Datum.
Mit Einführung von SQL Server 2008 wurden mehrere neue Datentypen implementiert :
date, time, datetime2, datetimeoffset
...
Gruß Musashi
Das Format ist im Prinzip "DateTime"
Entschuldige.. kannst du das ein wenig näher erläutern ? ich verstehe nicht was du mit myTabelle1 und tabelle1 meinst.
Habe ich das Richtig verstanden?
dbo.[VIEW_BESTELLÜBERSICHT].TerminTagBS = (SELECT TOP 1 TerminTagBS FROM dbo.view_ArtikelXXL INNER JOIN dbo.[VIEW_BESTELLÜBERSICHT] ON dbo.view_ArtikelXXL.Nr = dbo.[VIEW_BESTELLÜBERSICHT].ArtikelNr ORDER BY TerminTagBS DESC )
soll bedeuten das er mir nur den ersten wert ausgeben soll in TerminTagBS.
FROM dbo.view_ArtikelXXL INNER JOIN dbo.[VIEW_BESTELLÜBERSICHT] ON dbo.view_ArtikelXXL.Nr = dbo.[VIEW_BESTELLÜBERSICHT].ArtikelNr
Von der Tabelle ArtikelXXL gegenüberstellen mit Bestellübersicht. Dort soll er NR und ArtikelNr Vergleichen. und dann erst ausgeben. das ganze sortiert bei TerminTagBS damit top 1 greifen kann?
Das Ergebnis sieht dann so aus:
Ich bekomme bei Limit aber immer einen Fehler:
[Microsoft][SQL Server Native Client 11.0][SQL Server]Falsche Syntax in der Nähe von "LIMIT". (102)
Limit ist ja ein MySQL befehl ich nutze ja MSSQL also wäre das dann Select TOP 1.
Nur bekomme ich dann ja nur noch ein Datum ausgegeben. Sprich das höchste datum was er finden kann egal wie die Artikelnummern lauten
Ich habe nur noch nicht so recht verstanden wie das mit dem Unterquery läuft. Ich hab auch schon gegoogelt und was dazu gefunden und auch versucht umzusetzen, aber leider ohne erfolg. Wie muss das denn mit dem Unterquery aussehen?
Aber order by ist ja nur zum Sortieren? Der wert wird doch dann trotzdem mit aufgeführt.
Mir nutzt es ja nichts das es so sortiert wird. Es würden ja trotzdem beide Einträge vorhanden sein.
Das ist jetzt mal die gekürzte Variante
Die Artikelnummer gibt es 2 mal. Einmal kommt die Ware am 2019-06-17 und am 2019-08-05. Er soll mir aber NUR die 2019-08-05 anzeigen und die andere gar nicht. Hintergrund dazu ist, wenn ein Artikel 2 mal bestellt wird ist die erste Bestellung schon komplett verkauft und steht quasi nicht mehr zur Verfügung. Erst ab 2019-08-05 ist dieser Artikel wieder lieferbar. Ich lasse die abfrage automatisiert einmal täglich per Mail versenden. Daher kann ich nicht vorher noch da eingreifen.
Hallo zusammen,
ich habe eine SQL Abfrage erstellt die eine Verfügbarkeit bestimmter Artikel anzeigen soll. Nun habe ich diese erweitertet, so das er mir auch noch mit anzeigt wann die Bestellung ankommt. Mein Problem ist aber, das es zu einer Artikelnummer öfters vorkommt, dass es 2 Bestellungen zur selben Artikelnummer gibt. In diesem falle soll er mir aber nur das Neuere Datum Anzeigen ausgehend von TerminBS. Ich hoffe ich hab es verständlich genug erklärt ?
SELECT
dbo.view_ArtikelXXL.Nr AS ItemNo,
dbo.view_ArtikelXXL.Inhalt1 AS Contenuto1,
dbo.view_ArtikelXXL.Inhalt2 AS Contenuto2,
dbo.view_ArtikelXXL.VKPreisakt AS Price,
dbo.view_ArtikelXXL.Masseinheit AS Unit,
dbo.view_ArtikelXXL.Verpackungseinheit AS Inner1,
dbo.view_ArtikelXXL.Verpackungseinheit2 AS Inner2,
dbo.view_ArtikelXXL.Verpackungseinheit3 AS MOQ,
dbo.view_ArtikelXXL.Umkarton AS MasterCtn,
dbo.view_ArtikelXXL.SummevonDispobestand AS Available,
dbo.view_ArtikelXXL.DispoGesamt AS AvailableTotal,
dbo.[VIEW_BESTELLÜBERSICHT].ArtikelNr,
dbo.[VIEW_BESTELLÜBERSICHT].MEBestellt,
dbo.[VIEW_BESTELLÜBERSICHT].MENochLiefern,
dbo.[VIEW_BESTELLÜBERSICHT].MESchwimmt,
dbo.[VIEW_BESTELLÜBERSICHT].TerminTagBS
FROM
dbo.view_ArtikelXXL
INNER JOIN dbo.[VIEW_BESTELLÜBERSICHT] ON dbo.view_ArtikelXXL.Nr = dbo.[VIEW_BESTELLÜBERSICHT].ArtikelNr
WHERE
dbo.view_ArtikelXXL.Warengruppe <= 8888 AND
(dbo.view_ArtikelXXL.Warengruppe < 1040 OR
dbo.view_ArtikelXXL.Warengruppe > 1049) AND
dbo.view_ArtikelXXL.Warengruppe <> 1000 AND
dbo.view_ArtikelXXL.Warengruppe <> 2250 AND
(dbo.view_ArtikelXXL.SummevonDispobestand > 0 OR
dbo.view_ArtikelXXL.DispoGesamt > 0)
ORDER BY
ItemNo ASC
Alles anzeigen
Oh gott Arryay´s Dank dir für die Script beispiele. ich schau mir das mal an und versuche noch mal mit Array klar zu kommen :X
Das passiert alles in der Funktion _CheckProcess(), die alle 3000 ms aufgerufen wird.
Dort wird mit ProcessList() eine Liste aller Processe mit dem Namen "hhpxprojwinframe.exe" geholt. Wird ein Process mit diesem Namen gefunden, der vom aktuellen User ausgeführt wird, wird die Funktion mit Return verlassen und in ~3000 ms wieder aufgerufen, anderfalls wird die Funktion Shutdown($SD_LOGOFF) ausgeführt, die den User eigentlich ausloggen sollte...
Es gibt drei relevante Möglichkeiten:
- Der Process "hhpxprojwinframe.exe" wurde gefunden und wird auch vom aktuellen User ausgeführt, dann wird die Funktion in 3000 ms wieder aufgerufen.
- Der Process "hhpxprojwinframe.exe" wurde gefunden, wird aber nicht vom aktuellen User ausgeführt - der User sollte ausgeloggt werden.
- Der Process "hhpxprojwinframe.exe" wurde nicht gefunden - der User sollte ausgeloggt werden.
Baue mal die Funktion _CheckProcess() zum Testen so um:
Code Alles anzeigenFunc _CheckProcess() Local $aProcessUser, $aProcessList = ProcessList('hhpxprojwinframe.exe') If UBound($aProcessList) Then For $i = 1 To $aProcessList[0][0] Step 1 $aProcessUser = _WinAPI_GetProcessUser($aProcessList[$i][1]) If Not @error And $aProcessUser[0] = @UserName Then MsgBox(64, '_CheckProcess()', "'hhpxprojwinframe.exe' mit der PID "&$aProcessList[$i][1]&" wird bereits vom User "&@UserName&" ausgeführt!", 2) Return ; 'hhpxprojwinframe.exe' wird bereits vom User @UserName ausgeführt! EndIf Next EndIf MsgBox(64, '_CheckProcess()', "'hhpxprojwinframe.exe' wird nicht vom User "&@UserName&" ausgeführt - der User "&@UserName&" wird nun abgemeldet!", 2) Shutdown($SD_LOGOFF) ; (0) = Logoff - 'hhpxprojwinframe.exe' wird momentan nicht vom User @UserName ausgeführt! EndFunc ;==>_CheckProcess
Mit der Umgebauten Variante bekomme ich zumindest die meldeung, das der den Prozess nicht mehr findet. ABER er loggt sich nicht aus. Warum auch immer Funktoniert der Befehl
nicht anständig auf dem Server. Mache ich das ganze über CMD (Ich weiß ich mach es mir sehr einfach )
Loggt er sich aus wie es sein soll
Einzige was mich gerade ein wenig stört, ist das er jedes mal beim einloggen jetzt das Skript startet. Das ist zwar gewollt, aber das soll eigendlich der Server übernehmen. Jetzt gibt es ja die Zeile mit $g_bAutoStart ist die dafür zuständig? Wo schreibt er denn den wert hin bzw wo im system wird das hinterlegt?
Die Gutscheine sind für die messe. Im Prinzip steht da nur die Info für die messe drin wie Halle und Stand, und ein QR Code zum Scannen. Ausgewertet werden muss das ganze aber nicht. wir wissen immer nur am ende der Rechnung von der messe, wie viele gekommen sind. Der Rest interessiert nicht
Habe mal angefangen das Script zu schreiben, ich hänge aber noch daran zu checken wie ich die ganzen zeilen zu lesen habe nach und nach bis es keine mehr gibt
Hey Gmmg,
SMTP wäre kein Thema. Würde dann aber über unsere Firewall laufen, die macht bei uns den SMTP Versand (die konfig das das Programm bzw der User von da aus Senden darf würde dann natürlich gemacht)
Für die Daten der Kunden, wäre es wohl einfacher wenn diese in der Excel Tabelle stehen. So können wir diese auch erweitern oder jemand rausnehmen. Wir würden dann die Excel Tabelle einfach Pflegen.
Der Aufbau der Gutscheine ist eigendlich immer nur eine PDF Datei (natürlich mal X. Sprich es gibt 50 Gutscheine insgesamt aber es muss immer nur irgendeiner verschickt werden). Diese ist auch komplett frei von namen oder sonst etwas. Diese kann also einfach durch Zufall aus dem Ordner gegriffen werden und versendet werden.
Zwecks den Daten der User, wäre es vielleicht schön das so zugestallten, das die Absender Daten in einer InI Datei stehen. Somit kann auch mal jemand anderes die Sachen versenden. Vielleicht kann man in der Excel Tabelle auch den Standard Text hinterlegen der an jeder Mail angehängt wird.