Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: pur_berger am 29.05.08 - 12:55:04

Titel: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 29.05.08 - 12:55:04
Hallo!

Ich kämpf mich gerade durch scripting und Co durch (schreibe an eine Inventurdatenbank - und da ist man mit normalen Notes Formeln bald am Ende der Möglichkeiten ...) allerdings - finde ich keine vernünftige Möglichkeit das Folgende in Lotus Script umzuschreiben:

@Command( [FileSave] );
oprincipal:=Principal;
ofrom:=From;
osendto:=SendTo;
osubject:=Subject;
FIELD From:=@V3UserName;
FIELD SendTo:=oprincipal;
FIELD Principal:="";
FIELD Subject:=Z_Status;
@Command( [ToolsRefreshSelectedDocs] );
@Command( [FileSave] );
@MailSend;
FIELD From:=ofrom;
FIELD SendTo:=osendto;
FIELD Subject:=osubject;
FIELD Principal:=oprincipal;
FIELD SaveOptions:="0";
@Command( [ToolsRefreshSelectedDocs] );
@Command( [FileSave] );
@Command( [FileCloseWindow] )

Ich find nur leider absolut keine Funktion die dieser Logik entsprechen würde ....

Besten Dank im voraus!
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: botschi am 29.05.08 - 12:59:53
Du suchst ja hoffentlich keine Funktion, die das alles macht?  ;)
Das sind ja viele verschiedene Dinge bei... Mail senden, Speichern, Refresh, Fenster schließen usw.

Matthias
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: klaussal am 29.05.08 - 13:01:16
Zitat
Ich find nur leider absolut keine Funktion die dieser Logik entsprechen würde ....

Ich auch nicht......









Was willst Du überhaupt machen ?


PS:
Zitat
Am liebsten ist es uns, wenn Du Deinen richtigen Namen, oder wenigstens Deinen richtigen Vornamen verwendest.
Wenn Du einen Phantasienamen gewählt hast, wäre es schön, wenn Du in Deiner Signatur Deinen (Vor-)Namen angibst. Dein Phantasiename muss neutral sein.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 29.05.08 - 13:18:36
OK - also - schön langsam ...

Sichern und senden und schliesen sind ja nicht wirklich das Problem - das hab ich und das efunzt auch.

oprincipal:=Principal;
ofrom:=From;
osendto:=SendTo;
osubject:=Subject;
FIELD From:=@V3UserName;
FIELD SendTo:=oprincipal;
FIELD Principal:="";
FIELD Subject:=Z_Status;

Dieser Teil dient dazu ein bissal was zu faken. Hintergrund: Der User erhält ein Confirmationamail welches er bestätigen oder ablehnen kann. dannach sendet er über eine Button (der eben diese Funktionen enthält) das Mail retour. Sprich - Die vorhandenen Felder From, SendTo, Principal und Subject wedren ersetzt. Die drei Funtionen davor (ofrom:=From) dienen nur dazu das der orginalinhalt nicht verloren geht.

So - weiter

@Command( [ToolsRefreshSelectedDocs] );
@Command( [FileSave] );
@MailSend;

Refreshen und verschicken - eh klar

FIELD From:=ofrom;
FIELD SendTo:=osendto;
FIELD Subject:=osubject;
FIELD Principal:=oprincipal;

Und jetzt geben wir den Feldern die Orginalwerte zurück

FIELD SaveOptions:="0";

Ändern den Status

@Command( [ToolsRefreshSelectedDocs] );
@Command( [FileSave] );
@Command( [FileCloseWindow] )

Rfreshen alles nochmals, speichern und schließen.

So - jetzt hat der User in seiner Inbox in Blatt mit den INfos welche er zurückgeschickt hat, keine Editfunktion und keine Sendoption. Sprich - "Das hab ich doch garnicht geschickt" gibts ned.

Prinzipiell brauche ich im Script einerseits die Möglichkeit

ofrom:=From

abzubilden und weiters

FIELD SendTo:=osendto

durchzuführen ... und da find ich aber garnichts was mir hilft.

Set item=doc.ReplaceItemValue( "Subject","Z_Status1") hab ich's versucht - aber das haut irgendwie nicht hin ...
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: DerAndre am 29.05.08 - 13:26:23
Was haut nicht hin?

Kommt eine Fehlermeldung, steht der falsche Text im Subject?

Haut irgendwie nicht hin ist keine Aussage.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 29.05.08 - 13:39:27
der fehler den ich bekomm ist

Variant does not contain an object.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: m3 am 29.05.08 - 13:40:24
Die Meldung hat aber nix mit dem geposteten Formelcode zu tun.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: klaussal am 29.05.08 - 13:56:10
Bitte den ganzen Code, sonst bringt das nix.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 29.05.08 - 13:59:56
Sub Click(Source As Button)
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Set uidoc = workspace.CurrentDocument
   
   Dim WarningMessage As String
   Dim YesOrNo As Integer
   
   If uidoc.FieldGetText( "Z_Status" ) = "Handout has been declined by " And uidoc.FieldGetText( "CMRemarks" ) = "" Then
      Messagebox( "*** You have to provide a reason for Declination ***" ), 0 + 16
      Call uidoc.GotoField( "CMRemarks" )
      Continue = False
      Exit Sub
   End If
   Call uidoc.Save
   Dim doc As NotesDocument
   Dim item As NotesItem   
        Dim user As String
        user = session.UserName
   Set item=doc.ReplaceItemValue( "From",user)

Und da steigt mir das script mit diesem Fehler aus. Sprich - die eigentlich Frage ist nach wie vor - wie kann ich im Lotus Script einem Feld den Wert eines anderen Feldes zuweisen. Bzw, kann man im Script ähnlich wie indet Formularlanguage temporäre Felder erzeugen um Werte zwischenzuspeichern ...

Also so sieht das script aus bis zu dem Wert wo der Fehler kommt -

und da requested - hier der ganze Code:

Sub Click(Source As Button)
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Set uidoc = workspace.CurrentDocument
   
   Dim WarningMessage As String
   Dim YesOrNo As Integer
   
   If uidoc.FieldGetText( "Z_Status" ) = "Handout has been declined by " And uidoc.FieldGetText( "CMRemarks" ) = "" Then
      Messagebox( "*** You have to provide a reason for Declination ***" ), 0 + 16
      Call uidoc.GotoField( "CMRemarks" )
      Continue = False
      Exit Sub
   End If
   Call uidoc.Save
   Dim doc As NotesDocument
   Dim item As NotesItem
   Dim user As String
   user = session.UserName
   Set item=doc.ReplaceItemValue( "From",user)
   Set item=doc.ReplaceItemValue( "SendTo","Principal")
   Set item=doc.ReplaceItemValue( "Principal","")
   Set item=doc.ReplaceItemValue( "Subject","Z_Status1")
   Call uidoc.Refresh
   Call uidoc.Send
   Set item=doc.ReplaceItemValue( "From","OFrom")
   Set item=doc.ReplaceItemValue( "SendTo","OSendTo")
   Set item=doc.ReplaceItemValue( "Principal","OPrincipal")
   Set item=doc.ReplaceItemValue( "Subject","OSubject")
   Set item=doc.ReplaceItemValue( "SaveOptions",0)
   Call uidoc.Refresh
   Call uidoc.save
   Call uidoc.close(True)
End Sub
   
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 29.05.08 - 14:02:44
Hallo

Wo wird doc initialisiert?

Ersetze Set item=doc.ReplaceItemValue( "From",user)
durch call doc.ReplaceItemValue( "From", session.UserName )
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: DerAndre am 29.05.08 - 14:06:28
Und ein Fehlerhandling wäre auch nicht schlecht
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: klaussal am 29.05.08 - 14:08:17
... und hätte man das mal im Debugger laufen lassen, dann hätte man auch gesehen, das "doc" nicht initialisiert wird......

Aber wir wollen ja jetzt mal nicht kleinlich sein....  ;)
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 29.05.08 - 14:09:30
Zitat
Und ein Fehlerhandling wäre auch nicht schlecht

Sowieso  8)

und evtl. Fehler vorher abfangen ala:

if doc is Nothing Then
  Msgbox "Uuups, da ist mir was passiert..." , 16 , "Abbruch"
  goto EXIT_ME
end if
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: DerAndre am 29.05.08 - 14:14:15
Ein Option Declare ist manchmal aus sehr hilfreich.

Hilft aber nur gegen nichtdeklarieren und nicht gegen nichtinitialisieren...
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 29.05.08 - 14:14:37
Ahm - Freunde - wenn ich so gut wäre würde ich hier nicht fragen ...
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: klaussal am 29.05.08 - 14:19:14
Is schon klar, wir geben ja nur Tipps für die Zukunft bzw, wie man es besser machen kann. Das ist nicht persönlich gemeint.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 29.05.08 - 14:19:27
Darum geben wir ja die Hinweise
 
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: DerAndre am 29.05.08 - 14:27:23
Das ganze dient nur der zukünftigen Fehlerminimierung  :)

Und ist wie Klaus sagt nicht persönlich gemeint.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 29.05.08 - 14:29:33
So - dann stell ich mal witer blöde Fragen und laß mich nacher "Hinweisen" - Ich dachte eigentlich

Dim doc As NotesDocument

wäre die Initiailiserung?

Ahm - und bevor ich wieder mit kryptischen Hinweisen knofrontiert werde - ich beherrsche keine höherer Programmiersprache ... und die Lotus Hilfe ist nur mäßig hilfreich ....
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 29.05.08 - 14:31:01
Dim "definiert" eine Variable

Du musst ein Set verwenden:

Set doc = uidoc.Document '(Als Beispiel)

...
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 29.05.08 - 14:32:53
Zitat
ich beherrsche keine höherer Programmiersprache

ICh auch nicht. Wer beherrscht schone eine Programmiersprache ?! Nicht viele . (Viele meinen es ;-) )

Aber die Designerhilfe ist schon hilfreich .....
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: Driri am 29.05.08 - 17:14:49
Zitat
ich beherrsche keine höherer Programmiersprache ...

Die einzige Sprache, die ein Programmierer perfekt beherrscht ist Fluchen.


Sorry, konnte es mir nicht verkneifen  ;D
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 30.05.08 - 08:54:50
So - besten Dank mal - so kleppt es schließlich:

Sub Click(Source As Button)
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Dim doc As NotesDocument
   Set uidoc = workspace.CurrentDocument
   
   Dim WarningMessage As String
   Dim YesOrNo As Integer
   
   If ( uidoc.FieldGetText( "M_SelectConfirmationText" ) = ""  Or uidoc.FieldGetText( "M_SelectConfirmationText" ) = "Please Select Text" ) Then
      Messagebox( "*** Please Select confirmation Text ***" ), 0 + 16
      Call uidoc.GotoField( "M_SelectConfirmationText" )
      Continue = False
      Exit Sub
   End If
   
   If ( uidoc.FieldGetText( "M_AddEquipment" ) = "" ) Then
      WarningMessage = "Are you sure you don't want to add additional items (Powersupply for example)?"
      Set UIDoc = Workspace.CurrentDocument
   'UIDoc.signonsend=False
      YesOrNo=Workspace.Prompt (PROMPT_YESNO, "Warning", WarningMessage)
      If YesOrNo=0 Then
      'No was clicked
         Call uidoc.GotoField( "M_AddEquipment" )
         Continue = False         
         Exit Sub
      Else
         Continue = True
      End If   
   End If
   Set doc = uidoc.Document
   Set item=doc.ReplaceItemValue( "Hide","Yes")
   Set item=doc.ReplaceItemValue( "OPrincipal",uidoc.FieldGetText( "Principal" ))
   Set item=doc.ReplaceItemValue( "OFrom",uidoc.FieldGetText( "From"))
   Set item=doc.ReplaceItemValue( "OSendTo",uidoc.FieldGetText( "SendTo"))
   Set item=doc.ReplaceItemValue( "OSubject",uidoc.FieldGetText( "Subject"))
   Call uidoc.Send
   Call uidoc.Save
   Call uidoc.Close(True)
End Sub
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: klaussal am 30.05.08 - 08:56:36
Na also, geht doch.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 30.05.08 - 09:17:47
Ein Hinweis noch (wenn Du nichts dagegen hast) ..

Bau noch eine Fehlerbehandlung ein:

Code
....
on error goto ERROR_ME

....... Code .....


EXIT_ME:
Exit sub 'oder function

ERROR_ME:

msgbox |Fehler bei der Funktionsausführung:
| & error & " (" & err & ") in Zeile " & erl & |

Informieren Sie Ihren Datenbankbetreuer.| , 16 , "Unbehebbarer Fehler"

Err = 0
Resume EXIT_ME

.. 
End Sub 'oder Function
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 30.05.08 - 11:11:48
Na - blos ned dem User sagen er soll uns anrufen ;)

UNd Fluchen - jaaaaa - das kann ich jetzt auch :))

So - eine Kleinigkeit ist jetzt doch aufgetaucht: Um den User einbissal zu nerven hab ich in Terminate foldenes Script eingebaut:

Sub Terminate
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Set uidoc = workspace.CurrentDocument
   
   Call uidoc.Refresh
   
   If uidoc.FieldGetText( "Z_Status" ) = "" And uidoc.FieldGetText( "ReturnReceipt" ) = "0" Then
      Messagebox( "*** Please Note - You need to Accept or Decline the Handout!!! ***" ), 0 + 16
      Continue = False
      Call uidoc.close(False)
      Exit Sub
   End If
End Sub

Die Idee ist - das das je beim schließen läuft - das ich den ReturnRecipt Wert als indicator verwende (ich will ja nicht gepromted werden wenn ich das Document erstelle und versende). ReturnRecipt ist automatisch auf 1 (ich will ja wissen wenn der User das Document geöffnet hat).

So - aber - wenn der User das Dokument öffnet setzt der Client zwar den Wert auf "0" und schickt das RR Mail - nur die Routine erkennt nicht das ReturnRecipt schon auf "0" sthet - sprich - prompted erst dann wenn das Mail ein zweites Mal göffnet wird and über X wieder geschlossen wird ohne was zu machen ...
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: DerAndre am 30.05.08 - 11:14:31
Versuch es mal im Queryclose.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 30.05.08 - 11:16:30
Wo/Wie setzt Du denn "ReturnReceipt" ??

Etwa so wie in deinem o.g. Script:

Code
Set doc = uidoc.Document
   Set item=doc.ReplaceItemValue( "Hide","Yes")
   Set item=doc.ReplaceItemValue( "OPrincipal",uidoc.FieldGetText( "Principal" ))
   Set item=doc.ReplaceItemValue( "OFrom",uidoc.FieldGetText( "From"))
   Set item=doc.ReplaceItemValue( "OSendTo",uidoc.FieldGetText( "SendTo"))
   Set item=doc.ReplaceItemValue( "OSubject",uidoc.FieldGetText( "Subject"))
   Call uidoc.Send
   Call uidoc.Save
   Call uidoc.Close(True)

Wenn ja , dann schreibst Du den neuen wert ins Backend.
Im Terminate fragst Du aber das UI ab!!

Also: Entweder UI aktualisieren oder backend abfragen ...
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 30.05.08 - 11:36:31
Nep - das Feld ist default mit "1" befüllt.
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: dirk_2909 am 30.05.08 - 12:54:54
 ::)

Und wie wird der wert "0" gesetzt ???
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 30.05.08 - 13:02:45
Hehe - also die Rutiene bei Queryclose reinzuschreiben - hab noch nie so einen verzweifelten User gesehen ;) - führt dazu das das PopUp einfcah stehen bleibt und gar nix mehr geht ... Gut - das ist wohl etwas zuviel der Strafe :)
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 30.05.08 - 13:04:40
ReturnRecipt wird vom Mailclient automatisch als Reciptanvorderung erkannt. Sobald das Mail geöffnet wird geht eine ReturnRecipt Message and den Sender und der Wert wird auf "0" gesetzt. Hatte eine Mail kein ReturnRecipt gesetzt gibt's das Feld beim Empfänger gar ned ...
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 30.05.08 - 13:06:57
Hm - aber wenn ich Dich richtig verstehe wird wohl auch vom Mailclient der Wert im Backend geändert -
Das würde auch erklären warum beim nächsten Mal Client öffnen die Abfrage funzt ...

Frage: Kann ich im Terminate das Backend abfragen?
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: Fedaykin am 30.05.08 - 14:01:43
Hi Pur_Berger

Programmiere nun schon ein Weilchen, kann Deine Frage aber nicht wirklich beantworten. Nur würde nie in einem Terminate (Objekt wird aus Speicher entfernt) noch irgendwo hin zugreifen. Ausser vielleicht brav irgend eine Variable noch auf Nothing zu setzen oder so. Der Vorschlag QueryClose war schon nicht so verkehrt, nur musst Dein Script halt wohl etwas anpassen. So könnte ich mir vorstellen, dass ein uidoc.close(False) in einem QueryClose auch nicht wirklich eine gute Idee ist.

Gruss
Remo
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 30.05.08 - 18:03:18
Bin ich voll bei Dir - die Frage ist - sowohl bei der "ich häng mich in mir selber auf" Queryclose Schleife als aucj im Terminte - geht bei beiden erst nach dem zeiten Mal öffen - also - ReturnReceipt wird korrekt ausgelöst - der Trigger (ReturnReceipt="0") greift aber nicht ... sofort (obwohl - wenn ich mir den Feldwert ansehe dieser defenitiv schon "0" ist).

Am liebsten wäre mir die Funktion ohnehin so das man das Mail gar nicht erst schlißen kann wenn die Aktion nicht ausgeführt ist - bzw - auch nicht wegcklicken kann - sprich sofort wieder ein Popup kommt wenn der User verucht die Abfrage zu umgehen.

Der Punkt ist - er soll die Form bearbeiten Müssen (und ned - ah - der Support hat ma was geschickt - is ma eh wurscht - interessiert mich nicht) - also - jeder Vorschlag bite gerne :)
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: Fedaykin am 01.06.08 - 09:25:19
Hi pur_berger

Ich versuch mal etwas Queryclose zu erläutern, vielleicht geht ein Licht auf.
Sub Queryclose(Source As Notesuidocument, Continue As Variant)

Source gibt Dir das FontEnd Dokument zurück.
Continue kannst Du sagen ob wirklich dann geschlossen wird.

Dein Feldwert ist wohl bisher nur im Backend. So könntest schreiben.
uidoc.Reload
Sollte Werte von BackEnd ins FontEnd holen. (Designerhilfe steht mehr)

Um Feldwert dann im FontEnd zu checken reicht.
If Source.FieldGetText("ReturnReceipt")="0" then

Oder Du checkst direkt im BackEnd. Ungefähr so.

Set doc=Source.Document
If doc.GetItemValue("ReturnReceipt")(0)="0" then

Um das schliessen zu verhindern folgendes.
Continue=False

Hoffe hilft etwas.

Gruss
Remo
Titel: Re: Frage an die Profis - brauche Hilfe für SetFiueld:=...
Beitrag von: pur_berger am 02.06.08 - 10:55:34
Hm - nep - leider nein. Hab's auf alle Verainten versucht - wird einfach nicht erkannt das ReturnReceipt auf Null steht. Vielleicht ist diese Variable einfach ungeeignet?

Vielleicht sollte ich das Problem anders angehen - ich brauche ja in Wirklichkeit nur irgend eine Variable welche sich nach dem öffenen des Dokumentes verändert ...

Gesagt getan - hab jetzt noch eine Variable gebastelt - die ich mit Postopen umschreibe - dann funzt es - besten Dank nochmals an alle!