root_iv

big hack#1 "JSON and FileMaker 16" for a multiselect

Discussion created by root_iv on Jan 26, 2018
Latest reply on Jan 31, 2018 by mike_wallace_rcc

big hack#1 "JSON and FileMaker 16"

https://t.me/filemaker_help January 25, 2018

 

In development process of information system definite records are required to be selected.

For example, needed nomenclature could be added to shopping basket from product list.

 

82cc859cf2fd3cf430787.gif

 

With 16 system release and adding functions JSON implementation of this task was greatly simplified. Earlier for user selects holding global field or supporting table was required. We had to follow that this field or table were emptied before every new  selection procedure. Only public variable is needed now. All information about selected records can be easily added and read by using function JSON, where the result will be the following JSON- text:

“{"1":true,"3":true,"4":true}”

 

in which 1,3 and 4 – keys , which name corresponds to chosen identifier (if we chose record with id 1,3 and 4). Every key gets assigned the same boolean value: true.

Script , applying data-hold in JSON-text, is simply arranged . Let us suppose, we handle button, by which the user choses certain record or unselects. Thus we decided to store JSON-text in public variable $$JSON.

 

STEP1


From the beginning we need to initialize JSON-text as it is not empty in initial state, it looks as : “{}”. 

We can do it once in the script, prenex user’s work with recordset.  At this script item will appear : Set Variable [$$JSON; “{}”].

But we can dispence with preliminary script. For example, we can perform such check each time,  user push the botton to  “select” record.

The check will look so:

If (IsEmpty ($$JSON);"{}";$$JSON)

Later identifier value of current record can be accounted and memorized in variable $id_record.

Set Variable [$id_record; GetLayoutObjectAttribute ("id";"content")]

In order to item in script worked with using function GetLayoutObjectAttribute,  It is needed to place object on layout, displayed ID item, and name “id”.

 

STEP2


Then you make sure existence of tandem in

JSON-text, whose name of key corresponds to identifier. If current record has identifier  5, we have to find tandem “5”:true. Here we use function JSONGetElement

JSONGetElement($$JSON; $id_record)

 

STEP3


As such tandem doesn’t take place in our example, function returns  “empty”. It means this tandem needs to be added to JSON-text by function JSONSetElement

JSONSetElement ($$JSON; $id_record), результатом будет запись в $$JSON: “{"1":true,"3":true,"4":true, "5":true}”

If JSONGetElement($$JSON; $id_record) returns 1, it means that in text record is already considered. We need to do back action,- delete tandem from JSON by function

JSONDeleteElement

JSONDeleteElement($$JSON; $id_record),  if

$id_record was equal to 3, so tandem  "3":true,"  would be deleted and we would get:

“{"1":true,"3":true,"4":true}”

Thus , efforts are being made to fix and regulate chosen item in case of using JSON-function – minimum.

 


Let us draw our conclusion. For implementation of this task we need:

  1. To create JSON-text in public variable $$JSON
  2. To check using function JSONGetElement, if value from  $id_record took place in $$JSON.
  3. If it there isn’t , needed value  from $id_record  should be added in $$JSON  using JSONSetElement
  4. If record  should be deleted from $$JSON, we use  JSONDeleteElement.

 


Script "CheckButton" from MS.fmp12
  • #Write the current value of the object named id
  • Set Variable [ $record_id; Value:GetLayoutObjectAttribute ( "id";"content" ) ]
  • #check if there is a JSON variable
  • Set Variable [ $$MULTISELECT_LIST; Value:If (IsEmpty ($$MULTISELECT_LIST);"{}"; $$MULTISELECT_LIST ) ]
  • #switch if the variable is empty then write, otherwise delete
  • If [ JSONGetElement ( $$MULTISELECT_LIST;$record_id)]
  • Set Variable [ $$MULTISELECT_LIST; Value:
  • JSONDeleteElement ( $$MULTISELECT_LIST;$record_id )]
  • Else
  • Set Variable [ $$MULTISELECT_LIST; Value:
  • JSONSetElement ( $$MULTISELECT_LIST;$record_id; 1; JSONBoolean) ]
  • End If
  • #refresh checkboxes
  • Refresh Window
  • Refresh Object [ Object Name: "checkbox" ]

 


Download file MS.fmp12

Invest in the development of our project

We are ready to help in your development projects. Contact us and we will try to help you: artidog@gmail.com

Attachments

Outcomes