[SOLVED] makro błąd lub dziwny przeskok

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
acrab8338
Posty: 12
Rejestracja: pt kwie 01, 2011 11:09 am

[SOLVED] makro błąd lub dziwny przeskok

Post autor: acrab8338 »

W podanym poniżej makro pojawia się błąd:
Type: com.sun.star.illegalArgumentException
Message: sequence element is not assignable by given value

Kod: Zaznacz cały

for i = 0 to 10
if m < n - 8 then

sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = m
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = m + 8
Druk3.getByName("do").commit
Rem... To save the current row 
 druk3.UpdateRow 
 oDan.reload
 

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Copies"
args1(0).Value = 1
args1(1).Name = "Collate"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())
 
 m = m + 8
 end if
next i
Jak wstawie w inne miejsce: "dim args1(1) as new com.sun.star.beans.PropertyValue"
to w momencie "next i" uruchamia się pierwsze makro w module...

Kod: Zaznacz cały

dim args1(1) as new com.sun.star.beans.PropertyValue
for i = 0 to 10
if m < n - 8 then

sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = m
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = m + 8
Druk3.getByName("do").commit
Rem... To save the current row 
 druk3.UpdateRow 
 oDan.reload
 

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
args1(0).Name = "Copies"
args1(0).Value = 1
args1(1).Name = "Collate"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())
 
 m = m + 8
 end if
next i
proszę o pomoc
Ostatnio zmieniony czw cze 09, 2011 10:07 pm przez acrab8338, łącznie zmieniany 1 raz.
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: makro błąd lub dziwny przeskok

Post autor: Jan_J »

Uruchom w trybie krokowym (Narzędzia/Mka/Zarzadzaj/.../Edycja i F8), najprawdopodobniej wychodzisz poza zakres tablicy lub wskazujesz nieistniejący element jakiegoś obiektu.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
acrab8338
Posty: 12
Rejestracja: pt kwie 01, 2011 11:09 am

Re: makro błąd lub dziwny przeskok

Post autor: acrab8338 »

Dzięki, poszukam, ale wkleję jeszcze całe makro może widać błąd na pierwszy rzut oka.

Kod: Zaznacz cały

sub druk
dim oDan as object
dim oMies as object
dim omiesid as object
dim frm,oTextBox1 as object
dim sText1, sText2, sText3, sText4 as string
dim i as long



oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")
oDan = thisComponent.drawPage.forms.getByName("MainForm").getByName("Dan")
druk1 = thisComponent.drawPage.forms.getByName("MainForm").getByName("druk1")
druk3 = thisComponent.drawPage.forms.getByName("MainForm").getByName("druk3")

druk1.reload

druk1.reset
druk3.reset

drukid = druk3.getByName("id_m").currentvalue 
sText2 = druk1.getByName("id_mies").currentvalue
druk1.getByName("id_mies").text = drukid
druk1.getByName("id_mies").commit

Rem... To save the current row 
 If druk1.IsNew then 
 druk1.InsertRow 
 Else 
 druk1.UpdateRow 
 End if
  
wartod = oMies.getByName("od").currentvalue
wartdo = oMies.getByName("do").currentvalue
 
dodr = oMies.getByName("do").currentvalue 
oddr = oMies.getByName("od").currentvalue



m = cint(oddr)
n = cint(dodr)




dim args1(1) as new com.sun.star.beans.PropertyValue
for i = 0 to 10
if m < n - 8 then

sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = m
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = m + 8
Druk3.getByName("do").commit
Rem... To save the current row 
 druk3.UpdateRow 
 oDan.reload


rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
args1(0).Name = "Copies"
args1(0).Value = 1
args1(1).Name = "Collate"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())

 m = m + 8
 end if
next i


	sText2 = druk3.getByName("od").currentvalue
	druk3.getByName("od").text = m
	Druk3.getByName("od").commit

	sText4 = Druk3.getByName("do").currentvalue
	druk3.getByName("do").text = n
	Druk3.getByName("do").commit

	Rem... To save the current row 
	 If druk3.IsNew then 
	 druk3.InsertRow 
	 Else 
	 druk3.UpdateRow 
	 End if
	 oDan.reload
	 

rem ----------------------------------------------------------------------
rem define variables
dim document1   as object
dim dispatcher1 as object
rem ----------------------------------------------------------------------
rem get access to the document
document1   = ThisComponent.CurrentController.Frame
dispatcher1 = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args11(1) as new com.sun.star.beans.PropertyValue
args11(0).Name = "Copies"
args11(0).Value = 1
args11(1).Name = "Collate"
args11(1).Value = true
dispatcher1.executeDispatch(document1, ".uno:Print", "", 0, args11())



sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = wartod
Druk3.getByName("od").commit

sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = wartdo
Druk3.getByName("do").commit

Rem... To save the current row 
 If druk3.IsNew then 
 druk3.InsertRow 
 Else 
 druk3.UpdateRow 
 End if
 oDan.reload


End Sub
uprościłem i po "next i" jak skończy pętle to wraca na początek- nie wiem jak z tego wybrnąć

Kod: Zaznacz cały

Sub Main


oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")

oddr = oMies.getByName("od").currentvalue
dodr = oMies.getByName("do").currentvalue

m = cint(oddr)
n = cint(dodr)

for i = 0 to 10
if m < n then

 m = m + 1
 end if
next i

End Sub
Załączniki
forum.odb
(24.2 KiB) Pobrany 188 razy
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: makro błąd lub dziwny przeskok

Post autor: Jan_J »

Sam Twój kod nie wystarcza do uruchomienia, bo masz jeszcze własne formularze.

Ostatnia najprostsza wersja, jeżeli podstawić za oddr i dodr stałe, działa. Nic nie wraca, na żaden początek. Dodaj tylko "exit for" w ramach else, albo lepiej zastosuj pętlę "for i = m to n-1" (z odpowiednio zmodyfikowanym n). Bo tak jak jest, pętla zawsze się kręci 11 razy, czy trzeba czy nie trzeba.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
acrab8338
Posty: 12
Rejestracja: pt kwie 01, 2011 11:09 am

Re: makro błąd lub dziwny przeskok

Post autor: acrab8338 »

Nie wiem czy o to ci chodziło z tymi stałymi, ale tak jest teraz to czasami przeskakuje a czasami nie :) zresztą dokładnie tak było z tym pierwszym makrem: czasami drukowało poprawnie a czasami nie. Załączam plik w którym przycisk "test" uruchamia makro w 3 module.

Kod: Zaznacz cały

Sub Main
dim oMies as object
dim p as long

oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")
m = oMies.getByName("od").currentvalue
n = oMies.getByName("do").currentvalue

p = ( n - m ) / 8
	
for i = 0 to p
if m < n then
 m = m + 8
 end if
next i

End Sub
znalazłem w przykladzie cos takiego: " const a = 2 " ale nie wiem jak to zastosować w moim przypadku
Załączniki
forum2.odb
(24.77 KiB) Pobrany 188 razy
acrab8338
Posty: 12
Rejestracja: pt kwie 01, 2011 11:09 am

Re: makro błąd lub dziwny przeskok

Post autor: acrab8338 »

Jestem początkujący i trochę się pogubiłem. To uproszczone makro działą bez zarzutu. To dłuższe też pod warunkiem, że nie dodam funkcji drukuj. Załączam plik, w module drugim makra bez druku i z drukiem (te które zamieściłem na początku), w module trzecim makra uproszczone bez funkcji i z funkcją drukuj. formularzu1 przyciski uruchamiające makra. okazuje się, że dodanie funcji drukowania powoduje błedy.
Załączniki
forum4.odb
(25.18 KiB) Pobrany 187 razy
acrab8338
Posty: 12
Rejestracja: pt kwie 01, 2011 11:09 am

Re: makro błąd lub dziwny przeskok

Post autor: acrab8338 »

Makro wreszcie drukuje to co powinno ale ciągle przeskok występuje. Mam w związku z tym pytanie: czy jest opcja by wrzucić w to makro funkcje drukowanie napisaną w języky java, beanshell lub python?

Kod: Zaznacz cały

sub pusty

end sub

'=============================
sub druk
document1   = ThisComponent.CurrentController.Frame
dispatcher1 = createUnoService("com.sun.star.frame.DispatchHelper")
dim args11(1) as new com.sun.star.beans.PropertyValue
args11(0).Name = "Copies"
args11(0).Value = 1
args11(1).Name = "Collate"
args11(1).Value = true
dispatcher1.executeDispatch(document1, ".uno:Print", "", 0, args11())
end sub
'=============================

Sub makro
dim oMies as object
dim p as long

oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")

m = cint(oMies.getByName("od").currentvalue)
n = cint(oMies.getByName("do").currentvalue)

p = ( n - m ) / 8
	
for i = 0 to p


if m < n then
pusty()
druk()
 end if
 
   m = m + 8

next i

End Sub
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: makro błąd lub dziwny przeskok

Post autor: Jan_J »

Ejże, czy chodzi Ci o to, że czasami (czytaj: przy niektórych zestawach danych) druk() wywoływany jest wielokrotnie?
To jest błąd w Twojej pętli. W kodzie

Kod: Zaznacz cały

p = ( n - m ) / 8
for i = 0 to p
  if m < n then
    pusty()
    druk()
  end if
  m = m + 8
next i
może się zdarzyć, że po dodaniu 8 do m nie przekroczysz n, a iteracji będzie więcej niż jedna. I gotowy podwójny wydruk.
Tak jest np. przy m = 1, n = 12. Wtedy p = 1, i pętla robi dwa obroty, a za każdym razem warunek jest spełniony.
Pętlę trzeba przeorganizować. A marko pusty() usunąć.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
acrab8338
Posty: 12
Rejestracja: pt kwie 01, 2011 11:09 am

Re: makro błąd lub dziwny przeskok

Post autor: acrab8338 »

Podam kolejnosc w której są wywoływane makra. 1. makro 2. pusty 3. makro 4. druk 5. pusty 6. makro. Punkt 5 nie powinien mieć miejsca. Najdziwniejsze jest to że jak naciskam "f8" powoli to jest procedura działa jak powinna (bez punktu 5). jak naciskam "f8" szybko to kolejność jest taka jak napisałem na początku.
Przy stworzonym przeze mnie makro (na wzór uproszczonego z ostatniego postu) jest ok, przy tym wczesniejszym jeden z zakresów danych ("m" i "m+8" filtują id a przy ostatnim wydruku "m+8" i "n" - po dopisaniu kilku linijek i zamiany "p" na "p-1") drukuje się dwa razy a inny nie drukuje się wogóle.
Właściwie dodanie linijki pusty() która nie powinna wpływać na nic sprawia że wydruk jest prawidłowy. Sprawdzone w praktyce :)
Zastanawiam się czy tonie jest jakiś błąd programu.
acrab8338
Posty: 12
Rejestracja: pt kwie 01, 2011 11:09 am

Re: [SOLVED] makro błąd lub dziwny przeskok

Post autor: acrab8338 »

Sprawa wyjaśniła się przy innej części projektu, po prostu mam zbyt wolnego kompa :D Makro dzieliło mi dane z tabeli na przykładowo 3 zakresy. I tak najpierw wyświetlało zakres 1 potem zakres 2 potem zakres 3 i każdy z nich drukowało. Problem było to że zanim zadziałała cześć makra odpowiedzialna za drukowanie zakresu 1, już pojawiał się zakres 2 (kolejność w makrze była prawidłowa) i stąd ten podwójny wydruk.
Dodałem po funkcji drukuj kilka linijek które nic nie wnoszą, ale zajmują czas zanim przeskoczy kolejny zakres i drukuję się prawidłowo:D
A ten problem z wciśniętym f8 to rzeczywiście błąd programu.
ODPOWIEDZ