Funkcja dodatkowa - SQL-JSON problem z zapisem do txt

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, obiekty COM .NET

Moderator: mikey

Daniel
Posty: 1
Rejestracja: 27 lip 2021, 14:01
Rola: Inny

Funkcja dodatkowa - SQL-JSON problem z zapisem do txt

Post autor: Daniel »

Witam
Zmagam się z małym problemem zapisania tekstu do pliku txt, pracuję na Optimie w chmurze.

Stworzyłem proste zapytanie sql które zwraca wynik w postaci JSON, następnie cały JSON jest łączony i przypisany do jednej zmiennej którą chcę zapisać u siebie na dysku.
Rozwiązanie działa jeżeli pracuję na Optimie lokalnie ( zainstalowanej na pc ), natomiast jeżeli uruchomię ten sam skrypt na Optimie w chmurzę dostaję błąd, komunikat

Kod: Zaznacz cały

Exec error 70 in line 3: Permission denied
[Permission denied (-2146828218) | Microsoft JScript runtime error]
czy ktoś może podzielić się swoją wiedzą i powiedzieć jak zapisać plik txt na komputerze lokalnie

podsyłam mój skrypt skrócony aby nie zaśmiecać za bardzo :)

Kod: Zaznacz cały

[SQL]
SELECT * FROM (
SELECT
	VaN_RokMies,
	Ilosc_dokumentow = COUNT(VaN_Dokument),
	VaN_Typ, 
	Wartosc_netto = SUM(VaN_RazemNetto)
FROM 
	CDN.VatNag
GROUP BY 
	VaN_RokMies, 
	VaN_Typ
) AS resultTable
ORDER BY
	VaN_RokMies, 
	VaN_Typ
FOR JSON AUTO;

[JS]
var temp = "";

while (!Recordset.EOF) 
\{ 
var str = Recordset.fields(0).value;
temp = temp.concat(str);
Recordset.moveNext();
\}

var fs = new ActiveXObject("Scripting.FileSystemObject");
var a = fs.CreateTextFile("d:\\testfile.txt", true);
a.WriteLine(temp);
a.Close();

Pozdrawiam i z góry dziękuję za pomoc

taszek
Posty: 585
Rejestracja: 12 wrz 2012, 13:20
Rola: Administrator CDN XL
Wersja: 2016

Re: Funkcja dodatkowa - SQL-JSON problem z zapisem do txt

Post autor: taszek »

Musisz zestawić kanał wirtualny.

Taki przykład dostałem z asysty:
1) Kod funkcji użytkownika (nietestowany)
[SQL]
@PAR ?@ABC('Import dokumentu z pliku XML')@? PAR@
@PAR ?@Fs255(FileClient, Open, 'Pliki XML (*.XML)|*.XML|Wszystkie pliki (*.*)|*.*', *.XML)|sNazwaPliku|&Nazwa pliku:{PobierzZmKonfig('ImportXML')}@? PAR@
@PAR ?@X|Pierwotne|&Utwórz dokument pierwotny:0@? PAR@
@PAR ?@HN7|TypDokumentu|&TypDokumentu:0 @? @RH(999999) PAR@
Select NazwaPliku={_Q??sNazwaPliku}

[JS]
var filesys = CreateObject("Scripting.FileSystemObject");
var nazwaPlikuXml = Recordset.Fields("NazwaPliku").Value;
var nazwaPlikuTmp = nazwaPlikuXml;

//Sprawdzenie czy należy przesłać plik przez kanał wirtualny:
var kanalWirtualny = Session.Login.Application.UseDataFromTerminalClient
if( kanalWirtualny )
\{
var tempfolder = filesys.GetSpecialFolder(2);
nazwaPlikuTmp = filesys.GetTempName;

var rdpFile = new ActiveXObject("CDN.TerminalFileSystemServer");
rdpFile.UploadFileFromRemoteClient(nazwaPlikuXml, nazwaPlikuTmp);

\}

WykonajImport(nazwaPlikuTmp);

if( kanalWirtualny )
\{
if( filesys.FileExists(nazwaPlikuTmp) )
filesys.DeleteFile(nazwaPlikuTmp, true);
\}


2) Opis biblioteki do obsługi kanałów wirtualnych

3)
4) W .NET.
5)
6) //Dodajemy referencje do biblioteki RDPFileLib.dll, jeśli nie dodano do projektu. W pliku klasy dopisujemy:
7) using RDPFileLib;
8)
9) //można dodać property, które utworzy obiekt tylko gdy będzie potrzebny
10) private RDPFile rdpFile = null;
11) private RDPFile RdpFile
12) {
13) get { return rdpFile ?? (rdpFile = new RDPFile()); }
14) }
15)
16) //property UseDataFromTerminalClient jeśli jest wersja CIV lub zaznaczona opcja w konfiguracji „używaj kanałów wirtualnych” zwraca wartość 1.
17) useRdp = OptimaContext.Instance.OptimaAccess.Application.UseDataFromTerminalClient != 0
18)
19) //zapisanie pliku na komputerze klienta
20) RdpFile.SaveFileToRemoteClient(remoteClientFileName, localPath);
21)
22) //otwarcie dialogu SaveFileDialog na komputerze klienta i pobranie ścieżki
23) string remoteClientFileName = String.Empty;
24) var result = RdpFile.ShowSaveFileDialog(ref remoteClientFileName, uxExportSaveFileDialog.Filter);
25) if (result == DialogResult.OK)
26) {
27) remotePath = remoteClientFileName;
28) }
29)
30) //Wykonanie pliku na komputerze klienta
31) RdpFile.ExecuteFile(remoteClientFileName);
32)
33) // zapisanie danych na komputerze klienta
34) RdpFile.SaveFileToRemoteClient(remoteClientFileName, fileName);
35)
36) //pobranie ścieżki do folderu temp na komputera klienta
37) string tmpPath = RdpFile.GetTempPath();
38)
39) //Wykonanie pliku na komputerze klienta
40) RdpFile.ExecuteFile(remoteClientFileName);
41)
42) //usunięcie pliku z komputera klienta
43) RdpFile.DeleteFile(remoteClientFileName);
44)
45) //Pobranie pliku na serwer z komputera klienta, plik należy zapisać w folderze temp na serwerze. Po użyciu plik trzeba usunąć
46) RdpFile.UploadFileFromRemoteClient(remoteClientFileName, localPath);
47)
48)
49) W c++
50) W pliku .h dodajemy wskaźnik do obiektu COM:
51) IRDPFilePtr rdpFile;
52)
53) W konstruktorze klasy ustawiamy:
54) rdpFile = NULL;
55)
56) //property UseDataFromTerminalClient jeśli jest wersja CIV lub zaznaczona opcja w konfiguracji „używaj kanałów wirtualnych” zwraca wartość 1.
57) long val = ((IAdoSessionPtr)this->m_rSession)->Login->Application->UseDataFromTerminalClient;
58)
59) //tworzymy obiekt do obsługi kanałów wirtualnych
60) if(rdpFile == NULL && val !=0)
61) TESTHR(rdpFile.CreateInstance(__uuidof(RDPFile)));
62)
63) // zapisanie danych na komputerze klienta
64) rdpFile->SaveFileToRemoteClient(remoteClientFileName, fileName);
65)
66) //pobranie ścieżki do folderu temp na komputera klienta
67) bstr_t tmpPath = rdpFile->GetTempPath();
68)
69) //Wykonanie pliku na komputerze klienta
70) rdpFile->ExecuteFile(remoteClientFileName);
71)
72) //usunięcie pliku z komputera klienta
73) rdpFile->DeleteFile(remoteClientFileName);
74)
75) //Pobranie pliku na serwer z komputera klienta, plik należy zapisać w folderze temp na serwerze. Po użyciu plik trzeba usunąć
76) rdpFile->UploadFileFromRemoteClient(remoteClientFileName, localPath);
77)
78)
79)
80) Wszystkie dostępne metody
81)
82) /// <summary>
83) /// Wykonuje plik domyślnym programem na stacji klienta
84) /// </summary>
85) /// <param name="RemoteClientFileName">Nazwa pliku na komputrze klienta</param>
86) /// <returns>id procesu który edytuje plik na stacji klienta</returns>
87) int ExecuteFile(string RemoteClientFileName);
88) /// <summary>
89) /// Wykonuje plik na stacji klienta wskazanym programem
90) /// </summary>
91) /// <param name="RemoteClientFileName">Nazwa pliku na komputrze klienta</param>
92) /// <param name="applicationName">Nazwa aplikacji</param>
93) /// <returns>id procesu który edytuje plik na stacji klienta</returns>
94) int ExecuteFile(string RemoteClientFileName, string applicationName);
95) /// <summary>
96) /// Pobiera właściwości pliku
97) /// </summary>
98) /// <param name="RemoteClientFileName">Nazwa pliku</param>
99) /// <returns>Klasa FileProperties zawiara scieżke, rozmiar i czas modyfikacji pliku</returns>
100) FileProperties GetFileProperties(string RemoteClientFileName);
101) /// <summary>
102) /// Wyświetla dialog Otwórz plik
103) /// </summary>
104) /// <param name="FileName">Scieżka do wybranego pliku</param>
105) /// <param name="OpenFileDialog_Filter">Filtr dialogu, np.: Dokument tekstowy|*.txt|Dowolny Plik|*.*</param>
106) /// <param name="InitialPath">Katalog początkowy, nazwa lub ścieżka pliku do otwarcia - może być puste</param>
107) /// <returns>DialogResut OK lub Cancel</returns>
108) System.Windows.Forms.DialogResult ShowOpenFileDialog(out string FileName, string OpenFileDialog_Filter, string InitialPath);
109) /// <summary>
110) /// Wyświetla dialog Zapisz plik
111) /// </summary>
112) /// <param name="SaveFileDialog_FileName">Przed wykonaniem można podać domyślną ścieżkę lub nazwę pliku, po wykonaniu funkcji ścieżka do wybranego pliku przez użytkownika</param>
113) /// <param name="SaveFileDialog_Filter">Filtr dialogu, np.: Dokument tekstowy|*.txt|Dowolny Plik|*.*</param>
114) /// <returns>DialogResut OK lub Cancel</returns>
115) System.Windows.Forms.DialogResult ShowSaveFileDialog(ref string SaveFileDialog_FileName, string SaveFileDialog_Filter);
116) /// <summary>
117) /// Wyświetla dialog Wyboru folderu
118) /// </summary>
119) /// <param name="FolderBrowserDialogPath">Scieżka początkowa, wybrana ścieżka przez użytkownka</param>
120) /// <returns>DialogResut OK lub Cancel</returns>
121) System.Windows.Forms.DialogResult FolderBrowserDialog(ref string FolderBrowserDialogPath);
122) /// <summary>
123) /// Zapisuje plik z lokalnej maszyny na komputerze klienta
124) /// </summary>
125) /// <param name="RemoteClientFileName">Ścieżka do pliku na komputerze klienta</param>
126) /// <param name="LocalFile">Ścieżka do pliku na serwerze</param>
127) void SaveFileToRemoteClient(string RemoteClientFileName, string LocalFile);
128) /// <summary>
129) /// Zapisuje plik z lokalnej maszyny w folderze plików tymczasowyn na komputerze klienta
130) /// </summary>
131) /// <param name="RemoteClientFileName">Ścieżka pliku w folderze tymczasowym</param>
132) /// <param name="LocalFile">Ścieżka do pliku na serwerze</param>
133) void SaveTempFileToRemoteClient(out string RemoteClientFileName, string LocalFile);
134) /// <summary>
135) /// Pobiera plik na serwer z komputera klienta
136) /// </summary>
137) /// <param name="RemoteClientFileName">Ścieżka do pliku do pobrania</param>
138) /// <param name="LocalFile">Ścieżka do pliku do zapisania</param>
139) void UploadFileFromRemoteClient(string RemoteClientFileName, string LocalFile);
140) /// <summary>
141) /// Pobiera Path.GetTempPath na komputerze klienta
142) /// </summary>
143) /// <returns>Path.GetTempPath na komputerze klienta</returns>
144) string GetTempPath();
145) /// <summary>
146) /// Usuwa plik na komputerze klienta. Jeśli fileName jest RO, to trzeba zdjąć atrybut i usunąć plik bez pytania
147) /// </summary>
148) /// <param name="remoteClientFileName">Ścieżka do pliku na komputerze klienta</param>
149) void DeleteFile(string remoteClientFileName);
150) /// <summary>
151) /// Pobiera datę modyfikacji pliku na komputerze klienta
152) /// </summary>
153) /// <param name="remoteClientFileName">Ścieżka do pliku na komputerze klienta</param>
154) /// <returns>Data modyfikacji pliku</returns>
155) DateTime FileModifiedTime(string remoteClientFileName);
156) /// <summary>
157) /// Pobiera atrybut tylko do odczytu z pliku na komputerze klienta
158) /// </summary>
159) /// <param name="remoteClientFileName">Ścieżka do pliku na komputerze klienta</param>
160) /// <returns>Atrybut: tylko do odczytu</returns>
161) bool FileIsReadOnly(string remoteClientFileName);
162) /// <summary>
163) /// Ustawia atrybut tylko do odczytu z pliku na komputerze klienta
164) /// </summary>
165) /// <param name="remoteClientFileName">Ścieżka do pliku na komputerze klienta</param>
166) /// <param name="readOnly">atrybut readonly</param>
167) void SetFileReadOnly(string remoteClientFileName, bool readOnly);
168) /// <summary>
169) /// Pobiera rozmial pliku z komputera klienta
170) /// </summary>
171) /// <param name="remoteClientFileName">Ścieżka do pliku na komputerze klienta</param>
172) /// <returns>Rozmiar pliku</returns>
173) int FileSize(string remoteClientFileName);
174) /// <summary>
175) /// Sprawdza czy istnieje plik na komputerze klienta
176) /// </summary>
177) /// <param name="RemoteClientFileName">Ścieżka do pliku na komputerze klienta</param>
178) /// <returns>true - plik istnieje</returns>
179) bool FileExist(string RemoteClientFileName);
180) /// <summary>
181) /// Sprawdza czy istnieje proces o podanym id na komputerze klienta
182) /// </summary>
183) /// <param name="processId">Id procesu na komputerze klienta</param>
184) /// <returns>True jeśli dany proces jest uruchomiony</returns>
185) bool RemoteProcessExists(int processId);
186) /// <summary>
187) /// Metoda zastępująca CDNTS
188) /// </summary>
189) /// <param name="channelName"></param>
190) /// <param name="appPath"></param>
191) /// <param name="FilePath"></param>
192) /// <param name="content"></param>
193) void VirtualChannelSend(string channelName, string appPath, string FilePath, string content);
194) /// <summary>
195) /// Tworzy katalog na komputerze klienta
196) /// </summary>
197) /// <param name="RemoteClientDirectoryFullPath">Pełna ścieżka do katalogu który ma zostać utworzony</param>
198) void CreateDirectory(string RemoteClientDirectoryFullPath);
199) /// <summary>
200) /// Sprawdza czy istnieje katalog na komputerze klienta
201) /// </summary>
202) /// <param name="RemoteClientDirectoryFullPath">Pełna ścieżka do katalogu</param>
203) /// <returns></returns>
204) bool DirectoryExist(string RemoteClientDirectoryFullPath);
205) /// <summary>
206) /// Uruchamia skaner i skanuje pik
207) /// </summary>
208) /// <param name="fileName">nazwa pliku</param>
209) /// <param name="onlyOnePage">czy tylko jedna strona</param>
210) /// <param name="imageFormat">format</param>
211) /// <returns></returns>
212) bool Scan(ref string fileName, bool onlyOnePage, string imageFormat);
213)
214) /// <summary>
215) /// Pobiera nazwę i odcisk certyfikatu
216) /// </summary>
217) /// <param name="_params">Tytuł okna|Treść okna</param>
218) /// <param name="_certThumbprint">Zwracany odcisk certyfikatu</param>
219) /// <param name="_certName">Zwracana nazwa certyfikatu</param>
220) void CertificateSelectWithParams(string _params, out string _certThumbprint, out string _certName);
221)
222) /// <summary>
223) /// Otwiera okno podglądu szczegółów określonego odciskiem certyfikatu
224) /// </summary>
225) /// <param name="_params">Tytuł okna|Treść okna</param>
226) /// <param name="_result">Zwracany wynik - _certThumbprint w przypadku sukcesu i string pusty w przypadku nie znalezienia certyfikatu o zadanym odcisku</param>
227) void CertificateView(string _certThumbprint, out string _result);
228)
229) /// <summary>
230) /// Wysyła przelew krajowy poprzez webserwis CDC
231) /// </summary>
232) /// <param name="RemoteClientFileName">Ścieżka do pliku na kliencie z odpowiedzią</param>
233) /// <param name="LocalFile">Ścieżka do pliku z żądaniem</param>
234) void cdcDomesticTransfer(out string RemoteClientFileName, string LocalFile);
235)
236) /// <summary>
237) /// Wysyła przelew zagraniczny poprzez webserwis CDC
238) /// </summary>
239) /// <param name="RemoteClientFileName">Ścieżka do pliku na kliencie z odpowiedzią</param>
240) /// <param name="LocalFile">Ścieżka do pliku z żądaniem</param>
241) void cdcForeignTransfer(out string RemoteClientFileName, string LocalFile);
242)
243) /// <summary>
244) /// Wysyła przelew SEPA poprzez webserwis CDC
245) /// </summary>
246) /// <param name="RemoteClientFileName">Ścieżka do pliku na kliencie z odpowiedzią</param>
247) /// <param name="LocalFile">Ścieżka do pliku z żądaniem</param>
248) void cdcSEPATransfer(out string RemoteClientFileName, string LocalFile);
249)
250) /// <summary>
251) /// Pobiera status przelewu poprzez webserwis CDC
252) /// </summary>
253) /// <param name="RemoteClientFileName">Ścieżka do pliku na kliencie z odpowiedzią</param>
254) /// <param name="LocalFile">Ścieżka do pliku z żądaniem</param>
255) void cdcGetPaymentStatusReport(out string RemoteClientFileName, string LocalFile);
256)
257) /// <summary>
258) /// Pobiera wyciąg poprzez webserwis CDC
259) /// </summary>
260) /// <param name="RemoteClientFileName">Ścieżka do pliku na kliencie z odpowiedzią</param>
261) /// <param name="LocalFile">Ścieżka do pliku z żądaniem
262) void cdcGetStatement(out string RemoteClientFileName, string LocalFile);
263)
264) /// <summary>
265) /// Pobiera historię operacji poprzez webserwis CDC
266) /// </summary>
267) /// <param name="RemoteClientFileName">Ścieżka do pliku na kliencie z odpowiedzią</param>
268) /// <param name="LocalFile">Ścieżka do pliku z żądaniem</param>
269) void cdcGetAccountReport(out string RemoteClientFileName, string LocalFile);
270)
271) /// <summary>
272) /// Pobiera saldo rachunku poprzez webserwis CDC
273) /// </summary>
274) /// <param name="RemoteClientFileName">Ścieżka do pliku na kliencie z odpowiedzią</param>
275) /// <param name="LocalFile">Ścieżka do pliku z żądaniem</param>
276) void cdcGetAccountBalance(out string RemoteClientFileName, string LocalFile);


Ewentualnie Optima korzysta z drivera OLE DB do zaczytywania plików z XLS.
Pozdrawiam
Wojtek Cyrklewicz

ODPOWIEDZ