Beispiel - EWORK Heftungsscript
- Former user (Deleted)
- Dennis Balzuweit
Erläuterung
Dieses Beispiel entspricht der Standard Installations-Auslieferung des EWORK Heftungsscripts FixPageCount in der Version 5.3.1.
Das Skript führt eine feste Heftung durch. Über die Parametrisierung können Sie folgende Funktionen steuern
PageCount
Page Count ist vermutlich der wichtigste Parameter. Er steuert wie viele Seiten fix zu einem Dokument bzw. zu einer Heftung gehören.
Mit andern Worten über die Angabe einer natürlichen Zahl ohne Dezimalstellen, kann angegeben werden nach wie vielen Seiten die Heftung
automatisch durchgeführt wird.
ExecuteUserexits
Der Parameter kann True oder False annehmen. Ist er True, dann werden für alle Felder die UserExits ausgeführt. Seien Sie sich aber
bewusst, dass ein Userexit auch eine Benutzerinteraktion benötigen und die automatische Heftung dadurch unterbrochen
werden kann.
HaltOnError
Der Parameter kann True oder False annehmen. Ist er True, dann wird die Verarbeitung an der Stelle unterbrochen, an der der Fehler
aufgetreten ist. Die zur Zeit des Fehlers in der Verarbeitung befindlichen Dokumente bleiben selektiert. Bei folgendem Fehlverhalten kann ein
Fehler auftreten:
1. Die Userexits haben einen Fehler produziert.
2. Die Heftung konnte nicht durchgeführt werden, weil z.B. Pflichtfelder nicht gefüllt sind.
Ist der Parameter auf False gesetzt werden nachfolgende mögliche Heftungen weiter bearbeitet.
MoveFailedDocsToReserve
Der Parameter kann True oder False annehmen. Ist er True, dann werden die Dokumente die nicht geheftet werden konnten automatisch in die Rückstellungen verschoben. Ist er False verbleiben die Dokumente im Stapel.
PageVisibility
Standardmäßig wird immer die letzte Seite der Heftung angezeigt wenn EWORK wegen einer Unterbrechung stoppt. Dieses Verhalten kann mit dem Parameter geändert werden.
Folgende Werte sind möglich:
1. Last (Default) die letzte Seite wird angezeigt.
2. First die erste Seite der Heftung wird angezeigt
RecognitionFromModus
Standardmäßig werden die Recognitionwerte immer überschrieben somit wird der letzte gültige Wert je Heftung in das zugewiesene Feld übertragen. Folgende Modi gibt es:
1. LAST (Default) Der letzte Wert wird zugewiesen
2. FIRST: Der erste gefundene Wert wird zugewiesen die andren verworfen
3. CUMMULATE: Die Werte werden hintereinander weg geschrieben und mit , voneinander abgetrennt.
Skript
// ================================================================================== // Name.............: EWORK Heftungsscript - FixPageCount // ---------------------------------------------------------------------------------- // Company..........: CTO Balzuweit GmbH // ---------------------------------------------------------------------------------- // Creation.........: 18.07.2011 // Changed..........: 10.05.2019 // ================================================================================== // ---------------------------------------------------------------------------------- // Die Funktion führt sofern konfiguriert für jedes Feld die Userexits und // nachfolgende die Heftung aus. // ---------------------------------------------------------------------------------- function executeUserExits(HALT_ON_ERROR,fromIndexToIndex):boolean; var i : Integer; begin result := true; for i := 0 to ccFields.Count-1 do begin try ccApplication.ShowStatus('Executing userexits',ccFields.GetDisplayText(i),fromIndexToIndex[3]); ccApplication.ExecuteUserexit(i); except ccApplication.ShowStatus('Executing userexits','Error',fromIndexToIndex[3]); if HALT_ON_ERROR then begin result:=false; end; exit; end; end; end; // ---------------------------------------------------------------------------------- // Die Funktion berechnet den Fortschritt in Prozentselectiert alle relevante Seiten // fuer die aktuelle Heftung. // ---------------------------------------------------------------------------------- function getExecutionStatusInProcent(position,maxCount):Integer; begin if maxCount = 0 then begin result := 100; exit; end; result := position * 100 / maxCount; end; // ---------------------------------------------------------------------------------- // Die Funktion selectiert alle relevante Seiten fuer die aktuelle Heftung // ---------------------------------------------------------------------------------- function selectPages(BlobList;startIndex;endIndex,SHOW_DOCS):Integer; var selectPageFirst : Boolean; i : Integer; begin result := 0; selectPageFirst := upperCase(ccScriptEngine.GetResource('PageVisibility','Last')) = 'FIRST' ; if selectPageFirst = true then begin for i := endIndex downto startIndex do begin ccApplication.SelectBlob(BlobList[i],SHOW_DOCS); inc(result); end; end else begin for i := startIndex to endIndex do begin ccApplication.SelectBlob(BlobList[i],SHOW_DOCS); inc(result); end; end; end; // ---------------------------------------------------------------------------------- // Die Funktion führt die Heftung durch // ---------------------------------------------------------------------------------- function executeTacks(BlobList,HALT_ON_ERROR, MOVE_FAILED_DOCS_TO_RESERVE,fromIndexToIndex):boolean; var TackNr : Integer; i : Integer; TackId : String; SeparatorId : Variant; begin TackNr := fromIndexToIndex[2]; TackId := CreateId; ccApplication.ShowStatus('Creating tack',inttostr(TackNr),fromIndexToIndex[3]); //SeperatorPage bestimmen SeparatorId := BlobList[fromIndexToIndex[1]]; if ccApplication.CreateTack(TackId) = false then begin if HALT_ON_ERROR = True then begin result:=False; exit; end; if MOVE_FAILED_DOCS_TO_RESERVE = True then begin //Do it in the reserve area... for i:= fromIndexToIndex[0] to fromIndexToIndex[1] do ccApplication.ChangeBlob(BlobList[i],ccQS_OnHold,''); end; end; Result := True; end; // ---------------------------------------------------------------------------------- // Die Funktion führt selektiert alle Dokumente, führt sofern gewünscht die // Userexits aus und heftet die Dokumente. Dabei wird über den Array fromIndexToIndex // bestimmt von welchem Dokument zu welchem Dokument geheftet werden soll. // ---------------------------------------------------------------------------------- procedure BuildTack(lastRecoResult;Switch_Sep_UserExit_Move_Halt;BlobList;fromIndexToIndex,SHOW_DOCS); var EXECUTE_USER_EXITS : boolean; MOVE_FAILED_DOCS_TO_RESERVE : boolean; HALT_ON_ERROR : boolean; startIndex : Integer; toIndex : Integer; countPages : Integer; begin EXECUTE_USER_EXITS := Switch_Sep_UserExit_Move_Halt[0]; MOVE_FAILED_DOCS_TO_RESERVE := Switch_Sep_UserExit_Move_Halt[1]; HALT_ON_ERROR := Switch_Sep_UserExit_Move_Halt[2]; startIndex :=fromIndexToIndex[0]; toIndex :=fromIndexToIndex[1]; countPages :=selectPages(BlobList,startIndex, toIndex,SHOW_DOCS); if countPages >0 then begin ccRecognition.FillIndexMask(lastRecoResult); if EXECUTE_USER_EXITS = True then begin if executeUserExits(HALT_ON_ERROR,fromIndexToIndex) = False then raise ('exception on execution user exits'); end; if executeTacks(BlobList,HALT_ON_ERROR, MOVE_FAILED_DOCS_TO_RESERVE, fromIndexToIndex) = False then raise ('exception on tack execution'); end ccApplication.UnSelectAllBlobs(ccWS_Stack); ccApplication.PrepareIndexmask; end; // ---------------------------------------------------------------------------------- // Die Funktion geht durch alle Recowerte die erfasst worden sind und gibt beim // ersten das valide gefüllt wurde den Wert zurück. // ----------------------------------------------------------------------------------* function getRecoResult(actualRecoResult):String; var i : Integer; begin result := ''; for i:=0 to High(actualRecoResult) do begin if actualRecoResult[i,1] >'' then begin result := actualRecoResult[i,1]; exit; end; end; end; // ---------------------------------------------------------------------------------- // Die Funktion Verarbeitet je nach RecoModus der aus den Resourchen gelesen wird // die Recognitionwerte. // ---------------------------------------------------------------------------------- function AccumulateRecoResult(RecoModus:Integer;var LastValues, ActualValues: Variant):Variant; var i : Integer; begin for i:=0 to High(ActualValues) do begin case RecoModus of 1 : //Erster Wert begin if VarToStr(LastValues[i,1]) > '' then begin continue; end else begin if VarToStr(ActualValues[i,1]) > '' then begin LastValues[i,1] := ActualValues[i,1]; end; end; end; 2 : //Letzter Wert begin if VarToStr(ActualValues[i,1]) > '' then begin LastValues[i,1] := ActualValues[i,1]; end; end; else //Aufsummiert begin LastValues[i,1] := VarToStr(LastValues[i,1]) + ',' + ActualValues[i,1]; end; end; end; Result := LastValues; end; // ---------------------------------------------------------------------------------- // Die Funktion gibt den gesetzten Recognition-Modus zurück Last ist Default // ---------------------------------------------------------------------------------- function getRecognitionModus:Integer; var Modus : String; begin Modus := Uppercase(ccScriptEngine.GetResource('RecognitionFromModus','Last')); if Pos('CUMMULATE',Modus) > 0 then begin Result := 3; end else if Pos('FIRST',Modus) > 0 then begin Result := 1; end else begin Result := 2; end; end; var FIX_TACK_COUNT : Integer; RECOGNITION_MODUS : Integer; EXECUTE_USER_EXITS : Boolean; MOVE_FAILED_DOCS_TO_RESERVE : Boolean; HALT_ON_ERROR : Boolean; DEBUG : Boolean; SHOW_DOCS : Boolean; LASTOBJECT : String; Switch_Sep_UserExit_Move_Halt : Variant; FromIndexToIndex : Variant; BlobList : Variant; actualRecoResult : Variant; lastRecoResult : Variant; ListSize : Integer; tempRecoResults : Variant; tempDocCount : Integer; tempRecoResult : String; i : Integer; moveMode : Boolean; hasTempRecoResult : Boolean; begin //Anzahl Seiten nach der eine Heftung erfolgen soll FIX_TACK_COUNT := ccScriptEngine.GetResource('PageCount',3); EXECUTE_USER_EXITS := ccScriptEngine.GetResource('ExecuteUserexits',True); MOVE_FAILED_DOCS_TO_RESERVE := ccScriptEngine.GetResource('MoveFailedDocsToReserve',False); HALT_ON_ERROR := ccScriptEngine.GetResource('HaltOnError',False); DEBUG := ccScriptEngine.GetResource('Debug',True); LASTOBJECT := ccScriptEngine.GetResource('PageVisibility','Last'); RECOGNITION_MODUS := getRecognitionModus(); SHOW_DOCS := VarToBoolean(ccScriptEngine.GetResource('Silent',False) = False); if DEBUG = True then begin showMessage('FixPageCount v2.0 - Parameter: PageVisibility=' + LASTOBJECT + ', ExecuteUserExits=' + VarToStr(EXECUTE_USER_EXITS) + ', MoveFailedDocs=' + VarToStr(MOVE_FAILED_DOCS_TO_RESERVE) +', FixCount='+intToStr(FIX_TACK_COUNT)+', HaltOnError='+VarToStr(HALT_ON_ERROR)); end; Switch_Sep_UserExit_Move_Halt := [ EXECUTE_USER_EXITS ,MOVE_FAILED_DOCS_TO_RESERVE ,HALT_ON_ERROR ]; fromIndexToIndex := [-1,-1,0,0]; //HeftungVonPage,HeftungToPage,Akt. HeftungNr, VerlaufInProzent try ccApplication.ShowStatus('Tacking','Initialize',0); ccApplication.UnSelectAllBlobs(ccWS_Stack); if ccScriptEngine.Application = 'EWORKBATCH' then ccApplication.PrepareIndexmask; //Liste aufbauen mit allen Blobs BlobList := ccApplication.GetBlobList(ccWS_Stack,false,''); //Anzahl Scans ermitteln ListSize := VarArrayHighBound(BlobList,1); //Verarbeiten nur wenn es Dokumente gibt. if ListSize >= 0 then begin fromIndexToIndex[0] := 0; tempDocCount :=1; tempRecoResult :=''; moveMode := false; hasTempRecoResult := false; // Gehe durch alle Blobs for i:=0 to ListSize do begin //***************** Fortschritt ermitteln ****************** fromIndexToIndex[3] := getExecutionStatusInProcent(i,ListSize); //***************** Führe für Seite I die Recognition durch ****************** tempRecoResults := ccRecognition.Execute(BlobList[i]); tempRecoResult := getRecoResult(tempRecoResults); if hasTempRecoResult = true then begin actualRecoResult:= AccumulateRecoResult(RECOGNITION_MODUS, actualRecoResult, tempRecoResults) end; if (tempRecoResult > '') and (hasTempRecoResult = false) then begin actualRecoResult := tempRecoResults; hasTempRecoResult:= true; end; if (moveMode = false) and (tempDocCount = FIX_TACK_COUNT) then begin fromIndexToIndex[1] := i; try if not hasTempRecoResult then begin actualRecoResult := tempRecoResults; end; fromIndexToIndex[2]:= fromIndexToIndex[2] +1; //Seitenzähler BuildTack(actualRecoResult,Switch_Sep_UserExit_Move_Halt,BlobList,fromIndexToIndex,SHOW_DOCS); hasTempRecoResult := false; except exit; end; //Wenn die Anzahl bis zur letzten Seite nicht mehr der Anzahl der Heftung entspricht und in die Rückstellung verschoben werden soll //dann leg den Schalter um if ((ListSize - fromIndexToIndex[1]) < FIX_TACK_COUNT) AND (MOVE_FAILED_DOCS_TO_RESERVE = True) then moveMode := True; tempDocCount := 0; fromIndexToIndex[0] := i+1; end else if moveMode = True then begin ccApplication.ChangeBlob(BlobList[i],ccQS_OnHold,''); end; inc(tempDocCount); // ------- Prüfung ob ESC gedrückt worden ist ------------------------------- If ccRecognition.Stop Then Begin ccApplication.ShowStatus('User has stopped the execution (ESC)','Exit...',0); Exit; End; end; ccApplication.UnSelectAllBlobs(ccWS_Stack); end; finally ccApplication.CloseStatus; end; end;