Suche // Search:

31.01.2011

Formulare durch Anhänge vorbefüllen
//
Populate forms from attachments

Haben Sie sich nicht schon mal gewünscht, Formulare einfach durch eine externe Datei zu aktualisieren, anstatt sie bei jeder Kleinigkeit wieder in Designer öffnen zu müssen?
Das ist sogar möglich.
Sie können Formularobjekte wie z.B. Texte und Textfelder zur Laufzeit verändern und z.B. durch eine angehängte XML-Datei vorbefüllen zu lassen.
Diese Methode ist beispielsweise praktisch, wenn Sie nur ihre AGB's im Formular aktualisieren wollen oder sie einen Fragebogen haben, bei dem Sie die Fragen je nach Abteilung nur etwas variieren müssen.

Dieses Beispiel verwendet dazu eine relativ kompakte JavaScript-Funktion in einen Skriptobjekt, dass beim docReady:Event ausgeführt wird.
Das Skript prüft, ob Anhänge vorhanden sind, und wenn ja, ob ein Anhang einen ganz bestimmten Namen hat.
Dieser Anhang ist dann die Quelldatei, aus der die XML-Daten herausgelesen und vorbefüllt werden.

AKTUALISIERUNG: Ich habe mein Bespiel etwas ergänzt. Sie könne jetzt auch Dropdown-Listen und Listboxen aus den Anhängen heraus vorbefüllen.


Have you ever thought of updating your existing forms through an external file instead of opening them each time again in Designer?
This is even possible.
You can manipulate form objects such as a text or text field at runtime and populate them from an attached XML-file.
This method is handy for example if you only need to update the GTC in your form or you have a questionnaire with slight varying questions for each division.

This example uses a relatively short JavaScript function in a script object, which is executed on the docReady:Event.
The script determines if there are files attached to the form and if one has a specific file name.
This specific file is the source file where the XML data is extracted from and populated.

UPDATE: My sample got a bit more complemented. Now you also can populate drop down lists and list boxes from the attachments.


JavaScript-Funktion
//
JavaScript function
form1.#variables[0].Populate - (JavaScript, client)
 
function Presets () {
     var oDoc = event.target,
  oAttachment = oDoc.dataObjects,
  oAttachmentName,
  oAttachmentData,
  oAttachmentString,
  oXMLData;        

 if (oAttachment !== null) {
  for (var i = 0; i < oAttachment.length; i += 1) {
   oAttachmentName = oAttachment[i].path; 
   if (oAttachmentName == "LCB_FormPresets.xml") {
    oAttachmentData = oDoc.getDataObjectContents(oAttachmentName); 
    oAttachmentString = util.stringFromStream(oAttachmentData);
    oXMLData = XMLData.parse(oAttachmentString, true);

    xfa.form.form1.pageSet.Master.Headline.value.text.value = oXMLData.Preset01.value;
    xfa.form.form1.Page.Name.rawValue = oXMLData.Preset02.value; 
    xfa.form.form1.Page.Address.rawValue = oXMLData.Preset03.value; 
    xfa.form.form1.Page.Mail.rawValue = oXMLData.Preset04.value; 
    xfa.form.form1.Page.Phone.caption.value.text.value = oXMLData.Preset05.value; 
    xfa.form.form1.Page.Fax.caption.value.text.value = oXMLData.Preset06.value; 
    xfa.form.form1.Page.Mail.caption.value.text.value = oXMLData.Preset07.value;
    xfa.form.form1.Page.Explaination.value.text.value = oXMLData.Preset08.value;  
    xfa.form.form1.Page.Explaination.font.fill.color.value = oXMLData.Preset09.value;  
    
    var DDLValues = oXMLData.Preset10.value.split(", ");
       for (var d = 0; d < DDLValues.length; d += 1) {
         xfa.form.form1.Page.DropDown.addItem(DDLValues[d]);
         }
         
        var LBValues = oXMLData.Preset11.value.split(", ");
       for (var l = 0; l < LBValues.length; l += 1) {
         xfa.form.form1.Page.ListBox.addItem(LBValues[l]);
         }
   }
  }
 }
}
Schritt 1 – Leeres Formulare mit Platzhalter-Texten oder leeren Feldern
//
Step 1 – Empty form with placeholder texts or empty fields


Schritt 2 – XML-Datei mit den gewünschten Daten als Anhang hinzufügen
//
Step 2 – Attach XML-file with the desired data

Schritt 3 – Automatisch vorbefülltes Formular nach dem Schließen und Öffnen
//
Step 3 – Automatically populated form after closing and opening


Beispielformular
//
Sample form
https://files.acrobat.com/preview/e3c7761b-ae2a-4920-977b-e978cd81aa49

24.01.2011

Mehrstufige Dropdown-Liste
//
Multilevel dropdown list

Dropdown-Listen sind nützlich aber je nach Menge der Werte elend lang und dadurch unübersichtlich.
Gute Beispiele sind die Länder- oder Branchenauswahlen in den Anmeldeformularen vieler Websites.
Da finden sich gerne mal 100 und mehr Werte die ersteinmal gelesen werden wollen.
Wer macht das schon?

Dieses Beispiel zeigt, wie man in einer einzigen Dropdown-Liste mehrere Ebenen definieren kann, die jeweils nur einige wenige Werte anzeigen und dadurch übersichtlicher sind.
Eine getroffene Auswahl bringt den Benutzer eine Ebene tiefer und zeigt nur zu der Auswahl passende Werte an (Vom Groben ins Detail).


Dropdown Lists a useful but depending on the amount of values they display also very multitudinous.
Good examples are those country- or branch selections in the registration forms of many websites.
There you can have 100 or more values to read over. Who is really doing this?

This example shows how you can design a single dropdown list with several levels which only have a few values and are more readable.
A selection brings the user a level deeper which only shows values that matches the selection (top-down method)

Mehrstufige Dropdown-Liste – mit 3 Ebenen
//
Multilevel dropdown list – with 3 levels

Beispiel-Formular
//
Sample form
https://files.acrobat.com/a/preview/a056804c-a535-4a33-aeea-e0e1df82d346

12.01.2011

XFA Terminkalender
//
XFA Appointment Calendar

Heute will ich mal zeigen, was man alles mit XFA-Formularen und FormCalc realisieren kann. Dieses Beispiel ist ein Terminkalender.

Wenn Sie ein Jahr auswählen werden sämtliche Monate, Wochen und Tage durch ein Skript berechnet und der Kalender gerendert.
Allerdings ist dieser Vorgangs sehr rechenintensiv und dauert je nach Rechenleistung auch mal eine Minute und länger.

Besonderheiten:
In diesem Beispiel werden die Wochenenden ausgenommen, da man da gewöhnlich nicht arbeitet.
Zeiten bei denen eine Notiz oder ein Termin hinterlegt wurden, werden automatisch durch eine Farbe hervorgehoben.
Des Weiteren wird auch der heutige Tag wird in der Kopfzeile hervorgehoben.


Today I like to show what is possible with XFA forms and FormCalc. This example is an appointment calender.

If you select a year a script starts to calculate all months, week and days in front of rendering the calendar.
But, this progress need thousands of calculations and takes about a minute or longer to finish, depending on the computing power.

Features:
In the example all weekends are excluded because you generally do not work on this days.
Timeslots where a note or appointment has been added are automatically highlighted by a color.
Also, the current date is highlighted in the headline.

Kalender // Calendar


FormCalc-Skript - Berechnung der Kalenderblätter
//
FormCalc script - Calculation of the Calendar Sheets

if (RenderForm.value eq 1) then
    var nPages = Page.instanceManager.count 
    var nStart
    var nLength
    var nIndex
    var nDayNumber
    var nDayName 
    var nWeekDay
    var nWeekNumber
    var nYear = Year
    var nBegin
    var nFirstDay
    var nLastDay
    var nAddDay
    var nCheck

 for p = 0 upto nPages - 1 step 1 do
    nBegin = Concat("1.", p+1, ".", nYear)
    nFirstDay = Date2Num(nBegin, "D.M.YYYY")
    nAddDay = nFirstDay


    for d = 0 upto 31 step 1 do
        nAddDay = nAddDay + 1
        nCheck = Num2Date(nAddDay, "M")
        if (nCheck eq p+1) then
            nLastDay = nAddDay
        endif
    endfor

    nLength = Num2Date(nLastDay, "D")
    Page[p].Head.Month = Num2Date(Date2Num(nBegin, "D.M.YYYY"), "MMMM")
    Page[p].Body._Day.setInstances(nLength)
    nStart = Date2Num(nBegin, "D.M.YYYY")

    for d = 0 upto nLength - 1 step 1 do 
        nIndex = Sum(nStart, d)
        nDayNumber = Num2Date(nIndex, "DD")
        nDayName = Num2Date(nIndex, "EEE")
        nWeekDay = Num2Date(nIndex, "E")
        nWeekNumber = Num2Date(nIndex, "WW")
        if(nWeekDay eq "1" or nWeekDay eq "7") then
            Page[p].Body.Day[d].DayName.Text.w = S_S.value
            Page[p].Body.Day[d].DayName.Text.border.fill.color.value = "128,128,128"
            Page[p].Body.Day[d].Week.Text.w = S_S.value
            Page[p].Body.Day[d].Detail[*].Notes.w = S_S.value
            Page[p].Body.Day[d].Detail[*].Notes.ui.textEdit.border.fill.color.value = "128,128,128"
            Page[p].Body.Day[d].Detail[*].Notes.margin.topInset = "0.0mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.bottomInset = "0.0mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.leftInset = "0.0mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.rightInset = "0.0mm"
            Page[p].Body.Day[d].DayName.Text.value.text.value = ""
            Page[p].Body.Day[d].Week.Text.value.text.value = ""
        else
            Page[p].Body.Day[d].DayName.Text.w = M_F.value  
            Page[p].Body.Day[d].DayName.Text.border.fill.color.value = "255,255,255"
            Page[p].Body.Day[d].Week.Text.w = M_F.value 
            Page[p].Body.Day[d].Detail[*].Notes.w = M_F.value
            Page[p].Body.Day[d].Detail[*].Notes.ui.textEdit.border.fill.color.value = "255,255,255"
            Page[p].Body.Day[d].Detail[*].Notes.margin.topInset = "0.5mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.bottomInset = "0.5mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.leftInset = "0.5mm"
            Page[p].Body.Day[d].Detail[*].Notes.margin.rightInset = "0.5mm"
            Page[p].Body.Day[d].DayName.Text.value.text.value = Concat(nDayNumber, ".\u000a", nDayName)

            if(nWeekDay == "2") then
                Page[p].Body.Day[d].Week.Text.value.text.value = nWeekNumber
            else
                Page[p].Body.Day[d].Week.Text.value.text.value = ""
            endif
        endif
    endfor
endfor
RenderForm.value = 0
endif

Beispiel-Kalender // Example Calendar
https://acrobat.com/#d=YpV-ajdmwMmAXZHUPL1E-g

04.01.2011

FormCalc Diagramme Teil 6 - Blasendiagramm
//
FormCalc Charts Pt.6 - Bubble Chart

Heute gibt's nochmal ein neues Diagramm von mir - das Blasendiagramm (oder auch Scatter Plot genannt).
Es hat wie die vorherigen Beispiele auch die Möglichkeit Werte von 0 bis 10000 darzustellen und sich entsprechend zu skalieren.
Im Unterschied zu den bisherigen Beispielen, wird hier neben der Y-Achse auch die X-Achse dynamisch angepasst.

Zum Darstellen mehrerer Blasen, die sich ggf. auch überlappen können, wird wieder ein positioniertes Layout verwendet, bei dem mittels eines Tricks wieder mehrere Instanzen eines Teilformulars hinzugefügt bzw. gelöscht werden können.

Die Blasen zeigen jeweils den Wert für die Größe aus der Eingabetabelle an, wobei sich die Schriftgröße entsprechend der Blasengröße ändert.

Aktualierung:
Für die Blasengröße kann nun ein Mindestwert (in Zoll) angegeben werden, sodass diese im Diagramm nicht zu klein dargestellt werden.


Once more a new chart from me - the bubble chart (or scatter plot).
Like the previous examples it can display values between 0 and 10000 and scale automatically.
The diffrence in this example is, that it can dynamically adapt both, the Y and X-axis.

To display multiple bubbles which possibly can overlay each other, we use a positioned layout, where we can add or remove instances of subforms with a trick.

Each bubble shows the value of the size from the input table, where the font size changes analog to the bubble size.

Update:
For the bubble size you now can define a minimum value (inch size), so the bubble don't get rendered to small in the chart.


FormCalc-Skript – Aktualisierte Version 1.2
//
FormCalc script – Updated version 1.2
func Render(Flag) do
 if (Flag eq "true") then 
  var FactorX  
  var FactorY  
  var FactorS  
  var MaxInputX = Max(Input.Table.ChartValues[*].AmountX)
  var MaxInputY = Max(Input.Table.ChartValues[*].AmountY)
  var MaxInputS = Max(Input.Table.ChartValues[*].AmountS)
  var Fmin
  var FmaxX
  var FmaxY
  var FmaxS
  var MinPlotSize = 0.10 
  var Control = "Plotsizes:"
 
  for Fmin = 0 upto 9950 step 50 do
   FmaxX = Fmin + 50
   if (Within(MaxInputX, Fmin, FmaxX) eq 1) then
    FactorX = 1 / (FmaxX / 100)
   endif
   FmaxY = Fmin + 50
   if (Within(MaxInputY, Fmin, FmaxY) eq 1) then
    FactorY = 1 / (FmaxY / 100)
   endif
   FmaxS = Fmin + 50
   if (Within(MaxInputS, Fmin, FmaxS) eq 1) then
    FactorS = 1 / (FmaxS / 100)
   endif
  endfor
 
  var nRows = Input.Table.ChartValues.instanceManager.count 

  var GraphLabel   
  var ContainerHeight  
  var ContainerWidth   
  var ValueX
  var ValueY
  var ValueS
  var OffsetX
  var OffsetY
  var PlotSize
 
  for r=0 upto nRows -1 step 1 do
   Chart.layout = "tb"
   Chart._Plot.setInstances(nRows)
   Chart._Label.setInstances(nRows)
   Chart.layout = "position"
   ContainerHeight = UnitValue(Chart.Raster.h, "in")
   ContainerWidth = UnitValue(Chart.Raster.w, "in")
   Chart.Plot[r].y = ContainerHeight  
    
   ValueX = Input.Table.ChartValues[r].AmountX
   ValueY = Input.Table.ChartValues[r].AmountY
   ValueS = Input.Table.ChartValues[r].AmountS
   Chart.Plot[r].presence = "visible"
   Chart.Label[r].presence = "visible"

   for x = 0 upto 9 step 1 do
    Output.Chart.xAxis.Mark[x].Mark.value.text.value = Round((1 + x) * 10 / FactorX)
    Output.Chart.xAxis.y = ContainerHeight 
   endfor 
   for y = 10 downto 0 step 1 do
    Output.yAxis.Mark[y].Mark.value.text.value = Round((10 - y) * 10 / FactorY)
   endfor 

   var nColor = Choose(r+1,     
        "238,0,0",   
        "255,99,71", 
        "255,127,80",  
        "255,140,0",  
        "255,165,0",  
        "255,215,0", 
        "255,255,0",  
        "238,238,0",  
        "154,205,50",  
        "69,139,0",  
        "0,139,0",  
        "0,139,69",  
        "69,139,116",
        "82,139,139", 
        "0,139,139", 
        "0,134,139", 
        "83,134,139",
        "102,139,139", 
        "104,131,139", 
        "108,123,139") 

   Chart.Plot[r].Bubble.value.arc.edge.color.value = nColor
   Chart.Plot[r].Bubble.value.arc.fill.color.value = nColor
   Input.Table.ChartValues[r].Color.value.rectangle.fill.color.value = nColor
   GraphLabel = Input.Table.ChartValues[r].Label
   Chart.Label[r].BubbleValue.assist.toolTip.value = GraphLabel

   PlotSize = (ValueS / 150) * FactorS
   if (PlotSize >= MinPlotSize) then
    Chart.Plot[r].Bubble.h =  PlotSize
    Chart.Plot[r].Bubble.w =  PlotSize 
    Chart.Label[r].BubbleValue.h =  PlotSize
    Chart.Label[r].BubbleValue.w =  PlotSize 
   else 
    Chart.Plot[r].Bubble.h = MinPlotSize
    Chart.Plot[r].Bubble.w = MinPlotSize
    Chart.Label[r].BubbleValue.h = MinPlotSize
    Chart.Label[r].BubbleValue.w = MinPlotSize
   endif
   
   OffsetX = UnitValue(ValueX, "in") / 25.4 * FactorX  
   OffsetY = ContainerHeight - UnitValue(ValueY, "in") / 25.4 * FactorY 

   Chart.Plot[r].x =  OffsetX 
   Chart.Plot[r].y =  OffsetY 
   Chart.Label[r].x = OffsetX 
   Chart.Label[r].y = OffsetY 
   
   Chart.Label[r].BubbleValue.value.text.value = ValueS
  endfor

 endif
 RenderChart.value = "false" 
endfunc

Render(RenderChart.value)

Blasendiagramm - mit automatischer Skalierung
//
Bubble chart - with automatic scaling




Beispiel-Formular
//
Example form
https://workspaces.acrobat.com/app.html#d=71mOKqbTBCQOGuBLaSBndg