[gelöst] finsql via C/C++ aufrufen

21. September 2015 16:05

Hallo miteinander.

Da ich andauernd hie und da einzelne Objekte exportieren muss und dass gerne auf Knopfdruck erledigen würde, hatte ich die Idee, das über ein kleines Programm zu machen, indem die Objekte eingeben kann um diese dann per Knopfdruck zu exportieren. Das Starten einer Entwicklungsumgebung unter Angabe der Datenbank funktioniert. Möchte ich allerdings einen Export starten, geht DAS nicht. Ich bekomme weder eine Fehlermeldung, noch wird das Logfile geschrieben. Funktionieren tut das hier:

Code:
ShellExecute(0, L"open",
                    L"C:\\Windows\\System32\\cmd.exe",
          L"/c \"Pfad\\finsql.exe\" servername=Ziel\\NAVISION,database=ENTW-DB", 0, SW_HIDE));


Daraufhin wird die Umgebung mit der angegebenen Datenbank geöffnet.

Aber das hier

Code:
ShellExecute(0, L"open",
          L"C:\\Windows\\System32\\cmd.exe", \
          L"/c \"Pfad\\finsql.exe\" command=exportobjects,file=u:\\V700-T.txt,servername=Ziel\\navision,database=ENTW-DB,logfile=u:\\meinExportTestLog.txt,filter=\"ID=5146087;Type=Table\"",
                    0, SW_HIDE));


geht nicht.

Sobald ich was exportieren will gibt es zwar keine Fehler aber getan wird auch nix. Kopiere ich diesen String aus dem Code und füge ihn in die Cmd-Shell ein, läuft der Export. Weiß vielleicht jemand was über Eigenarten von Navision in diesem Kontext oder mache ich hier was falsch?

Danke
Kai
Zuletzt geändert von Bongo am 24. September 2015 14:39, insgesamt 1-mal geändert.

Re: finsql via C/C++ aufrufen

24. September 2015 09:00

Kleiner Fortschritt: wir fanden jetzt heraus, dass es ohne die Angabe des Filters funktioniert. Allerdings möchte ich nicht sämtliche Objekte exportieren und schon den Filter nutzen. Wahrscheinlich stört sich da was an den übergebenen Anführungsstrichen. Beispiel:

Code:
...,filter="ID=5147010..5147020"


Hat da vielleicht jemand eine Idee?

Re: finsql via C/C++ aufrufen

24. September 2015 10:33

Hallo,

  • sicherlich hast du schon versucht den Befehl auf der Kommandozeile auszuprobieren.
  • ich vermute das du recht hast, dass es mit dem "Escapen" der Sonderzeichen zu tun hat Probier mal folgendes: Setz um die Anführungszeichen " vorher und hinterher jeweils ein ' OHNE die Leerzeichen, die sind nur zur Verdeutlichung ->
    Code:
    ..... +' " '+  "ID=5147010..5147020" +  ' " '  ....

Viele Grüße,
Janosch

Re: finsql via C/C++ aufrufen

24. September 2015 10:48

Habe das gerade mal ausprobiert - hat aber leider nicht geklappt. Mein Programm hat dann das hier übergeben:

Code:
filter='"'Type=Table;ID=5146087'"'


Hast du das so gemeint?

Re: finsql via C/C++ aufrufen

24. September 2015 11:24

So sieht ein korrekter Filter für die Tabellen 5 bis 8 aus:
Code:
filter="Type=Table;ID=5..8"


Das " normal zu escapen sollte da reichen.
http://stackoverflow.com/questions/3905946/how-to-add-doublequotes-to-a-string-that-is-inside-a-variable

In meinen PowerShell-Beispielobjekten hier ist auch eine Tabelle dabei (Pkt. 2), die solche Filterstrings automatisch erzeugt. Die funktionieren, zumindest für alle gängigen Fälle :wink: .

Re: finsql via C/C++ aufrufen

24. September 2015 11:57

Im C-Code sieht das so aus:

Code:
...filter=\"Type=Table;ID=5146087\"";


und an die CmdShell übergeben wird das hier:

Code:
filter="Type=Table;ID=5146087"

Re: finsql via C/C++ aufrufen

24. September 2015 14:38

Das Problem wurde gelöst. Da ich anfangs, so wie es aussieht, was falsch gemacht habe als ich finsql.exe direkt über den Befehl ShellExecute aufrufen wollte, ging ich davon aus, dass ich über die CmdShell gehen muss. Hab das jetzt nochmal direkt ausgeführt und nun funktioniert es.

Vielen Dank für eure Hilfe
Gruß
Kai