IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Créer plusieurs enregistrements depuis une seule vue. [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut Créer plusieurs enregistrements depuis une seule vue.
    Bonjour,

    Je vous soumets un problème qui me semble simple à comprendre mais difficile à réaliser (j'espère me tromper).

    J'ai une table FACTURES avec une table liée LIG_FACTURES. La table FACTURES contient les éléments "d'entête" de la facture et la table LIG_FACTURES le détail des lignes de la facture.

    Mon utilisateur créé d'abord l'entête de la facture ensuite on lui demande s'il veut saisir les lignes de détail de la facture. Jusque là pas de problème.

    J'arrive très bien à saisir une ligne et à l'enregistrer mais c'est rébarbatif pour l'utilisateur s'il faut créer dix lignes pour une facture. Comment faire pour saisir plusieurs lignes dans une seule vue et ensuite créer les enregistrements correspondants dans la table LIG_FACTURES ?

    Je ne sais pas si j'ai été clair...

    Est ce que quelqu'un a un début de piste ?

    D'avance merci.

  2. #2
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut
    Si j'ai bien compris, c'est que à chaque ligne tapée tu fais un INSERT en Base ?

    Si c'est ça tu peux palier à ce problème en passant par des variables de session. Je m'explique, j'imagine que que tu as un objet qui défini les lignes qui suivent l'en-tête de la facture. Tu n'as qu'a faire une liste de ces objets, et à chaque fois où l'utilisateur saisie une ligne tu remplis un objet(ligne) que tu mets dans la liste. Une fois la liste remplie tu la stocke dans une variable de session, et puis pour la prochaine ligne tu récupères ta liste dans la variable de session et tu lui insères un nouvel objet. Ainsi tu remplis ta liste d'objets, et pour sauvegarder tout tu feras un foreach sur ta liste d'objets.
    Peux tu nous donner quelques éléments de ton code où tu ecris l'objet et où tu le sauvegarde ?

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Merci Julien de ta réponse.

    Je réexplique mes besoins.

    En fait l'utilisateur crée d'abord l'entête de la facture en créant un enregistrement dans la table FACTURES (insert). A la création je lance une vue qui demande si il veut créer les lignes de facture (Oui/Non).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public ActionResult Create()
            {
     
                FACTURES facture = db.FACTURES.Find(id);
                if (facture == null)
                {
                    return HttpNotFound();
                }
     
     
                return View();
            }
     
            //
            // POST: /FACTURES/Create
     
            [HttpPost]
            public ActionResult Create(FACTURES factures)
            {
     
                if (ModelState.IsValid)
                {
                    ViewBag.idfac= int.Parse(factures.FC_ID.ToString()); 
                    db.FACTURES.Add(factures);
                    db.SaveChanges();
                    return RedirectToAction("Create", "lig_fact", new { id = ViewBag.idfac });
                }
     
                return View(garantir_pc);
            }
    Code à peu près équivalent pour les lig_factures.


    Si il dit oui il va sur une vue ou il peut saisir une ligne de la table LIG_FACTURES. Il valide, l'enregistrement est créé (liée à la table FACTURE par l'id de l'entête créé plus tôt) et une vue est lancée qui lui demande si il veut rajouter une autre ligne etc,etc,etc.

    Ce que je voudrai faire (et je ne sais pas comment et si c'est faisable) c'est permettre à l'utilisateur de créer plusieurs lignes de facture depuis une seule vue (qu'il n'est pas à valider à chaque fois) et ensuite d'enregistrer les lignes créées dans le controleur en une fois.

    Je précise que je ne sais pas comment faire dans la vue ni dans le contrôleur.

    Je m'explique, j'imagine que que tu as un objet qui défini les lignes qui suivent l'en-tête de la facture.
    Euh non. J'ai mon modèle de données correspondant à ma table LIG_FACTURES. Pour l'instant c'est tout.
    Cordialement

  4. #4
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Est ce que tu utilises "angularJS" ou "knockoutjs" (ou autre librairie javascript pour faire du binding coté client) ?

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Pour l'instant katkiller, je n'utilise rien, je cherche simplement une "méthode" pour faire ce que je veux faire.

    Je vais donc regarder "angularJS" ou "knockoutjs" comme tu le préconises pour voir si cela me semble solutionner mon "problème".

    Comme marqué dans l'intitulé du post je suis débutant et je ne connais rien à toutes ses "améliorations graphiques" type AJAX, JS et consors. J'essaye déjà de maîtriser le modèle MVC et c'est vrai qu'avec ce post je m'égare un peu.

    Merci encore de vos réponses.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Bon les librairies MVVM sont de gros morceaux...

    Est ce que tu utilises JQuery ?

    Edit : En y réfléchissant bien il y a peu être moyen sans... mais j'ai tellement l'habitude de faire avec que j'ai oublié comment je faisais avant...
    Je vais essayer de te faire un petit exemple (juste en MVC)...

    C'est du MVC 4 ou 5 ?
    Framework 4 ou 4.5 ou + ?

  7. #7
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    public ActionResult Create() //création de l'en-tête
    {
    	Factures facture = db.Factures.find(id);
    	if (facture == null)
    	{
    		return HttpNotFound();
    	}
     
    	return View();// vue ou tu as ton formulaire pour l'en-tête
    }
     
    [httpPost]
    public ActionResult Create(Factures facture)//tu retournes ton formulaire rempli (modèle facture)
    {
    	if (ModelState.IsValid)//tu verifies le formulaire
                {
                    ViewBag.idfac= int.Parse(factures.FC_ID.ToString()); // tu chopes l'id qui marche bien
                    db.FACTURES.Add(factures);// tu sauvegardes l'en-tête
                    db.SaveChanges();
                    return RedirectToAction("Addligne", "lig_fact", new { id = ViewBag.idfac });//redirection vers la fonction pour créer les lignes
                }
     
                return View(garantir_pc);
    }
     
    public ActionResult Addligne(string id = "")
    {
    ViewBag.id = id;
    //je te conseille de créer un objet "lignes" pour faire ensuite :
    List<lignes> ligneFact = new List<lignes>();// ça te balance les lignes deja existantes 
    ligneFact = db.Factures_Lignes(id) // je suppose que ta db te retourne une liste de lignes
    if (Session["lignes"] != null)
    {
    	List<lignes> ligneFact2 = new List<lignes>(); // tu recrées une liste de lignes
    	ligneFact2 = (List<lignes>)Session["lignes"]; // tu mets les lignes stockées en session dans ta liste
    	ligneFact.AddRange(ligneFact2); // tu mets les lignes sauvegardés dans la variable de sessions bout a bout avec celles en base
    }
    return View("Addligne",ligneFact); //Ligne fact sera itéré sur ta vue (fortement typée) list ou details
    }
     
    //Après tu te fais une fonction pour mettre les nouvelles lignes tapées dans ta variable de session
    // utilises un actionlink
     
    public ActionResult PutLigneInSession(int champ1 = 0, int champ2 = 0, string champ3 = "", string id = "" // ton id de départ !)
    {
    List<lignes> list = new List<lignes>();//nouvelle liste de ligne
    lignes NouvelleLigne = new lignes();//nouvelle ligne
    NouvelleLigne.champ1 = champ1;//tu remplis ton objet
    NouvelleLigne.champ2 = champ2;
    NouvelleLigne.champ3 = champ3;
    list.Add(NouvelleLigne);
     
    if (Session["lignes"] != null)//test si tu as déjà enregistré des lignes ou pas
    {
    	List<lignes> listInSession = new List<lignes>();
    	listInSession = (List<lignes>)Session["lignes"];//tu mets le contenu de la variable dans une liste du meme type
    	ListInSession.AddRange(list); // tu ajoutes ta nouvelle ligne à ce qui existe déjà
    	Session["lignes"]= ListInSession; //tu sauvegardes ce que tu viens de faire :)
    }
     
    if (Session["lignes"] == null)//si c'est la premiere ligne que tu crées
    	Session["lignes"] = list;
     
     
    	return RedirectToAction("Addligne","leNomdeTonControleur", new {id = id}); //comme ça tu retournes dans la fonction pour ajouter une ligne
    }
     
    public ActionResult SaveMyLignes(int id = 0)
    {
    	List<lignes> list = new List<lignes>(); // tu crées une liste de lignes
    	list = (List<lignes>)Session["lignes"];//tu mets dans cette liste les lignes sauvées en session
    	foreach(var item in list)
    	{
    		db.ADD(item);
    		db.savesChanges();
    		//je pense que ça doit être un truc dans ce style pour ta sauvegarde
    	}
    	Session["lignes"] = null; // comme tu as sauvegardé en base tu peux vider la variable de session
    	return RedirectToAction("Create","LeNomDeTonControlleur");
    }
    Je verrais bien un truc de ce style pour ton projet, c'est une solution que j'ai déjà utilisé et qui fonctionne. Je l'ai écrite très vite il se peut que tu trouve quelques coquilles dedans (casse) et j'ai mis pas mal de commentaires pour t'expliquer le cheminement. Je pense même qu'on peut améliorer encore ce code...

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par katkiller Voir le message
    C'est du MVC 4 ou 5 ?
    Framework 4 ou 4.5 ou + ?
    MVC 4 - Framework 4.5

    Merci Julien pour ton code je vais regarder ça attentivement

    Cordialement

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    J'ai contourné le problème en rechargeant ma page à chaque insertion.

    Cela correspond à un comportement acceptable pour l'utilisateur tout en permettant un code simple.

    Je peux fournir plus de détails à ceux qui le souhaitent.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Formulaire : Créer plusieurs enregistrements en une seule fois !
    Par Doudou-Galak dans le forum IHM
    Réponses: 9
    Dernier message: 21/10/2016, 09h10
  2. Réponses: 2
    Dernier message: 29/03/2006, 16h36
  3. plusieurs enregistrements dans une seul ligne
    Par Celelibi dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 15h55
  4. Insérer plusieurs enregistrements en une seule requête
    Par pyd001 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/02/2004, 10h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo