Jump to content
  • 0
tackenco

Record op slot zetten

Question

Ik heb een lastige (of het kan natuurlijk helemaal niet)

 

In een applicatie heb ik een tabel met offertes.

Je kunt het record op slot zetten door in het veld "slot" een één in te voeren.

Nu heb ik in de gebruikers privilege set bij "Data Access and Design" custom privileges ingesteld bij het modificeren van een offerte record. Dat mag niet als het veld "slot" op 1 staat.

Dit gaat natuurlijk nog goed!

In de offerte maak ik gebruik van een child-tabel "offerte_lines". Voor die tabel heb ik natuurlijk dezelfde privileges ingesteld.

Nu is het dus zo dat als de offerte op slot staat zowel de velden van de tabel offerte als van de tabel offerte_lines niet gewijzigd kunnen worden (tenzij je in een andere privilegeset zit natuurlijk)

 

Nu het probleem:

Het aanmaken van records in de child-tabel "offerte_lines" kan je alleen limiteren met "ja" of "nee". Het is nu dus nog mogelijk om nieuwe offerteregels aan te maken terwijl deze al op slot staat. Ik wil liever niet met een extra layout of tab-weergave werken omdat je dan weer alles moet scripten en de standaard "status area" moet je ook gewoon kunnen gebruiken om naar het volgende of vorige record te gaan. Ik heb ook al gekeken of je met custom menu's de sub-commands "next record" en "previous record" kan manipuleren door er een script aan te koppelen, dat zou wat mij betreft een prima compromis zijn omdat het "boekje" in de status-area daar volgens mij ook gebruik van maakt. Dat lukt dus helaas niet.

 

Ik hoop dat iemand een goede ingeving heeft!

Alvast bedankt

Share this post


Link to post

16 answers to this question

Recommended Posts

  • 0

Hoi,

 

Ja, iets vergelijkbaars had ik ook al uitgevonden al was dat wat ingewikkelder terwijl jouw oplossing mooi simpel is.

Dank hiervoor :)

 

Het probleem blijft wat mij betreft wel dat je pas een melding krijgt op het moment dat je het record commit. Het liefst zou ik al een melding willen als je naar het volgende veld gaat of dat je helemaal geen regel kan bijmaken. Jouw oplossing is tot nu toe nog wel de beste, zeker in combinatie met het instellen van een privilege set.

 

Ik zat ook nog te denken aan iets met de plug-in zipp script. Bijvoorbeeld op het veld "aantal" in de offerte regels. Bij het verlaten van dat veld zou je een scriptje kunnen laten controleren :idea:

 

Groet, Niels

Share this post


Link to post
  • 0

een mogelijke oplossing kan ook liggen in zippscript ( of DoScript ) in combinatie met een webviewer.

 

Je maakt een script dat enkel en alleen het volgende doet: Commit.

 

In de webviewer op je offerte layout zet je de volgende calculatie:

 

Let ( 
_script = "mFMb_DoScript( \"Commit_DNR\" ; \"\" ; \"\" ; \"\" )"
;
Case ( lock = 1 ; Evaluate ( _script ) ; "" )
)

 

Op die manier zal FM telkens iemand iets aan de offerte wil veranderen direct commiten, waardoor het niet meer mogelijk is om een veld binnen te geraken om te veranderen.

 

Die case kan je natuurlijk uitbreiden met privilegesets en dergelijken...

Share this post


Link to post
  • 0

Hoi Andries,

 

Klinkt goed, ik ben het aan het proberen maar krijg het niet werkend.

Het script wordt niet getriggerd. Hoe zit dat precies met die webviewer, ik heb zoiets nog nooit gebruikt.

 

Vast bedankt, Niels

Share this post


Link to post
  • 0

OK, klein foutje gemaakt.

 

Dit is de juiste code:

Let ( 
_script = "mFMb_DoScript( \"Commit_DNR\" ; Get ( FileName ) )"
;
Case ( lock = 1 ; Evaluate ( _script ) ; "" )
)

 

Heb een voorbeeldbestandje toegevoegd.

 

Succes ermee

LockRecord.fp7

Share this post


Link to post
  • 0

Hee Andries,

 

Bedankt, het werkt nu.

Ik heb wel nog de volgende scriptstappen aan het commit script toegevoegd.

- Allow User Abort off

- Revert Record

Anders was het nog niet helemaal volledig waterdicht.

 

De reden dat je dit in de webviewer zet is waarschijnlijk vanwege de werking van de webviewer.

Hoe en waarom begrijp ik nog steeds niet maar het werkt wel.

 

Ontzettend bedankt voor alle hulp!

Groet, Niels

Share this post


Link to post
  • 0

Niels,

 

de webviewer "refreshed" elke keer als je ergens een veld activeert of een commit doet. Je kan dit dus ook gebruiken om hem steeds een calculatie te laten evalueren.

 

Op het moment dat de lock = 1 waar is, zal hij dus het script triggeren.

 

Pas wel op met deze methode, want hiermee kom je snel in een eindeloze loop. Ikzelf ben heel voorzichtig om scripts te triggeren vanuit de webviewer. Bijvoorbeeld een set field in het script op dezelfde layout zou dus nogmaals het script triggeren, als je dan ook nog eens een commit doet nadien, wordt het nog eens getriggered, en voor je het weet ben je vertrokken voor vele malen uitvoeren van hetzelfde script... (dit kan natuurlijk weer opgelost worden door " and not Get ( ScriptName )" in de case te betrekken )

 

Hier is een bestand dat duidelijk maakt wanneer de calculatie in de webviewer wordt herberekend.

 

Groetjes

 

Andries

Webviewer.fp7

Edited by Guest

Share this post


Link to post
  • 0

Heel mooi. Wel zou ik aan de gebruiker enige feedback geven waarom hij of zij geen toegang heeft tot de veldinhoud. Nu lijkt het meer op een bug dan een functie. Maar voor een voorbeeld, en daar gaat het per slot van rekening om is het uitstekend gevonden.

Share this post


Link to post
  • 0

Ja, die loop dat had ik al in de gaten.

Als je een custom message wil in je commit script komt de melding 3 à 4 keer voorbij.

Ik heb dat er maar weer uitgesloopt.

 

Dat is dus inderdaad erg handig met die webviewer, dank je voor de uitleg en het voorbeeld.

 

Het belangrijkste in mijn geval is dat als een offerte op slot staat deze niet meer aangepast mag worden.

Alleen de top-level user mag de offerte eventueel unlocken.

D.m.v. conditional formatting heb ik in de layout enkele objecten toegevoegd waardoor je snel ziet dat de offerte op slot staat.

Er hoeft dus niet alsnog een melding te komen, hoewel dat natuurlijk wel chique is.

 

Nogmaals bedankt.

Niels

Share this post


Link to post
  • 0

hallo, ondanks het feit dat dit een topic is van 2 jaar geleden wil ik hier toch nog eens op terugkomen.

Mogelijks zijn er meer mensen op zoek naar een goede oplossing.

 

Ik was ook op zoek naar een mogelijkheid om mijn records te beveiligen eenmaal de offerte of bon afgesloten was. Ik werkte vroeger privelegesets maar gezien ik via de werkwijze geen optimaal resultaat kwam ik met dit op de proppen.

 

Een offerte (tabel offerte) met offerte regels (tabel offerte regels) op één layout.

Eénmaal de layout mooi afgewerkt is maak je een kopij van de layout en noem je die "offerte Locked". In deze layout vink je onder "Data behavior" de "Field entry" uit zodoende alle velden ontoegankelijk zijn.

Eén veld om de offerte terug te zetten naar bon heb ik wel toegankelijk door het vinkje niet uit te vinken.

 

In je tabel offerte zet je een script die bij het afsluiten van de offerte het veld locked op waarde 1 brengt. Via script triggering op de layout doe je een check of het veld locked 1 is en bijgevolg stuur je de gebruiker naar de layout 'offerte locked' of de layout waar wel nog aanpassingen mogelijk zijn.

 

Eigenlijk is het een zeer eenvoudige denkpiste maar met optimaal resultaat.

Share this post


Link to post
  • 0

Je werkt dus met een layoutName_View en een layoutName_Edit.

 

Je moet dus wel onthouden dat je mogelijke veranderingen op layout niveau in BEIDE layouts moet doen.

 

Afhankelijk hoe je de navigatie doet kun je een flag zetten in een veld voor de Edit layout.

Een onLayoutload script trigger checkt de waarde en blijft op de Edit layout or switched naar de View layout.

Dat geeft een bijkomende mogelijkheid om een ander menu set te laden ook.

 

Een "geheim" Shift + click (bv, of iedere andere key combinatie) zal de script trigger overbruggen en de gebruiker in de Edit layout houden indien de flag op View staat en je eigenlijk Edit nodig hebt.

 

Dat kan dus enkel vanaf FM 10...

Share this post


Link to post
  • 0

:wink: Jean,

 

Je werkt dus met een layoutName_View en een layoutName_Edit.

Ja inderdaad een layout voor Edit en eentje voor enkel View

 

Je moet dus wel onthouden dat je mogelijke veranderingen op layout niveau in BEIDE layouts moet doen.

Daar ben ik me van bewust maar eenmaal het programma optimaal werkt denk ik niet dat ik nog veel ingrijpende wijzigingen aan de layout zal brengen. Zowieso zijn alle icons en buttons global containervelden. In mijn design table heb ik enkele global containervelden met 80 repitities. Verander ik maw een icon in mijn design table dan wordt deze verandering doorgevoerd in mijn volledig bestand, dus op alle layouts waar dit containerveld voorkomt. Het zou dus eigenlijk alleen nog het scriptgedeelte zijn die manuele aanpassing zou nodig hebben. En indien ik er echt eens met de borstel wil in vegen, dan maak ik gewoon terug een kopij van mijn definitief ontwerp (Edit layout), wijzig de kopij naar View layout en pas enkel de scripts aan die naar deze layout verwijzen. (een 20-tal)

 

Afhankelijk hoe je de navigatie doet kun je een flag zetten in een veld voor de Edit layout.

Een onLayoutload script trigger checkt de waarde en blijft op de Edit layout or switched naar de View layout.

Dat geeft een bijkomende mogelijkheid om een ander menu set te laden ook.

Dat is nu precies wat ik ook gedaan heb. Deze manier van werken laat inderdaad ook toe om een andere menu set te laden. :D Zo heb ik de button nodig om de bon af te sluiten, uiteraard verwijderd op mijn View layout waardoor de klant onmogelijk een afgesloten bon nogmaals kan afsluiten (wat eigenlijk via een script zowieso al niet mogelijk was)

 

Een "geheim" Shift + click (bv, of iedere andere key combinatie) zal de script trigger overbruggen en de gebruiker in de Edit layout houden indien de flag op View staat en je eigenlijk Edit nodig hebt.

Tja maar eigenlijk werk ik niet met een script trigger op de layout (wat wel mogelijk zou zijn). Ik werk met persoonlijke navigatiebuttons die mijn inziens meer mogelijkheden bieden voor navigatie, vooral bij scripting dan. De truck met de shift toets werkt dan blijkbaar niet 8)

FM.JPG.a71f9fa6367a75d18810cd4e87fd874b.JPG

Share this post


Link to post
  • 0
De truck met de shift toets werkt dan blijkbaar niet 8)

 

Capture de modKey status in een variable en plaats dat als tweede argument in je IF() statement.

 

@if je layout is 'locked' en $variable is nrModKey, goto Edit layout.

 

Het uitvissen van het wat plaatsen waar en in welke volgorde, laat ik even aan jou,,,, :wink:

Share this post


Link to post
  • 0

Bijna.

 

Wat we willen weten is of er, bij het triggeren van het script een "bijkomende toets" gebruikt wordt.

Voorlopig willen we niet weten welke, enkel 'of'.

 

FileMaker captured de gebruikte "key" met Get ( ActiveModifierKeys ).

 

Die waarde vang je op in je variable.

Set Variable; [$ModKey; Value ; Get ( ActiveModifierKeys )]

 

Nu zijn er op zijn minst twee mogelijkheden:

1. Of je gebruikt de variable in het huidige script.

2. Of je gebruikt het in een bijkomend script.

 

1. Je gaat naar het record volgens je scriptparameter en dan controleer je naar welke layout.

(disclaimer - hier volgen we de volledige stappen, later kun je de stappen fine tunen, script stappen is pseudo code, niet gecontroleerd – is enkel een voorbeeld van werken bij gebruik van de behangpapier methode)

If [ Get ( ScriptParameter ) = "First" ]
Go to Record/Request/Page [First]
If [FAKTUUR INPUT::factuurLocked = “ja” and $ModKey > 0]
Go to Layout ( yourLayoutName_Edit)
End If
If [FAKTUUR INPUT::factuurLocked = “ja”
Go to Layout ( yourLayoutName_View)
Else
Go to Layout ( yourLayoutName_Edit)
End If
End If

 

2. Je gaat naar het record volgens je scriptparameter en dan roep je een script aan waar je de variable als scriptparameter aan doorgeeft

 

....
Set Variable; [$ModKey; Value ; Get ( ActiveModifierKeys )]
....
If [ Get ( ScriptParameter ) = "First" ]
Go to Record/Request/Page [First]
End If
…..
……

Perform Script [“Check Layout” ; Parameter : “$ModKey”]

 

In script Check Layout doe je de controle op het gebruik van een mogelijke mod key.


If [FAKTUUR INPUT::factuurLocked = “ja” and Get (Scriptparameter) > 0]
Go to Layout ( yourLayoutName_Edit)
End If
If [FAKTUUR INPUT::factuurLocked = “ja”
Go to Layout ( yourLayoutName_View)
Else
Go to Layout ( yourLayoutName_Edit)
End If

 

Met enkele kleine aanpassingen kun je script (2) eigenlijk gebruiken als script trigger die aangeroepen wordt op het ogenblik dat je met je navigatie op een bepaalde layout komt.

Je kunt de script trigger onLayoutEnter gebruiken daarvoor.

 

Dat heeft het voordeel dat je flexible blijft en dan hoef je je record navigatie script niet aan te raken.

 

Als je nu gebruik wil maken van een specifieke modKey (shift, Ctrl, Alt, of combinatie) moet je die waarde opvangen in je variable en controleer je niet op > 0, maar op de specifieke waarde van de gebruikte modKey (1, 2, 4, 8.... of iedere andere mogelijke combinatie)

Share this post


Link to post
  • 0
Bijna.

 

Bijna helemaal ernaast ja... :lol:

 

Interessant Jean. Ik zal me daar de komende dagen eens op verdiepen.

 

Groetjes

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...