Hi My question is
i need a form to fill the details like below, for this requirement i am thinking to go with the form layout will be fine or any other methods i can go with?
after filling these details if user wants to add one/more contracts he should get the same form below one after the other is that functionality is possible in forml ayout ?
let me know if any suggestions
button to add more forms
Discussion posts and replies are publicly visible
Yes it is possible please refer to the below screenshots and code.
a!localVariables( local!xyz:'type!{urn:com:appian:types}AA_Vehicle'(), a!formLayout( contents: { a!forEach( items: local!xyz, expression: { a!cardLayout( contents: a!columnsLayout( columns: { a!columnLayout( contents: { a!sectionLayout( label: "Vehicle Information", labelSize: "SMALL", contents: {}, divider: "NONE" ), a!sideBySideLayout( items: { a!sideBySideItem( item: a!textField( label: "Make", labelPosition: "ABOVE", value: fv!item.vehicleMake, saveInto: fv!item.vehicleMake, required: true, validations: if( len(fv!item.vehicleMake) > 255, "Value may not be longer than 255 characters. You have entered " & len(fv!item.vehicleMake) & " characters.", null ) ) ), a!sideBySideItem( item: a!textField( label: "Model", labelPosition: "ABOVE", value: fv!item.vehicleModel, saveInto: fv!item.vehicleModel, required: true, validations: if( len(fv!item.vehicleModel) > 255, "Value may not be longer than 255 characters. You have entered " & len(fv!item.vehicleModel) & " characters.", null ) ) ), a!sideBySideItem( item: a!integerField( label: "Year", labelPosition: "ABOVE", value: fv!item.vehicleYear, saveInto: fv!item.vehicleYear, required: true ) ) } ), a!sideBySideLayout( items: { a!sideBySideItem( item: a!textField( label: "VIN", labelPosition: "ABOVE", value: fv!item.vehicleVIN, saveInto: fv!item.vehicleVIN, required: true, validations: if( len(fv!item.vehicleVIN) > 17, "Value may not be longer than 17 characters. You have entered " & len(fv!item.vehicleVIN) & " characters.", null ) ), width: "2X" ), a!sideBySideItem( item: a!integerField( label: "Mileage", labelPosition: "ABOVE", value: fv!item.vehicleMileage, saveInto: fv!item.vehicleMileage, required: true ) ), a!sideBySideItem( item: a!textField( label: "Color", labelPosition: "ABOVE", value: fv!item.vehicleColor, saveInto: fv!item.vehicleColor, required: true, validations: if( len(fv!item.vehicleColor) > 255, "Value may not be longer than 255 characters. You have entered " & len(fv!item.vehicleColor) & " characters.", null ) ) ) } ), a!dropdownField( label: "Category", labelPosition: "ABOVE", placeholder: "--- Select category ---", choiceLabels: {"abc"}, choiceValues: {"abc"}, value: fv!item.vehicleCategory, saveInto: fv!item.vehicleCategory, required: true, validations: {} ), } ), a!columnLayout( contents: { a!sectionLayout( label: "Maintenance History", labelSize: "SMALL", contents: {}, divider: "NONE" ), a!sideBySideLayout( items: { a!sideBySideItem( item: a!dateField( label: "Last Maintenance", labelPosition: "ABOVE", value: fv!item.vehicleLastMaintenanceDate, saveInto: fv!item.vehicleLastMaintenanceDate, required: true, validations: if( fv!item.vehicleLastMaintenanceDate > today(), "Enter a date before today", "" ) ) ), a!sideBySideItem( item: a!dateField( label: "Next Maintenance", labelPosition: "ABOVE", value: if( or( isnull(fv!item.vehicleLastMaintenanceDate), isnull(fv!item.vehicleCategory) ), "", caladddays( fv!item.vehicleLastMaintenanceDate, rule!AA_DetermineMaintenanceDate( vehicleCategory: fv!item.vehicleCategory ) ) ), saveInto: fv!item.vehicleNextMaintenanceDate, showWhen: not(isnull(fv!item.vehicleID)), required: false, readonly: true ) ) } ), a!sideBySideLayout( items: { a!sideBySideItem( item: a!dateField( label: "Added On", labelPosition: "ABOVE", value: fv!item.vehicleDateAdded, showwhen: not(isnull(fv!item.vehicleDateAdded)), required: false, readonly: true, align: "LEFT" ) ), a!sideBySideItem( item: a!textField( label: "Added By", labelPosition: "ABOVE", value: rule!AA_displayUser(fv!item.vehicleAddedBy), showwhen: not(isnull(fv!item.vehicleAddedBy)), required: false, readonly: true ) ) } ), a!fileUploadField( label: "Image", labelPosition: "ABOVE", helptooltip: "Upload images in PNG or JPG formats", target: cons!AA_DOCUMENTS_FOLDER_POINTER, maxselections: 1, value: fv!item.vehicleImage, saveInto: fv!item.vehicleImage, validations: a!localVariables( local!invalidExtensions: difference( upper(fv!files.extension), { "PNG", "JPG" } ), if( length(local!invalidExtensions) > 0, "Attachments must be images. Remove: " & index( fv!files, "name", wherecontains( local!invalidExtensions, upper(fv!files.extension) ), {} ), "" ) ) ), a!imageField( label: "", labelPosition: "COLLAPSED", images: if( isnull(fv!item.vehicleImage), null, { a!documentImage(document: fv!item.vehicleImage) } ), showwhen: not(isnull(fv!item.vehicleImage)), size: "MEDIUM", isThumbnail: false, style: "STANDARD", accessibilitytext: "Photo of vehicle" ) } ) } ) ), a!sectionLayout(), } ), a!richTextDisplayField( value: a!richTextItem( text: "add New", link: a!dynamicLink( saveInto: a!save( local!xyz, append( local!xyz, 'type!{urn:com:appian:types}AA_Vehicle'() ) ) ) ) ) } ) )
this data how can i store in database. here will be adding multiple data/entries that data at a time to db how can i store it and even how can i design the process model for this requirement
give me some suggestions
You can create CDT and use that CDT to show data into Grid means under rows use the local variable with that CDT and under addnewrow link use the CDT in append function as well. Create a button and on click of that button you can write to DB use the local variable for valueToStore configuration
a!localVariables( local!data:'type!{urn:com:appian:types}Account'(), a!formLayout( contents: { a!forEach( items: local!data, expression: { a!textField( label: "Account ID "&fv!index, value: fv!item.AccountID, saveInto: fv!item.AccountID ), a!textField( label: "Account Name "&fv!index, value: fv!item.AccountName, saveInto: fv!item.AccountName ) } ), a!linkField( links: a!dynamicLink( label: "Add more", saveInto: { a!save( local!data, append( local!data, 'type!{urn:com:appian:types}Account'() ) ) } ) ), a!buttonLayout( a!buttonWidget( label:"Save", saveInto: { a!writeToDataStoreEntity( dataStoreEntity: cons!UAC_ACCOUNT, valueToStore: local!data ) } ) ) } ) )