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 :

Problème de tests sur un Id (de type INT) pour décider de l'action à prendre


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Problème de tests sur un Id (de type INT) pour décider de l'action à prendre
    Hello,

    Je suis en train de déboguer le code d'un collègue et à un endroit, il fait quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If monId > 0 Then
        'du code pour quand l'objet existe déjà
    Else
        'du code pour quand l'objet est nouveau
    End If
    Bon déjà, dans la DB, vu que l'id est de type INT, l'autoincrément commence à la borne négative de la plage de données autorisée par le type INT donc le test ">" est de toute façon incorrect.

    Mais du coup, que mettre comme test ?

    J'ai pour premier reflex de tester s'il vaut Nothing mais pour un variable de type Integer, la mettre à Nothing équivaut à la mettre à 0. Ce n'est évidemment pas la bonne solution.

    Dans mes applications, j'ai une propriété IsNew As Boolean dans mes objets qui me permet de savoir si l'objet est nouveau ou pas. Je pourrais éventuellement utilisé le même procédé mais le nombre de modifications à faire risque d'être pas mal important dans ce cas.

    Du coup, je me demande s'il n'y a pas un truc que j'ignore histoire de pouvoir continuer à tester l'id sans devoir ajouter une propriété booléenne partout (c'est un peu dans l'urgence^^).

    A vos suggestions et merci d'avance
    Kropernic

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Citation Envoyé par Kropernic Voir le message
    Mais du coup, que mettre comme test ?

    J'ai pour premier reflex de tester s'il vaut Nothing mais pour un variable de type Integer, la mettre à Nothing équivaut à la mettre à 0. Ce n'est évidemment pas la bonne solution.
    Heu, mettre à 0 n'équivaut pas à nothing
    Pour permettre à un integer d'être positionné à nothing il faut faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Dim i As New Nullable(Of Integer)
            Try
                If i.HasValue Then MessageBox.Show(i.ToString) Else MessageBox.Show("i n'a pas de valeur")
                If Not IsNothing(i) Then MessageBox.Show(i.ToString) Else MessageBox.Show("i vaut nothing")
                'ou
                If i Is Nothing Then MessageBox.Show("i vaut nothing")
     
                i = 0
                If Not IsNothing(i) Then MessageBox.Show(i.ToString) Else MessageBox.Show("i vaut nothing")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    Je ne sais pas si cela va te permettre d'avancer.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Mais...

    Si il fait ce test, c'est surement que lorsqu'il crée l'objet pour la première fois (dans le code), l'ID contient par défaut 0.
    Si il charge un objet, il contiendra quelque chose au dessus de zéro...

    Ce qu'il fait que tu appelles surement une seule fonction genre Save(), qui teste cette valeur pour savoir si c'est un ajout ou une modification.

    Si c'est ça... ce test en vaut bien un autre.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  4. #4
    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
    pour compléter les types nullables peuvent s'écire de la sorte :

    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    @mactwist : S'il fait ce test, c'est parce qu'il avait l'habitude de passer à la trappe la moitié des valeurs possibles pour un entier en commençant l'incrémentation à 1. Mais est arrivé le premier projet où il travaille sur un DB que j'ai modélisée et où je trouve que cette moitié de valeur inférieur est quand même fort utile. Du coup, un objet venant de la DB peut avoir un Id ayant une valeur négative, positive ou égale à 0.

    @rv et pol : Nullable(Of T) !!! C'est exactement ce qu'il me fallait. Un grand merci

    Sinon, pour ma culture personnelle (je pourrais sûrement trouver sur le net mais y aurait tellement de résultat dans google que j'saurais pas lequel regarder), pourquoi les types par valeur ne peuvent "valoir" Nothing ? Vous cassez pas le cul s'il faut rentrer dans des détails super techniques hein. Car je suppute que cela ait à voir avec la manière dont les objets sont stockés en mémoire.
    Kropernic

  6. #6
    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
    Citation Envoyé par Kropernic Voir le message
    Sinon, pour ma culture personnelle (je pourrais sûrement trouver sur le net mais y aurait tellement de résultat dans google que j'saurais pas lequel regarder), pourquoi les types par valeur ne peuvent "valoir" Nothing ? Vous cassez pas le cul s'il faut rentrer dans des détails super techniques hein. Car je suppute que cela ait à voir avec la manière dont les objets sont stockés en mémoire.
    tu as visé juste
    il y a 2 types de types en .net (^^)
    les types par valeur et les types par référence
    les objets sont des types par référence, quand tu as une variable typée as button, ta variable est un pointeur (4 ou 8 octets selon x86/x64) vers l'objet en question, qui lui peut prendre plus de ram
    nothing est donc un pointeur vide, qui ne pointe vers rien
    les types par valeur (types primitifs et structures) (date/boolean/integer/short ... et les structures (point...)) eux stocke le contenu de la variable directement
    dim i as integer fait donc que l'espace mémoire est directement le nombre, qui est initialisé par défaut (avec des bits à 0 je suppose, ce qui fait qu'il vaut 0)

    c'est aussi pour ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim i1 as integer = 5
    dim i2 as integer = i1
    i2+=1 ' i2 est incrémenté mais pas i1
    dim b1 as new button
    dim b2 as button = b1
    b1.Text = "aa" ' b1 et b2 ont .text = "aa" car ce sont 2 pointeurs mais qui pointent vers le même espace mémoire, la même instance
    et après on pourrait dériver sur byref/byval ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ah bin voilà. Je savais déjà pour les types par référence.

    Me manquait juste la partie où tu expliques qu'un objet avec un type par valeur est la valeur et non pointeur.

    Du coup, quand on déclare As Integer? ou As Nullable(Of Integer), que fait .NET ? Il crée un genre de classe anonyme avec une seule propriété de type Integer qui serait accéder automatiquement ?

    Pour les passages de paramètres ByVal/ByRef, je n'ai jamais lu de documentation sur le sujet mais je pense avoir une idée assez claire de comment cela se passe.
    Kropernic

  8. #8
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Du coup, quand on déclare As Integer? ou As Nullable(Of Integer), que fait .NET ? Il crée un genre de classe anonyme avec une seule propriété de type Integer qui serait accéder automatiquement ?
    il utilise simplement la structure "System.Nullable<T>" : http://referencesource.microsoft.com...em/nullable.cs.
    Points important dans cette structure : les conversions et la surcharge de l'opérateur "=="

  9. #9
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Merci pour la source Meziantou. C'était instructif.

    Tant que j'y suis et pour vérifier que j'ai bien intégré le concept...

    Est-ce que je peux me servir d'un type référence, disons une classe custom C, pour passer un objet d'un formulaire à un autre comme si c'était un paramètre ByRef d'une procédure/fonction ?

    Un peu de code pour explicité ma question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public Class Form1
        Private unObjet As CustomClass
        '...
     
        Private Sub button1_Click(sender As System.Object, e As System.EventArgs) Handles button1.Click
            Dim frm as Form2
            frm.unObjet = Me.unObjet
            frm.ShowDialog()
        End Sub
     
        '...
    End Class
    Une fois revenu sur Form1 après l'instruction frm.ShowDialog(), est-ce que la variable unObjet contient bien ce qui y a été mis dans Form2 ?

    C'est bien juste ou je passe encore à côté d'un détail ?

    EDIT : Après quelques petits tests, j'avais bien tout compris. Et c'est en fait vachement pratique !
    Kropernic

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

Discussions similaires

  1. Problème de test sur un champ
    Par Imad_ing dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/06/2010, 13h39
  2. [Tableaux] Problème de test sur une variable
    Par Laurent64 dans le forum Langage
    Réponses: 7
    Dernier message: 20/05/2007, 14h04
  3. [Conception] problème avec firefox sur les champs input type="file"
    Par maverick56 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 11/05/2007, 10h57
  4. Problème de test sur la taille des fichiers
    Par gregal dans le forum Langage
    Réponses: 7
    Dernier message: 12/12/2006, 20h57
  5. Réponses: 4
    Dernier message: 16/06/2005, 15h37

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