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 :

Le dataset.bof ne répond plus.


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Le dataset.bof ne répond plus.
    Bonjour,
    Je ne sais pas si je dois poster ici ou sur Interbase, mais je pense plus à un problème spécifique Delphi.
    L'algo suivant est censé sur un dataset comportant un champ 'numero_ligne', décaler les numéros de ligne selon la position où l'on veut insérer.

    dans
    1,2,3,4,5
    si je prévois d'insérer après 3, je dois obtenir :
    1,2,3,5,6

    Si on fait cet exemple ça marche.

    En revanche si je tente d'insérer avant 1, ça boucle indéfiniment.
    Le test sur bof est inopérant.

    Le pire, c'est que je pense qu'il a dû fonctionner à une époque.

    Y a-t-il quelque chose qui pourrait expliquer ça ?
    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 TDB_piece_client.decaler_lignes(P_Table_Ligne  :  TDataset;
                                              P_nb_lignes    : integer);
    Var
     
     L_Numero_Ligne_Initiale:Integer;
     L_Numero_Ligne:Integer;
     
    begin
    P_table_ligne.DisableControls;
    // Récupération du numéro de la ligne d'insertion
    L_Numero_Ligne_Initiale:=P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger;
     
    // On se place à la fin du recordset
    P_Table_Ligne.Last;
    // Tant qu'on n'est pas sur la ligne d'insertion
    repeat
      if (P_table_ligne.State <> dsEdit) and   (P_table_ligne.State <> dsInsert)
      then
        P_table_ligne.edit;
      L_Numero_Ligne:=P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger;
      // On décale le numéro de ligne du nombre d'insertion désiré
      P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger:=L_Numero_Ligne+P_nb_lignes;
      // on remonte d'une ligne dans la grille
      //P_table_Ligne.MoveBy(-1);
      P_table_Ligne.Prior;
    until  (P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger < L_Numero_Ligne_Initiale) or
        P_table_ligne.bof;
    If Not P_table_ligne.bof
    Then
      P_table_Ligne.MoveBy(+1);
    P_table_ligne.EnableControls;
    end;

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Fausse piste
    J'ai fait fausse route en prétendant que c'était le bof qui ne répondait pas.
    En poursuivant mes tests, je constate que c'est le dataset.prior qui ne marche que la première fois.
    La deuxième fois il reste sur le même enregistrement.

    Donc
    dans la suite 1,2,3,4,5
    si j'insère avant 5, l'algo fonctionne.
    Comme c'est le cas le plus courant, nous avons mis longtemps avant de constater le problème.
    Dans tous les autres cas, comme il faut faire plusieurs décalages, donc plusieurs prior, il bloque.

    Mais je ne comprends toujours pas pourquoi

  3. #3
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 94
    Points : 73
    Points
    73
    Par défaut
    Si ta table est indexée et que le numéro de ligne fait partie de ton index, tu risques d'avoir des problémes.
    S'il s'agit d'une pièce comptable par exemple, le mieux est de procéder comme suit:
    1 envoyer toutes les lignes dans une Tlist
    2 Supprimer de ta Table BDD tous les records copiés dans la Tlist
    3 Récupérer ta Tlist en donnant les nouveaux numéros

    J'éspère avoir été Clair.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut TTable contre TQuery
    Merci de cette expertise.
    Effectivement mon champ "numero_ligne" est dans l'index de la table.
    De plus le composant alimentant le dataset est un TTable.
    Pour tester j'ai remplacé le TTable par un TQuery en RequestLive avec un requête triée sur la clef "numero_piece+numero_ligne".
    Et là l'algo fonctionne de nouveau.
    Avec ma solution, on travaille toujours en direct sur les enregistrements (RequestLive), mais cette fois ci, Delphi ne se perd plus dans les déplacements dans le Dataset.

    Sinon votre solution est claire, mais elle s'écarte de la logique RAD de cet écran. J'ai un Dataset qui alimente un DBGrid et je travaille directement dessus.

    Il faut que je poursuive des tests de non-régression pour voir si ma solution fonctionne bien.

    Maintenant même si je peux comprendre que Delphi parte en live quand on touche à l'index d'une table et qu'on tente de se déplacer dedans au même moment, je ne fais pas trop la différence avec ce qui semble marcher, càd, toucher aux même enregistrements d'une requête en dynamique.
    @+
    fp

  5. #5
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 94
    Points : 73
    Points
    73
    Par défaut
    En fait votre problème est dû à ce qui suit.
    Supposons que vous avez la série des lignes 1,2,3,4,5,8.
    Quand vous êtes sur l'enregistrement dont N° de ligne est 3 et que vous changez le numéro de ligne 3 vers 7. Numéro de ligne faisant partie de la clé de l'index, alors l'enregistrement suivant n'est pas la ligne 4 mais la ligne 8. En modifiant le numéro de ligne, il se positionne au nouvel emplacement.
    Ce problème est connu dans les logiciels de comptabilité!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Francis
    En fait votre problème est dû à ce qui suit.
    Supposons que vous avez la série des lignes 1,2,3,4,5,8.
    Quand vous êtes sur l'enregistrement dont N° de ligne est 3 et que vous changez le numéro de ligne 3 vers 7. Numéro de ligne faisant partie de la clé de l'index, alors l'enregistrement suivant n'est pas la ligne 4 mais la ligne 8. En modifiant le numéro de ligne, il se positionne au nouvel emplacement.
    Ce problème est connu dans les logiciels de comptabilité!
    Francis,
    Ce n'est pas tout à fait ça,
    Car selon mon algo, on ne décale que d'une seule ligne et à partir de la fin. Voir le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    P_Table_Ligne.Last; 
    repeat  
    //décalage
    P_table_Ligne.MoveBy(-1);
    until bof or ....
    8->9
    5->6
    4->5
    3->4 et on s'arrête

    Tout ça sans le problème de déplacement dans le Dataset.

    @+
    fp

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Merci de votre aide
    Bonjour,
    J'ai enfin réglé le problème.

    Il y avait dans le traitement une fonction (lancé par un évènement onPost) qui se déplaçait dans le Dataset.
    C'est ce qui produisait cet effet de bord incompréhensible.
    Quand j'ai remplacé mon conteneur de Dataset (TTable remplacé par TQuery), je n'avais pas encore implémenté les évènements associés, c'est pourquoi, ça marchait de nouveau.

    Ce déplacement avait été introduit par une nouvelle fonction.

    Merci de votre aide.
    fp

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

Discussions similaires

  1. Le service ne répond plus
    Par WebPac dans le forum Delphi
    Réponses: 4
    Dernier message: 25/08/2006, 17h34
  2. [Eclipse plantage]ne répond plus
    Par agougeon dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/05/2006, 14h24
  3. Table qui ne répond plus, toutes operations impossible
    Par imer5 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 11/05/2006, 16h26
  4. MySQL ne répond plus ...
    Par Ickou dans le forum Outils
    Réponses: 19
    Dernier message: 10/05/2006, 18h01
  5. Programme ne répond plus.
    Par twizell dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 14/11/2005, 19h46

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