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

VB.NET Discussion :

Modification de lignes dans un fichier séquentiel.


Sujet :

VB.NET

  1. #21
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Va falloir que tu testes et que tu compares toi-même

    Tu peux facilement importer/sauvegarder un fichier xml à partir d'une Datatable. Et puis personne ne t'empêche d'essayer le lien que je t'ai donné et qui mène à des chaînes de connexions OLEDB pour des fichiers texte. VB 2010, même Express, à un assistant pour ajouter des sources de données. Et même, avec un peu de chance, il va te créer ta chaîne de connexion er tes requêtes de mise à jour en prime.

    Eu, si tu relis le fil, tu vas voir des solutions possibles avec des SGDB gratuits. En principe, tu devrais pouvoir remplacer sans tout réécrire. Et même Access 2007 et suivants constituent un meilleur choix qu'un fichier texte ou XML pur et dur

    1) VB.net peut piloter les applications Office par (un semblant, mais "visuellement" c'est tout comme) automation comme en VB6
    2) Un fichier Access c'est en fait un fichier zip.

    Et puis, en corrigeant ton fichier en mémoire, tu peux t'en tirer avec une seule lecture et une seule écriture. Cela reste quand même moins pire que de le faire un double ou en triple.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  2. #22
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut
    Bonjour

    Voici ce que j'obtiens pour la saisie/lecture. Ouvrir une form avec un bouton et 2 textbox :

    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
    Imports System
    Imports System.IO
    Imports System.Xml
     
    Public Class Form1
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            Dim text2 As String
            text2 = ""
     
            Dim doc As XmlDocument = New XmlDocument()
            doc.LoadXml("<book numero='1' auteur='Chat' date='2014' enonce='2#' solution='texte solution'></book>")
            ' "<book numero='2' auteur='Chien' date='2014' enonce='2#' misc='texte solution'></book></pb1>")
     
            ' Déplace dans un élément.   
            Dim myElement As XmlElement = doc.DocumentElement
     
            ' Cré un attribut de collection pour l'élément.  
            Dim attrColl As XmlAttributeCollection = myElement.Attributes
     
            ' visualise la collection par itération.  
     
            Dim i As Integer
            For i = 0 To attrColl.Count - 1
                text2 = text2 + (" " + attrColl.ItemOf(i).Name) + "  " + (" " + attrColl.ItemOf(i).Value + vbCrLf)
            Next
     
            'visualise  les attributs
            TextBox1.Text = text2
     
            ' Récupérer deux attributs de la collection comme date et solution 
     
            Dim attrSolution As XmlAttribute = attrColl("solution")
            Dim attrDate As XmlAttribute = attrColl("date")
     
            doc.Save("c:\sb\out3.xml")
     
            'Lire le fichier xml
            Dim xmldoc As New System.Xml.XmlDocument
            xmldoc.Load("c:\sb\out3.xml")
            Dim allText As String = "Fichier xml = " + xmldoc.InnerXml
            allText = "Fichier xml = " + xmldoc.InnerXml + vbCrLf + vbCrLf + "Contenue solution et date = " + attrSolution.InnerXml + "   " + attrDate.InnerXml
     
            'visualise le fichier xml et texte
            TextBox2.Text = allText
     
        End Sub
    End Class
    Cela fonctionne en appuyant sur le bouton.

    Par contre si je remplace une ligne code par celle ci-dessous pour analyser un deuxième problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    doc.LoadXml("<book numero='1' auteur='Chat' date='2014' enonce='2#' solution='texte solution'></book>" & _
            "<book numero='2' auteur='Chien' date='2014' enonce='2#' solution='texte solution'></book>")
    Après validation du bouton j'ai un message au débogage que je ne comprend pas : Une exception non gérée du type 'System.Xml.XmlException' s'est produite dans System.Xml.dll. Informations supplémentaires*: Il existe plusieurs éléments racine. Ligne 1, position 90.

    J'avoue être perdu.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  3. #23
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par excalybur Voir le message
    Bonjour


    Après validation du bouton j'ai un message au débogage que je ne comprend pas : Une exception non gérée du type 'System.Xml.XmlException' s'est produite dans System.Xml.dll. Informations supplémentaires*: Il existe plusieurs éléments racine. Ligne 1, position 90.

    J'avoue être perdu.
    Comme par hasard, la position 90, c'est le 90e caractère, incluant les espaces, de la ligne

    Sur cette page ils disent

    Charge le document XML à partir de la chaîne spécifiée.
    Donc si le document est chargé une fois, tu n'as pas besoin de le charger 3 ou 4 fois.

    Il existe des classes et des méthodes pour:

    1) Parcourir un document XML.
    2) Sélectionner un élément particulier du fichier

    Commence par essayer ceci avec ce qui fonctionne:

    Mets un point d'arrêt (F9 comme dans VB6) sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     doc.LoadXml("<book numero='1' auteur='Chat' date='2014' enonce='2#' solution='texte solution'></book>")
    Lance l'exécution

    Une fois arrêté, met un espion sur doc


    Exécute ton instruction (F11 même chose que F8 en VB6

    Regarde dans ta fenêtre espion ou espion1. En déroulant les + de Doc, tu devrais pourvoir retrouver le texte qui a été chargé.

    Et puis le F1 de Visual Basic Express fonctionne exactement comme celui de VB6. (ll ouvre l'aide.)

    Voir aussi:

    https://dotnet.developpez.com/cours
    http://plasserre.developpez.com/cours/vb-net/
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  4. #24
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si tu n'as pas des tailles fixes ca va compliquer le tout

    ca resterait faisable, mais pourquoi ne pas utiliser une base de données genre sqlite ? c'est gratuit, ca reste un fichier qui contient les données, et ca s'occupe de gérer l'alignement des données ...
    Bonjour à tous,

    Désolé de ne pas donner de news en instantanées, j'ai d'autres activités qui me mange le temps !

    Un grand merci à tous pour vos idées et suggestions qui m'ont permis de 'moderniser' un peu mes connaissances en programmation.

    Après avoir mis à jour mon VS 2017 en 15.5.7 j'en ai profiter pour incorporer SQL server fourni par MS.

    Le principe de construction de la base est assez bien pensé, il faut néanmoins y a aller prudemment au début, car les étapes sont très nombreuses. J'ai pu construire 'SuperData' ce programme test à fignoler :

    1/ Ouvrir une font avec trois boutons : Supprimer, remplacer, ajouter

    2/ Configurer une base SQL que j'appel SuperBase.mdf dont le code est sur le serveur (mon PC) est :


    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
    CREATE TABLE [dbo].[SuperTable] (
        [Id]                 INT          IDENTITY (1, 1) NOT NULL,
        [Auteur]             VARCHAR (50) NULL,
        [Numéro catalogue]   VARCHAR (50) NULL,
        [Numéro publication] VARCHAR (50) NULL,
        [Numéro auxiliaire]  VARCHAR (50) NULL,
        [Année]              VARCHAR (50) NULL,
        [Prix]               VARCHAR (50) NULL,
        [Version]            VARCHAR (50) NULL,
        [Source]             VARCHAR (50) NULL,
        [Position 1]         VARCHAR (50) NULL,
        [Position 2]         VARCHAR (50) NULL,
        [Position 3]         VARCHAR (50) NULL,
        [Position 4]         VARCHAR (50) NULL,
        [Position 5]         VARCHAR (50) NULL,
        [Position 6]         VARCHAR (50) NULL,
        [position 7]         VARCHAR (50) NULL,
        [Position 8]         VARCHAR (50) NULL,
        [Enoncé]             VARCHAR (50) NULL,
        [Nombre de pièces]   VARCHAR (50) NULL,
        [Thème]              VARCHAR (50) NULL,
        [Solution]           VARCHAR (50) NULL,
        [Commentaires]       VARCHAR (50) NULL,
        [Notes]              VARCHAR (50) NULL,
        [Numéro livre]       VARCHAR (50) NULL,
        [UTF]                VARCHAR (50) NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    3/ Incorporer la table dans le form1 et configurer à sa convenance les items et les cases à renseigner

    4/ Ecrire le code VB :

    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
    Public Class Form1
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.WindowState = FormWindowState.Normal
            'cette ligne de code charge les données dans la table 'SuperTableDataSet.SuperTable'. 
            Me.SuperTableTableAdapter.Fill(Me.SuperTableDataSet.SuperTable)
            If ComboBox1.Text = Nothing Then
                Try
                    SuperTableBindingSource.AddNew()
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try
            End If
        End Sub
     
        Private Sub SaveButton_Click(sender As Object, e As EventArgs) Handles SaveButton.Click
            Try
                Me.Validate()
                Me.SuperTableBindingSource.EndEdit()
                Me.TableAdapterManager.UpdateAll(Me.SuperTableDataSet)
                MessageBox.Show("Le problème a été enregistré", "Information", MessageBoxButtons.OK)
                SuperTableBindingSource.AddNew()
                AuteurTextBox.Select()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
     
        Private Sub NewButton_Click(sender As Object, e As EventArgs) Handles ReplaceButton.Click
            Try
                SuperTableBindingSource.AddNew()
                AuteurTextBox.Select()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
     
        End Sub
     
        Private Sub DelateButton_Click(sender As Object, e As EventArgs) Handles DelateButton.Click
            Select Case MsgBox("Etes-vous sur de vouloir supprimer ce problème?", MsgBoxStyle.YesNo, "Etes-vous sur?")
                Case MsgBoxResult.Yes
                    Try
                        SuperTableBindingSource.RemoveCurrent()
                    Catch ex As Exception
                        MessageBox.Show(ex.Message)
                    End Try
                Case MsgBoxResult.No
            End Select
        End Sub
     
        Private Sub BackButton_Click(sender As Object, e As EventArgs) Handles BackButton.Click
            Try
                SuperTableBindingSource.MovePrevious()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
     
        Private Sub NextButton_Click(sender As Object, e As EventArgs) Handles NextButton.Click
            Try
                SuperTableBindingSource.MoveNext()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    End Class
    5/ Démarrer.

    Voici une photo de l'application :

    Nom : Capture test superData.JPG
Affichages : 184
Taille : 190,9 Ko

    Au démarrage renseigner ID à 1 puisqu'on lui interdit la valeur 0 et remplir la 1ère fiche et ajouter. Faire de même pour 2 autres problèmes.

    On notera que l'on peut créer un problème avec l'Id de son choix... Pour la suite il faudra que je prévoie un système d'incrémentation automatique.

    Il y a un problème qui m'échappe : Lorsque j'enregistre un nouveau problème Id s'incrémente d'un et affiche le nombre obtenu, mais en négatif !

    Exemple si j'enregistre le problème 1, ID prendre la valeur -2 et non 2 ! Pourquoi? -2 est-il considéré comme un élément vide inexistant?

    Si je ne fais pas cas de ce-2 et que je renseigne la fiche puis enregistre Id prend la valeur 2 à la lecture.

    Je présume que l'on peut forcer ces valeurs par programme, mais bon c'est mieux de savoir pourquoi.

    Je me pose une question si je fait pas une confusion : Est-ce que je peut utiliser Id pour correspondre à mes numéros séquentiels ou est-ce qu'il faut prévoir une case supplémentaire "Numéro du problème" de ma base indépendante de ID ?

    Pour modifier un problème : rechercher le problème souhaité par le nom ou l'ID et corriger le contenu et valider la correction.

    Même principe pour effacer.

    Reste la question : Comment rendre 'flottante' la dimension de la solution ? Elle est fixée à 50 dans l'exemple, mais en pratique elle va de 10 à 10000 caractères pour quelques rares problèmes.

    Bonne fin de dimanche.

    A vous lire.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  5. #25
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut

    Une question = une discussion.
    Nouvelle question = nouvelle discussion.

    Le titre de la discussion de ce fil est: Modification de lignes dans un fichier séquentiel.
    Ce qui n'a plus rien à voir avec ton dernier message, qui lui est de la manipulation de base de données.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #26
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    id est bien déclaré identity (= auto incrément) donc si tu fais un insert sans préciser de valeur pour id sql server va s'occuper d'incrémenter (sans soucis)
    donc ce n'est pas à toi d'incrémenter cette valeur dans ton code
    par ailleurs un id à fortiori auto incrément n'est pas une valeur utile pour l'application, et ne doit pas être présentée aux utilisateurs, le programme doit s'en servir pour identifier une ligne

    tu as mis des varchar(50), si tu veux stocker un string de 100 caractères mets un varchar(100)
    varchar veut dire variable justement, sql server ne stocke que ce qui est réellement utilisé
    varchar peut aller jusqu'à 8000, si tu veux plus de caractères ca doit etre le type text qu'il te faut
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #27
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    id est bien déclaré identity (= auto incrément) donc si tu fais un insert sans préciser de valeur pour id sql server va s'occuper d'incrémenter (sans soucis)
    donc ce n'est pas à toi d'incrémenter cette valeur dans ton code
    par ailleurs un id à fortiori auto incrément n'est pas une valeur utile pour l'application, et ne doit pas être présentée aux utilisateurs, le programme doit s'en servir pour identifier une ligne

    tu as mis des varchar(50), si tu veux stocker un string de 100 caractères mets un varchar(100)
    varchar veut dire variable justement, sql server ne stocke que ce qui est réellement utilisé
    varchar peut aller jusqu'à 8000, si tu veux plus de caractères ca doit etre le type text qu'il te faut
    Bonjout

    Merci pour ces précisions, c'est bien noté.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  8. #28
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    Salut

    Une question = une discussion.
    Nouvelle question = nouvelle discussion.

    Le titre de la discussion de ce fil est: Modification de lignes dans un fichier séquentiel.
    Ce qui n'a plus rien à voir avec ton dernier message, qui lui est de la manipulation de base de données.
    Bonjour

    Effectivement on s'en écarte un peu (beaucoup !) mais c'était dans la (ma) suite logique pour que d'autres lecteurs puissent trouver une solution à la conversion de vieux fichier séquentiel.

    Je marque Résolu.

    En vous remerciant tous pour vos contributions et à bientôt.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Comment bien utiliser la fonction preventDefault()
    Par benoit256255 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/11/2017, 14h57
  2. Réponses: 1
    Dernier message: 16/09/2015, 15h53
  3. Réponses: 3
    Dernier message: 27/02/2008, 11h07
  4. [C#] Comment bien utiliser des TRY CATCH
    Par UNi[FR] dans le forum C#
    Réponses: 5
    Dernier message: 14/11/2007, 19h20
  5. [EasyPHP] Comment utiliser la fonction mail avec EasyPHP ?
    Par baguira dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 09/03/2007, 00h32

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