21 déc. 2024·8 min de lecture

Contraintes de base de données pour la validation des formulaires dans les apps no-code

Utilisez des contraintes en base pour valider les formulaires : bloquez les mauvaises données tôt, affichez des erreurs claires et gardez les apps no-code cohérentes entre les équipes.

Contraintes de base de données pour la validation des formulaires dans les apps no-code

Pourquoi les mauvaises données de formulaire se propagent si vite

Les mauvaises données ne restent rarement au même endroit. Une valeur incorrecte saisie dans un formulaire peut être copiée, référencée et considérée comme fiable par toutes les parties de l’application qui y ont accès.

Cela commence souvent petit : quelqu’un saisit un email avec un espace final, sélectionne le mauvais client ou entre une quantité négative parce que le champ l’autorise. Le formulaire l’accepte, et le système traite la valeur comme vraie.

Après ça, l’effet domino est rapide. Les rapports affichent des totaux erronés, des automatisations s’exécutent sur les mauvais enregistrements et les messages clients affichent des champs désordonnés, peu professionnels. Les équipes créent alors des contournements comme des feuilles de calcul privées, ce qui crée encore plus d’incohérence. Pire encore, la même valeur incorrecte revient souvent plus tard parce qu’elle apparaît comme option ou est recopiée dans de nouveaux enregistrements.

Corriger les données a posteriori est lent et risqué : le nettoyage n’est presque jamais une simple édition. Il faut retrouver chaque endroit où la valeur est passée, mettre à jour les enregistrements liés et revérifier tout ce qui en dépend. Une correction « simple » peut casser des workflows, déclencher des notifications en double ou embrouiller l’historique d’audit.

L’intérêt des contraintes en base de données pour la validation des formulaires est d’arrêter cette chaîne dès la première étape. Quand la base refuse des données impossibles ou incohérentes, vous évitez des erreurs silencieuses et vous obtenez un point clair pour afficher un retour utile dans l’interface.

Imaginez un formulaire de commande interne construit dans un outil no-code comme AppMaster. Si une commande est enregistrée sans lien client ou avec un numéro de commande en double, elle peut contaminer factures, tâches d’expédition et rapports de revenus. La bloquer à l’envoi garde tout le flux en aval propre et évite un nettoyage douloureux.

Les contraintes de base, expliquées simplement

Les contraintes de base de données sont des règles simples qui vivent dans la base. Elles s’exécutent à chaque fois que des données sont enregistrées, peu importe d’où elles viennent : un formulaire web, un écran mobile, un import ou un appel API. Si une règle est violée, la base refuse l’enregistrement.

C’est là la grande différence avec la validation uniquement côté UI. Un formulaire peut vérifier des champs avant d’appuyer sur Enregistrer, mais ces vérifications sont faciles à manquer ou à contourner. Un autre écran peut oublier la même règle. Une automatisation peut écrire directement en base. Bientôt, vous avez des données qui semblent correctes à un endroit et qui cassent les rapports ailleurs.

Quand on parle de contraintes de base pour la validation des formulaires, l’idée est simple : laissez la base être le juge final, et laissez l’interface guider l’utilisateur pour qu’il atteigne rarement ce mur.

La plupart des applications réelles couvrent une grande partie des besoins avec trois types de base :

  • Unique : « Cette valeur doit être unique. » Exemple : email, identifiant employé, numéro de facture.
  • Check : « Cette condition doit être vraie. » Exemple : quantity > 0, start_date <= end_date.
  • Clé étrangère : « Ceci doit pointer vers un enregistrement réel dans une autre table. » Exemple : chaque commande doit référencer un client existant.

Les contraintes sont d’autant plus importantes dans les apps no-code parce qu’il y a souvent plusieurs manières de créer ou mettre à jour des données : une app web pour les admins, une app mobile pour le terrain, et des processus automatisés qui écrivent en fond. Les contraintes gardent tous ces chemins cohérents.

Elles rendent aussi les erreurs plus claires quand vous les concevez. Plutôt que de laisser des données incorrectes s’insinuer et corriger ensuite, vous pouvez afficher un message ciblé comme « Ce numéro de facture existe déjà » ou « Veuillez sélectionner un client valide » et garder la base propre dès le départ.

De la contrainte à des messages d’erreur humains et clairs

Les contraintes sont excellentes pour arrêter les mauvaises saisies, mais les messages bruts de la base sont généralement destinés aux développeurs, pas à la personne qui remplit un formulaire. L’objectif est simple : gardez la règle en base, puis traduisez l’échec en un message expliquant ce qui s’est passé et comment faire pour corriger.

Traitez chaque contrainte comme un petit « contrat d’erreur » en deux parties : ce qui ne va pas, et comment le réparer. Votre UI reste conviviale sans affaiblir les règles de données.

Quelques traductions qui fonctionnent bien :

  • Mauvais : “Unique constraint violation on users_email_key”

  • Bon : “Cet email est déjà utilisé. Essayez de vous connecter ou utilisez un autre email.”

  • Mauvais : “Check constraint failed: order_total_positive”

  • Bon : “Le total doit être supérieur à 0. Ajoutez au moins un article ou ajustez la quantité.”

  • Mauvais : “Foreign key violation on customer_id”

  • Bon : “Choisissez un client valide. S’il est nouveau, créez d’abord le client.”

Où afficher le message importe autant que les mots. Mettez une erreur ciblée au niveau du champ. Pour des règles entre champs (comme « end date doit être après start date »), une bannière en tête de formulaire est souvent plus claire.

Gardez un petit ensemble de styles d’affichage : texte inline pour la plupart des problèmes, une petite bannière pour les règles multi-champs, et un toast pour de courtes confirmations (pas pour des corrections détaillées) suffisent généralement.

Assurez-vous aussi que la formulation reste cohérente entre web et mobile. Si votre formulaire web dit « Choisissez un client valide », votre app mobile ne doit pas dire « FK invalide ». Utilisez les mêmes verbes courts (« Choisissez », « Entrez », « Supprimez ») et le même ton, pour que les utilisateurs sachent à quoi s’attendre.

Si vous construisez dans AppMaster, cette correspondance est quelque chose que vous concevez intentionnellement : la base reste stricte, tandis que la logique UI transforme les échecs en conseils calmes et précis.

Étapes : créez d’abord les règles, puis le formulaire

Si vous concevez le formulaire en premier, vous vous retrouvez à courir après les cas limites sans fin. Si vous concevez d’abord les règles de données, l’UI devient plus simple parce qu’elle reflète des règles qui existent déjà en base.

Un ordre de construction pratique :

  1. Écrivez les quelques champs qui comptent vraiment. Définissez « valide » en termes simples. Exemple : « L’email doit être unique », « Quantity doit être >= 1 », « Chaque commande doit appartenir à un client. »
  2. Modelez les tables et les relations. Décidez de ce qui appartient à quoi avant de dessiner les écrans.
  3. Ajoutez les contraintes pour les règles non négociables. Utilisez UNIQUE pour les doublons, CHECK pour les règles toujours vraies et les clés étrangères pour les relations.
  4. Construisez l’UI pour correspondre aux contraintes. Indiquez les champs obligatoires, utilisez les bons types d’entrée et ajoutez des indices simples. L’UI doit guider les gens, mais la base reste la porte finale.
  5. Essayez de casser volontairement le tout. Collez des valeurs sales, tentez des doublons et sélectionnez des enregistrements liés manquants. Améliorez ensuite les libellés et le texte d’erreur jusqu’à ce qu’il soit évident quoi corriger.

Exemple rapide

Supposons que vous créez un formulaire interne « Nouvelle commande ». Vous pouvez laisser un utilisateur chercher par nom de client, mais la base ne doit accepter qu’un vrai Customer ID (clé étrangère). En UI, cela devient un sélecteur avec recherche. Si l’utilisateur soumet sans choisir de client, le message peut simplement dire « Choisissez un client » au lieu d’échouer plus tard avec une erreur d’enregistrement déroutante.

Cela garantit la cohérence entre web et mobile sans répéter de logique fragile partout.

Contraintes UNIQUE qui évitent les doublons réels

Empêchez les liens cassés entre tables
Faites en sorte que les relations soient réelles pour que les commandes ne pointent que vers des clients existants.
Utiliser les clés étrangères

Une contrainte UNIQUE est la façon la plus simple d’empêcher l’accumulation de « la même chose, entrée différemment ». La base refuse une valeur en double, même si le formulaire l’a manquée.

Utilisez les UNIQUE pour des valeurs que les gens répètent naturellement par erreur : emails, noms d’utilisateur, numéros de facture, étiquettes d’actifs, identifiants employés ou numéros de ticket collés depuis des tableurs.

La première décision est la portée. Certaines valeurs doivent être uniques dans tout le système (un nom d’utilisateur). D’autres n’ont besoin d’être uniques que dans un groupe parent (numéro de facture par organisation, étiquette d’actif par entrepôt). Choisissez la portée consciemment pour ne pas bloquer des données valides.

Une façon pratique de penser :

  • Unique globale : une valeur, un enregistrement n’importe où (nom d’utilisateur, handle public)
  • Unique par organisation : unique au sein d’une entreprise/équipe (invoice_number + org_id)
  • Unique par site : unique au sein d’un site (asset_tag + location_id)

La manière dont vous gérez le conflit importe autant que la règle. Quand une UNIQUE échoue, ne dites pas seulement « existe déjà ». Dites ce qui a collisionné et ce que l’utilisateur peut faire ensuite. Par exemple : « Le numéro de facture 1047 existe déjà pour Acme Co. Essayez 1047-2, ou ouvrez la facture existante. » Si l’UI peut référencer sans risque l’enregistrement existant, un petit indice comme la date de création ou le propriétaire peut aider l’utilisateur à récupérer sans exposer des détails sensibles.

Les modifications requièrent une attention particulière. Une erreur classique est de traiter une mise à jour comme un nouvel enregistrement et d’indiquer un « doublon » contre lui-même. Assurez-vous que votre logique de sauvegarde reconnaît l’enregistrement courant pour qu’il ne se compare pas à lui-même.

Dans AppMaster, définissez la règle UNIQUE dans le Data Designer d’abord, puis reflétez-la dans le formulaire avec un message convivial. La base reste le gardien final, et votre UI reste honnête parce qu’elle explique une règle réelle.

Contraintes CHECK pour des règles toujours vraies

Une contrainte CHECK est une règle que la base applique à chaque ligne, à chaque fois. Si quelqu’un entre une valeur qui viole la règle, l’enregistrement échoue. C’est exactement ce qu’il faut pour des règles qui ne doivent jamais être violées, même si les données sont créées depuis différents écrans, imports ou automatisations.

Les meilleurs CHECK sont simples et prévisibles. Si un utilisateur ne peut pas deviner la règle, il continuera de rencontrer des erreurs et blâmera le formulaire. Gardez les CHECK axés sur des faits, pas sur des politiques compliquées.

CHECK courants qui rapportent vite :

  • Plages : quantity entre 1 et 1000, age entre 13 et 120
  • États autorisés : status doit être Draft, Submitted, Approved ou Rejected
  • Nombres positifs : amount > 0, discount entre 0 et 100
  • Ordre des dates : end_date >= start_date
  • Logique simple : si status = Approved alors approved_at n’est pas null

L’astuce pour rendre les CHECK accueillants est la formulation du message UI. N’échoez pas le nom de la contrainte. Dites à l’utilisateur ce qu’il doit changer.

Bons modèles :

  • « La quantité doit être comprise entre 1 et 1000. »
  • « Choisissez un statut : Draft, Submitted, Approved ou Rejected. »
  • « La date de fin doit être la même ou postérieure à la date de début. »
  • « Le montant doit être supérieur à 0. »

Dans un builder no-code comme AppMaster, il est acceptable de refléter les mêmes CHECK dans le formulaire pour un retour instantané, mais conservez la contrainte CHECK en base comme garde-fou final. Ainsi, si un nouvel écran est ajouté plus tard, la règle tient encore.

Clés étrangères qui maintiennent les relations réelles

Affichez des messages d'erreur compréhensibles
Transformez les échecs de contraintes en messages calmes et ciblés que les utilisateurs peuvent corriger rapidement.
Map Errors

Une clé étrangère (FK) impose une promesse simple : si un champ dit qu’il pointe vers un autre enregistrement, cet autre enregistrement doit exister. Si une Order a un CustomerId, la base refuse toute commande qui référence un client qui n’est pas dans la table Customers.

Cela compte parce que les champs de relation sont l’endroit où les données « presque correctes » apparaissent. Quelqu’un tape mal un nom de client, colle un ancien ID ou sélectionne un enregistrement supprimé hier. Sans FK, ces erreurs semblent correctes jusqu’à ce que les rapports, la facturation ou le support se cassent.

Le pattern UI est simple : remplacez le texte libre par des choix sûrs. Au lieu d’un champ texte pour « Client », utilisez un select, une recherche ou un autocomplete qui écrit l’ID du client en arrière-plan. Dans un constructeur no-code (par exemple, en utilisant des composants UI AppMaster liés à vos modèles), cela signifie généralement lier un dropdown ou une liste de recherche à la table Customers et sauvegarder la référence au record sélectionné, pas l’étiquette.

Quand l’enregistrement référencé manque ou est supprimé, décidez du comportement à l’avance. La plupart des équipes choisissent une des approches suivantes :

  • Empêcher la suppression tant qu’il existe des enregistrements liés (commun pour clients, produits, départements)
  • Archiver au lieu de supprimer (conserver l’historique sans casser les relations)
  • Cascade delete seulement quand c’est vraiment sûr (rare pour des données métier)
  • Mettre la référence à vide seulement quand la relation est optionnelle

Prévoyez aussi le flux « créer un enregistrement lié ». Un formulaire ne devrait pas forcer l’utilisateur à quitter la page, créer le client ailleurs, puis revenir et tout retaper. Une approche pratique est une action « Nouveau client » qui crée d’abord le client, renvoie le nouvel ID et le sélectionne automatiquement.

Si une FK échoue, n’affichez pas un message brut de la base. Dites ce qui s’est passé en langage clair : « Veuillez choisir un client existant (le client sélectionné n’existe plus). » Cette phrase simple empêche la propagation d’une relation cassée.

Gérer les échecs de contraintes dans le flux UI

Protégez vos données avec des contraintes simples
Imposez des règles toujours vraies comme quantity > 0 et start date avant end date.
Ajouter des vérifications

Les bons formulaires attrapent les erreurs tôt, sans pour autant se croire juge ultime. L’UI aide l’utilisateur à aller plus vite ; la base garantit qu’on n’enregistre rien de mauvais.

Les vérifications côté client servent pour l’évidence : champ requis vide, email sans @, ou un nombre manifestement hors bornes. Les afficher immédiatement rend le formulaire réactif et réduit les soumissions ratées.

Les vérifications côté serveur sont là où les contraintes font leur vrai travail. Même si l’UI oublie quelque chose (ou que deux personnes soumettent en même temps), la base bloque doublons, valeurs invalides et relations brisées.

Quand une erreur de contrainte revient du serveur, gardez la réponse prévisible :

  • Conservez toutes les saisies de l’utilisateur. Ne réinitialisez pas la page.
  • Mettez en évidence le champ qui a causé le problème et ajoutez un court message à proximité.
  • Si le problème implique plusieurs champs, affichez un message en tête et marquez quand même le champ le plus pertinent.
  • Proposez une action sûre : éditer la valeur, ou ouvrir l’enregistrement existant si cela a du sens.

Enfin, consignez l’événement pour pouvoir améliorer le formulaire : capturez le nom de la contrainte, la table/le champ et l’action utilisateur qui l’a déclenchée. Si une contrainte échoue souvent, ajoutez un petit indice dans l’UI ou une vérification côté client supplémentaire. Une montée soudaine peut aussi signaler un écran déroutant ou une intégration cassée.

Exemple : un formulaire de commande interne qui reste propre dans le temps

Considérez un outil interne simple utilisé par les ventes et le support : un formulaire « Create Order ». Il semble inoffensif, mais il touche les tables les plus sensibles. Si le formulaire accepte de mauvaises saisies ne serait-ce qu’une fois, ces erreurs se répandent dans factures, expéditions, remboursements et rapports.

La façon propre de le construire est de laisser les règles de la base guider l’UI. Le formulaire devient un front-end convivial pour des règles qui tiennent dans la durée, même si quelqu’un importe des données ou édite des enregistrements ailleurs.

Voici ce que la table Order impose :

  • Numéro de commande unique : chaque order_number doit être différent.
  • CHECK pour les règles toujours vraies : quantity > 0, unit_price >= 0, et peut-être unit_price <= 100000.
  • Clé étrangère vers Customer : chaque commande doit pointer vers un enregistrement client réel.

Voyons ce qui arrive en situation réelle.

Un commercial saisit un numéro de commande de mémoire et le réutilise par erreur. La sauvegarde échoue sur la contrainte UNIQUE. Au lieu d’un vague « échec de la sauvegarde », l’UI peut afficher : « Le numéro de commande existe déjà. Utilisez le numéro suivant disponible ou recherchez la commande existante. »

Plus tard, un enregistrement client est fusionné ou supprimé pendant qu’un utilisateur a encore le formulaire ouvert. Il appuie sur Enregistrer avec l’ancien client sélectionné. La clé étrangère bloque l’opération. Une bonne réponse UI : « Ce client n’est plus disponible. Actualisez la liste des clients et choisissez-en un autre. » Ensuite, rechargez le dropdown Customer et conservez le reste du formulaire intact pour que l’utilisateur ne perde pas son travail.

Avec le temps, ce modèle garde les commandes cohérentes sans compter sur la vigilance quotidienne de tout le monde.

Erreurs courantes qui causent des messages confus et des données sales

Arrêtez les doublons dès l'origine
Définissez des champs uniques comme l'email ou le numéro de facture pour empêcher la propagation des doublons.
Définir les contraintes

Le moyen le plus rapide d’obtenir des données désordonnées est de s’appuyer sur des règles UI seulement. Un champ requis dans un formulaire aide, mais ne protège pas les imports, intégrations, modifications admin ou un second écran qui écrit dans la même table. Si la base accepte de mauvaises valeurs, elles apparaîtront partout plus tard.

Autre erreur fréquente : écrire des contraintes trop strictes pour la vie réelle. Un CHECK qui semble correct au jour 1 peut bloquer des cas normaux une semaine après, comme des remboursements, des expéditions partielles ou des numéros de téléphone internationaux. Bonne règle : contraignez ce qui doit toujours être vrai, pas ce qui est généralement vrai.

Les mises à jour sont souvent négligées. Les collisions UNIQUE lors d’une édition sont classiques : un utilisateur ouvre un enregistrement, change un champ non lié, et la sauvegarde échoue parce qu’une valeur « unique » a changé ailleurs. Les transitions d’état sont un autre piège. Si un enregistrement peut passer Draft → Approved → Cancelled, assurez-vous que vos CHECK permettent tout le chemin, pas seulement l’état final.

Les clés étrangères échouent de la façon la plus évitable : laisser les gens taper des IDs. Si l’UI autorise du texte libre pour une relation, vous aurez des relations cassées. Préférez des pickers liés à des enregistrements existants et conservez la clé étrangère en base comme dernier rempart.

Enfin, les erreurs brutes de la base créent panique et tickets support. Vous pouvez garder des contraintes strictes tout en affichant des messages humains.

Une liste de corrections rapide :

  • Faites des contraintes la source de vérité, pas seulement des règles de formulaire
  • Concevez les CHECK autour des workflows réels, en incluant les exceptions
  • Gérez les éditions et transitions, pas seulement la création
  • Utilisez des pickers pour les relations, pas des identifiants tapés
  • Mappez les échecs de contraintes en messages conviviaux au niveau du champ

Checklist rapide et prochaines étapes pour les équipes no-code

Avant de publier un formulaire, supposez qu’il sera utilisé à la hâte, un jour difficile, avec des données collées. L’approche la plus sûre : des contraintes en base pour la validation des formulaires, afin que la base fasse respecter la vérité même si l’UI laisse passer quelque chose.

Vérifications rapides avant le lancement

Exécutez ces vérifications pour chaque formulaire qui écrit en base :

  • Doublons : identifiez ce qui doit être unique (email, numéro de commande, ID externe) et confirmez qu’une règle UNIQUE existe
  • Relations manquantes : confirmez que chaque relation requise est appliquée (par ex. une Order doit avoir un Customer)
  • Plages invalides : ajoutez des CHECK pour les valeurs devant rester dans des bornes (quantity > 0, discount entre 0 et 100)
  • Champs obligatoires : assurez-vous que les « must have » sont appliqués au niveau base, pas seulement avec des flags UI
  • Valeurs par défaut sûres : décidez ce qui doit se remplir automatiquement (status = "Draft") pour éviter les suppositions

Testez ensuite comme un utilisateur, pas comme un constructeur : faites une soumission propre de bout en bout, puis essayez de la casser avec des doublons, relations manquantes, nombres hors bornes, champs requis vides et saisies de type incorrect.

Prochaines étapes dans AppMaster

Si vous construisez sur AppMaster (appmaster.io), modelez d’abord les règles dans le Data Designer (UNIQUE, CHECK, clés étrangères), puis construisez le formulaire dans le web ou mobile UI builder et connectez la logique de sauvegarde dans le Business Process Editor. Quand une contrainte échoue, capturez l’erreur et mappez-la vers une action claire : quoi changer et où.

Gardez le texte d’erreur cohérent et posé. Évitez de blâmer. Préférez « Utilisez une adresse email unique » plutôt que « Email invalide ». Si possible, affichez la valeur en conflit ou la plage requise pour que la correction soit évidente.

Choisissez un formulaire réel (par exemple “Create Customer” ou “New Order”), construisez-le de bout en bout, puis validez-le avec des données désordonnées issues du travail quotidien de votre équipe.

FAQ

Why should I enforce validation in the database instead of only in the form UI?

Commencez par des contraintes en base de données : elles protègent tous les chemins d’écriture — formulaires web, écrans mobiles, imports et appels API. La validation côté client reste utile pour un retour rapide, mais la base doit être la dernière barrière afin que des valeurs incorrectes ne s’infiltrent pas via un autre écran ou une automatisation.

Which database constraints matter most for typical business forms?

Concentrez-vous sur l’essentiel qui empêche la plupart des dégâts réels : UNIQUE pour les doublons, CHECK pour les règles qui doivent toujours être vraies, et clés étrangères pour les relations réelles. N’ajoutez que les règles dont vous êtes sûr qu’elles ne doivent jamais être violées, même lors d’imports ou d’exceptions.

When should I use a unique constraint, and how do I pick the right scope?

Mettez une contrainte UNIQUE quand une valeur doit identifier un seul enregistrement dans la portée choisie : email, numéro de facture, identifiant employé. Choisissez d’abord la portée (globale vs par organisation / emplacement) pour ne pas bloquer des répétitions valides dans votre activité.

What makes a good check constraint that won’t frustrate users?

Faites les CHECK simples et prévisibles : plages, nombres positifs, ordre des dates. Si les utilisateurs ne peuvent pas deviner la règle depuis le libellé du champ, ils frapperont plusieurs fois. Rédigez des indications UI claires et évitez les CHECK qui codent une politique complexe.

How do foreign keys help, and what should the UI do differently?

Une clé étrangère empêche les références « presque correctes » : une commande qui pointerait vers un client inexistant. En UI, évitez le champ texte libre pour les relations : utilisez un sélecteur, une recherche ou un autocomplete qui enregistre l’ID du client derrière l’étiquette afin que la relation reste valide.

How do I turn raw constraint errors into clear, human messages?

Traitez chaque contrainte comme un « contrat d’erreur » : traduisez l’échec technique en une phrase qui explique ce qui s’est passé et quoi faire ensuite. Par exemple, remplacez une violation UNIQUE brute par : “Cet email est déjà utilisé. Utilisez un autre email ou connectez-vous.”

Where should I display constraint-related errors in the form?

Affichez les erreurs de champ à côté du champ concerné et conservez les saisies de l’utilisateur pour qu’il puisse corriger rapidement. Pour les règles impliquant plusieurs champs (ex. dates), un court message en tête de formulaire est souvent plus clair, tout en mettant en évidence le champ le plus pertinent.

Do I still need client-side validation if I have database constraints?

La validation côté client doit capter les problèmes évidents (champs requis vides, format d’email basique) pour réduire les soumissions échouées. Les contraintes en base restent nécessaires pour gérer les conditions de concurrence et les autres chemins d’écriture (deux personnes soumettant le même numéro de facture simultanément).

What are the most common mistakes that lead to confusing errors or dirty data?

Ne comptez pas seulement sur des règles UI, n’imposez pas des contraintes plus strictes que les workflows réels, et ne négligez pas les mises à jour et transitions d’état. Évitez aussi de laisser les utilisateurs taper des IDs pour les relations : préférez des sélecteurs pour garder l’intégrité. Enfin, mappez les erreurs brutes en messages humains pour éviter la panique.

How do I apply this approach in AppMaster without overcomplicating the app?

Modelez d’abord vos données et vos contraintes dans le Data Designer, puis construisez le formulaire et mappez les échecs de contraintes vers des messages sympathiques dans le flux UI. Dans AppMaster, cela signifie définir les règles UNIQUE / CHECK / FK dans le modèle, connecter les sauvegardes dans le Business Process Editor et garder le libellé d’erreur cohérent entre web et mobile. Pour aller vite, construisez un formulaire à fort impact de bout en bout et testez-le avec des données désordonnées.

Facile à démarrer
Créer quelque chose d'incroyable

Expérimentez avec AppMaster avec un plan gratuit.
Lorsque vous serez prêt, vous pourrez choisir l'abonnement approprié.

Démarrer