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

#1 15. 1. 2009 15:04:07

Mirozm
Člen
Registrace: 9. 1. 2006
Příspěvků: 49

prechod medzi dokumentami

Mam taký problém:
mám otvorený dokument z neho spustím makro ktoré mi skopíruje nejaké dáta ,otvorí ďalší dokument a vloží ich do neho uloží ho a zavrie. No potom by som chcel z pôvodného dokumentu zas niečo kopírovať a robiť s tým inú operáciu ,ale neviem ako ho zaktivovať.

sub vlozit
dim document, dispatcher object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
' kopírovanie dát na export
	with ovladanie
		.vyberlb("export","A1:C4901")
		.zkopiruj
		.vyberlb("ceny")
		rem ------export dát----------------------- zošit č.2----(do šablony faktúra)
		.otvor("/media/................/faktúra.ots")'otvorenie dokumetu 
		.uloz_novy_zosit("/media/............/faktúra.ots")
		.vyberlb("cena","D1")
		.vloz
		.vyberlb("faktúra")
		.uloz_zosit("/media/............/faktúra.ots") 
   		
potialto to ide dobre
                        .nastav_subor("/media/.............../ceny.ods") - Tu je problém 
                        .vyberlb("ceny","A1:E4901")
                        .zkopiruj

		.otvor("/media/.............../cenníky.ods")'otvorenie dokumetu 
		.vyberlb("ceny","A1")
		.vloz
		.uloz_zosit("/media/............../cenníky.ods")
	end with
end sub 

takže skusil som niečo ako toto,(nastav_subor) lebo po uložení tej faktúry mi už nechce robiť operácie v pôvodnom dokumente "ceny" ale vypíše mi error
Takže môj pokus:

sub nastav_subor(optional cesta as string)'nastaví hladaný otvorený zošit
dim oDoc as object, eDocs as object
  set eDocs = StarDesktop.Components.CreateEnumeration' vytvor kolekci otevrenych dokumentu
  on error goto DALSI
  do while eDocs.hasMoreElements ' projdi kolekci dokumentu
    set oDoc = eDocs.NextElement 
     if oDoc.ImplementationName="ScModelObj" then ' pokud je to sesit   
      if(ConvertFromURL(oDoc.URL))=cesta then ' a je to hledany sesit neviem co tu mam dať aby som inicializoval dokument
      
      oDoc.initialize '?
rem set oDoc = StarDesktop.ActiveFrame ?
rem set oDoc = this component ?
                ' msgbox("súbor nájdený",0,"Databáza")'hláška
        exit sub ' udelali jsme co jsme chteli, koncime
      end if
    end if
DALSI:
  loop
end sub

LO 5.1.6  platforma Ubuntu-linux 16.04

Offline

#2 15. 1. 2009 16:43:00

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: prechod medzi dokumentami

Je to trochu ťažší oriešok - OO.o. sa po otvorení súboru doň prepne a jeho zavretím "ste vo vzduchu". Mne napríklad blblo rozšírenie, kde som súbor zavrel - zhavaroval OO.o, lebo sa nedokázal prepnúť do pôvodného dokumentu, z ktorého bolo makro volané. Iné riešenie zatiaľ nepoznám ako je manuálne zatváranie dokumentov.

Offline

#3 16. 1. 2009 09:56:16

Mirozm
Člen
Registrace: 9. 1. 2006
Příspěvků: 49

Re: prechod medzi dokumentami

No samotné otváranie zatváranie dokumentov mi nerobí problémy na to mám urobené makrá.
Problém je v tom že keď otvorím dokument a chcem z neho nakopírovať niečo do dokumentu z ktorého bolo volané makro tak vtedy mi to ostane visieť hoci dokument ktorý som otvoril zavriem.Zaujímavé je že keď tam ten msgbox nechám aktívny a odkliknem ho tak to funguje a makro beží ďalej.No musí byť otvorené len okno z ktorého bolo makro volané.
No nič asi sa budem musieť nejako potrápiť.
Sú tri makrá na prechádzanie dokumentov a okien skúsim ich využiť.

sub ProjdiOkna 
dim oDesk as object, oFrames as object, oFrame as object
dim i as integer
  set oDesk = StarDesktop
  set oFrames = oDesk.Frames
  for i=0 to oFrames.Count - 1
    set oFrame = oFrames.getByIndex(i)
    msgbox oFrame.Title 
  next i
end sub

 sub ProjdiSesity
  dim oDoc, eDocs as object
   set eDocs = StarDesktop.Components.CreateEnumeration
   on error goto DALSI
    do while eDocs.hasMoreElements
    set oDoc = eDocs.NextElement
      if oDoc.ImplementationName = "ScModelObj" then
      xray odoc
      oDoc=CurrentController.Frame
      oDoc.initialize
        msgbox oDoc.URL & " >> " & oDoc.CurrentController.Frame.Title
      end if
  DALSI:
    loop
  end sub

sub ProjdiKomponenty
dim eComponents as object, oDoc as object
  set eComponents = StarDesktop.Components.CreateEnumeration
' Jedna z komponent Nápovědy nepodporuje ImplementationName
' proto obslouzime pripadnou chybu
  on error goto DALSI
  do while eComponents.hasMoreElements
    oDoc = eComponents.NextElement
    msgbox oDoc.ImplementationName
DALSI:
  loop
end sub

Editoval Mirozm (16. 1. 2009 10:30:41)


LO 5.1.6  platforma Ubuntu-linux 16.04

Offline

#4 19. 1. 2009 08:20:03

Mirozm
Člen
Registrace: 9. 1. 2006
Příspěvků: 49

Re: prechod medzi dokumentami

j-pastierik napsal(a)

Je to trochu ťažší oriešok - OO.o. sa po otvorení súboru doň prepne a jeho zavretím "ste vo vzduchu". Mne napríklad blblo rozšírenie, kde som súbor zavrel - zhavaroval OO.o, lebo sa nedokázal prepnúť do pôvodného dokumentu, z ktorého bolo makro volané. Iné riešenie zatiaľ nepoznám ako je manuálne zatváranie dokumentov.

Už to mám:
Takto aktivujem dokument ktorý chcem , ide to podľa názvu a nie cesty

takže makro sa volá s parametrom nazov

sub makro
nastav_subor("ceny")'ceny je napríklad ten názov súboru z ktorého bolo pôvodne spustené makro ,ale už nie je aktívny
end sub

samotné makro:

sub nastav_subor(optional nazov as string)'nastaví hladaný otvorený zošit
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=nazov + ".ods - OpenOffice.org Calc" then    
     oFrame.activate 
     oActivny=oFrame.ComponentWindow
     oActivny.setFocus   
    ' msgbox "pravda"
    else
   ' msgbox "nepravda"
 ' msgbox oFrame.Title 
    end if
  next i
end sub

PS:s tým ComponentWindow mi pomohol mr. xray smile

Editoval Mirozm (20. 1. 2009 14:03:38)


LO 5.1.6  platforma Ubuntu-linux 16.04

Offline

#5 19. 1. 2009 17:03:46

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: prechod medzi dokumentami

Super, ja mám tento problém: potrebujem zatvoriť súbor, ktorý je otvorený a prepnúť sa do pôvodného. Ako vidím, tak to asi dokážem teraz vyriešiť - najprv sa prepnem do pôvodného a potom zatvorím ten druhý:
oSubor.store() ' uloží zmeny
oSubor.dispose() ' zatvorí súbor

xray je dobrý pomocník, ale niekedy je to na dlhé hľadanie :-)

Offline

#6 20. 1. 2009 08:06:08

Mirozm
Člen
Registrace: 9. 1. 2006
Příspěvků: 49

Re: prechod medzi dokumentami

j-pastierik napsal(a)

Super, ja mám tento problém: potrebujem zatvoriť súbor, ktorý je otvorený a prepnúť sa do pôvodného. Ako vidím, tak to asi dokážem teraz vyriešiť - najprv sa prepnem do pôvodného a potom zatvorím ten druhý:
oSubor.store() ' uloží zmeny
oSubor.dispose() ' zatvorí súbor

xray je dobrý pomocník, ale niekedy je to na dlhé hľadanie :-)

Ja to tak nerobím, ale zatváram ho hneď (neprepínam sa do pvôvodného).
Mám to tak,že skopírujem dáta z pôvodného dokumentu v ktorom pracujem  potom otvorím dokument ktorý mi slúži ako databáza tam vložím údaje uložím a zavriem a potom uložím a zavriem pvôvodný. Toto mi v pohode šlo aj predtým.
Tento problém (s prepínaním) mi vznikol až vtedy keď som potreboval skopírovať z pvôvodného dokumentu nejaké dáta dva krát(rozdielne) nešlo to a preto som musel hľadať riešenie ako ho znovu aktivujem.

PS:mám narobených dosť univerzálnych makier pre Calc na otváranie, zatváranie,uloženie, uloženie ako,prepínanie medzi listami, vkladanie do buniek,zoradenie dát a iné.
Niekde to môžem zakvačiť.Poprípade ak by mi tu povolili blog mohol by som to dať tam:)
Alebo čo tak pokračovanie Vášho seriálu tentoraz pre calc?

Nejaké makro na zatváranie a ukladanie zošitov kde sa netreba prepínať do iného dokumentu zavrie ho aj keď je aktívny:

takže makro sa volá s parametrom cesta (windowsáci si ju samozrejme zmenia na trebárs C:\ atd.)

sub makro
uloz_zosit("/media/................/databázy/cenníky.ods") 
end sub

sub uloz_zosit(optional cesta as string)
dim oDoc, eDocs as object
  set eDocs = StarDesktop.Components.CreateEnumeration' vytvor kolekciu otvorenych dokumentov
  on error goto DALSI  'ak by bola chyba
  do while eDocs.hasMoreElements ' prejdi kolekciu dokumentov
    set oDoc = eDocs.NextElement 
     if oDoc.ImplementationName="ScModelObj" then ' pokiaľ je to zošit   
      if(ConvertFromURL(oDoc.URL))=cesta then ' a je to hladany zošit
        oDoc.Store() ' tak ho uloz
        oDoc.Close(true) ' a zavri
        exit sub '  končíme
      end if
    end if
DALSI:
  loop
end sub

LO 5.1.6  platforma Ubuntu-linux 16.04

Offline

#7 20. 1. 2009 16:57:21

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: prechod medzi dokumentami

Seriál bude pokračovať, ale ja píšem makrá podľa požiadavok používateľov - takže ich témy sú podľa toho, koľko mám podkladov. Preto tam toho veľa nie je - prišlo mi dosť málo mailov na to, aby som z toho niečo viac "vyprodukoval" a ani v diskusiách nie je vidno veľa požiadavok na makrá pre Calc, čo ma inak dosť prekvapuje. Ešte mám čo to v zálohe v starých mailoch, musím sa v tom prehrabať a niečo z toho bude hádam aj na seriál.

Inak mne pri kopírovaní pri automatickom vkladaní textu a následnom zatváraní súboru (išlo o dokumenty Writer) havaroval OO.o (ide o makro, ktoré generuje slová do slovenského slovníka pre kontrolu gramatiky), preto teraz skúsim to prepínanie.

Máte tam však zaujímavosť oDoc.Close(true) - ja používam oDoc.dispose() a tu môže byť problém, prečo to Vám ide a mne to havaruje. Takže som sa niečo naučil a môžem programovať :-)

Offline

Zápatí