Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 14. 9. 2016 21:57:43

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Dobrý den. Vytvořil jsem si funkci na načtení hodnot z externího souboru CSV do proměnné a následný přenos do souboru. Udělal jsem to hlavně proto, že potřebuji nějak ošetřit když se pokouším otvírat neexistující soubor tak aby to jen zaznamenolo chybu ale neohrozilo běh makra. Ale teď mám problém s návratovou hodnotou. Funkce vypadá takto:

Function LoadCSVFile (file as string)

	dim arg1(1) as new com.sun.star.beans.PropertyValue
	dim tempDoc as object, listCSV as object
	dim zdroj
	
	on error goto chyba
	
	arg1(0).Name = "FilterName"
	arg1(0).Value = "Text – txt – csv (StarCalc)" 'název filtru
	arg1(1).Name = "FilterOptions"
	arg1(1).Value = "59,,76,1" '59=středník, nic pro oddelovac textu, 76=UTF-8,1=první řádek

	tempDoc = starDeskTop.LoadComponentFromURL(file," ",0,arg1()) 

	listCSV = tempDoc.Sheets.GetByIndex(0)
	zdroj = listCSV.getCellRangeByName("A1:JA2").getDataArray
	tempDoc.close(True)
	LoadCSVFile = zdroj
	exit function
	
	chyba:
	' print "chyba"
	LoadCSVFile = 0

End Function

v těle makra pak mám:

prenos = LoadCSVFile(adresa)
if prenos = 0 then 'tady mě to hodí chybu hned jak se objeví první existující soubor
  REM tady musí být zápis do chybového logu
  goto DalsiSoubor
end if

Nevíte prosím jak deklarovat výstup funkce nebo jak zjišťovat zda byl proces ukončen chybou?

Editoval ludviktrnka (15. 9. 2016 16:35:27)


LibreOffice 5.4.

Offline

#2 14. 9. 2016 22:59:45

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 844

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Něco jako:

chyba:
  ' print "chyba"
  LoadCSVFile = cverr(0)

a test:

if iserror(prenos) then 'tady mě to hodí chybu hned jak se objeví první existující soubor
    REM tady musí být zápis do chybového logu
    goto DalsiSoubor
end if

Offline

#3 15. 9. 2016 04:03:10

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Já bych doporučil původní funkci hned na začátku větvit pomocí
If IsMissing(adresa) then
..
..
Else
LoadCSVFile = cverr(0)
End If

Chybou bych ošetřil až případně podmínku True


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 15. 9. 2016 15:05:07

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Nějak to nefunguje. Co to je to cverr(0)? Pokud se program snaží otevřít neexistující soubor, tak se to zastaví na řádku 'if iserror(prenos) then' s hláškou: 'BASIC - chyba při běhu. Proměnná objektu není nastavena.'
Ale existující soubor projede, tak aspoň to je fajn :-)


LibreOffice 5.4.

Offline

#5 15. 9. 2016 15:28:38

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 844

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

CVErr Function [Runtime]

Converts a string expression or numeric expression to a variant expression of the sub type "Error".

Tímto lze nastavit "běžné" chyby, např. CVErr(xlErrNA), nebo vlastní kód chyby a tak testovat, co se stalo.

Tady testuju jen, jestli je chyba.

prenos = LoadCSVFile(adresa)
if iserror(prenos) then

Offline

#6 15. 9. 2016 15:45:33

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Mám to nakonec nějak vyřešené. Funguje to ale není to moc hezký :-(. Je asi úplně jedno co do LoadCSVFile při chybě vložím, protže na řádku if... se to vždy zasekne. Použil jsem předchozí LoadCSVFile = 0 a v makru potom tuto šílenost:

prenos = LoadCSVFile(adresa)
on error resume next
if iserror(prenos) then
on error goto 0
rem logování chyby	
goto DalsiSoubor
end if

LibreOffice 5.4.

Offline

#7 15. 9. 2016 15:50:52

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Celkem tedy chápu úmysl skrze CVErr ale prostě to nějak nefunguje. Přitom proměnné prenos a LoadCSVFile nemám nijak deklarované tak předpokládám že se deklarují jako variant a pojmou vše. Ale nevím mám v teorii silné mezery.


EDIT: jestli by nepomohl nějaký ReDim nebo něco takového, nikdy jsem to nepoužil. Funkcí LoadCSVFile přenáším vlastně soubor buněk pomocí listCSV.getCellRangeByName("A1:JA2").getDataArray, tak to má být asi typ object (nebo ne?) a pak se to změní na variant funkcí CVErr a to ovšem nepojme proměnná Prenos, která může být z předchozí operace nadeklarovaná jako object. Uff - mám v tom zmatek.

Editoval ludviktrnka (15. 9. 2016 15:58:13)


LibreOffice 5.4.

Offline

#8 15. 9. 2016 16:11:14

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Heuréka :-)

ve funkci:

chyba:
LoadCSVFile = Empty

V makru:

prenos = LoadCSVFile(adresa)
if isempty(prenos) then
rem logování chyby	
goto DalsiSoubor
end if

a proměnné kterých se to týká jsem tedy natvrdo deklaroval jako variant. Zatím to vypadá že to šlape.

Díky za nasměrování.

Editoval ludviktrnka (15. 9. 2016 16:15:30)


LibreOffice 5.4.

Offline

#9 15. 9. 2016 17:51:06

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Já si myslím že EMPTY neřeší všechny chyby reaspektive problémy. V adresáři může být poškozený soubor který je logicky "neprázdný", ale nespustitelný. Pak by to chtělo vrátit neúspěšné volání do nějakého reportu a pokračovat.
    Následně by mělo jít soubor nalistovat a otestovat co se tam děje. Naštěstí u CSV moc takových chyb není. Ale může se vyskytnout chyba "nenalezení" hledaných buněk. Například nečekanými separátory nebo možná i kódováním. Chybějící soubor je dán právě IsMissing takže pokud není chybějící (je přítomen v adresáři) může mít ještě chybu přístupu.
    Tam by to právě mělo být ošetřeno tou funkcí cverr, nebo jen odkazem "soubor xyz je poškozen". Jde tedy jen o Vaše přesvědčení zda potřebujete informaci typu "soubor existuje, je ale poškozený". To jiným způsobem asi nezjistíte. U hromadných zpracování například pro eshop to může mít docela fatální důsledky.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#10 15. 9. 2016 19:04:47

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Já se omlouvám ale tato kombinace fakt nefunguje. A chyba se na radku if... objevi vždy když funkce skončí = cverr(0).

LoadCSVFile = cverr(0)
--------------------
prenos = LoadCSVFile(adresa)
If IsError(prenos) then


A když zadám podmínku IsMissing(file) tak bude vždy true neboť textovou proměnnou "adresa" do funkce vkládám vždy a vždy má obsah, akorát někdy špatný(cestu k neexistujícímu souboru). Copak funkce IsMissing je schopna podívat se do adresáře zda soubor existuje? Zkouším to ale je to jak píšu ... nevím toto asi nějak nechápu, to je příliš stručně naznačeno.

Editoval ludviktrnka (15. 9. 2016 19:12:12)


LibreOffice 5.4.

Offline

#11 15. 9. 2016 19:09:26

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Pokud se soubor načte (funkce nevrátí chybu) můžu správnost testovat na několika místech obsahu souboru - má mít určenou strukturu. Pokud soubor existuje a nenačte se kvůli nějaké chybě a funkce vrátí chybu, tak ptostě zjistím že "tato adresa" je "divná" to jako informace pro další průzkum stačí.


LibreOffice 5.4.

Offline

#12 15. 9. 2016 19:50:15

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Já se omlouvám - napsal jsem to z hlavy mělo to být buď :


If Not IsMissing(adresa) then
...
Else
LoadCSVFile = cverr(něco)
End If


nebo


If IsMissing(adresa) then
LoadCSVFile = cverr(něco)
Else
......
End If


     Ono je to nazvané správně - IsMissing, (nebo jen Missing) je v překladu "chybějící", nebo spíš "neexistující". Takže docela logicky IsMissing(true) znamená že neexistuje. Já jsem to používal podobně jako proměnnou při hledání souborů ve spojitosti iVar * IsMissing(adresa), ale nejčastě se to používá když nastavujete nový list, nebo dokument.
     Otestuje se zda "nové jméno" neexisteje. Když neexistuje tak se vytvoří což je vlastně řešení true. Takže jsem ani moc nepřemýšlel a napsal volovinu. Nebyl jsem doma a tak jsem netestoval, což normálně dělám i když jde o prkotiny. Ješte jednou se omlouvám.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#13 15. 9. 2016 20:04:10

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

ne o to nejde, to jsem pochopil, že to má obrácenou logiku, ale mě jde o to že já nějakou adresu mám vždy, nikdy není "chybějící". Takže tahle funkce je pro mne nepoužitelná, resp. zbytečná. Chybějící je soubor, ale ne adresa souboru. To že soubor chybí se dozvím až tehdy až se budu snažit jej otevřít. Ostatně tak je to uvedeno i zde: https://www.openoffice.cz/doplnky/preru … lu-a-maker
"...chyby, které jsou nevyhnutelné – například se makro pokouší otevřít neexistující dokument apod. ..." (samozřejmě již dávno tento zdroj nepovažuji za úplný, jakkoli mi stále pomáhá, ale tady uvádí typický příklad pro použití funkcí postavených na "on error"


LibreOffice 5.4.

Offline

#14 15. 9. 2016 20:14:13

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

... když zakládám něco nového a vím kam mohu si projet existující položky a sledovat pomocí ismissing zda nová položka již je či není. Šlo by to i v případě místního adresáře pomocí Dir, ale pokud se nemýlím u vzdálené složky na webu to nelze ... Ono je tedy vysoce pravděpodobné že k chybě docházet nebude, obsah složky bude generován vždy aktuálně a s největší pravděpodobností nikdy nenastane případ otvírání neexistujícího souboru, ale na straně webu to má na starosti někdo jiný, tak se musím jistit.


LibreOffice 5.4.

Offline

#15 15. 9. 2016 20:45:03

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Ano to máte pravdu. Ale může docházet k chybám z přenosu. Respektive se u některých řešení může stát, že nepracují ze zálohy a začnou editovat. To je sice mžik, ale může Vás to vykopnout. Dobré systémy Vás podrží a nevykopnou. Takže chyby mohou nasat vždy a musí se s tím počítat.
    Chápu, že si stáhnete seznam například pomocí souborového manažera z FTP, nebo HTTP a pak z něj pouštíte kopírování. Ale mezi tím může dojít ke změně a původní soubor tam už nebude.
    Pomocí Dir se dají manipulovat jen adresáře v podřízeném stroji, nebo pokud jste přihlášen jako admin systému - ale obecně to na vzdálených adresářích nejde. Pokud nemáte zrovna nakolíkovaný hlavní stroj (existují takové programy - ale je to většinou lumpárna).


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#16 15. 9. 2016 22:15:27

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Ještě se zeptám na druhou věc - nevíte náhodou jak vrátit "kurzor" do sešitu z něhož jsem spoštěl makro? Při Otvírání a zavírání CSV nakonec dávka skončí často (ne vždy, ale většinou) v jiném sešitě, než z něhož dávku spouštím. Je to takové nepříjemné. Zkouším nastavit aktivní list doc.currentController.setActivesheet(sOdber) nefunguje, zkouším vybrat doc.CurrentController.select(vyber) nefunguje, zkouším přesunout kurzor pomocí dispečera dispatcher.executeDispatch(dokument, ".uno:GoToCell", "", 0, args1()) nefunguje. Resp. vše funguje nějak na pozadí. Jakmile se octnu v jiném otevřeném sešitě, tak už jsou všechny snahy o návrat marné. Myslím tím návrat obrazovky, procesy probíhají správně, jde jen o zobrazení na obrazovce a jen na konci procesu.


LibreOffice 5.4.

Offline

#17 16. 9. 2016 05:10:14

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Nemám představu jak ten proces spouštíte. Měl byste spouštět skryté soubory (hidden). Pak by se podsunutí na pozadí nemělo konat a měly by fungovat formulace se "select".
     Tady je od Dana Sedláčka makro, které takový postup demonstruje (jmenuje se to tuším malá makra). Proces je takový, že se aktivuje první dokument (otevřený) a druhý jako skrytý (hidden). Můžete podobně vytvořit třeba třetí a další skrytý.
     On tam tuším uvádí také postup pro kopírování ze skrytého do aktivního, ale snadno si poradíte třeba tak že zkopírujete z jednoho skrytého do druhého skrytého. Při takovém postupu neopustíte původní (aktivační) spouštěný dokument.



     Je možné nastavit nový dokument a opustit (nebo zavřít) ten původní - a tohle asi děláte Vy. Řešením takového problémy by bylo spouštění přes nějaký "pivot" dokument. Problém je v tom, že jakmile dostanete kurzor do jiného (nového) sešitu na popředí tak z tohoto nového nemáte šanci přepnout zpět. To se stane například když použijete pro kopírování schránku která udělá v novém sešitě něco(select).
     Úlohu zde hraje například deklarace proměnných. Když nastavíte například jako Global adresu výchozího dokumentu a spoušťové makro (oboje do knihovny Standard - nad všemi typy dokumentů), tak se můžete v nejhorším vracet pomocí klávesové zkratky. Ale ta nadřazená makra se chovají jako "pivot" takže proces může chodit i s deaktivací spoušťového dokumentu.


     Já ale preferuji udělat jeden dokument (nejlépe Calc) jako šablonu a pokud to jde, tak otevírám nový dokument ze šablony. Při vygenerování nového dokumentu ze šablony se přepíše makro podle global proměnné na volání původního spoušťového dokumentu.
     Pak není problém se vracet. Dělal jsem to tak pro nějaké obsluhy Writer šablon (nějaká cestovka) kde se muselo individuálně zkontrolovat provedení nabídky. Ta se dělala sice také podle šablony Writer a načítala různé databáze (termíny, ceny, adresy) a fotky (většinou internet, ale i místní složky). Před uložením do pošty se musela vizuálně zkontrolovat a případně manuálně poopravit, doplnit například že se jedná o ilustrační (archivní) foto.


     Původní požadavek byl volat to z hromadné korespondence, ale právě kvůli kontrole jsem to postavil tak, že se do určeného adresáře vygenerovaly všechny nabídky podle adresáře a kontrola probíhala při tomto procesu. Vlastní hromadná korespondence se pak omezila na výběr šablony.
     Takže Calc načetl adresář a postupně volal šablonu za šablonou kterou otevřel k úpravě a po úpravě + uložení otevřel jinou. Calc se aktivoval manuálním otevřením šablony Writer a zeptal se na na režim - buď jen jednu šablonu, nebo definovaný okruh klientů (například jen takové kteří dříve požadovali Malorku ap.), a nebo všechny adresy.
     Vše fungovalo na jednom adresáři kdy byl Calc a asi 3 druhy šablon OTT, obrázky jako logo a podobné věci. V Calku byly adresy klientů, různých serverů (obrázky ap.) Manuálně se tam doplnily ceny a myslím že přímo z domácí stránky poskytovatele + úprava pro vyjádření orientační ceny. Také jsem tam zabudoval hodnocení klienta, ale už jsem zpětnou vazbu nedostal takže nevím jestli uplatňovali bonusy pro dobré klienty.


     Takže si to promítněte jak Vám běží proces. Když byste potřeboval něco konkrétnějšího tak by to chtělo zevrubnější popis, nebo přímo ukázku. Prostě problém se dá řešit buď neopuštěním původního dokumentu, nebo jeho rekurzivním voláním.
     Nyní se domnívám, že nový dokument po načtení otevíráte k vizuální kontrole, respektive k manuální úpravě. Tam by asi bylo na místě kopírovat do ODT, zkontrolovat (opravit) a následně uložit jako CSV (tím se smažou makra ap.) + Kill zdroj ODT.
     Tohle by bylo na šablonu Calcu která by nejprve vytvořila adresář s Pivot Calcem který má doplněnou knihovnu maker a načten zdroj adres pro čtení CSV. Následně by se Pivot otevřel a postupně by vytvářel jednotlivé obsahy ze drojů CSV do Calků. Tento Calc už obsahuje makra pro své uložení (CSV) a eliminaci své ODT podoby + otevření dalšího Calcu zavoláním "pivota".


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#18 22. 9. 2016 20:37:40

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 711

Re: jak řešit návratovou honotu funkce při chybě VYŘEŠENO: empty

Jo tak hidden to vyřešilo. Nevím sice které, mám tam pro jistotu dvě :-) ale funguje to, otvírané soubory se ani neukážou.

...
arg1(2).Name = "Hidden"
arg1(2).Value = True



tempDoc = starDeskTop.LoadComponentFromURL(file,"_hidden ",0,arg1())


LibreOffice 5.4.

Offline

Zápatí