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

Langage Delphi Discussion :

erreur de vérification d'étendue


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 397
    Points : 165
    Points
    165
    Par défaut erreur de vérification d'étendue
    Bonjour,

    tout est dans le titre
    j'ai cette erreur lorsque je lance la procédure

    et je ne vois pas ou se situe l'erreur

    Petite précision, le LOTO me sert juste de base pour me replonger
    dans la programmation sous Delphi

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
      procedure TForm1.Button4Click(Sender: TObject);
    var i, X, Z, refus : integer;
    num, tir : array of integer;
    begin
     
          refus:= 0;
          for i:=1 to 10000 do
           begin
     
             FDQuery1.SQL.Text:='SELECT id, n1, n2, n3, n4, n5 FROM combinaison WHERE id=:i';
             FDquery1.Open('',[i]);
             num[1]:= FdQuery1.FieldByName('n1').AsInteger;
             num[2]:= FdQuery1.FieldByName('n2').AsInteger;
             num[3]:= FdQuery1.FieldByName('n3').AsInteger;
             num[4]:= FdQuery1.FieldByName('n4').AsInteger;
             num[5]:= FdQuery1.FieldByName('n5').AsInteger;
     
                    for X:=1 to 7309 do
                     begin
                      FDQuery2.SQL.Text:='SELECT n1, n2, n3, n4, n5 FROM histo_loto';
                      tir[1]:= FdQuery2.FieldByName('n1').AsInteger;
                      tir[2]:= FdQuery2.FieldByName('n2').AsInteger;
                      tir[3]:= FdQuery2.FieldByName('n3').AsInteger;
                      tir[4]:= FdQuery2.FieldByName('n4').AsInteger;
                      tir[5]:= FdQuery2.FieldByName('n5').AsInteger;
     
     
                      Z:= 0;
                      if num[1] = tir[1] then Z:= Z+1;
                      if num[2] = tir[2] then Z:= Z+1;
                      if num[3] = tir[3] then Z:= Z+1;
                      if num[4] = tir[4] then Z:= Z+1;
                      if num[5] = tir[5] then Z:= Z+1;
     
                        if Z = 5 then
                        begin
                         FDQuery1.SQL.Text:='DELETE FROM combinaison WHERE id=:i';
                         refus := refus +1 ;
                         Edit19.Text:= IntToStr(refus);
                        end;
     
                       end;
           end;
     
           Edit19.Text:= IntToStr(refus);
           FDquery1.Close;
           FDquery2.Close;
     
    end; // fin de procedure

    les tables concernées


    Nom : loto.png
Affichages : 116
Taille : 195,5 Ko
    Images attachées Images attachées  
    75 ans quelques dents en moins, mais toujours envie d'apprendre

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 743
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 743
    Points : 13 299
    Points
    13 299
    Par défaut
    Tu déclares des tableaux dynamiques array of mais ne leur donne aucune taille, il manque au minimum un SetLength avant remplissage. L'indice du premier élément sera invariablement 0.

    Lorsque le nombre d'éléments est connu d'avance, on passe plutôt par un tableau statique array[1..5] of. L'indice du premier élément est libre ici.

  3. #3
    Rédacteur/Modérateur

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

    il y a encore beaucoup de déchet SQL


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       for i:=1 to 10000 do
        begin
              FDQuery1.SQL.Text:='SELECT id, n1, n2, n3, n4, n5 FROM combinaison WHERE id=:i';
              // Traitement  
        end;
    à remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        FDQuery1.Open('SELECT id, n1, n2, n3, n4, n5 FROM combinaison WHERE between 1 AND 10000');
        While not FDQuery1.EOF do
          begin
             // Traitement
             FDQuery1.Next;
          end;
    NB. il faudra expliquer le pourquoi 1-10000, moi, je partirai sur les derniers 10000 tirages (encore faut-il qu'il y en ait autant de saisis !) Donc peut-être un ORDER BY date_tir DESC* et l'utilisation de LIMIT 10000
    * en espérant que date_tir soit bien une colonne de type date et pas texte

    à quoi sert ce X ?

    je pense qu'il y a mieux pour refuser les combinaisons, mais il faut que j'y réfléchisse un autre jour qu'un Lundi surtout après Kiné
    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 habitué
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 397
    Points : 165
    Points
    165
    Par défaut
    merci j'avais vu mon erreur, mais je prend en compte les remarques de SergioMaster

    Bonne journée à tous
    75 ans quelques dents en moins, mais toujours envie d'apprendre

  5. #5
    Membre habitué
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 397
    Points : 165
    Points
    165
    Par défaut
    je reprend la discussion car tel que réalisée ma procédure est irréaliste (10000 x 7309 = 73.000.000)

    Je recherche donc un code pour rechercher dans les deux les équivalences

    j'ai fait ceci mais une erreur de "FireCard[phys][MYSQL]champ 'n1' dans field list est ambigue"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
          With FDQuery1 do
                begin
                  SQL.Clear;
                  SQL.Add('SELECT n1 FROM combinaison, histo_loto');
                  SQL.Add('WHERE combinaison.n1 = histo_loto.n1');
                  SQL.Add('and combinaison.n2 = histo_loto.n2');
                  FDquery1.Open();
                  id:= FdQuery1.FieldByName('id').AsInteger;
                end;
         Edit19.Text:= IntToStr(id);
    75 ans quelques dents en moins, mais toujours envie d'apprendre

  6. #6
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 946
    Points
    1 946
    Par défaut
    Bonjour,

    Citation Envoyé par michel71 Voir le message
    j'ai fait ceci mais une erreur de "FireCard[phys][MYSQL]champ 'n1' dans field list est ambigue"
    C'est parce que le champ n1 existe dans les deux tables et sur ton select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                  SQL.Add('SELECT n1 FROM combinaison, histo_loto');
    Il ne sait pas lequel il faut prendre, celui de la table combinaison ( combinaison.n1 ) ou celui de la table histo_loto ( histo_loto.n1 ) ?

    Mais vu ton code, il faut que tu fasses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                  SQL.Add('SELECT id FROM combinaison, histo_loto');
    non ?

  7. #7
    Rédacteur/Modérateur

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

    Je reste toujours sur le SQL qui me choque 'encore' à cause de son utilisation "à l'ancienne" : table1,table2 WHERE s'exprime désormais plutôt en jointure table1 join table2 ON
    Je vais présumer que les nombres sont toujours ordonnés ? Si c'est le cas, on peut déjà jouer sur la concaténation pour obtenir un texte de la combinaison

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT c.id,h.date_tir sorti,c.n1||','||c.n2||','||c.n3||','||c.n4||','||c.n5  tirage from combinaison c 
                        JOIN histo_loto h ON 1=1
    ceci devrait sortir les combinaisons et en cas de découverte dans l'historique la colonne "sorti" devrait contenir "null" si la combinaison n'est jamais sortie.

    NB. utiliser des alias de table (et de colonne) est une pratique qui permet de rendre l'écriture plus "fluide"

    Pour connaitre le nombre de fois où le même tirage est sorti

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(1) Fois,n1||','||n2||','||n3||','||n4||','||n5 sorti From Histo_Loto GROUP BY sorti 
    -- Note dépendant du SGBD, il faudra peut-être écrire GROUP BY n1||','||n2||','||n3||','||n4||','||n5
    NB. pour une fois cette histoire de 5 colonnes est pénalisante, un tirage en varchar(14) serait plus pratique. Concrètement, côté Delphi, j'utiliserai une liste d'entier trié (pas un tableau) pour en obtenir le texte.

    ce dernier code SQL m'amène à l'utilisation de CTE (Common Table Expression) de ma proposition initiale

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WITH H as (SELECT COUNT(1) Fois,n1||','||n2||','||n3||','||n4||','||n5 sorti From Histo_Loto GROUP BY sorti)
    SELECT c.id,COALESCE(0,h.Fois) F,c.n1,c.n2,c.n3,c.n4,c.n5 from combinaison c 
               LEFT JOIN H ON c.n1||','||c.n2||','||c.n3||','||c.n4||','||c.n5=h.sorti
    Ainsi, il est possible de faire un test sur la colonne F pour éliminer les combinaisons sorties plus de x fois en ajoutant un WHERE F<=:X

    Cela étant, je me pose des questions sur la pertinence des tables et leurs structures.
    - "Pourquoi plusieurs tables ?" C'est la question qui m'a tout de suite interpellé, l'intérêt de la table combinaison (voir ce que j'ai pu écrire pour montrer une l'utilisation d'un tirage combinatoire) ?
    - "Pourquoi ces DELETE ?" Oui, j'en suis resté au premier code


    NB.MariaDB, je n'en suis pas un grand pratiquant, mais, j'ai lu en cherchant autre chose, le type ROW au sein d'une procédure
    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

  8. #8
    Membre habitué
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 397
    Points : 165
    Points
    165
    Par défaut
    Merci à tous pour vos réponses, avec votre aide j'ai réussi à faire ce que je voulais

    Bonne journée
    75 ans quelques dents en moins, mais toujours envie d'apprendre

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/06/2011, 15h56
  2. Erreur fréquente avec ASP et IIS
    Par Community Management dans le forum ASP
    Réponses: 2
    Dernier message: 11/02/2004, 22h20
  3. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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