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

#1 10. 12. 2012 13:12:11

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

collection - VYŘEŠENO

Zdravím uživatele OOO big_smile

Zase něco kutím, a jako obvykle sténám nad Basicem. Hodily by se mi asociativní pole jako v PHP či Pythonu, ale bez obezliček nemožné.

Při pátrání jsem narazil na datový typ Collection, který už už vypadá dobře, bohužel, bez nějakého bližšího popisu.

Nemá někdo odkaz, nebo povědomí o tom, jak collection funguje? Jediný funkční príklad vypadá asi takto,

dim cSumLine As New Collection
cSumline.Add(array(4,12,2),"Zakl0")
On Error GoTo indexbad
a = cSumLine("Zakl0")
msgbox a
indexbad:

což mi nestačí. Nepodařilo se mi prvky iterovat, mazat, získat velikost kolekce a podobně,

Má někdo o tomto povědomí ?

Předem díky

Milan

Editoval MilanUhrak (17. 12. 2012 08:03:00)

Offline

#2 11. 12. 2012 09:46:50

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: collection - VYŘEŠENO

Typ Collection neznám, možná jde o jiný programovací jazyk než Basic. Váš příklad mi vrací prázdný text.


Můžete využít klasické pole:

sub pole_dat
pole = array(1,2,3,4,5,6,"ahoj")
for i = LBound(pole) to UBound(pole)'pro procházení polem
print pole(i) ' jednotlivé položky pole
next i
'nebo zadat pořadí v poli přímo
a = pole(0)'zadáváte pořadí v pole - začíná 0
print a ' zobrazí 1
end sub

Pro další možnosti se můžete kouknout sem Apache OpenOffice Wiki - Arrays a sem Apache OpenOffice Wiki - Mapping of Sequences and Arrays.


;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 11. 12. 2012 16:49:31

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

Re: collection - VYŘEŠENO

Mám ten dojem, že Milan Uhrák požaduje mimo vysvětlení uvedeného makra také to co nazývá "obezličky". Vzhledem k tomu, že je to dlouholetý člen a pak také k tomu, že drtivá většina lidí neví co je to asociované (asociativní) pole, udělám stručný výklad tohoto pojmu a možnosti řešení v Calcu. Lhal bych, kdybych tvrdil, že znám vše kolem tohoto problému. Dokonce se domnívám, že řešení možná najde uživatel Lp, nebo někdo jiný. Měl bych také určitý zájem pokročit v určité velmi blízké oblasti. Proto popíšu nejprve problém asoc. polí, potom vysvětlím co asi znamená to uvedené makro a jak to řešit nepřímo (nebo i přímo).
----------------------------------------------------------------------
   Asociativní pole jsou taková, která v první řadě realizují asociaci ve smyslu, který je znám spíš ze světa šifer (asociace - záměna). Takže každému prvku pole "A" odpovídá jeden prvek pole "B". Typicky tedy lze procházet obě pole stejným iterátorem (naráz). Prakticky to znamená, že určené prvky pole "A" zavoloají své ekvivalenty v poli "B". V základní poloze jde "jen a jen" o pole jednorozměrná, ale pro praxi je nutné vědět, že se to používá častěji pro pole vícerozměrná.
   Tedy první pole "A" je jednorozměrné a pole "B" je dvojrozměrné. Ve výsledku tedy voláme "některé prvky" pole "A" a vrátí se nám "řádky (nebo sloupce) dvojrozměrného pole "B". Typickým příkladem je volání úseku na řádku podle čísla řádku. Znamená to, že téměř všechny funkce (vzorce) v Calcu mají charakter asociovaných polí, a to tehdy, když využívají "adresu" typu A1:C1 a podobně. Ale asi nejlepším příkladem je funkce SUMIF, Countif, a vyhledávací s koncovkou "UP" - LookUP ap. To je také asi vysvětlení proč Basic nepotřebuje samostatně asociované pole. Musíme si uvědomit, že pro programování můžeme použít deklaraci buňky s přídavkem .formula - a sem vzorec zadat. Samostatnou kapitolou jsou potom "maticové vzorce", kde lze jednotlivá pole "sčítat a nebo například násobit ap." - ale jde o logické operace na množinách.
  Jiné kafe je to pro případ užití ve Writeru (například záměna velkých a malých písmen ap), nebo v Impresu, kde bychom tímto způsobem mohli dělat něco jako "rozpohybování". Například pro "běžícího panáčka" místo zrychlení času vybavení, přeskakovat ob obrázek a podobně také větvit vývoj prezentace podle událostí. Proto do jisté míry má cenu se zabývat problematikou asociovaných polí.
   Takže cestou je najít vhodný vzorec a ten pak implementovat do makra, nebo nasimulovat pomocí iterace s dotazem IF, Case, ......
------------------------------------------------------------------------
   Problém uvedeného makra je velice pravděpodoně z "jiného soudku". Samozřejmě potřebuje ke svému běhu deklaraci dvou polí. Bez nich nic mimo chyby nevrátí. Také se přikláním k Danovi, že to nebude kód pro BasicOO, ale velice by mne to zajímalo (tedy kde na to autor narazil). Mám dojem, že jde o "INTERSECT" - tedy plným názvem "intersection" - česky : "průnik". "Ryzí" intersect musí vrátit "společné prvky" jmenovitě.
   Ale pro praxi potřebujeme například vyhodnocení průniku ve formě "COUNT" (počet společných prvků), nebo "SUM" (tedy součet společných prvků) a konečně Data typu SUMPRODUCT, nebo možná typy "Integer"... "String" a možná i jejich kvantifikaci podle druhu. (Já osobně potřebuji všechny druhy popisovaného typu).
   Takže "Array(4,12,2)" je buď určitý výběr z dříve deklarovaného a zřejmě "většího" pole, a pak jde i asociaci na pole "Zákl10" kde se sečtou ekvivalenty, Nebo jde o celé pole a sčítá se jen intersect - prvky v průniku s polem "Zákl10". Pole "Zákl10" může být snadno pole generované a nebo také vícerozměrné.
   Makro obsahuje výraz indexbad: - tedy výraz buď pro "GoTo, nebo GoSub" (v tomto případě je to GoTo) a tím končí. Je to smyčka, která iteruje dotazovanou funkcí. Vidíme jen to, co se děje v případě chyby. Přeskočí se "a = cSumLine("Zakl0")" plus "msgbox a". Jiný případ - ten zřejmě důležitější není vidět i když tam může makro skončit (hláška msbox zastaví makro a čeká na potvrzení). Tedy spíš není vidět Začátek SUB ,,, a konec End Sub. Může tam být ještě všechno možné před, nebo za. Může to být také "Function", která je spřežena s jinou funkcí, a nebo také s makrem. Takže Collection může být právě specificky deklarovanou funkcí možná z nějakého rozšíření.  Vyhledavač nenajde pod tímto heslem nic z oblasti programování. Jen odkazuje na "kolekce" typu "vánočních ozdob", "kolekce obuvi", "kolekce spodního prádla" ap.
-------------------------------------------------------------------------
  Neodpustím si poznámku, že jsem byl 2 dny mimo domov a nemohl jsem se přihlásit z druhého počítače do svého profilu. Proto se k diskusi dostávám až dnes. Budu uvedené makro zkoumat ve vlastním zájmu, ale uvítal bych odkaz kde se vykytuje to co jste pane Uhráku vykopíroval jako makro v úvodu.

Editoval neutr (12. 12. 2012 06:03:26)


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

Offline

#4 12. 12. 2012 10:17:57

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

Re: collection - VYŘEŠENO

Zdravím všechny, koho tohle téma zajímá

Abych lépe vysvětlil, o co  se mi jedná ...

Asociované pole dokáže ukládat udaje asociované s klíčem, tozn, že se jedná o strukturu, kde klíč představuje trivialní hodnotu ( 1, 2 ,23 ,"Petr", "Pavel")
a této hodnotě je přiřazen libovolný údaj (triviální, pole, objekt ).

V praxi vytvořím definici pro import strukturovaných dat s údaji pevné délky (v tomto případě se jedná o INVOIC fakturu) a jelikož jsem nechtěl, aby se mi v kódu hemžily funkce mid(řádek, pozice, delka), snažil jsem se o záznam těchto dat do asociovaného pole. Toto ale  ooBasicu nemáme, nejbližší možná náhrada je Collection. Tato je ovšem importovaná na podporu collection z VBA, a SKUTEČNĚ jsem k ní nenašel žáden popis, dokonce ani v kukátku neuvidíte více, než že je to collection.

kód - tak jak jsem jej uvedl v úvodním příspěvku - asi nefunguje, protože msgboxuju pole, ale v mém případě funguje bez potíží.

Ve funkci, která řeší ctení dat
****nejprve definice  ***

global cSumLine As New Collection
global sLine as string

sub main 
 cSumline.Add(array(4,12,2),"Zakl0")
 ....
 sLine = aInvFH.readLine   ' použita netrivialni funkce pro zachování ne-UTF kódování...
  .....   
  udaj = ctiudaj("Zakl0")  ' a tohle vypadá mnohem čitelněji
  oCell.string=udaj        ' zápis do buňky

end sub


Function ctiUdaj( udaj as string) as Variant
  On Error GoTo indexbad
  a = cSumLine("Zakl0")
  tmp = mid(sLine, a(0), a(1) )
  ctiudaj = tmp
  indexbad:
end Function

******************
Příklad je ořezán na nutné minimum, jen pro vysvětlení, pokud je zájem, klidně sem postnu celý dokument,

cílem bylo zpřehlednit kód a zkusit něco, co  jsem dosud v OOO neviděl, a připadá mi to užitečné.

Co ovšem u kolekcí postrádám, je dotaz na existenci klíče příp. iterace, tedy .. postrádám .. nevím zda tuto vlastnost má, a pokud ano, jak ji použít.

používám ooo (Apache, ne libre) na OpenSuse, i když jsem viděl zaručené informace, že kolekce "jen a pouze" na win strojích (prý se využívá nejaká microsoftí knihovna) tak na suse to jede taky..

A tady odkaz, není  těžké najít podobné, nicméně konkrétní popis ani na vývojářských stránkách jsem nedohledal ...

New Collection and Dictionary like VBA


A k těm obezličkám :
asociativní pole z pythonu (zde dictionary) není problém použít, ale zaprvé nikdy jsem nepsal v pythonu vic než pár řákd, nějak se do toho jakzyka nedokážu dostat, a za druhé, nevím skoro nic o integraci pythonu jako makra, nevím, jak se to bělá, jestli lze volat pythoní funkce z ooBasicu a naopak.

pokud bych chtěl dosáhnout vlastnosti asociativního pole v ooBasicu jinak než přes kolekci, musel bych v podstatě napsat komplet obslužný kód, který by nějak obsluhoval 2 stejně velké array, jedno pro klíč, jedno pro hodnoty .. a to si nejsem výsledkem jist, takže proto to nazyvam obezličky

Toť asi vše ..

jinak díky za reakce a snahu ..

Milan

Editoval MilanUhrak (12. 12. 2012 10:35:40)

Offline

#5 12. 12. 2012 11:43:09

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

Re: collection - VYŘEŠENO

Já jsem na tom s Pythonem podobně. K zprovoznění Pythonu je potřeba doinstalovat asistenční nástroje. Teorieticky by tam měl být Javascript, Sheel, Java a uvedený had. Dá se jenom rozšířit na hada. Já dělám s Javascriptem a ten jsem prostě nezprovoznil (ve starších verzích to šlo v pohodě).
  Ve správci maker se pak objeví (tam kde je volba Makra OpenOffice) také Python, kde je například "Ahoj světe". Ovšem všechno ostatní už je na Vás. Domnívám se, že musíte používat externí debuger ap. Scripty se pak pouští přes UNO přímo ze správce stejně jako Basic.
  Pokud je "Collection" implementovaná v systému je její chod "zvenčí" nepřístupný. Asi nepůjde navázat vnitřní iteraci na vnější eventy. Prostě se vysype jako kýbl s uhlím.
  Hledal jsem to na netu, protože by to mohl být intersect. Byl bych štěstím bez sebe, kdyby byl nějaký typ průniku. Já v podstatě potřebuji generovat šílený relace například 1000:21000000. Dělám to pomocí polí, ale časy jsou zoufalý. Implementovaný intersect by byl výrazně rychlejší. Tak jsem to chtěl dělat přes Javascript, a ten zase neumím rozchodit. Doufám, že nové verze to budou umět. Nevím jestli to umí LO - mám AOO. Zřejmě se budu muset naučit Python.
  Rád se na Vaše soubory podívám, ale za chvíli jedu oslavovat a dřív jak zítra v poledne fungovat nebudu.


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

Offline

#6 12. 12. 2012 20:38:36

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: collection - VYŘEŠENO

neutr a MilanUhrak napsal(a)

Neutr:
Takže každému prvku pole "A" odpovídá jeden prvek pole "B". Typicky tedy lze procházet obě pole stejným iterátorem (naráz). Prakticky to znamená, že určené prvky pole "A" zavoloají své ekvivalenty v poli "B".
MilanUhrak:
Asociované pole dokáže ukládat udaje asociované s klíčem, tozn, že se jedná o strukturu, kde klíč představuje trivialní hodnotu ( 1, 2 ,23 ,"Petr", "Pavel")
a této hodnotě je přiřazen libovolný údaj (triviální, pole, objekt )

Zjednodušeně řečeno jde o dvousloupcový VLOOKUP v programové podobě?

MilanUhrak napsal(a)

pokud bych chtěl dosáhnout vlastnosti asociativního pole v ooBasicu jinak než přes kolekci, musel bych v podstatě napsat komplet obslužný kód, který by nějak obsluhoval 2 stejně velké array, jedno pro klíč, jedno pro hodnoty .. a to si nejsem výsledkem jist

No takové makro nebo spíše funkce by mohla vypadat takto (předpokládám dvourozměrné asociované pole):

function pole(vstup as string) as string
list = ThisComponent.sheets(0)
pole1 = list.getCellRangeByName("A1:A10").getDataArray
pole2 = list.getCellRangeByName("B1:B10").getDataArray
for i = 0 to 9
if pole1(i)(0) = vstup then
pole = pole2(i)(0)
endif
next i
print pole
end function

Pro případ, že jednotlivé údaje máte uvedeny v buňkách, můžete je tímto způsobem načíst do makra a pracovat s nimi. Pokud ano, nezapomeňte si upravit adresování i proměnou i, respektive její koncovou hodnotu. Lze také jednotlivá pole definovat i přímo v makru

pole1 = Array(hodnota1, hodnota2,...hodnotax)

vyhledávání by pak probíhalo takto:

if pole1(i) = vstup then
pole = pole2(i)

Proměnná vstup se dá řešit třeba i tím inputboxem, předáním hodnoty z jiného makra atd... Možností úprav je mnoho. Doufám, že to pomůže.


;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#7 13. 12. 2012 12:40:37

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

Re: collection - VYŘEŠENO

Dane máš pravdu. Asi jsem tam toho napsal až moc. Ale uvedl jsem příklad vzorců s koncovkou "UP" jako typická asociovaná pole. Je jen málo případů, kdy by zabudované vzorce nevyhověly nějakému požadavku. Zkušení uživatelé Calcu nemusí hledat podobné věci. Vše je poměrně transparentní ze skutečnosti, že Calc je dvojrozměrné pole (kostičkovaný papír). To však u programovacích jazyků není, a v podstatě musí (nám zcela samozřejmou) navigaci nasimulovat programem.
   U pana Uhráka jde zřejmě jen o vhodnou implementaci. Tvoje makro je výstižné a přímo použitelné. Jen bych dodal, že je možné také zabudovat přímo VLOOKUP (nebo jiný "UP") do makra - pomocí "formula".

   Také bych uvedl ještě maličko teoretické úvahy. Pokud vzorce vyžadují "stejnou délku" porovnávaných (asociovaných) polí - jde skutečně o asociovaná pole. Pokud ne - jde o charakter "Intersection", "Union" a podobně - tedy množinové operace. U některých vzorců prstě vyhodí chybu skutečnost, že dvě pole stejná nejsou, zatímco jiným podobným to nevadí.


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

Offline

#8 13. 12. 2012 13:42:49

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

Re: collection - VYŘEŠENO

Už je mi to dost jasné. Jde o to "uživatelsky" pracovat s kontejnery programu. Uvedená diskuse ukazuje možnosti. Konkrétní problém je tam nastaven jako přístup k překladu, nebo spíš k automatickému doplnění data jako je název města - doplnit směrovací číslo, či opačně. Takže je to mechanizmus zejména vhodný pro slovníkové překladače.
    Uvedená řešení navrhuje například vstup pomocí dialogu, kde by se zřejmě zvolila řeč, nebo synonymum ap. Pak to lze řešit jen bez zásahu do zdrojáků OOo.
    Běžné slovníky (například oprava pravopisu) mohou automaticky bez jednotlivého dalšího volání (zásahu) provést opravu. Je to dáno jen textovým dokumentem (1 list), kde se prohledává množina výrazu znak po znaku, a když nenajde ten napsaný autorem práce, automaticky, nebo podle výběru tvar přepíše. Tyhle funkce údajně v MSO podléhají (třídě?) Collection. Zájem byl podobnou třídu dopsat pro OOo/AO. Navíc zřejmě pro všechny učely nevyhoví 1 list, a je zájem "asociovat" více listů.

(Podobně fungují například interaktivní šablony PsPadu. Například napíšete "J" a šablona otevře dialog pro daný jazyk (programovací) s výběrem všech slov začínající od "J". Klepnete na požadovaný výraz a on přepíše to "J" požadovaným výrazem. Já jsem si takhle například upravil šablonu HTML o "javasript" (javascript má vlastní šablonu). Napíšu například java a vložím tagy na javascript. Ty v HTML šabloně nebyly)

    Řešením je napsat to pro UNO (ale pozor knihovny UNA ap. se píšou buď v "C", nebo v "Java"), nebo samozřejmě v Pythonu ap. přímo pro OOo/AO.
    Uživatelské řešení ale určitě postačuje, i když se musí udělat pro každý konkrétní případ samostatně. Pro toto téma by byl podle mne fundovaným autorem pan ing Pastierik.
   
    Je určitě chvályhodné, že se o to pokouší i někdo jiný. Nyní je zřejmé, že by to mohly být nástroje pro všechny možné účely. Nejen tedy pro dictionary, ale mohlo by to být uděláno pro MATH - například napsat česky srozumitelný požadavek (kombinace nejčstěji používaných vzorců) a kliknutím vložit (přepsat přímo) správně předformátovaným kód pro vzorec, který se jen přepíše v argumentech, doplní ap.) Například podobně pro DRAW - zadat slovo "čtverec" a zavolat dialog ve kterém jen doplníme rozměry a tak podobně. Udělalo by to z DRAW skutečně silný nástroj.
    Také je zřejmé, že to nebude ani tak pro numerické výpočty, jako pro obecné přizpůsobení vlastností programu. Myšlenka je zajímavá, a myslím že by realizece v podobě rozšíření (nebo i šablony) byla komerčně úspěšná.

    Takže když už asi víme co sleduje autor tohoto příspěvku, můžeme lépe směrovat odpovědi. Samozřejmě by bylo asi dobré specifikovat blíž co by to mělo být (co to má dělat). Například Danovo makro může pracovat v Calcu, kde jsou pole na různých listech (nebo i na jednom listu). Ovšem pro Writer by šlo neco podobného určitě také. Nejvhodnějším prostředkem je šablona.

Editoval neutr (13. 12. 2012 13:56:16)


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

Offline

#9 13. 12. 2012 17:18:30

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

Re: collection - VYŘEŠENO

V ukázce máte chybu má být:

dim cSumLine As New Collection
cSumline.Add(array(4,12,2),"Zakl0")
On Error GoTo indexbad
a = cSumLine("Zakl0")
'///////////////
msgbox a(0)
'///////////////
indexbad:

Jinak objekt collection je přibližně to co hledáte.
Může obsahovat (skoro?) cokoliv, odkazuje se na to indexem nebo jménem (metodu add znáte, odkaz jménem taky, Metoda count dá počet záznamů (takže můžete iterovat)

objCollection.count

metoda remove odstraní objekt

objCollection.remove(index nebo jméno) 

Dotaz na klíč jsem taky nanašel, obejde se to snadno pomocí on error goto

Popis jsem zatím nenašel (ani jsme ho nehledal), chová se hodně podobně, jako stejný objekt v excelu.

Editoval lp. (13. 12. 2012 17:21:52)

Offline

#10 14. 12. 2012 08:08:07

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

Re: collection - VYŘEŠENO

lp. napsal(a)

Jinak objekt collection je přibližně to co hledáte.
Může obsahovat (skoro?) cokoliv, odkazuje se na to indexem nebo jménem (metodu add znáte, odkaz jménem taky, Metoda count dá počet záznamů (takže můžete iterovat)

objCollection.count

metoda remove odstraní objekt

objCollection.remove(index nebo jméno)

Dotaz na klíč jsem taky nanašel, obejde se to snadno pomocí on error goto

Popis jsem zatím nenašel (ani jsme ho nehledal), chová se hodně podobně, jako stejný objekt v excelu.


Děkuji ... jsem rád, že mne konečně někdo pochopil. Mým cílem není dělat vícerozmězné pole v sešitu Calcu, ale v proměnné ooBasic... ty další metody, které jste uvedl .. díky aspoň za ně, excel VBA moc neznám.

A ještě malé zjištění :
Pokud se snažím o toto :

Dim cLine As New Collection

cLine.Add(150, "Petr")
....

cLine.Add(145, "Petr")

nastane také chyba

Pokud si tedy nejme jisti, zda klíč Petr již neexistuje, je potřeba to ošetřit

Editoval MilanUhrak (14. 12. 2012 08:24:09)

Offline

#11 18. 12. 2012 07:10:48

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

Re: collection - VYŘEŠENO

Tohle téma je zajímavé a dost vybočuje z běžných témat. Slíbil jste, že 

Milan Uhrák napsal(a)

pokud je zájem, klidně sem postnu celý dokument.

Už se těším. 
   Ten popisovaný problém zřejmě souvisí s tím, že klíče jsou spojeny logickým AND. Takovou vlastnost čárka běžně mívá. Je otázkou, zda použít nějaký (nevím jaký, ale vyzkoušel bych různé) operátor.

Editoval neutr (18. 12. 2012 07:11:41)


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

Offline

#12 18. 12. 2012 13:21:00

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

Re: collection - VYŘEŠENO

Pane Neutr,
nejsem profesionalni programátor, prostě mně to jen baví.. z dnešních jazyků znám jakš-takš PHP, okusil jsem i Python a samozřejmě dělám Shellovské scripty (to ale není "jazyk" v pravém slova smyslu .. i když i v Bashi už asociativní pole jsou big_smile ).

Vy ovšem zjevně nevíte, o čem píšu, podívejte se prosím, jak fungují asociovaná (správně ASOCIATIVNI - holt nejsem suterén big_smile ) pole v PHP.

Problém, který spomínám v předchozím příspěvku nenastal čárkou, ta odděluje klíč od hodnoty, ale tím, že jsem již definovanému klíči "Petr" přiřadil (pokusil přiřadit) jinou hodnotu. Normálně by se měla přepsat, ale tohle není pole, nýbrž kolekce, takže to spadne. S podivem je, že nepomohlo ani
On Error Goto
chyba vyskočila do msgboxu...
taky si nejsem jist, pokud iteruju kolekci, (pomocí indexu), jak získám klíč... no asi to nejde, musím si vystačit s tím co funguje a nevymyšlet kraviny...

Soubor, (dokument) který se v bolestech big_smile rodí, je skoro hotov, snad jediným problémem je ona INVOICE faktura ... ta je originální a zveřejním ji jedině, až si najdu čas ji pozměnit. Úkolem makra, které píšu je z INVOICE souboru vytvořit fakturu, která se dá tisknut a číst lidmi. Důvody jsou nepodstatné, úkol jasný. práce je na mne, tak se snažím.

A vám všem díky za pomoc, když nevím, jak dál   

Pole a Asociativní pole v PHP ..  http://scriptici.titl.name/index/ucebni … php-13.php

Editoval MilanUhrak (18. 12. 2012 13:25:37)

Offline

#13 18. 12. 2012 16:00:47

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

Re: collection - VYŘEŠENO

Děkuji Vám za příspěvek. Už jsem se lekl, že tomu nerozumím. I když také nejsem programátor, jenom samouk. Ano asociativní pole je obecný pojem. Používá se ale také výraz asociovaná pole (asociované pole) a to tak, že každému prvku z A odpovídá pořadí jediného prvku B. Dejme tomu, že máme nějaké A+B pole která jsou asociovaná. Můžeme ale libovolné pole C (za předpokladu, že má stejný počet prvků) připojit jako asociaci k poli A, nebo B. Při tom je možné využívat přístupu pomocí kteréhokoliv k jinému. Takovému přiřazení pak říkáme asociace, a tomu poli C bychom říkali asociované pole.
  V Javascriptu (ale asi i jinde) je možné přistupovat pomocí polí s textem, tedy nejen s čísly. Ale čísla jsou typickým přístupovým polem právě kvůli možnosti iterací.
  V textovém poli se přistupuje pomocí lexikálního vyhledávání, které je rychlejší, nežli používat hledání procházením přiřazeného číselného pole (nebo údaje z iterátoru - pak nemá vlastní vyhledávané pole přiřazenu asociaci v podobě číselného pole). Toto téma je popsáno jako rozdíl mezi binárními vyhledáváním (binární stromy) a stromy lexikálními.
   Vstupní číselná pole jsou už "asociována" a proto se stane, že po smazání položek číselná řada vynechává smazaná čísla, ale nevadí to - přeskakují se (tohle se iterátoru nestane).
   Pochopitelně pokud je nastálo připojen číselný seznam podle kterého se vyhledává, šlo by hovořit o "klíči" ne tak u přístupu iterátorem. Rozdíl je v tom, jestli je používán zásobník typu "poslední dovnitř - první ven" - jakýsi "stoh, který je nutné přehazovat jako haldu", nebo je zásobník seznamem - tj data jsou spojena s číslem pozice buferu a je možné vyhledávat i z obou stran. Když se přehazuje "halda" je rychlejší lexikální vyhledávání, protože iterátor musí začít navrchu a jde postupně až na dno po jedné. Takže když iteruje podle čísla, testuje položku, za položkou. Lexikální vyhledávání (string řetězce) testují jen první znak, pak druhý a následně třetí a tak dál až najdou shodu. Netestují tedy celé řetězce.
   Právě proto se například uníkátní ID tvoří jako řetězce z ASCII znaků (některé programy to umí automaticky ale vypadá to jako šifra, i když to tak není v pravém smyslu slova (knihovny dll ap.).
   Toto umí také databáze a pak se typicky hovoří o klíči - uníkátním, neunikátním a podobně. Typický klíč není číselný, ale může být o tom žádná.
   Velmi často se vyhledává podle více klíčů. Pole mohou být asociována i z více polí, nebo může jít o vícenásobné hledání. Pak mohou být klíče vícenásobné, spojené logickým AND, OR a podobně. Je to velice podobné operací třídění podle více parametrů, ale zde jde jen o výběry.
   Ten dojem, že jde o vícenásobná klíč (unikátnost jsem nepředpokládal podle Vašich dotazů) Viz :

kde klíč představuje trivialní hodnotu ( 1, 2 ,23 ,"Petr", "Pavel")

a nebo :

Dim cLine As New Collection
cLine.Add(150, "Petr")
....
cLine.Add(145, "Petr") nastane také chyba
Pokud si tedy nejme jisti, zda klíč Petr již neexistuje, je potřeba to ošetřit

   Myslíte si že byste se mohl mýlit? - vždyť vždy hovoříze o "Petrovi" jako o klíči. Proč bych si měl myslet něco jiného. Jak mám vyčuchat, že to není klíč. Existují například seznamy ne náhodou jich několik mám (překladové slovníky), které mají jako klíč slovo, které je odděleno mezerou, nebo i jinak od vlastního údaje. Jsou samozřejmě i takové co mají čárku. Když je jednou (145, "Petr") a pak ještě (150, "Petr") tak to chápu jako číslo (nejspíš unikátní klíč) a "Petr" jako neunikátní klíč - z jiného asociovaného pole. Pak bych to viděl na tahání záznamů například takto 1.X(šíslo)-Yx"Petr"- a ten vyhledá třeba jinde X^Y - tou záznamů z asociovaného pole S, D, S,... Tak= předpokládám, že klíč "Petr" by mohl zpětně vracet "unikátní indexy - čísla" - jedná se přeci o asociaci u které je předpoklad obousměrného vyhledávání.
   Jinak Vám děkuji za příspěvek i když jsem nepomohl, ale snažil jsem se.


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

Offline

#14 18. 12. 2012 16:17:15

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

Re: collection - VYŘEŠENO

Bohužel nemám čas hledat v současné dokumentaci.

funguje:

iterace přes index, for each ...

Přepis klíče přímo nelze provést, nedříve je nutné záznam vymazat. Např:

on error resume next
kol.remove klíč
kol.add klíč

Klíč to nevrací. Můžete ale klíč uložit v položce. Alternativně můžete vytvořit druhou kolekci jenom s klíči.

metoda add podporuje parametry before a after (lze tak umístit položku na místo v seznamu)

Offline

#15 19. 12. 2012 07:41:53

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

Re: collection - VYŘEŠENO

Dobrý den
ip - > super, děkuji za další pootevření, s tiim kličem je to škoda, ale co už ..

neutr -> jen krátce :

cLine.Add(150, "Petr")

přiřazuje klíči "Petr" hodnotu 150 /např výška/
Petr povyroste, chci mu změnit hodnotu na 151, v kolekci nelze.O tom jsem psal


kolekci (asociativní pole) používám nejčastěji jako prostředníka při načítání dat z databáze, kdy pole (v PHP ) má po načtení příkazem  mysql_fetch_assoc podobu

$a = array( "udaj1"=>hodnota1, "udaj2"=>hodnota2 ....)

v dalším pak sázím výsledky do webové stránky

echo "<td>".$a["udaj1"]."</td>\n<td>".$a["udaj2"]."</td>..........

prostě si vytahuji hodnoty pomoci jmen klíčů v poli.
V případě, který řeším nyní, mám dlouhý řádek nabitý údaji a definici kde který údaj začíná, jak je dlouhý a podobně...

v PHP bych si nadefinoval pole

$header=aray("prvniudaj"=>array("pocatek"=>1, "delka"=>15,
 "desetinnychmist"=>0, "typ"=>"C")),"druhyudaj"=>array(................

při vytahování údajů z řádku pak nemusím každý zvlášť tahat v kódu, ale
napíšu obecnou funkci, které předám

$polozka = vemudaj($header["prvniudaj"])

a funkce vemudaj si potřebné parametry pro vyhledání udaje v řádku převezme z pole, a vrátí mi hodnotu, kterou potřebuju (řetězec, číslo nebo cokoliv)

Načítat data takto je možná zbytečně složité, ale pro mne daleko přehlednější

Nicméně, toto je řešení v PHP, ooBasic nic takového nemá, a jediným východiskem jsou kolekce. Ty mají ovšem určitá omezení, a my se tomu musíme přizpůsobit. Kolekce jsem doposud nikdy nepoužíval, narazil jsem na ně čírou náhodou a zde jsem hledal někoho, kdo o kolekcích ví více.

jinak doufám, že tato horká diskuze bude užitečná i dalším čtenářům, a rozšíří jim obzory jako mně...

Milan

Offline

#16 19. 12. 2012 12:30:06

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

Re: collection - VYŘEŠENO

Zdravím, a znovu bych se tedy zeptal. Nechápu proč potřebujete collectin. Napadá mne jediné, že máte data někde na serveru a chcete je dostat do formuláře faktury. Nejspíš proto, že na serveru jsou data aktualizovaná v databázi (MySQL?) a do base by se musely exportovat růčo, protože Base by si s importem neporadila, i když existuje snad nějaké rozšíření pro MYSQL.
   Pokud by Vaše data byly v Base, nebo Calcu, tak vytvořit formulář krmit ho například z Calcu (ten samý sešit, jiný list) není žádný problém a fungovalo by to stejně ne-li lépe než v PHP. Takže možná vůbec nejde o potřebu používat Collection, ale export/import dat. Ale jistě by pro Vás nebyl problém například vytvořit paralelní data na serveru ve formátu csv, dbf, nebo třeba rtf ap. Navíc existuje verze OOo pro přenos na USB klíči, takže udělat fakturu například u prodejního stánku a na cizím noťasu - žádný problém.
    Jiná věc je rekompilace cizích faktur doma za stolem. Ale vytisknout, nebo jen elektronicky archivovat, na to nic nepotřebujete. Tedy věděl bych i k čemu by to bylo dobré, ale to by se týkalo faktur adresovaných někomu jinému - omluva z toho Vas nepodezřívám smile nemyslím si že byste měl zájem někoho "hákovat", nebo pozměňovat dokumentaci pro FÚ a podobně.
   Proto předpokládám, že máte spíš jiný problém, který se dá obejít jednodušším způsobem, nežli je použití Collection. Zase mi připadá neuvěřitelné (jste dlouhodobý člen fóra), že byste nevěděl, jak dostat externí data do formátu pro Calc, nebo Base. Textové dokumenty lze zaregistrovat pro OOo a pak už nepotřebujete Collection. Totéž platí pro import přímo do Calcu.
   Snadno si ale také představím, že si stáhnete vyhledanou adresu a další data do textového dokumentu (nebo spíš přímo HTML formát) pomocí PHP. Ten pak potřebujete zpřístupnit pro Calc. Ani v tom bych žádný velký problém neviděl. Ale maličko dovedností to už obnáší.
   Udělat validní fakturu Invoice znamená také možnost šifrovat a dodržet standardy, které pro takové dokumenty platí. Stačí možná jen šifrovat dokument archivem Zip, Rar ap. Také je možné šifrovat poštu. OOo podporuje elektronický podpis, takže pokud víte, co obnáší legislativa můžete pro své ale i cizí potřeby úspěšně užívat vlastní šablonu.
   Jde pak jen o to, že nemusíte kupovat placený program, ani používat (upravovat) například free z
Faktura
Tomu rozumím. Také se rád bavím podobným způsobem. Tolik k účelu.
   Jenom mne zajímalo proč to děléte složitější, než by to mohlo být. Nechce se mi věřit, že potřebujete právě a jenom collection. Ano určitě je to schůdné řešení jak se ukázalo, a může to být využito i pro jiné účely. A proto mně to zajímá.


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

Offline

#17 19. 12. 2012 13:17:05

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

Re: collection - VYŘEŠENO

Dobrý den , psal jsem to už podruhé, takže potřetí :

Mám soubor s extrémně dlouhými řádky (až 600 znaků), obsahujícími data faktury. (formát EDI Invoic) popis např. zde (dosti komplikovaný dokument, asi z toho moc nepoberete)

Příloha smlouvy o edi Invoice


Soubor se musí jakýmkoliv způsobem načíst tak, aby byla z těchto dat vytvořena faktura rovnou vhodná k tisku.


Colection nepoužívám proto, že to jinak nejde, ale proto, abych do collection načetl strukturu InVOIC souboru (tedy co - kde najdu), a poté zpracovával položky jménem, nikoliv ručně vydatlovanou definici v místě potřeby + dodatečné úpravy údaje tak, aby byl použitelný

Jelikož je definice již zložena v listu CALC, nebyl problém pomocí funkce ve vedlejším listu vytvořit kód, takže ručně jsem nic neopisoval...

použitím

 =CONCATENATE("cItem.Add(array(";INVOIC.E82;", ";INVOIC.D82;"), """;INVOIC.M82; """ )")

vznikne např.

  cItem.Add(array(35, 25), "P_CIS_ZBO")

Ale odbíháme od tématu... chtěl jsem prostě jen vědět, co od collection můžu čekat, a co dovedou, pro mé potřeby se ukázali jako nejvhodnější cesta k cíli, a tím celá debata končí. Pokud máte lepší nápad, nechám si vysvětlit, ale makro již svou práci dělá, a to je pro mne v tuto chvíli podstatné

Editoval MilanUhrak (19. 12. 2012 13:18:49)

Offline

#18 19. 12. 2012 15:01:43

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

Re: collection - VYŘEŠENO

Nevím o čem mluvíte
Tohle má úplně snadný řešení - nebo ne?
Teda vím proč máte problémy. PDF jste načítal Writrem, nebo Calcem - to je pak paskvil smile
Stačí jen zkoušet - nejlépe přímo kopírovat obrazovku z HTML. Musíte opatrně, aby jste dostal všechna důležitá data - ale jde to snadno - lépe nežli hledat řešení pomocí collection. Myslel jsem si něco takového, ale bál jsem se zeptat.


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

Offline

#19 19. 12. 2012 19:06:33

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

Re: collection - VYŘEŠENO

Vím, že na Vás tlačím, ale od počátku mne to zajímalo. Moc rád bych bych se dostal do modulů EDI, tedy elektronické výměně dat pro vnitřní chod státní správy. Dohledával jsem to kde se dalo, ale právě zdrojáky, nebo něco konkrétního jsem nenašel. A tak mne zajímalo právě to co jste psal o těch fakturách. Ono je to dost frekventované téma, a je to velice podobné modulům pro intranety. Ale ani zde jsem neuspěl.
  Takže ví někdo jak bych se dostal například k INHOUSE Formát – Nestandardní formát zpráv, se kterým umí pracovat podnikový informační systém.
  Při komunikaci s jinými subjekty je zpráva z tohoto formátu překládána EDI konvertorem do standardního či jiného požadovaného formátu. A to je to oč běží. Ale jsou také různé moduly. Rád bych se podíval na kousek kódu.

Editoval neutr (19. 12. 2012 19:12:31)


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

Offline

Zápatí