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

Bases de données Delphi Discussion :

Comment inscrire une chaine vide dans un champ de table access avec Null interdit ?


Sujet :

Bases de données Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Comment inscrire une chaine vide dans un champ de table access avec Null interdit ?
    Bonjour à tous,

    voici la situation :

    j'accède à une table Access pour laquelle je ne dois pas modifier la structure (logiciel tiers)
    dans cette table je souhaite pouvoir écrire dans un champ de type mémo, dont la propriété est "Null interdit"
    si je veux y inscrire des données, j'ai 2 solutions
    • soit j'utilise une requête de type Sql : "UpDate MaTable Set MonChamp='' Where xxx" et dans ce cas pas de problème
    • soit j'utilise KADaoTable1.FieldByName('MonChamp').Value := '' et là ça plante à cause de la propriété "Null interdit"


    Dans la 2ème solution, quelqu'un connait-il la syntaxe que je devrais utiliser dans le cas d'une chaine vide ?

    merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    force le type peut-être ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    KADaoTable1.FieldByName('MonChamp').AsString:= '';
    Value c'est un Variant, il ne type peut-être pas la valeur '' comme une chaine
    Mais en Delphi comme '' c'est nil, ... on ne peut pas reprocher à la DB d'amalgamer '' à NULL même si c'est bien dommage

    En Oracle, c'est encore pire !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     INSERT INTO TABLE_AVEC_CHAMP_NOT_NULL(CHAMP_NOT_NULL) VALUES ('');
    ORA-01400: impossible d'insérer NULL dans ("TABLE_AVEC_CHAMP_NOT_NULL"."CHAMP_NOT_NULL")
    Même le SQL ne passe pas !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci d'avoir pris du temps pour me répondre !
    j'ai essayé, en effet, de contourner le problème en forçant le type avec "...AsString", mais le résultat est le même,
    j'ai aussi tenté de remplacer la chaine vide ('') par la constante "EmptyStr", pas mieux...
    je me demande comment Access fait la différence entre "chaine vide" et "null"...
    c'est ballot de bloquer sur un truc aussi basique !

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Sans conviction aucune : en essayant de lui passer un octet x00 voire 2 octets x0000 ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Et si au lieu de passer une chaine vide (c.a.d. ''), vous passiez une chaine avec un ou plusieurs espaces (c.a.d. ' ') ?
    Philippe.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je vous remercie tous les 2, Serge et Philippe !
    Il aurait été simple, en effet, d'y inscrire un simple espace, mais ultérieurement le logiciel tiers détectera que le champ n'est pas vide, et agira en conséquence... En attendant d'avoir THE réponse magique, devant laquelle je m'exclamerai "ah ben oui, c'est EVIDENT", je vais créer un générateur pour avoir la syntaxe SQL adéquate en identifiant les champs indexés...
    Je vais laisser ce post ouvert, car je ne perds pas l'espoir d'avoir un jour la réponse !

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par ItsMoreFunInPhil Voir le message
    Il aurait été simple, en effet, d'y inscrire un simple espace, mais ultérieurement le logiciel tiers détectera que le champ n'est pas vide, et agira en conséquence... En attendant d'avoir THE réponse magique, devant laquelle je m'exclamerai "ah ben oui, c'est EVIDENT", je vais créer un générateur pour avoir la syntaxe SQL adéquate en identifiant les champs indexés...
    Je vais laisser ce post ouvert, car je ne perds pas l'espoir d'avoir un jour la réponse !
    Je ne sais pas (plus en fait) comme fonctionne Access, mais avec d'autres SGBD, insérer un ou plusieurs espaces terminaux ne changent rien, que les colonnes soit typées CHAR ou VARCHAR
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from matable where macolonne = 'toto'
    -- ou
    select * from matable where macolonne = 'toto   '
    -- renvoie le même ensemble de données
    En fait dans la norme SQL les blancs de remplissage sont toujours non significatif pour la recherche (attention à l'ordre de lecture toutefois suivant les langues !).
    Philippe.

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Est ce vraiment un message d'acces ? ou du provider de données qui confond vide et null ?


    Sinon essayez le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     KADaoTable1.FieldByName('MonChamp').Value := '';
     KADaoTable1.FieldByName('MonChamp').Bound := true;
    Et j'essayerai plutot d'utiliser un composant de type DataSet (ou Query+update) que Table1...

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Réponse à Philippe
    eh bien, si, le logiciel tiers va faire la différence entre une chaine vide et une chaine avec un ou plusieurs caractères "espace", pour tout dire il s'agit d'un logiciel Sage PE, et tel qu'il est conçu, peu importe le contenu du champ, du moment que ce n'est pas une chaine vide... bref, il faut faire avec...
    merci beaucoup d'avoir essayé de m'aider !

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Réponse à Frédéric,
    j'ai tenté ma chance avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    KADaoTable1.FieldByName('MonChamp').Bound := true;
    mais mon vieux Delphi 7 ne connait pas...
    je vais donc rester sur la méthode utilisant une requête SQL, qui ne pose pas de problème, comme je le disais dans mon post initial du 12/01
    merci à tous, bien cordialement, JPL

Discussions similaires

  1. Enregistrer une valeur vide dans un champ DATE
    Par delilou dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 25/01/2012, 16h54
  2. [resolut]Insertion d'une valeur vide dans un champ mémo
    Par bak47 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 23/04/2008, 20h24
  3. Comment chercher une chaine hexa dans un fichier ?
    Par marchphi dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2008, 08h59
  4. comment entrer une chaine vide.
    Par abdelhamidem dans le forum Débuter
    Réponses: 9
    Dernier message: 09/12/2007, 15h43
  5. Insertion d'une chaine vide dans un double
    Par root76 dans le forum Langage
    Réponses: 9
    Dernier message: 05/01/2007, 16h49

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