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

#1 5. 3. 2014 22:46:41

meda
Člen
Registrace: 5. 3. 2014
Příspěvků: 3

kopírování mezi soubory - makro

Dobrý den,

potřebuji udělat jednoduchou aplikaci na inventuru a potřebuji poradit s problémem, ohledně kopírování dat z jednoho souboru do druhého souboru.

Konkrétní problém je tento:

V souboru "den" vyplním datum a dále u každého zboží vždy 3 údaje (náš princip inventury), následně bych potřeboval, aby se po stisknutí tlačítka tyto údaje překopírovaly do souboru "prekopirovane", ale tak, že vždy do nových prázdných sloupců (snad je to z přiloženého souboru poznat jak to myslím). A aby se po odeslání mohl vymzat obsah souboru "den", ale v souboru "prekopirovane" aby údaje zustaly.

Doufám, že jsem to řekl alespon trošku srozumitelně.

soubory: http://ulozto.cz/xaKY6e8m/rada-rar

P.S. Případně pokud někdo má nějaký soubor na inventuru pro stánkový prodej (zboží nejde přes čárový kod a není tak možná automatická inventura), klidně jsem ochoten za rozumnou cenu tento soubor odkoupit. Pokud možno v OpenOffice.

P.S.2. Pokud má někdo zájem, můžeme se domluvit na výrobě tohoto souboru přímo na míru. Pokud se někdo této rpoblematice věnuje, určitě mě kontaktujte a můžeme se domluvit, že bych si u vás tento soubor nechal kompletně udělat.

Editoval meda (5. 3. 2014 22:48:25)

Offline

#2 6. 3. 2014 06:50:46

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

Re: kopírování mezi soubory - makro

Žádný velký problém. Jde spíš o detaily.
- Jedná se o inventury mezi různými prodavači?
- Mělo by se vyhodnotit také rozdílové množství a ceny?
- Bude (má být) soubor "překopírované" přístupný tomu kdo inventuru dělá?
- Mají mít stejné položky zboží vždy stejný řádek?
- Má se vyhodnocovat například trvanlivost (doba spotřeby)?
- Je položek hodně - řádově více nežli desítky - má se sledovat předpoklad vyprodání?
- Mohou prodavači přebírat zboží od dodavatelů a zavádět nový druh nebo jinou cenu?
- Má se vyhodnocovat tržba - popřípadě (převzetí zásob + nákup nových - tržba)?
     Jde sice o detaily - ale může jich být milion. Zejména pokud by se jednalo například o potraviny, kde je potřeba také někdy fofrem zlevnit a přednostně vyprodat. Pak správně načasovat dodávku čerstvého sortimentu a ohlídat aby to prodavač nezneužil.
     Jinak asi bude probíhat předání směny s režimem jako mají hospody, a jinak stánek se zeleninou, kde se po týdnu střídá rodina.


     To vlastní makro - nebo jeho nějaká podoba tady bylo už vícekrát. Jde asi jen o ty detaily a o to, zda se má kopírovat do skrytého souboru, popřípadě do zaheslovaného. V podstatě jde asi o to, zda je potřeba inventuru jako předávací protokol mezi směnami z "cizích" prodavačů. Tedy začátek směny - konec směny shodný za přítomnosti obou směn - nebo jen stav na konci směny - bez vyhodnocení začátku.
     Je možné například ráno zboží navézt - prodavač prodá a co neprodá vezme domů. Druhý den přijde jiný prodavač, který má také z minula nějaké zboží a ráno se mu jen doplní a on pak také odevzdá tržbu za svůj předchozí prodej ap.... Prostě mnoho variant.

      Někdy bude zájem si předání i nafotit - stačí mít zboží správně srovnané a nikdo nepochybuje, což může být zejména v předávce typu "hospoda" velmi sporné. Malé zboží může být vybaveno jen pro účely dokumentace cedulkou (300 ks žvýkaček...). Oba prodavači fotkou (každý svou) potvrdí, že údaj na cedulce je správný. Odeslání sešitu ke kopírování.
      Jinak by asi vypadala "stop inventura" - kontrola stánku zda si prodavač nepřilepšuje na úkor zaměstnavatele, nebo zda nešidí zákazníky. To všam by mělo zapadat do celkové koncepce inventur nejlépe tak, aby to přijal i kontrolní orgán. Může to rozhodnout o tom, kdo dostane pokutu, zda jen prodavaš, nebo prodavač i firma, nebo jen firma. Kontrolní orgány by raději viděly pokladnu - ale v plátěném, nebo igelitovém stánku a elektronika určená do vnitřních prostor? Noťas, nebo tablet bez problé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

#3 6. 3. 2014 08:26:35

meda
Člen
Registrace: 5. 3. 2014
Příspěvků: 3

Re: kopírování mezi soubory - makro

Dobrý den,

pokusím se Vám dopovědět na váš dotaz.

Jedná se o inventuru pro stánkový prodej, respektive jde o stánek ve vodáckém kempu.

Aplikace na inventuru by nám měla být schopna pohlídat, jestli tržba odpovídá +- prodanému zboží, měla by umět vypsat určitou sestavu o počtu prodaného jednotlivého zboží a také by měla umět vypsat aktuální stav skladu.

Naše myšlenka je následující:
Zaměstnanci po směně vyplní připravený formulář, kde bude přednastaveno všechno zboží které v kiosku máme (počítejme cca 100-200 položek (jídlo, alkohol, cukrovinky, nanuky atd...)). To by byl soubor "den", provozní zároveň do jiného souboru zadá denní tržbu, do dalšího souboru zadá dodané zboží od dodavatelů.

Detaily co má jednotlivý soubor umět, bych určitě dodal.

Ještě by byl soubor "sortiment" kde by budou veškeré údaje o daném zboží (nákupní cena, prodejní cena, počet ks v balení atd..).

Pomocí makra se toto vše překopíruje do souboru, do kterého bude přístup pouze pod heslem, a ve kterém budou probíhat veškeré matematické výpočty.

Další soubor by právě měl umět udělat tisk sestav z tohoto zaveslovaného souboru. Nebo-li po stisknutí tlačítka "finance" by měl umět ve vybraném období vypsat porovnání tržby a prodaného zboží. Po stisknutí "Prodej" by měl umět vypsat za nějaké období počet prodaného zboží.

Dobré by také bylo, aby ze souboru "sortiment" šlo vypsat určité zboží, pro hledání výhodnější koupě. nemůžeme si pamatovat, všechny položky. Řeknu příklad: budeme kupovat sud kofoly u jedné firmy za xx kč a v letáku jiného velkoobchodu bude najednou za yy kč, tak aby jsme jenom nechali vypsat cenu kofoly a mohli to porovnat.
 
Vím že je to jenom takový hrubý náznak a jak říkáte je tam mnoho detailů, ale ty se spíše budou lépe ukazovat v rozdělané práci, jestli mi rozumíte jak to myslím.

jak jsem říkal, matematická stránka věci není žádný problém, nechceme to ovšem mít všechno v jednom souboru kde bude mraky listů, chceme aby to bylo přehledné.

nemusí se hlídat trvanlivost (většina věcí má trvanlivost na celé období prodeje) ani nemusí být aplikace přizpůsobena na slevu.

Offline

#4 6. 3. 2014 10:55:35

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

Re: kopírování mezi soubory - makro

Ano rozumím. O to je to snadnější. Předpokládám tedy, že tam nebude prodej váženého zboží, ani rozlívání nápojů. Prodej jen kusů, nebo rozlívání (čepování) na vlastní triko prodavače. Přes to se asi stane, že konec dne se začátkem následujícího nebude souhlasit a mohou vzniknout spory. Důvodů může být více. Například Vám někdo kiosek vykrade, nebo jeden ze střídajících se prodavačů udělá nechtěnou chybu, či dokonce podvod na kolegu. Ne vždy bude moci skutečný stav garantovat provozní. Při tom podle všeho nebude prováděno předávání ze směny na směnu - mezi směnami bude proluka. Potřebou je potvrdit počáteční stav a pak konečný tím samým prodavačem. Máte konkrétní představu co se stane, když prodavač převezme nové zboží, které již na stánku má, ale za jinou cenu? Samozřejmě bych se právě o tohle zajímat nemusel, ale Vy byste na to stejně asi narazili jako naproblém. Takových věcí je poměrně dost. Napíšu jen náznakově o co jde:
- Prodavač převezme nové zboží, potvrdí příjem, ale neměl by zboží pustit do prodeje bez provozního kvůli přecenení. Nechá to v kiosku v krabicích a ráno provozní zjistí, že krabice jsou napolo, nebo zcela vybrané. Prodavač který to přebíral bude tvrdit, že si ničeho nevšiml - a že bylo vše v pořádku když odcházel. Ráno už tam nejspíš bude další prodavač, a ten bude tvrdit, že na to ani nesáhl.
- Podobná situace, jen původní prodavač uvede jiný stav, nežli "shledá" ten další. Manko budou házet jeden na druhého, nebo na provozního, který bude mít asi logicky také klíče.
- Hloupý prodavač si přinese své vlastní zboží (nesouhlasí s oficiálním sortimentem) a bude "rejžovat". Chytrý prodavač bude "rejžovat" jen na svém zboží, které je stejné, jako to dodané oficiálně. Stačí mu v létě 1 krabice nanuků a 10 Pet-lahví 1,5 lt piva? Co takhle malinkaté věci jako kondomy, cigarety a podobně?
- Co takhle záměna gramáží - například sušenky a bonbóny s různým, ale velice podobným obsahem. Jeden karton pak jednou bude obsahovat třeba 60 kusů a jiný jen 40 - ale větších.


     Jednoduše si myslím, že těch kolonek je potřeba více. Řešením jiného typu je registrační pokladna - a může to být i starý typ, který nemá elektronický výstup. Důležité je to, aby všichni věděli, že musí dát lístek z pokladny. Při manku se dá kontrolní páska naskenovat stolním skenerem a přes OCR vložit do Calcu - ale i stará pokladna něco stojí - udržba, páska ap. Jsme u HW.
     Jak to budou prodavači zadávat? Notebookem? Mají tam něco se síťovým propojením? Tedy může tam být i starší stroj jen Off-line a je možné to přenášet na flashi. Nebo to vyplní jako skutečný papír a odevzdají provoznímu ke zpracování?


      Oč se jedná: - Pokud je tam nějaký počítač, je možné vytvořit systém s hesly tak aby každý prodavač měl své vlastní stejně jako provozní. Majitel bude mít všechna hesla. Takže provozní se dostane do souborů prodavače, ale ne na souhrny. Prodavač se dostane jen ke svým souborům jako ke kopiím. To mu znemožní zpětné přepisování. Pokud by to bylo jen v Off-line provozu, bude přenášen celý klíčenkami adresář všech záznamů. To pak můžete porovnat - detaily jsou maličko složitější, ale nic co by nemohlo vyhovět každému systému provozu. Myslím, že by tam mohlo být i připojení k netu - tím by se vyřešilo plno věcí.

Editoval neutr (6. 3. 2014 10:57:02)


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

#5 6. 3. 2014 11:51:06

meda
Člen
Registrace: 5. 3. 2014
Příspěvků: 3

Re: kopírování mezi soubory - makro

Právě kvůli inventuře (již minulý rok jsme ji dělali, ale právě pouze pomocí jednoduchého sčítání v Excelu) neměníme během sezony sortiment zboží, proto si myslím, že problém s neceněním zboží by nastat neměl.

Nyní mi nejde o to řešit moc věci okolo viny, respektive manka a čí to bude vina. Bude problém, že se v kempu střídají brigádníci a vlastně nejsou určeny žádné pevné směny (nejsme majitel, dělám pouze provozního a už jsem s majitelem o tomto mluvil, že to bude hodně divoké dělat v tomto systému inventuru). Spíše než o nějaké buzerování že chybí v kase vzhledem k inventuře 100 kč, nám jde spíše o případ kdy bude za jeden den chybět třeba i několik tisíc. Kiosek je navíc vybaven kamerovým systémem, takže když díky inventuře vytipujeme podezřelý den, můžeme si potom prohlédnout záznam jestli na něm není něco podezřelého. Také nám jde o systém pro příští rok, respektive pro příští objednávky. podívat se že minulý víkend se prodalo tolik piva a tolik klobás.

Samozřejmě během sezony se objeví mnoho much a mnoho nových problémů, které nás nikoho nyní nenapadnou. Pro letošní rok hledáme pouze nějaký dá se říci hrubý návrh a hrubé řešení, které se bude v průběhu dalších let zdokonalovat právě podle problémů na které narazíme během sezony.

Inventuru zamýšlí majitel pomocí papírového formuláře a já nebo kolega to posléze naťukáme do systému. Letos nebude mít nikdo kromě provozních a majitele k tomuto systému přístup, proto není potřeba složitě řešit zaheslování různých věcí. Potřebujeme najít ten nejlepší způsob, kterým toto zpracovávat.

Ano registrační pokladna je další možnost, v minulých letech jsem zkoušeli pokladny podobného typu jako má McDonald (dotykové atd..), ale znatelně to zpomaluje práci obsluhy. Ty 3 měsíce je to u nás opravdu frmol, a je potřeba co nejrychlejší způsob výdeje zboží z kiosku.

Myslím, že nejlepší by bylo nejdříve vyrobit nějakou základní kostru, pro letošní sezonu zatím nic extra složitého. udělalo by se pár testů a mohlo by se to případně dále upravovat.

Představa o celém schématu je následující:
http://ulozto.cz/xc347hW4/dokument1-pdf

Jestli mi rozumíte jak to myslím s tou hrubou kostrou. Vždycky se lépe diskutuje již na nějakou hotovou věcí, kde se může řešit konkrétní problém. Jestli se můžeme domluvit, že by jste mis  tím na zakázku pomohl. V jaké cenové hladině by se to tak pohybovalo?

Offline

#6 6. 3. 2014 12:01:09

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

Re: kopírování mezi soubory - makro

Myslím, že pro inventuru skladu je lepší databázové řešení, s tím ale nepomohu.


Ošetření makrem lze, ale je nutné naprosto přesně definovat, způsob jakým se mají data přenášet.

Sub prenos
dim prekopirovane as object 	
dim args(1) as new com.sun.star.beans.PropertyValue
args(0).Name = "Hidden" ' otevřeme jako skrytý
args(0).Value = True
args(1).Name = "Password" ' heslo
args(1).Value = "Heslo" ' doplňte si vaše
'zaměňte si adresu dokumentu podle vás
adresa = ConvertToURL("/home/daniel/Plocha/rada/prekopirovane.ods")
doc = thisComponent
okno = doc.currentController.Frame.getComponentWindow ' přiřazení okna dokumentu
okno.setVisible(false) ' uzavřeme okno - zrychlení makra
list_den = doc.sheets(0) ' nebo název listu - doc.sheets.getByName("List1")
' otevřeme překopírované.ods jako skrytý
prekopirovane = Stardesktop.loadComponentFromURL(adresa," ",0, args())

list_prekopirovane = prekopirovane.sheets(0)
oblast_den = list_den.getCellRangeByName("C3:E202").getDataArray ' načteme data ze souboru den.ods
' načítá se 200 řádků
datum = list_den.getCellRangeByName("E1").value ' pro daný dane
for i = 2 to 93 step 3 ' nalezneme stejné datum v překopírované.ods '
den_prekopirovane = list_prekopirovane.getCellByPosition(i,1).value ' zjištění datumu prohledáváme každý třetí sloupec
if den_prekopirovane = datum then ' pokud jsou data shodná tak
'zadefinujeme si oblast pro vložení do překopírované.ods
vloz_do_prekopirovane = list_prekopirovane.getCellRangeByPosition(i,2,i+2,201)
'vložíme celou oblast z dokumentu den.ods
vloz_do_prekopirovane.setDataArray(oblast_den)
else
endif
next i
prekopirovane.store() ' uložíme
prekopirovane.close(True) ' uzavřeme
print "PŘENOS PROVEDEN" 
okno.setVisible(True)' zobrazíme okno
End Sub

Tento kód přenese data z dokumentu den.ods do překopírované.ods. V překopírované.ods si musíte přednastavit data na celý měsíc. Nyní provádí makro test dat v rozmezí 31 dní.
Také přenese data inventury v pořadí v jakém jsou zadány ve dni.ods. Stejná struktura musí být i v překopírovaném.ods!

Co se stane, když datum chybí, má se automaticky doplnit? Má makro skončit a nahlásit chybu?
Co s novým zbožím? Je nutné neustále hlídat nové zboží, aby nechybělo. Má se provádět kontrola na toto nové zboží a pokud chybí, má se doplnit? A kam se má doplnit?
Těch otazníků je celá řada a řešení nemusí být zrovna jednoduchá.
Databázové řešení tyto problémy odstraňuje, můžete se inspirovat v seriálu p. Svobody Práce s databází - Base z OpenOffice.
Na druhou stranu s Base má zkušenost jen velmi málo lidí, zatímco s makry vám můžeme pomoci.


;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 6. 3. 2014 12:27:55

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

Re: kopírování mezi soubory - makro

Ano to už podle obrázku vypadá celkem koncipovaně. Vlastní makro pro kopírování není problém. Ovšem co, kam a proč kopírovat musí být zřejmé - nyní už představu mám. Můžeme se domluvit. Znám i problematiku jako takovou a dokonce současně něco podobného pomáhám řešit jednomu kamennému obchodu. O peníze jde až první řadě - dáte mi na pivo až když se Vám to (jestli se to) bude líbit :-)

Editoval neutr (6. 3. 2014 12:28:35)


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. 2. 2017 14:01:42

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

Dobrý den
Prosím o radu:
mám dva soubory, jeden jako hlavní - jedno z maker otvírá druhý soubor, který je zdrojem a editorem dat a obsahuje makro pro přenos dat do hlavního sešitu. Problém spočívá v tom, že při ladění mi obě makra šla správně (podmínky vypsány):
hlavní souubor otevřen, otevřený dialog
datový soubor otevřen ručně z OO, funkční
makro pro přenos dat spojeno s tlačítkem na liště, data překopíruje, makro projde korektně (ověřeno krokováním)


Pokud vše pustím v ostrém provozu (podmínky vypsány), makro pro přenos dat se nespustí
hlavní souubor otevřen, otevřený dialog
datový soubor otevřen makrem z hlavního, stav OK
makro spojeno s tlačítkem na liště, makro se nespustí, OO na příslušné makro vůbec neskočí (ověřeno krokováním)

zde makro pro otevření datového souboru
Sub sort_Fread
    Fondy = thisComponent
    Strana_1 = fondy.sheets(1)
    Strana_2 = fondy.sheets(2)
   
    dim sURL as string
    dim Market_data as object
    srcURL = "E:\Users\Tata\Documents\Penize\3_Fondy_RB\Market_data.ods"
    convURL = ConvertToURL(srcURL)
    infobox = sort_base.getcontrol("infobox_sort")
     dim oDoc as object, eDocs as object
        set eDocs = StarDesktop.Components.CreateEnumeration
    Strana_2.getcellrangebyname("A6").value = 0
    do while eDocs.hasMoreElements
        set oDoc = eDocs.NextElement
        if oDoc.ImplementationName="ScModelObj" and ConvertFromURL(oDoc.URL) = srcURL then
            Strana_2.getcellrangebyname("A6").value = 1
    endif   
    loop
    if Strana_2.getcellrangebyname("A6").value = 0 then
        Market_data_file = StarDesktop.loadComponentFromURL(convURL," ",0,Array())
    endif
    str1 = "Soubor dat obchodů je otevřen - proveďdte aktualizaci"
end sub

zde makro pro přenos dat (uloženo v knihovně "Standard" jako dokumentové makro
sub Send
    Market_data = thisComponent
    StarDesktop.Frames("Fondy_RB_17-02-06.ods - OpenOffice Calc").activate
    Fondy = StarDesktop.getCurrentComponent()
    Strana_0 = Market_data.sheets(0)
    row_act = Strana_0.rows
    row_act.removebyindex(0,1)
    src_data = Market_data.Sheets(0)
    Market_data.Currentcontroller.select(src_data)
    packet = Market_data.CurrentController.getTransferable()
    Target_arrea = Fondy.Sheets(1).getCellRangeByName("A1")
    Fondy.CurrentController.select(Target_arrea)
    Fondy.CurrentController.insertTransferable(packet)
end sub

Děkuju Martin

Offline

#9 14. 2. 2017 10:09:54

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

Re: kopírování mezi soubory - makro

Mám stejný "problém". Jakmile otevřu soubor makrem, pak v něm obsažená makra nelze spustit. (LO 5.2.2.2, win 7). Ale jak z toho ven to nevím, zas tak mě to netrápí, jen jsem si toho všimnul. Možná zkoušet různé způsoby otvírání ...


LibreOffice 5.2.2.2

Offline

#10 14. 2. 2017 10:29:01

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

Ještě jsem vydedukoval tohle: Když se dostanu přímo na text makra pokusím se ho spustit v testovacím módu, objeví se hláška "z bezpečnostních důvodů nelze spustit toto makro, ověřte nastavení bezpečnosti". Zabezpečení makra jsem zkoušel i na nejnižší stupeň, je možné, že to bude vyžadovat zapsání makra do seznamu bezpečných nebo nějaký certifikát - to moc nedávám.
Martin

Offline

#11 14. 2. 2017 10:40:52

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

Způsoby otvírání - to by tam musel být nějaký parametr na povolení maker a je mi divné, že by implicitní hodnota byla zakázat - a že by po otevření nevyskočilo nějaké upozornění typu - "makra nejsou povolena".
M

Offline

#12 14. 2. 2017 10:47:16

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

Re: kopírování mezi soubory - makro

Marrtt napsal(a)

Způsoby otvírání - to by tam musel být nějaký parametr na povolení maker a je mi divné, že by implicitní hodnota byla zakázat - a že by po otevření nevyskočilo nějaké upozornění typu - "makra nejsou povolena".
M

Je to tak mrknite sem: https://wiki.openoffice.org/wiki/Docume … tarDesktop

MacroExecutionMode (Integer)
    indicates if document macros may be executed. Values : see com.sun.star.document.MacroExecMode

A dejte pak vědět řešení. Díky :-)


konstanty a jejich významy zde: http://www.openoffice.org/api/docs/comm … cMode.html

Editoval ludviktrnka (14. 2. 2017 10:50:17)


LibreOffice 5.2.2.2

Offline

#13 14. 2. 2017 11:01:54

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

Re: kopírování mezi soubory - makro

Jo je to přesně ono, u mě už to fachčí:

dim argum(0) as new com.sun.star.beans.PropertyValue   	
argum(0).Name = "MacroExecutionMode"
argum(0).Value = 4
secDoc = starDeskTop.LoadComponentFromURL(file,,0,argum())

LibreOffice 5.2.2.2

Offline

#14 14. 2. 2017 11:06:51

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

Tak z toho teda chytrej nejsem; zaprvé mám bohužel trochu handicap v AJ (za mejch mladejch let se učila jen ruština, takže jsem jazykově bohatě vybaven na příjezd Kozáků). Zadruhé je ta wiki pro mě dost nesrozumitelná a nevidím tam příklad praktického použití. Takže pořád chodím kolem chaloupky a nevidím dveře...

Offline

#15 14. 2. 2017 11:10:08

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

Bomba!!!
až budete v Praze, máte u mě pivo!!

Dík

Offline

#16 14. 2. 2017 13:10:53

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

Re: kopírování mezi soubory - makro

Já bych se taky rád zeptal. Vy pomocí této metody:
packet = Market_data.CurrentController.getTransferable()
Fondy.CurrentController.insertTransferable(packet)

přenášíte obsah celého listu? Jak je to rychlé? Kolik toho přenášíte?


EDIT: Tak jsem to vyzkoušel na ne úplně malém souboru (asi 1200 x 13) a je to naprosto excelentní. Přenos je v mžiku hotovej. A už jsem objevil i popis u Dana Sedláčka - no stále jsem tento materiál nepostihnul celý.

Editoval ludviktrnka (14. 2. 2017 13:34:54)


LibreOffice 5.2.2.2

Offline

#17 15. 2. 2017 11:36:44

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

Re: kopírování mezi soubory - makro

Transferable vždy značí práci schránky. To znamené že přenáší vše stejně jako když uděláte Ctrl+C.
     Konkrétně to znamená také přenos obrazu - nejen textu. Ostatní metody jsou většinou omezené například jen na text. Účelem je zřejmě dlouhodobé uchování v paměti. Schránka určitě zabírá mnohem víc místa a tak umí jen jeden obsah. To samozřejmě přenese relativně spolehlivě.
     Proto Transferable (schránka) se při novém nakopírování dat smaže a ponechá jen poslední. U ostatních způsobů kopírování - například přes deklarace Dim, Global ... lze načíst docela mnoho různých datových paketů které se mohou volat na přeskáčku. Je to ale docela složité protože to někdy umí zaplnit postupně celou operační paměť. Složité je to proto že se používá ještě odkládací paměť a v operační se uchovávají jen adresy obsahu. Kvůli špatně vybavené paměti často program padá. Paměť se plní a neuvolňuje. To souvisí také asi víc s Operačním systémem, počtem spuštěných úloh a asi mnoho jiných věcí.
     Když se použije schránka tak se kopírovaný obsah nemusí vejít do operační paměti. Potom se odloží a vkládá se jen po částech - to co přenese cachovací paměť úložiště (stránkovací paměť).


     Já tomu až tak dobře nerozumím ale programátor by měl optimalizovat procesy tak aby vše chodilo co nejrychleji a bez nebezpečí pádu. Proto si myslím, že UNO používá asi výhradně kopírování schránkou za cenu větší bezpečnosti. Proto já (a a nejsem sám) UNO vůbec nevolá pokud to není nutné.


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

#18 15. 2. 2017 11:59:15

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

Re: kopírování mezi soubory - makro

Já myslím že tady je zásadní ta věc, že ačkoli vybírám celý list ( src_data = ThisComponent.Sheets(0),
ThisComponent.Currentcontroller.select(src_data) ) tak schránka ty prázdné buňky více méně ignoruje a to co je ke kopírování tak spolehlivě a rychle natáhne a vyplivne. Já bych to viděl jako optimální způsob nahrazení "starých dat" novými ve stávajícím listu. Rozhodně z toho co jsem zkoušel tak nejrychlejší. Asi se to ale moc nehodí do cyklů, kdy se pak musí neustále přepínat aktivní listy. (což by možná mohlo zpomalovat, ale vlastně nevím)(Zkoušel jsem i UNO, to bylo celkem fajn, ale ten zápis je pro mě takový kostrbatý), nejpomalejší bylo kopírování obsahu velké matice pomocí zdroj=list.getCellRangeByName("A1:HZ5000").getDataArray,
list2.getCellRangeByName("A1:HZ5000").setDataArray(zdroj)
Tato metoda neumí ignorovat prázdné buňky, čím větší oblast vyberu, tím je přenos pomalejší a nestabilní bez ohledu na množství dat. Na druhou stranu pokud je velikost oblasti přiměřeně malá, a asi se celkem hodí do cyklů - nemusí se přepínat CurrentController.


EDIT: Tak jsem zkusil getTransferable v jiné variantě: kopírování po řádcích do nového sešitu. Je zde nevýhoda kopírování všeho tedy hlavně vzorců, metoda getDataArray bere jen hodnoty, takže to je výrazný rozdíl, který jsem si neuvědomil. Jinak bych musel přes UNO. Nicméně alespoň jsem viděl rychlost a ta je v cyklu kopírování po řádcích v podstatě totožná. (zejména když to musí všude hezky napsat #REF! :-)

Editoval ludviktrnka (15. 2. 2017 12:25:59)


LibreOffice 5.2.2.2

Offline

#19 22. 2. 2017 09:13:20

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

hodlám tím způsobem kopírovat cca 1000 řádků (vlastně jen jednou při první iniciaci programu - historická data), zcela tupě ručně okopírovaných z webové stránky bankovní aplikace. Další dávky dat budou velmi malé, odhadem 10-50 řádků po cca 10 sloupcích 1x měsíčně podle aktivity obchodníka (píšu si účetnictví kapit. obchodů). Data se načtou jako text, číslo, datum, další zpracování až v makrech po odeslání do hlavního programu. Pro tyto účely rychlé a spolehlivé.

Offline

#20 22. 2. 2017 21:37:41

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

Ještě k tomuto tématu jedna poznámka - při pokusu přenášet data do skrytého listu jsem narazil na drobnou potíž - ani při deklaraci listu jménem není list nalezen a schránka se vysemení do prvního listu sešitu. Při deklaraci pořadím listu (např, (3) se vysype do čtvrtého viditelného listu v cílovém souboru. Je tedy nutné (pokud na to zase neexistuje nějaký fígl), cílovou stránku v příslušném makru zviditelnit a po nasypání dat zase skrýt.

Offline

#21 22. 2. 2017 21:57:56

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

Re: kopírování mezi soubory - makro

Nevím, myslím že to skrze CurentControler nepůjde. Nebo možná je tam jiný problém - moc se v tom nevyznám. Buď bych list zviditelnil a zase skryl nebo použijte jinou metodu kopírování. Zrovna nedávno jsem to řešil zde: https://forum.openoffice.cz/viewtopic.php?id=4338, na konci už bylo docela použitelné makro na přenos celkem velkého objemu dat a to funguje bez ohledu na viditelnost či "aktivnost" jak listu tak i souboru (obecně není problém požívat se souborem v režimu hidden).


LibreOffice 5.2.2.2

Offline

#22 22. 2. 2017 22:00:08

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

Re: kopírování mezi soubory - makro

To bude chyba označení z deklarace. Je rozdíl v popisu objektu na popředí, na pozadí a zavřeního. Dále jde o určení jménem listu nebo jeho indexem - od počátku. Když přidáte list - posunete předpokládaný cíl na jinou pozici.


     Někdy to vyžaduje deklarovat objekt pomocí DOC. ThisComponent je dost zrádné - načte aktuálně a třeba omylem otevřený list. Víděl jsem ve vašem kódu kopírování bez zadání cílové plochy "data-array".
Potom je potřeba deklarovat option Explicit a doladit neúplné deklarace, souběhy názvů a podobně.


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

#23 22. 2. 2017 22:27:51

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

Re: kopírování mezi soubory - makro

Možná byste mohl přesněji popsat co má vlastně vaše makro udělat. Já nějak chápu to že první makro otevře daný soubor. A druhé makro provede přenos dat. Je to tak? Mám pocit že by řešení mohlo být i krapet jednoduší (alespoň pro mne čitelnější). Mrknite na zmíněný příspěvek.


LibreOffice 5.2.2.2

Offline

#24 23. 2. 2017 08:15:28

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

To ludviktrnka:
přesně tak- první otevře datový soubor (nebo detekuje, že je otevřen) a zapíše do programu značku, že je otevřen (to není teď důležité)
druhé makro je uloženo v tom nově otevřeném souboru a mělo by způsobit toto:
najdi cílový sešit
zviditelni list č.2
smaž 1.řádek ze zdrojového souboru (instrukce pro uživatele k vložení dat)
přenes data na druhý list cílového sešitu
skryj cílový list
přepni na první list cílového sešitu
smaž data ze zdrojového listu - vyřešeno samost. procedurou
zavři se

To neutr:
Cílové pole je deklarované:
Target_arrea = Fondy.Sheets(1).getCellRangeByName("A1")
zkusil jsem to bez deklarace zdrojového pole záměrně, protože neznám jeho velikost - pokaždé jiný počet řádků
src_data = Market_data.Sheets(0).....chybí deklarace zdrojového pole
Market_data.Currentcontroller.select(src_data)
packet = Market_data.CurrentController.getTransferable()
data to přenese i bez deklarace zdrojové oblasti

Zatím je to vlastně jen opsané a přivedené do jakžtak funkčního stavu, zatím jsem nad tím moc nedumal, jak to udělat lépe. Nejdřív to začlením do logiky programu (dialogy, návěští stavů apod), pak vyzkouším nějaké příkazy vypustit nebo změnit a prozkoumám, co to dělá.

Offline

#25 23. 2. 2017 08:20:48

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: kopírování mezi soubory - makro

Teď to vypadá takto:
sub Send
    dim DI_Qest as object
    DialogLibraries.LoadLibrary("Standard")
    DI_Qest = CreateUnoDialog(DialogLibraries.Standard.DI_Qest)
    Market_data = thisComponent
    Strana_0 = Market_data.sheets(0)
    dim oDesk, oFrames, oFrame,oDoc,oActivny as object, sURL,nazov1 as string,i as integer
    set oDesk = StarDesktop
    set oFrames = oDesk.Frames
    for i=0 to oFrames.Count - 1
        set oFrame = oFrames.getByIndex(i)
         nazov1=oFrame.Title
        if nazov1="Fondy_RB_17-02-21.ods - OpenOffice Calc" then   
            oFrame.activate
            oActivny=oFrame.ComponentWindow
            Target_doc = StarDesktop.getCurrentComponent()

            if Strana_0.getcellrangebyname("A1").string = "direction" then
rem                src_data = Strana_0 rem .getCellRangeByName("A1:Z1000")
                Market_data.Currentcontroller.select(Strana_0)
                packet = Market_data.CurrentController.getTransferable()
                Target_arrea = Target_doc.sheets.getByName("data").getCellRangeByName("A1")
                Target_doc.CurrentController.select(Target_arrea)
                Target_doc.sheets.getByName("data").isvisible = true
                Target_doc.CurrentController.insertTransferable(packet)
                Target_doc.sheets.getByName("data").isvisible = false
                oActivny.setFocus
                Target_doc.CurrentController.select(Target_doc.sheets.getByName("Fondy_M+R")
                clear_head
                Target_doc.Sheets(2).getCellRangeByName("A6").string = "Close_Send"               
            else
                if DI_Qest.execute() = 1 then
                    Target_doc.Sheets(2).getCellRangeByName("A6").string = "Open_Empty"
                else
                    Target_doc.Sheets(2).getCellRangeByName("A6").string = "Close_Empty"
rem                    Market_data.close(true)
                endif       
            endif      
               exit for
        end if
    next i
end sub


sub clear_head
    Market_data = thisComponent
    clear
    Market_data.close(true)
end sub   

   
sub clear
    Market_data = thisComponent
    Strana_0 = Market_data.sheets(0)
    row_act = Strana_0.rows
    do
        Data_arrea = Strana_0.getCellRangeByName("A1:M100")
        row_act.removeByIndex(0,100)
    loop while Strana_0.getcellrangebyname("A1").string <> ""
end sub

Offline

Zápatí