Attachment/Files/Dateianhänge erstellen ohne die generierte Datei zu überschreiben
Guten Tag,
ich nutze Ninox um meine Buchhaltung zu organisieren. Ich möchte via Schaltfläche eine Rechnung erzeugen, diese Rechnung soll als PDF unveränderlich in der gespeichert und dem Datensatz als Attachment angefügt werden. Bei jedem weiteren Erzeugen via dieser Schaltfläche soll dann eine neue Datei erstellt und erneut erzeugt udn angehängt werden ohne bestehende Attachments zu überschreiben.
Problem:
Nutze ich importFile(this, printAndSaveRecord(this, "My Print Layout"), "MEINDATEINAME.pdf"), werden bestehende Attachments mit demselben Dateinamen einfach überschrieben.
Freilich ist es kein Problem einen neuen Dateinamen zu erzeugen, allerdings müsste ich dazu zunächst wissen, ob der aktuell definierte Dateiname bereits in Verwendung ist.
Leider liefert mir die file(...,...) Funktion dazu keinen passenden Rückgabewert. Die files(...) Funktion liefert mir zwar ein Array aller Attachments, jedoch mit einem Prefix mit 2+ Stellen (z.B. B/19 , wobei 19 meine DatensatzNr ist und entsprechend zahlreiche stellen annehmen kann).
Ich konnte keine Funktion finden die das Array effizient auf Übereinstimmungen überprüft. Ich habe versucht das Array mit einer Schleife zu durchlaufen und die Elemente mit contain bzw. index(string, match) auf gleichheit zu überprüfen, das jedoch ist offenbar ineffizient, denn selbst bei unter 5 Elementen dauert es mehrere Sekunden bis ich einen Rückgabe erhalte... siehe:
function isAvailableName(name : text) do
let allFiles := files(this);
if allFiles = null then false end;
let allFilesLength := count(allFiles);
let i := 0;
let available := true;
while i < allFilesLength or not available do
let currentItem := item(allFiles, i);
if contains(text(currentItem), name) then
available := false
end;
i := i + 1
end
;
available
end;
Wie kann ich das lösen?
4 Antworten
-
Kurz: Kann ich überprüfen ob eine Datei mit einem gegebenem Namen bereits existiert? Ist das möglich?
-
Würde es nicht eventuell genügen, die Dateinamen in ein Textfeld einzulesen und dieses nach dem String zu durchsuchen? So in etwa:
let Dateien := concat(files(this));
let available := if contains(Dateien, DATEINAME) then false else true end
available
-
Hallo,
ich prüfe in einem ähnlichen Fall, ob die Rechnung schon vorhanden ist mit:
var dateien := files(this);
contains(text(dateien), 'Dateiname Rechnung')Dies müsstest Du natürlich in einer Schleife abarbeiten, bis zum ersten nicht verwendeten Namen. Eine Lösung mit weniger "suchen" wäre meiner Meinung nach, dass Du in den Rechnungsdatensatz ein numerisches Feld "Anzahl gedruckt" einbaust. Dieses erhöhst Du vor jedem Druck um eins und bindest den Wert in den Dateinamen ein.
VG Frank
-
Danke für die konstruktiven Antworten. Beide Lösungen funktionieren (schnell). Auf diesen simplen Ansatz bin ich tatsächlich nicht gekommen...
Vielen Dank :)
Content aside
- vor 5 JahrenZuletzt aktiv
- 4Antworten
- 2536Ansichten