Archiv für die Kategorie ‘Trick’

Hi Leute,

ich kam mal wieder dazu eine Laufendenummer in einem Report anzeigen lassen zu wollen. Bis Dato konnte/habe ich diese immer in NAV erstellt und dann in das Dataset mit übernommen. Nun aber musste dies im RDLC selber berechnen da die Sortierung im Dataset und im Layout unterschiedlich waren. Hier eine ganz simple Lösung:

1. Wir erstellen eine eigene Funktion + Variable im Custom Code Bereich des Reports

Custom Code Bereich

snap2188 snap2189

Der einzufügende Code:

Dim GroupCnt as Integer=0
Function GetGroupRownumber() as String
 GroupCnt=GroupCnt+1
 return GroupCnt.ToString()
 End Function

2. Diese sprechen wir in dem Control unserer Wahl an:

=Code.GetGroupRownumber()

3. Wir erfreuen uns an der hochzählenden, laufenden Nr. 🙂

 

Im Prinzip macht diese Funktion nichts anderes als eine integer Variable hochzuzählen. Da diese Funktion aber nur ausgeführt wird wenn sie auch angezeigt wird werden nicht eingeblendete Controls nicht mit gezählt! Werden Zeilen also aus diversen Gründen nicht angezeigt, werden diese auch nicht mit gezählt 🙂

 

Mit freundlichen Grüßen, Matthias König

Advertisements

Datensatzwert in SQL vergleichen

Veröffentlicht: 2. März 2011 in SQL, Trick

Wie schon angekündigt, hier der SQL Befehl um Datensätze, bzw. bestimmte Felder zweier zusammengehörender (selber Primary Key) Datensätze in unterschiedlichen Tabellen auf Differenzen zu überprüfen:

(Beispiel der Customer Tabelle in Live und Dev Datenbank)

SELECT
 'DevDatabse' TableID
 ,[No_]       
 ,[Name]       
 ,[Quantity]
FROM [DataBase_Dev].[dbo].[Company$Customer] as TableOne
WHERE
 BINARY_CHECKSUM(
 TableOne.[Name]
 ,TableOne.[Post Code]
 ,TableOne.[City]
 ,TableOne.[Fax No_]
 ,TableOne.[E-Mail]
 ,TableOne.[Home Page]
 <>
 (SELECT BINARY_CHECKSUM(
 TableTwo.[Name]
 ,TableTwo.[Post Code]
 ,TableTwo.[City]
 ,TableTwo.[Fax No_]
 ,TableTwo.[E-Mail]
 ,TableTwo.[Home Page]
 )
 FROM DataBase_Live].[dbo].[Company$Customer] as TableTwo
 WHERE TableTwo.[No_]  = TableOne.[No_]

Hier wurde die Build-in-Function BINARY_CHECKSUM verwendet. Diese errechnet ein Prüfsummenwert aus den angegebenen Werten, der zum Vergleich verwendet werden kann. Innerhalb dieser Funktion, können die zu überprüfenden Felder eingetragen werden. Leider kann man sich hier das Leben nicht einfach machen in dem man ‚*‘ eingibt weil hier der in SQL intern verwendete Timestamp fast immer unterschiedlich sein wird ;).

Mit freundlichen Grüßen,

Matthias König

Tabelleninhalt in SQL vergleichen

Veröffentlicht: 9. Februar 2011 in SQL, Tipp, Trick

Oder auch „Ist der Datensatz in beiden Tabellen vorhanden?“

Um einen Automatismus per Webservice zu steuern, musste ich DataPorts in Codeunits umschreiben (NAS und Webservice :D) und in diesem Zuge wollte ich am Ende die Importierten Daten im Vergleich zum DataPort überprüfen. Zu allerersteinmal wollte ich kontrollieren ob alle Datensätze importiert wurden, also ob beide Varianten die selben Datensätze erzeugen. Dafür habe ich den Dataport in einem Mandanten gestartet und die Codeunit in einem anderen Mandanten. Nun können diese per SQL einfach gegenübergestellt werden, sodass verglichen werden kann, wo ein Datensatz fehlt. Da dies allerdings (meines Wissens nach) nicht mit einem Script geht, habe ich zwei kleine gebastelt. Mit den nun folgenden SQL Scripten (natürlich abgeändert 😉 ) können Daten zweier Tabellen verglichen werden:

-- es fehlt etwas in TabelleEins
SELECT *
FROM [DatenBank].[dbo].[MandantEins$Tabelle XYZ] AS TabelleInEins
LEFT JOIN [DatenBank].[dbo].[MandantZwei$Tabelle XYZ] AS TabelleInZwei
ON TabelleInEins.ID = TabelleInZwei.ID
WHERE TabelleInZwei.ID is null
-- es fehlt etwas in TabelleZwei
SELECT *
FROM [DatenBank].[dbo].[MandantEins$Tabelle XYZ] AS TabelleInEins
RIGHT JOIN [DatenBank].[dbo].[MandantZwei$Tabelle XYZ] AS TabelleInZwei
ON TabelleInEins.ID = TabelleInZwei.ID
WHERE TabelleInEins.ID is null

Die Tage wird wohl noch ein „Datensatzwert in SQL vergleichen“ Artikel erscheinen, da ich natürlich noch die Richtigkeit der restlichen importierten Daten überprüfen muss.

Diese Scripte mögen nicht das non-plus Ultra seien aber sie haben mir ihren Dienst erwiesen 🙂 Verbesserungsvorschläge/Alternativ-Scripte gern als Kommentar.

Mit freundlichen Grüßen, Matthias König

Es gibt die Möglichkeit, eine Excel interne Funktion zu verwenden, um ein wunderschönes Diagramm in NAV anzuzeigen. Hierfür muss selbstverständlich Excel auf dem ausführendem Rechner installiert sein, sodass diese externe Ressource als Automation Server angesprochen werden kann.

Die Vorgehensweise ist folgende: Es wird ein Excel-Sheet erstellt und dies wird mit den gewünschten Daten gefüllt. Daraufhin wird per Code ein Diagramm angelegt sowie die eine sogenannte ChartRange definiert. Diese „range“, in der unsere importierten Daten sich befinden, ist die Datenquelle unseres Diagramms sodass diese das Diagramm bilden.

Dieses Diagramm exportierten wir nun als .bmp! Spätestens ab hier, weiß der NAV Entwickler, dass wir diese Bild Dateien importieren und anzeigen können. Nun kann z.B. über TempBlob (Tabelle) eine Temporäre Record Variable angelegt werden, sodass dieses Bild in NAV angezeigt werden kann.

Um das alles nicht immer wieder neu machen zu müssen, habe ich eine kleine Codeunit geschrieben, die dafür verwendet werden kann: ExcelDiagramManagement. Des Weiteren ist eine Beispielform (+Tabelle) und ein Report mit in diesem Paket.

Diese ist natürlich sehr, sehr rudimentär und unterstützt nur sehr simple Diagramme aber ich denke sie zeigt die Möglichkeiten mit diesem Automation Server.

Außerdem hier noch weitere Diagrammarten:

http://msdn.microsoft.com/en-us/library/bb241008%28office.12%29.aspx

Das Beispiel-Paket:
http://dl.dropbox.com/u/38246410/nav/EDM1.0.zip – ExcelDiagrammManagement 1.0

edit:
So, weil ich zwischenzeitlich den Provider gewechselt hatte, und WordPress mir einen Strich durch die Rechnung gemacht hat, liegt die Datei nun bei DropBox. Das sollte konsistent sein.Einfach den Pfad kopieren und in die Adresszeile des Browsers einfügen.

Die Parameter COVERAGELOG und COVERAGEFILENAME sind sehr nützliche Parameter die einem bei der Fehlersuche helfen können. Mit Hilfe dieser, können für gewisse Abläufe (oder grundsätzlich) der/die Code Coverage gestartet werden. Zum Beispiel, wenn beim Starten von NAV ein Fehler auftritt sodass vorher Code Coverage gar nicht gestartet werden kann, kann eine Verknüpfung der fin(sql).exe erstellt werden, die den (zusätzlichen) Parameter COVERAGELOG bekommt.

Mit Hilfe dieses Parameters wird der Code Coverage vor NAV gestartet sodass jede Aktion mit geloggt wird.

Falls allerdings nur gewisse Abschnitte mit geloggt werden sollen, kann der Parameter ignoriert (bzw. brauch dieser nicht gesetzt werden) werden und es kann die folgende Code Zeile an die entsprechende Stelle geschrieben werden:

COVERARGELOG([boolean value]);

Damit wird der Code Coverage gestartet. Respektive mit COVERAGELOG(FALSE) wieder beendet. Wenn ein Anwender also nur gelegentlich ein Fehler bei der (Beispielsweise) Angebotserstellung hat und das Problem nicht rekonstruierbar ist, kann diese Funktion helfen. Es kann (beispielsweise) beim OnOnit der Form COVERAGELOG gesetzt werden, sodass jedes Mal, wenn ein Angebote erstellt werden, das Code Coverage mit läuft. Sobald der Fehler wieder auftritt, könnte man sich diesen anschauen um dem Fehler evtl. auf die Schliche zu kommen. Hier könnte einem allerdings auch schon ein kleines Problem auffallen: Man muss sich direkt mit dem Kunden Verbinden und die Code Coverage Form mit ihm zusammen analysieren. Aber auch dafür gibt es eine Lösung: COVERAGEFILENAME!

Wenn der Client mit diesem Parameter gestartet wird, wird alles was im Code Coverage gesichert wird, als binary in diese Textdatei gespeichert. Außerdem wird diese Datei beim Start auch geladen! Das heißt, dass wenn dies ein Netzlaufwerkpfad wäre, auf man auch Zugriff hat, dieses Log bequem und in Ruhe von dem eigenen Arbeitsplatz analysiert werden kann.

Selbstverständlich können diese Parameter (+Funktion) miteinander kombiniert werden.

Mit freundlichen Grüßen,

Matthias König

Ja, auch das geht mit NAV! Allerdings ist Siherunterladencherheit ein nicht ganz so groß geschriebenes Wort an dieser Stelle. Verwendet wird die von ftp.exe von Microsoft. Hierfür kann prinzipiell eine Konfigurationsdatei erstellt werden und per Console (Ausführen –> cmd)  ausgeführt werden. Das bedeutet für uns, dass wir dies in NAV auch nutzen können.

Die Idee

Wir erstellen eine Konfigurations-Datei und verwenden diese direkt per ftp.exe in kombination mit der Console.

Voraussetzungen

Wir benötigen also Benutzername, Passwort, Hostname und Dateiname der zu herrunterladenenen Datei sowie der Pfad, wo diese hingespeichert werden soll.

Die Umsetzung

Wir erstellen eine Codeunit die dafür zuständig ist, Dateien von einem FTP Server herrunter zu laden. Dieser verbindet sich mit einem Benutzerkonto auf einen FTP Server und lädt eine Datei in ein ausgewählten Pfad. In der Codeunit gibt es folgende Funktionen:

  • setHideDialog – Dialogbox ein bzw. auschalten.
  • XENVIRON – Umgebungsvariable abrufen, wird verwendet um die Konfigurationsdatei in den TEMPORARAYPATH zu sichern.
  • FileExists – Kontrolle ob eine Datei schon existiert. Wichtig für Timeout!
  • getFTPData – Daten vom FTP abrufen.

Der Quellcode

Hier der exportierte AL-Code als Textexport:

OBJECT Codeunit 50008 FTP Data
{
  OBJECT-PROPERTIES
  {
    Date=01.09.10;
    Time=12:57:38;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            getFTPData('Matt', '*1*2*3*4', 'irgendeinFTP.de/', 'c:/temp/', 'Test.zip');
          END;

  }
  CODE
  {
    VAR
      HideDialog@1000000000 : Boolean;

    PROCEDURE setHideDialog@1000000002(value@1000000000 : Boolean);
    BEGIN
      HideDialog := value;
    END;

    PROCEDURE XENVIRON@1000000001(Value@1000000000 : Text[50]) : Text[1024];
    VAR
      WshShell@1000000001 : Automation "{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{72C24DD5-D70A-438B-8A42-98424B88AFB8}:'Windows Script Host Object Model'.WshShell";
    BEGIN
      // Webservices and RTC
      IF ISSERVICETIER THEN BEGIN
        CREATE(WshShell, TRUE, TRUE);
        EXIT( WshShell.ExpandEnvironmentStrings('%' + Value + '%') );
      END ELSE BEGIN
        EXIT( ENVIRON(Value) );
      END;
    END;

    PROCEDURE FileExists@1140002(Foldername@1140000 : Text[256]) : Boolean;
    VAR
      FileSystemObject@50000 : Automation "{420B2830-E718-11CF-893D-00A0C9054228} 1.0:{0D43FE01-F093-11CF-8940-00A0C9054228}:'Microsoft Scripting Runtime'.FileSystemObject";
    BEGIN
      IF ISCLEAR(FileSystemObject) THEN
        CREATE(FileSystemObject, TRUE, TRUE);
      EXIT(FileSystemObject.FileExists(Foldername));
    END;

    PROCEDURE getFTPData@1000000000(UsernameValue@1000000025 : Text[250];PasswordValue@1000000026 : Text[250];HostAddressValue@1000000027 : Text[1024];DestPathValue@1000000028 : Text[1024];FileNameValue@1000000029 : Text[1024]);
    VAR
      CommandsFile@1000000000 : File;
      MSShell@1000000018 : Automation "{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{72C24DD5-D70A-438B-8A42-98424B88AFB8}:'Windows Script Host Object Model'.WshShell";
      FileSystemObject@1000000017 : Automation "{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{0D43FE01-F093-11CF-8940-00A0C9054228}:'Windows Script Host Object Model'.FileSystemObject";
      WindowStyle@1000000006 : Variant;
      WaitOnReturn@1000000005 : Variant;
      DateText@1000000024 : Text[8];
      MemberNo@1000000023 : Text[6];
      HostAddress@1000000022 : Text[1024];
      CommandsFileTxt@1000000021 : Text[1024];
      FileName@1000000019 : Text[1024];
      DestinationFilePath@1000000015 : Text[1024];
      Password@1000000009 : Text[250];
      UserName@1000000008 : Text[250];
      sleepIndex@1000000004 : Integer;
      maxTimeOutMilSec@1000000003 : Integer;
      maxTimeOut@1000000002 : Integer;
      timeOut@1000000001 : Integer;
      dlg@1000000007 : Dialog;
    BEGIN
      // ###############################################################################################################################
      // Parameter
      // ###############################################################################################################################
      // Datei mit KLARTEXT Einlogg-Daten
      CommandsFileTxt := XENVIRON('TEMP') + '\__TEMP__984613516~65435164.txt';
      maxTimeOutMilSec := 60000; // 60 Sekunden Timout

      // Zugangsdaten
      UserName := UsernameValue;
      Password := PasswordValue;
      HostAddress := HostAddressValue;

      DestinationFilePath := DestPathValue;
      FileName := FileNameValue;

      // ###############################################################################################################################

      // Timeout-Berechnung
      maxTimeOut := maxTimeOutMilSec / 500;
      IF (maxTimeOutMilSec = 0) AND (maxTimeOut = 0) THEN BEGIN
        maxTimeOutMilSec := 10000;
        maxTimeOut := maxTimeOutMilSec / 500;
      END;

      IF NOT HideDialog THEN BEGIN
        dlg.OPEN('Datei wird abgerufen #1###################\'+
          'Status               #2###################\'+
          'Timeout              #3###################');

        dlg.UPDATE(1, FileName);
        dlg.UPDATE(2, 'Anfrage wird erstellt');
      END;

      IF ISCLEAR(MSShell) THEN
        CREATE(MSShell);

      IF ISCLEAR(FileSystemObject) THEN
        CREATE(FileSystemObject);

      CommandsFile.TEXTMODE(TRUE);
      CommandsFile.WRITEMODE(TRUE);

      // Wenn die Datei nicht erstellt werden kann, muss diese erst gel”st werden (noch existent)
      IF NOT CommandsFile.CREATE(CommandsFileTxt) THEN BEGIN
        // Prozess Beenden, falls noch im Zugriff
        // MSShell.ShellExecute('cmd', '/c TASKKILL /F /IM FTP.EXE /T', '', '', 0 );
        MSShell.Exec('/c TASKKILL /F /IM FTP.EXE /T');
        FileSystemObject.DeleteFile(CommandsFileTxt, TRUE);
        CommandsFile.CREATE(CommandsFileTxt)
      END;

      CommandsFile.WRITE(UserName);
      CommandsFile.WRITE(Password);
      CommandsFile.WRITE('binary');
      CommandsFile.WRITE('get ' + FileName+ ' "' + DestinationFilePath + '"' );
      CommandsFile.WRITE('quit');

      CommandsFile.TRUNC;
      CommandsFile.CLOSE;

      // MESSAGE('%1', STRSUBSTNO('ftp -s:"%1" %2', CommandsFileTxt, HostAddress));
      // ERROR('');
      // Abruf! Request!
      WindowStyle := 0; // nicht sichtbar
      WaitOnReturn := FALSE; // asynchron

      // An dieser Stelle wird die Datei aufgegriffen und mit ftp.exe verwendet
      MSShell.Run(STRSUBSTNO('ftp -s:"%1" %2', CommandsFileTxt, HostAddress), WindowStyle, WaitOnReturn);

      // wait for it! TimeOut!
      REPEAT
        IF NOT HideDialog THEN BEGIN
          // kein "flackern"
          dlg.UPDATE(2, '');
          dlg.UPDATE(2, 'Warte auf Antwort');
        END;

        SLEEP(500);
        timeOut += 1;

        IF NOT HideDialog THEN BEGIN
          // kein "flackern"
          dlg.UPDATE(3, '');
          dlg.UPDATE(3, (500 * timeOut) / 1000);
        END;

      UNTIL (FileExists(DestinationFilePath)) OR (timeOut = maxTimeOut);

      // Datei erhalten
      IF (timeOut <> maxTimeOut) THEN BEGIN
        IF NOT HideDialog THEN BEGIN
          dlg.UPDATE(2, '');
          dlg.UPDATE(2, 'Antwort erhalten!');
          // zur Darstellung
          SLEEP(1000);
        END;
      END ELSE BEGIN
      // keine Datei erhalten
        IF NOT HideDialog THEN BEGIN
          dlg.UPDATE(2, '');
          dlg.UPDATE(2, 'Antwort nicht erhalten!');
          // zur Darstellung
          SLEEP(1000);
        END;
      END;

      // Datei sicherheitshalber l”schen, Loggindaten im Klartext enthalten
      IF FileExists(CommandsFileTxt) THEN BEGIN
        // MSShell.Exec('/c TASKKILL /F /IM FTP.EXE /T');
        FileSystemObject.DeleteFile(CommandsFileTxt, TRUE);
      END;

      IF NOT HideDialog THEN
        dlg.CLOSE;
    END;

    BEGIN
    END.
  }
}

Falls sich hier der Fehlerteufel eingeschlichen hat, bitte ich um ein Kommentar 🙂

Gruß,

Matthias König

OBJECT Codeunit 50008 FTP Data
{
OBJECT-PROPERTIES
{
Date=01.09.10;
Time=12:57:38;
Modified=Yes;
Version List=;
}
PROPERTIES
{
OnRun=BEGIN
getFTPData(‚Matt‘, ‚*1*2*3*4‘, ‚irgendeinFTP.de/‘, ‚c:/temp/‘, ‚Test.zip‘);
END;}
CODE
{
VAR
HideDialog@1000000000 : Boolean;

PROCEDURE setHideDialog@1000000002(value@1000000000 : Boolean);
BEGIN
HideDialog := value;
END;

PROCEDURE XENVIRON@1000000001(Value@1000000000 : Text[50]) : Text[1024];
VAR
WshShell@1000000001 : Automation „{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{72C24DD5-D70A-438B-8A42-98424B88AFB8}:’Windows Script Host Object Model‘.WshShell“;
BEGIN
// Webservices and RTC
IF ISSERVICETIER THEN BEGIN
CREATE(WshShell, TRUE, TRUE);
EXIT( WshShell.ExpandEnvironmentStrings(‚%‘ + Value + ‚%‘) );
END ELSE BEGIN
EXIT( ENVIRON(Value) );
END;
END;

PROCEDURE FileExists@1140002(Foldername@1140000 : Text[256]) : Boolean;
VAR
FileSystemObject@50000 : Automation „{420B2830-E718-11CF-893D-00A0C9054228} 1.0:{0D43FE01-F093-11CF-8940-00A0C9054228}:’Microsoft Scripting Runtime‘.FileSystemObject“;
BEGIN
IF ISCLEAR(FileSystemObject) THEN
CREATE(FileSystemObject, TRUE, TRUE);
EXIT(FileSystemObject.FileExists(Foldername));
END;

PROCEDURE getFTPData@1000000000(UsernameValue@1000000025 : Text[250];PasswordValue@1000000026 : Text[250];HostAddressValue@1000000027 : Text[1024];DestPathValue@1000000028 : Text[1024];FileNameValue@1000000029 : Text[1024]);
VAR
CommandsFile@1000000000 : File;
MSShell@1000000018 : Automation „{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{72C24DD5-D70A-438B-8A42-98424B88AFB8}:’Windows Script Host Object Model‘.WshShell“;
FileSystemObject@1000000017 : Automation „{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{0D43FE01-F093-11CF-8940-00A0C9054228}:’Windows Script Host Object Model‘.FileSystemObject“;
WindowStyle@1000000006 : Variant;
WaitOnReturn@1000000005 : Variant;
DateText@1000000024 : Text[8];
MemberNo@1000000023 : Text[6];
HostAddress@1000000022 : Text[1024];
CommandsFileTxt@1000000021 : Text[1024];
FileName@1000000019 : Text[1024];
DestinationFilePath@1000000015 : Text[1024];
Password@1000000009 : Text[250];
UserName@1000000008 : Text[250];
sleepIndex@1000000004 : Integer;
maxTimeOutMilSec@1000000003 : Integer;
maxTimeOut@1000000002 : Integer;
timeOut@1000000001 : Integer;
dlg@1000000007 : Dialog;
BEGIN
// ###############################################################################################################################
// Parameter
// ###############################################################################################################################
// Datei mit KLARTEXT Einlogg-Daten
CommandsFileTxt := XENVIRON(‚TEMP‘) + ‚\__TEMP__984613516~65435164.txt‘;
maxTimeOutMilSec := 60000; // 60 Sekunden Timout

// Zugangsdaten
UserName := UsernameValue;
Password := PasswordValue;
HostAddress := HostAddressValue;

DestinationFilePath := DestPathValue;
FileName := FileNameValue;

// ###############################################################################################################################

// Timeout-Berechnung
maxTimeOut := maxTimeOutMilSec / 500;
IF (maxTimeOutMilSec = 0) AND (maxTimeOut = 0) THEN BEGIN
maxTimeOutMilSec := 10000;
maxTimeOut := maxTimeOutMilSec / 500;
END;

IF NOT HideDialog THEN BEGIN
dlg.OPEN(‚Datei wird abgerufen #1###################\’+
‚Status               #2###################\’+
‚Timeout              #3###################‘);

dlg.UPDATE(1, FileName);
dlg.UPDATE(2, ‚Anfrage wird erstellt‘);
END;

IF ISCLEAR(MSShell) THEN
CREATE(MSShell);

IF ISCLEAR(FileSystemObject) THEN
CREATE(FileSystemObject);

CommandsFile.TEXTMODE(TRUE);
CommandsFile.WRITEMODE(TRUE);

// Wenn die Datei nicht erstellt werden kann, muss diese erst gel”st werden (noch existent)
IF NOT CommandsFile.CREATE(CommandsFileTxt) THEN BEGIN
// Prozess Beenden, falls noch im Zugriff
// MSShell.ShellExecute(‚cmd‘, ‚/c TASKKILL /F /IM FTP.EXE /T‘, “, “, 0 );
MSShell.Exec(‚/c TASKKILL /F /IM FTP.EXE /T‘);
FileSystemObject.DeleteFile(CommandsFileTxt, TRUE);
CommandsFile.CREATE(CommandsFileTxt)
END;

CommandsFile.WRITE(UserName);
CommandsFile.WRITE(Password);
CommandsFile.WRITE(‚binary‘);
CommandsFile.WRITE(‚get ‚ + FileName+ ‚ „‚ + DestinationFilePath + ‚“‚ );
CommandsFile.WRITE(‚quit‘);

CommandsFile.TRUNC;
CommandsFile.CLOSE;

// MESSAGE(‚%1‘, STRSUBSTNO(‚ftp -s:“%1″ %2‘, CommandsFileTxt, HostAddress));
// ERROR(“);
// Abruf! Request!
WindowStyle := 0; // nicht sichtbar
WaitOnReturn := FALSE; // asynchron

// An dieser Stelle wird die Datei aufgegriffen und mit ftp.exe verwendet
MSShell.Run(STRSUBSTNO(‚ftp -s:“%1″ %2‘, CommandsFileTxt, HostAddress), WindowStyle, WaitOnReturn);

// wait for it! TimeOut!
REPEAT
IF NOT HideDialog THEN BEGIN
// kein „flackern“
dlg.UPDATE(2, “);
dlg.UPDATE(2, ‚Warte auf Antwort‘);
END;

SLEEP(500);
timeOut += 1;

IF NOT HideDialog THEN BEGIN
// kein „flackern“
dlg.UPDATE(3, “);
dlg.UPDATE(3, (500 * timeOut) / 1000);
END;

UNTIL (FileExists(DestinationFilePath)) OR (timeOut = maxTimeOut);

// Datei erhalten
IF (timeOut <> maxTimeOut) THEN BEGIN
IF NOT HideDialog THEN BEGIN
dlg.UPDATE(2, “);
dlg.UPDATE(2, ‚Antwort erhalten!‘);
// zur Darstellung
SLEEP(1000);
END;
END ELSE BEGIN
// keine Datei erhalten
IF NOT HideDialog THEN BEGIN
dlg.UPDATE(2, “);
dlg.UPDATE(2, ‚Antwort nicht erhalten!‘);
// zur Darstellung
SLEEP(1000);
END;
END;

// Datei sicherheitshalber l”schen, Loggindaten im Klartext enthalten
IF FileExists(CommandsFileTxt) THEN BEGIN
// MSShell.Exec(‚/c TASKKILL /F /IM FTP.EXE /T‘);
FileSystemObject.DeleteFile(CommandsFileTxt, TRUE);
END;

IF NOT HideDialog THEN
dlg.CLOSE;
END;

BEGIN
END.
}
}

Wenn einem die Tabelle aber die LookUp-Form unbekannt ist oder man möchte die LookUpFormID der Tabelle evtl. noch ändern, kann man diese über einen Dynamischen Aufruf starten:

FORM.RUNMODAL(0, Record);

Gruß,

Matthias König