Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   PDF-Datein nach Datenbankvorgabe verschieben (https://www.delphipraxis.net/185215-pdf-datein-nach-datenbankvorgabe-verschieben.html)

darky95 22. Mai 2015 15:50

PDF-Datein nach Datenbankvorgabe verschieben
 
Hallo Leute,

ich habe monatlich rund 300 Briefe auf meinem Tisch liegen, die ich auf einen Schlag bearbeiten und versenden muss.
Der Spaß soll jetzt digitalisiert werden, also per Mail (PDF) raus gehen. Ich habe alle Briefe eingescannt, und per AutoHotKey schon eindeutig umbenennen lassen. :-D

Mein Problem besteht jetzt darin, dass ich eine Datenbank habe (die man ggf. zu einer Exceltabelle herabstufen kann), in der festgehalten ist, welches Dokument in welches Außenhaus muss. Jetzt sollen sozusagen PDF1, PDF17, PDF19,... in einen Ordner gepackt werden, sodass der nur noch gezippt werden muss und per Mail gesammelt ans Sekretariat gehen kann. :-D (In der DB steht zu jedem "PDFn" der Ort dazu).

Mit welchem Befehl kann ich die Datenbank mit den Dateinamen abgleichen und entsprechend verschieben(am besten ohne etwas klicken zu müssen)? Und erinnere ich mich richtig, dass MoveFile Datein verschob?

Vielen Dank für eure Hilfe! :)

himitsu 22. Mai 2015 16:14

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Datenbanken haben im Allgemeinen keinen Zugriff auf Dateien.

Delphi-Referenz durchsuchenRenameFile / MSDN-Library durchsuchenMoveFile
Delphi-Referenz durchsuchenTFile.Move
uvm.

Captnemo 22. Mai 2015 16:22

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Zitat:

Zitat von darky95 (Beitrag 1302603)
Mit welchem Befehl kann ich die Datenbank mit den Dateinamen abgleichen und entsprechend verschieben(am besten ohne etwas klicken zu müssen)? Und erinnere ich mich richtig, dass MoveFile Datein verschob?

Den einen Befehl gibt's nicht, den wird's auch nie geben. Es sein denn, einer erfindet endlich den Button, der schon bevor ich ihn klick genau weiß, was ich von ihm will.

Jetzt mal im Ernst.
Eine Datenbank dient dazu, dort Daten abzulegen und abzurufen. Sie kann zwar auch (je nach Datenbank) einiges selbst mit den Daten machen, aber mit Sicherheit keine Mails verschicken.

darky95 22. Mai 2015 16:25

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Danke schonmal :)

Das Programm soll an sich nur anhand der Dateinamen die PDFs in verschiedene Ordner sortieren. Die Zuordnung steht in der DB.

Das verschicken mache ich dann per Hand, das ist nicht das Problem. (Werden ja ORDNERWEISE verschickt)

Das per Hand sortieren raubt mir jedoch immer mehrere Stunden.

jobo 22. Mai 2015 16:34

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
[klugscheiß]
Ich verschicke Email aus Oracle DB. Quasi mit Bordmitteln. Den Code dazu findet man im Internet.
Es ist auch m.E. gar nicht so unsinnig. Alle Daten die dabei entstehen bzw. benötigt werden, passen prima in eine DB und gehören da auch hin.
Und ich wette mal (ohne es zu wissen), das bspw. MS Exchange hauptsächlich aus Datenbank besteht.
Aber klar, den Knopf, der es macht wie der TE es haben will, den gibt's nicht.
Und das mit Excel ist natürlich praktisch, aber ich würde sagen, das taugt nicht für einen professionellen Einsatz, also am besten schnell wieder vergessen.
[/klugscheiß]

vagtler 22. Mai 2015 16:37

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Welche Datenbank? Wie sieht die Struktur der Zuordnungen aus?

p80286 22. Mai 2015 16:56

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Also nochmal von vorne:
  • a) es gibt eine Datenbank, in der steht welches Dokument D1,D2...Dz an welche Filiale geschickt werden muß.
  • b)irgendwo existiert eine Ansammlung von Verzeichnissen (für jede Filiale eines) in denen jeweils eine Kopie eines oder mehrerer Dokumente abgelegt werden soll/kann.
  • c)Irgendwann wird der Inhalt jedes Ordners gezipt und durch das Sekretariat and die entsprechende Filiale verschickt
.

ist das soweit richtig?

Wenn Ja dann
Code:
select 'copy '||filename||' '||filialverzeichnis||'\*.*' from Mydatabase where meinebedingung
//
select '7Zip '||filialverzeichnis'||'\*.* Zielverzeichnisunddatei' from MyDatabase where meinebedingung
damit hättest Du schon mal einen Ansatz.
(Das das Ergebnis der beiden Abfragen jeweils Zeilen in einer Batchdatei werden, muß wohl nicht erwähnt werden)

Zitat:

Zitat von jobo (Beitrag 1302614)
[klugscheiß]
Ich verschicke Email aus Oracle DB. Quasi mit Bordmitteln. Den Code dazu findet man im Internet.
Es ist auch m.E. gar nicht so unsinnig. Alle Daten die dabei entstehen bzw. benötigt werden, passen prima in eine DB und gehören da auch hin.

a) jo das geht
b) ist zum Glück bei uns abgeschaltet, was meinst Du wieviele Mails ich jede Woche aus der Queue kratze die irrtümlich versendet wurden?


Gruß
K-H

jobo 22. Mai 2015 17:09

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Zitat:

Zitat von p80286 (Beitrag 1302622)
..
Zitat:

Zitat von jobo (Beitrag 1302614)
[klugscheiß]
Ich verschicke Email aus Oracle DB. Quasi mit Bordmitteln. Den Code dazu findet man im Internet.
Es ist auch m.E. gar nicht so unsinnig. Alle Daten die dabei entstehen bzw. benötigt werden, passen prima in eine DB und gehören da auch hin.

..
b) ist zum Glück bei uns abgeschaltet, was meinst Du wieviele Mails ich jede Woche aus der Queue kratze die irrtümlich versendet wurden?
..

b) Ist ja eher ein organisatorisches oder Schulungsproblem oder so? Welches Tool zum Mail verschicken verwendet wird, ist ja zweitrangig, wenn der Benutzer dabei pennt.

Vlt. sollte ich noch ergänzen, dass es nicht um hauseigene Emails geht, sondern eine Seriendruckerweiterung eines Kundensystems. Bei regulierten Worklows kann da eigentlich nichts schief gehen.

Captnemo 22. Mai 2015 20:32

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Also, wenn man so eine Frage in einem Delphiforum stellt, gehe ich davon aus, dass auch eine Lösung, oder vielmehr ein Lösungsansatz, in Delphi/Lazarus erwartet wird.
Ansonsten würde man die Frage ja in einem Forum passend zur verwendeten DB z.b. Oracleforum stellen.

jobo 23. Mai 2015 07:21

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Ja, schon klar. Ich hab ja extra den [Klugsch..] Modus aktiviert. Ist nicht so wichtig und hilft dem TE sicher nicht.

Sir Rufo 23. Mai 2015 08:51

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Wozu die Dateien verschieben? Ich kann jede Datei in einen beliebigen Ordner eines ZIP-Archivs packen.

Also können die Dateien da bleiben, wo die sind und erzeuge einfach das ZIP-Archiv. Das kommt an die Mail und raus damit.

p80286 23. Mai 2015 12:06

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Naja wie Jobo schon zart andeutete, ist eine Frage der Organisation und Ausbildung. Wenn man ein Verzeichnis für eine Zieladresse hat, ist für die meisten Menschen einfacher damit umzugehen. Und so wie der TE das Problem beschrieben hat, ist der Arbeitsablauf sehr menschlich.

Gruß
k-H

Luckie 23. Mai 2015 12:38

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Hm. Nach dem Dateinamen in der DB suchen. Feld auslesen wohin und verschieben.

Code:
Dateiname | Ziel
a        | Verzeichnis A
b        | Verzeichnis B
c        | Verzeichnis C
So habe ich es verstanden.

darky95 28. Mai 2015 06:03

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Okay, habe mich vllt wirklich etwas blöd angestellt bei dem Erstellen des Themas.

Habe mir jetzt folgendes zusammengeschustert:

Code:
procedure TForm1.btnstartSortClick(Sender: TObject);
var i:Integer; fname, dirname : string;

begin
 
      for i:=1 to 248 do begin
      fname:= StringGrid.Cells[1,i];
      dirname:=StringGrid.Cells[2,i];

       if not DirectoryExists('C:\pdfbenannt\'+dirname+'\') then
              CreateDir('C:\pdfbenannt\'+dirname+'\') else
       if not FileExists('C:\pdfbenannt\'+fname+'.pdf') then break else
    end;
    showmessage('Schritt 1 fertig');

    for i:=1 to 248 do begin
      fname:= StringGrid.Cells[1,i];
      dirname:=StringGrid.Cells[2,i];

      renamefile('C:\pdfbenannt\'+dirname+'.pdf','C:\pdfbenannt\'+dirName+'\'+fname+'.pdf') ;
    end;
    showmessage('Schritt 2 fertig');
end;
Bis jetzt erstellt der Ablauf genau die richtigen Ordner, verfrachtet die Dateien jedoch nicht hinein. Kann mir jetzt jemand weiter helfen?

himitsu 28. Mai 2015 08:17

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Wieso gibst du eigentlich DirectoryExists und CreateDir einen Pfad ("Path" mit abschließendem "\") und kein Verzeichnis ("Dir") ?

Wenn man das mal halbwegs irdentlich formatiert ... Warum wird das Break nur gemacht, wenn das Verzeichnis existierte, aber die Datei nicht?
Wenn das Verzeichnis nicht existiert, dann existiert die Datei doch auch nicht.
Delphi-Quellcode:
if not DirectoryExists('C:\pdfbenannt\'+dirname+'\') then
  CreateDir('C:\pdfbenannt\'+dirname+'\')
else
  if not FileExists('C:\pdfbenannt\'+fname+'.pdf') then
    Break
  else
    {nix};
Warum eigentlich zwei Schleifen und wieso nur in der Ersten das Break?
Wenn man jetzt eine Fehlerprüfung einfügt, würde einem das schön auf die Füsse fallen, da die Funktion natürlich den Fehler "Datei existiert nicht" wirft.

Tipp: Delphi-Referenz durchsuchenForceDirectories

Zitat:

Zitat von darky95 (Beitrag 1303332)
verfrachtet die Dateien jedoch nicht hinein. Kann mir jetzt jemand weiter helfen?

Nee, aber warum fragst du RenameFile nicht? Das weiß doch das Warum und nennt es dir auch.

Delphi-Quellcode:
procedure TForm1.btnstartSortClick(Sender: TObject);
var
  i: Integer;
  fname, dirname: string;
begin
  for i := 1 to 248 do begin
    fname  := StringGrid.Cells[1, i];
    dirname := StringGrid.Cells[2, i];
    if not FileExists('C:\pdfbenannt\'+fname+'.pdf') then
      Break; // oder Continue?
    ForceDirectories('C:\pdfbenannt\'+dirname);
    if not RenameFile('C:\pdfbenannt\'+dirname+'.pdf','C:\pdfbenannt\'+dirName+'\'+fname+'.pdf') then
      RaiseLastOSError;
  end;
  ShowMessage(fertig');
end;
Delphi-Referenz durchsuchenRaiseLastOSError oder Delphi-Referenz durchsuchenRaiseLastWin32Error (in alten Delphis), bzw. MSDN-Library durchsuchenGetLastError und Delphi-Referenz durchsuchenSysErrorMessage
oder Delphi-Referenz durchsuchenTDirectory.CreateDirectory + Delphi-Referenz durchsuchenTFile.Move (CreateDirectory = ForceDirectories).

darky95 28. Mai 2015 11:09

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe das StrigGrid nochmal überarbeitet. Der Code sieht jetzt so (übernommen) aus:

Code:
procedure TForm1.btnstartSortClick(Sender: TObject);
var i:Integer; fname, dirname : string;
begin

    for i := 1 to 248 do begin
     fname := StringGrid.Cells[0, i];
     dirname := StringGrid.Cells[1, i];
     if not FileExists('C:\pdfbenannt\'+fname+'.pdf') then
       Continue; // oder Continue?
     ForceDirectories('C:\pdfbenannt\'+dirname);
      if not RenameFile('C:\pdfbenannt\'+dirname+'.pdf','C:\pdfbenannt\'+dirName+'\'+fname+'.pdf') then
       RaiseLastOSError;
   end;
   ShowMessage('fertig');
Nur kann ich mit der Fehlermeldung nichts anfangen (Das System kann die Datei nicht finden - obwohl sie genau in dem Ordner liegt!):|

himitsu 28. Mai 2015 11:34

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Bist'e dir da ganz sicher?

Groß-/Kleinschreibung ist zwar egal (außer es ist z.B. kein FAT/NTFS), aber sonst muß das 'C:\pdfbenannt\'+dirname+'.pdf' halt stimmen, was es wohl doch nicht tut.


PS: Strg+C im (Fehler)Dialog und als Text irgendwo wieder einfügen (Strg+V)
Vor das RenameFile ein
Delphi-Quellcode:
ShowMessage('C:\pdfbenannt\'+dirname+'.pdf');
-> Strg+C -> im Editor Strg+V -> den Pfad rauskopieren -> und dann mal probehalber in den Explorer kopieren und [Enter]

Mikkey 28. Mai 2015 15:17

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Zitat:

Zitat von darky95 (Beitrag 1303373)
Habe das StrigGrid nochmal überarbeitet. Der Code sieht jetzt so (übernommen) aus:

Code:
procedure TForm1.btnstartSortClick(Sender: TObject);
var i:Integer; fname, dirname : string;
begin

    for i := 1 to 248 do begin
     fname := StringGrid.Cells[0, i];
     dirname := StringGrid.Cells[1, i];
     if not FileExists('C:\pdfbenannt\'+fname+'.pdf') then
       Continue; // oder Continue?
     ForceDirectories('C:\pdfbenannt\'+dirname);
      if not RenameFile('C:\pdfbenannt\'+dirname+'.pdf','C:\pdfbenannt\'+dirName+'\'+fname+'.pdf') then
       RaiseLastOSError;
   end;
   ShowMessage('fertig');
Nur kann ich mit der Fehlermeldung nichts anfangen (Das System kann die Datei nicht finden - obwohl sie genau in dem Ordner liegt!):|

Bist Du sicher, dass das so gehört, einmal
if not FileExists('C:\pdfbenannt\'+fname+'.pdf')
und danach
RenameFile('C:\pdfbenannt\'+dirname+'.pdf'
??

darky95 29. Mai 2015 07:03

AW: PDF-Datein nach Datenbankvorgabe verschieben
 
Mit folgendem Code hat's wunderbar funktioniert:

Code:
for i := 1 to 248 do begin
     fname := StringGrid.Cells[0, i];
     dirname := StringGrid.Cells[1, i];
     
     if not FileExists('C:\pdfbenannt\'+fname) then
       Continue; // oder Continue?
     ForceDirectories('C:\pdfbenannt\'+dirname);
   
      if not RenameFile('C:\pdfbenannt\'+fname,'C:\pdfbenannt\'+dirName+'\'+fname) then
       RaiseLastOSError;
      ProgressBar1.Position:=ProgressBar1.position+7;
   end;
Vielen Dank an alle! :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz