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

  1. #1
    Membre averti

    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
    Points : 332
    Points
    332
    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 averti

    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
    Points : 332
    Points
    332
    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 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    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...))
    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

  4. #4
    Membre averti

    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
    Points : 332
    Points
    332
    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 averti

    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
    Points : 332
    Points
    332
    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 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    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é ?
    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

  7. #7
    Membre averti

    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
    Points : 332
    Points
    332
    Par défaut
    bonsoir,

    @SergioMaster

    Depw est une variable chaine contenant une partie du nom du fichier,
    exemple Depw := 'WDEP' ...qui est complétée suivant les besoins.
    Ce qui me permet de traiter des fichiers ayant la même structure dans une application de gestion de comptes bancaires.

    Je confirme le SQL LOCAL BDE ne permet pas d'utiliser une variable pour le nom du fichier, il demande la référence_de_table
    Avec Delphi je peux utiliser les variables.

    Mon probléme est résolu, je voulais simplement voir s'il y avait d'autres solutions à celui-ci.

    Merci à tous PL

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour ,

    je comprends mieux , mais si ce n'est que ça tu pourrais faire ainsi :
    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(an : word);  // à partir de NWDepAN
    var ChDBQ : string;
         dbfName : String;              
    begin
       DepMod.TbAff.Open;
       DepMod.TbEnr.Open;
      dbfname:=format('wdep%.2d.dbf',[an]);
      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 '+QuotedStr(dbfname)+' 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 '+Quotedstr(dbfname)+ D ');
        QuertbCd.SQL.Add('WHERE (D.DBQ=''  '') OR (D.DBQ IS NULL)');
        QuertbCd.Prepare;
        QuertbCd.ExecSQL;
      end;...
    bon , je ne suis pas sur de moi en ce qui concerne les " ou simple ' (via quotedstr) du nom mais je crois que cela devrait fonctionner
    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

  9. #9
    Membre averti

    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
    Points : 332
    Points
    332
    Par défaut
    Bonjour,

    Encore merci @Sergio pour sa solution.
    Mais quand j'ai commencé à coder l'application (sous Delphi 3) j'avais un seul compte 'Wdep'.
    Puis je l'ai étendue à d'autres comptes 'Wliv', ... d'ou passage à la variable DepW et difficile d'utiliser SQL local.

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 10/01/2007, 22h45
  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, 09h33
  3. Sélection dynamique de champs
    Par nirousse dans le forum Outils
    Réponses: 3
    Dernier message: 02/05/2006, 19h24
  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, 11h18
  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, 16h56

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