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 :

[D2006]DB sélection d'un champ caractère


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Par défaut [D2006]DB sélection d'un champ caractère
    Bonjour.

    Dans un programme j'ai une procédure qui sélectionne les enregistrements sur le champ DBQ=' '.
    Ce champ date DBQ, en fait le mois, n'a que les valeurs suivantes : ' ' (2 espaces), '01'..'12' ou '**'.

    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
    procedure TFInitA.CreatWdeps;
    begin   // creation du fichier archive de AN sans les enreg. non réglés  DBQ = '  ';
      FichSt.Tbst.ReadOnly := False;
      FichSt.Tbst.Close;
      FichSt.Tbst.TableName := Depw+'bak.dbf'; // à partir de fich. de AN sauvegardé
      FichSt.Tbst.Filter := '(DBQ <> ''  '')  OR (DBQ <> '''' )';       // 05/01/2009
      FichSt.Tbst.Filtered := true;
      FichSt.CopieFichDB(FichSt.TbSt, DepMod.TbAff, NWdepAN+'.dbf');
      DepMod.TbAff.AddIndex('IxNrep','NREP',[]);
      DepMod.TbAff.AddIndex('IxCode','CODE',[]);
      MemFA.Lines.Add('  Création du f. '+ NWdepAN +'.dbf');             // archivé
     
      FichSt.Tbst.Close;  // création du fich AN1 avec report des enreg. non réglés  WDEP13
      FichSt.Tbst.TableName := Depw+'bak.dbf';
      FichSt.TbSt.Filtered := false;
      FichSt.Tbst.Filter := '(DBQ = ''  '') OR (DBQ = '''' )' ;         // 05/01/2009
      FichSt.Tbst.Filtered := true;       // filtrage du nouveau fichier de l'année
      FichSt.AjoutFichDB(FichSt.TbSt, DepMod.TbAff, DepW+'.dbf');
      MemFA.Lines.Add('  Création du f. '+Depw+'.dbf de la nouvelle année'); //EC WDEP
     
      FichSt.Tbst.Close;
      FichSt.Tbst.Filtered := false;
      FichSt.Tbst.Filter := '';
    end;
     
    procedure TFInitA.CopieFich(TablSource, TablDestination : Ttable; NomFDest : string);
    begin                                                     //nom du f.destination
      TablDestination.TableName := NomFDest;            
      TBM.Destination := TablDestination;                 
      TBM.Source := TablSource;                           
      TBM.Mode := batCopy;
      TBM.Execute;                                      
    end;
    J'ai utilisé cette procédure pendant des années, une fois DBQ avait une longueur nulle, d'où l'ajout au filtre.
    Mais cette fois la sélection ne fonctionne pas, même après avoir modifié à ' ' des champs DBQ.

    Pourquoi ce défaut de sélection ?

    Bonne Année à tous.

  2. #2
    Membre éclairé

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Par défaut
    Bonjour,

    J'ai trouvé une solution en inversant le filtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    FichSt.Tbst.Filter := '((DBQ>=''00'') AND (DBQ<=''12'')) OR (DBQ=''**'')';            
    ...
    FichSt.Tbst.Filter := 'NOT((DBQ>=''00'') AND (DBQ<=''12'')) AND (DBQ<>''**'')';
    Mais cette solution de dépannage ne me satisfait pas intellectuellement.

    Y a t'il une solution pour le filtre initial ?

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par paulfr Voir le message
    Mais cette solution de dépannage ne me satisfait pas intellectuellement.
    Y a t'il une solution pour le filtre initial ?

    le SQL ? (j'ai horreur des filtres j'y préfère toujours des querys même pour de tables DBF ou paradox)
    seul hic , je ne me rappelle plus si un batchmove peut se faire via une Query (et pourtant , j'en ai fait une tripotée il y a une 10aines d'années)

    cela donnerait quelque chose du genre (il y a certainement plus propre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE (DBQ IS NULL) OR (DBQ IN ('**','  ','01','02','03',etc...))

  4. #4
    Membre éclairé

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Par défaut
    Bonjour,

    Merci @Sergio pour sa suggestion.
    Mais je ne suis pas un adepte de SQL. Sous D3 je l'ai abordé sans résultat, avec internet bas débit il y a un bail.
    De plus c'est une application locale et personnelle.
    Je ferme la discussion
    PL

  5. #5
    Membre éclairé

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Par défaut
    Bonjour,

    J'ai repris la procedure pour trouver un solution plus satisfaisante.
    Elle s'exécute à partir de l'archive de l'année :

    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
    procedure TFInitA.CreatWdeps;  // à partir de WDepAN copie de DB Q='  ' ds WDep
    var ChDBQ : string;               // et suppression en même temps
    begin
       DepMod.TbAff.Open;
       DepMod.TbEnr.Open;
     
      DepMod.TbAff.Open;               // a partir de NWdepAN copie des enreg. '  '
      DepMod.TbAff.First;              // dans DepMod.TbEnr : Wdep.dbf
      DepMod.TbEnr.Open;               // et suppression dans TbAff
      DepMod.TbEnr.Edit;
      DepMod.TbEnr.Last;
      While not DepMod.TbAff.Eof do
      begin
        ChDbQ := DepMod.TbAff.FieldByName('DBQ').AsString;
         if (ChDbq = '  ') or (ChDbq='') then
           begin
             DepMod.TbEnr.AppendRecord([
               DepMod.TbAff.FieldByName('DATE').AsString,
               DepMod.TbAff.FieldByName('NREP').AsString,
               DepMod.TbAff.FieldByName('DESIGN').AsString,
               DepMod.TbAff.FieldByName('DEBIT').AsString,
               DepMod.TbAff.FieldByName('CREDIT').AsString,
               DepMod.TbAff.FieldByName('CODE').AsString,
               '  ']);                // champ DBQ
               DepMod.TbAff.Delete;
           end
           else DepMod.TbAff.Next;          
      end;
    ...

    Incité par SergioMaster j'ai cherché une solution SQL (BDE !) :

    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
    procedure TFInitA.CreatWdeps;  // à partir de NWDepAN
    var ChDBQ : string;              
    begin
       DepMod.TbAff.Open;
       DepMod.TbEnr.Open;
     
      with DepMod do            // Version  SQL   22/01/2014
      begin
        QuertbCd.Close;     //insertion dans wdep des enregistrements DBQ='  '
        QuertbCd.SQL.Clear;
        QuertbCd.SQL.Add('INSERT INTO "wdep.dbf" ');
        QuertbCd.SQL.Add('SELECT * FROM "wdep13.dbf" D ');
        QuertbCd.SQL.Add('WHERE (D.DBQ=''  '') OR (D.DBQ IS NULL)');    // OK
        QuertbCd.Prepare;
        QuertbCd.ExecSQL;
      end;
      DepMod.QuerTbCd.UnPrepare;
     
      with DepMod do   // suppression dans l'archive WDep13.dbf des enreg. DBQ='  '
      begin
        QuertbCd.Close;                                     
        QuertbCd.SQL.Clear;
        QuertbCd.SQL.Add('DELETE FROM "wdep13.dbf" D ');
        QuertbCd.SQL.Add('WHERE (D.DBQ=''  '') OR (D.DBQ IS NULL)');
        QuertbCd.Prepare;
        QuertbCd.ExecSQL;
      end;...
    Mais elle ne peut satisfaire les différents DepW (='Wdep',...).

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Bonsoir,
    Mais elle ne peut satisfaire les différents DepW (='Wdep',...).
    Oh , je suis sur que si . Cela aurait été plus facile avec une période numérique c'est certain et il est sur que DBF n'aide pas

    en fait , je ne comprend pas vraiment l'objectif : DepW (='Wdep',...) cela correspond a quoi ?
    pourrais tu fournir la structure de la table , un jeu d'essai et résultat souhaité ?

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 10/01/2007, 23h45
  2. Sélection de 2 champs identiques dans 2 tables différentes
    Par Véronique75ca dans le forum Access
    Réponses: 3
    Dernier message: 28/06/2006, 10h33
  3. Sélection dynamique de champs
    Par nirousse dans le forum Outils
    Réponses: 3
    Dernier message: 02/05/2006, 20h24
  4. Insert d'un champ caractères spéciaux avec firebird et php
    Par PHILOSOPHE dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 14/05/2005, 12h18
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 17h56

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