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 :

Requête SQL sur une partie de ligne


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut Requête SQL sur une partie de ligne
    Bonjour,


    Dans un fichier, entre les caractères 1 et 28 de chaque ligne, j'ai le nom d'une personne. J'aimerai récupérer cette donnée pour chacune des lignes, et remplacer le nom de la personne par son id_du_patient qui est présent dans la table 'patient' de ma base de donnée. Je précise que l'insertion de tous les autres champs (ztable1jour, ztable1annee, ...) fonctionnent. C'est juste le passage en rouge que je ne sais pas comment faire ... . Peut-être ne peut-on pas faire ' copy (memo1.Lines[i],1,27)' dans une requête SQL?

    un exemple de deux lignes du fichier :

    max 37051706741 Site B 17/05/1937 Grozy 0ABUT990100491290 0A08:00 16091773280134110 RESIDENCE Site B
    Mahieu 37051706741 Site B 17/05/1937 Grozy 0ABUT990100491290 0A08:00 16091873280134110 RESIDENCE Site B


    Actuellement, j'ai ceci

    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
    procedure TFficheEnvoi.BitBtn1Click(Sender: TObject);
    var i : Integer;
    z: integer;
    
    
    begin
    
      for i := 0 to Memo2.Lines.Count-2 do
       begin
    
     ZTable1.Append;
     if ZTable1.State in [dsedit , dsinsert] then
    
      
        ZTable1medecin.Text := copy(memo1.Lines[i],91,20);
       
        ZTable1jour.Text := copy(memo1.Lines[i],156,2);
        ZTable1mois.Text := copy(memo1.Lines[i],154,2);
        ZTable1heure.Text := copy(memo1.Lines[i],144,2);
        ZTable1annee.Text := '2016';
    
        ZTable1id_du_patient.Text:=('select id_du_patient from patient where nom = copy (memo1.Lines[i],1,27)');
    
    
    
        ZTable1.Post;
    end;
    end;

    et la structure de la table 'patient' est celle-ci:

    id_du_patient (clé primaire)
    nom
    prenom
    date_naissance



    merci d'a

  2. #2
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Utilise le QuotedStr et le +, et je rejoins SergioMaster sur le Query
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select id_du_patient from patient where nom = ' + QuotedStr(copy(memo1.Lines[i],1,27));
    Par contre il faudrait peut être regarder avec le nom, le prénom et la date de naissance pour éviter les homonymes, nan ?

  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,

    désolé si je dit que c'est du grand n'importe quoi mais c'est l'impression que j'en ai
    1- tout d'abord le fichier d'importation, il est évident que si vous utilisez copy et des positions fixes il faut que ce dernier ai des lignes de longueur fixes ce qui n'est pas le cas dans l'exemple.
    D'ailleurs cet exemple me rappelle une autre discussion où j'avais suggéré d'utiliser des expressions régulières

    2-le passage en rouge ... on ne met pas une requête SQL dans une colonne de table , cette requête ne sera pas exécutée et simplement considérée comme valeur de colonne ce qui n'est certainement pas ce qui est prévu. Au mieux vous devrez exécutez la requête pour obtenir le résultat et tant qu'a faire utilisez une requête paramétré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
    30
    31
    32
    33
    34
    procedure TFficheEnvoi.BitBtn1Click(Sender: TObject);
    var i : Integer;
    z: integer;
    AQuery : TZReadOnlyQuery;
    
    begin
     AQuery:=TZReadOnlyQuery.Create(Nil);
     try
       AQuery.Connection:=ZTable1.Connexion;
       AQuery.SQL.Text:='select id_du_patient from patient where nom = :N';
       AQuery.Prepare;
    
      for i := 0 to Memo2.Lines.Count-2 do
       begin
          ZTable1.Append;                    
          if ZTable1.State in [dsedit , dsinsert] then    <<< RIDICULE il y a Append donc sera toujours en dsInsert
                                                                       
             ZTable1medecin.Text := copy(memo1.Lines[i],91,20);   <<< juste cette colonne ou il manque un begin ? 
       
             ZTable1jour.Text := copy(memo1.Lines[i],156,2);
             ZTable1mois.Text := copy(memo1.Lines[i],154,2);
             ZTable1heure.Text := copy(memo1.Lines[i],144,2);
             ZTable1annee.Text := '2016';
             AQuery.ParamByName('N').asString:=copy (memo1.Lines[i],1,27);
             AQuery.Active:=True;
             ZTable1id_du_patient.Text:=AQuery.FieldbyName('id_du_patient').asString;
             AQuery.Active:=False;
        ZTable1.Post;
    end;
    finally
       Aquery.free;
    end;
    end;
    voici en bleu ce qui devrait plus ou moins être écrit + quelques commentaires
    et quelques questions genre que doit on faire si l'id du patient n'est pas trouvée (AQuery.FieldbyName('id_du_patient').isnull)? en cas d'homonymie (aQuery.Recordcount>1)?
    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 du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Merci pour vos réponses. Effectivement je débute... .

    Oui, les fichiers sont bien de longueur de lignes identiques (petite erreur de ma part quand j'ai copié coller les deux lignes du fichier...)

    J'ai bien compris le raisonnement à suivre, mais j'ai un message d'erreur qui me dit "erreur sql. No database selected". Je ne vois pas d'où ça vient ça...

    Chez moi ztable1.connection c'est zconnection1 et zconnection1 est relié à mysql. Est-ce le soucis?

  5. #5
    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,

    comment répondre à cette question sans le code ? Je présume alors que c'est le code que j'ai proposé qui a été utilisé et à ma grande honte, en me relisant je vois écrit :

    AQuery.Connection:=ZTable1.Connexion;bon , écrit sans filet, j'ai mélangé du français et de l'anglais (ou plutôt du Pascal) mais je pense que Delphi aura souligné cette syntaxe bancale.

    Chez moi ztable1.connection c'est zconnection1 et zconnection1 est relié à mysql. Est-ce le soucis?
    non le soucis n'est pas mysql (sauf si bien sur la table patient n'est pas dans la même base) , AQuery.Connection:= zconnection1; fera aussi bien l'affaire, le truc c'est que, quand on n'a pas les informations nécessaires (le nom de la connexion à utiliser) on est obligé de faire autrement d'où mon code AQuery.Connection:=ZTable1.Connection;De plus, j'ai utilisé une méthode (requête créée au runtime) cela ne veut pas dire que c'est la seule, juste celle que j'ai pu proposée avec les informations données.

    J'ai aussi été étonné par l'utilisation de ZTable1Champ.Text, pourrait-on connaitre la version de Delphi utilisée ? je suis de la vieille école, celle qui préfère spécifié le type pas des asString, asInteger ..... et j'en profite pour faire remarquer que pour une IDentification il est toujours mieux d'utiliser une valeur numérique, du moins est-ce toujours comme cela que la plupart comprennent un nom de colonne débutant par ID
    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

  6. #6
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    Embarcadero® Delphi® XE5 Version 19.0.13476.4176

    Effectivement, dans un premier temps, j'ai repris votre code. Dans un second temps, je vais tenter de gérer, comme vous me l'avez suggérer, l'homonymie ... .

    oui, je m'étais bien rendu compte que c'était connexion et non pas connection, mais ça ne change rien à mon 'no database selected'.

    J'ai ztable1 qui est relié avec "medicament" et ztable2 qui est relié sur la table "patient".

    Nom : Capture.PNG
Affichages : 411
Taille : 29,0 Ko

    J'ai essayé

    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
    procedure TFficheEnvoi.BitBtn1Click(Sender: TObject);
    var i : Integer;
    AQuery : TZReadOnlyQuery;
     
    begin
     AQuery:=TZReadOnlyQuery.Create(Nil);
     try
       AQuery.Connection:=ZTable2.Connection;
       AQuery.SQL.Text:='select id_du_patient from patient where nom = :N';
       AQuery.Prepare;
     
      for i := 0 to Memo2.Lines.Count-2 do
       begin
          ZTable1.Append;
     
             ZTable1medecin.Text := copy(memo1.Lines[i],91,20);
             ZTable1jour.Text := copy(memo1.Lines[i],156,2);
             ZTable1mois.Text := copy(memo1.Lines[i],154,2);
             ZTable1heure.Text := copy(memo1.Lines[i],144,2);
             ZTable1annee.Text := '2016';
             AQuery.ParamByName('N').asString:=copy (memo1.Lines[i],1,27);
             AQuery.Active:=True;
             ZTable1id_du_patient.Text:=AQuery.FieldbyName('id_du_patient').asString;
             AQuery.Active:=False;
     
        ZTable1.Post;
     
    end;
    finally
       Aquery.free;
    end;
    end;

  7. #7
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Points : 41
    Points
    41
    Par défaut
    bon j'ai cherché tellement et l'erreur était un "s" en trop à fonction dans le database de ma zconnection... quel con je suis... merci à vous

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

Discussions similaires

  1. [MySQL] requete SQL sur une partie d'un date
    Par stefano dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/09/2012, 13h40
  2. Réponses: 2
    Dernier message: 06/03/2008, 14h26
  3. distinct sur une partie de ligne
    Par igorzup dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/03/2007, 00h08
  4. [Vba-Excel] Exécuter une requete SQL sur une feuille de donnée
    Par Spacy_green dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/11/2006, 09h27
  5. Réponses: 23
    Dernier message: 19/09/2006, 11h33

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