Comment demander une sauvegarde numérique conditionée

Lunasoft Messages postés 75 Date d'inscription samedi 28 juin 2008 Statut Membre Dernière intervention 16 août 2011 - 28 juin 2008 à 17:04
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 1 juil. 2008 à 21:07
Bonjour!

J'ai une question sans solution qui me demande de l'aide de votre part.
J'ai deux tables ayant les trois champs identiques pour toutes les deux Tables (Entreprise, Annee).
Dans les codes de filtrage que j'ai écrit, je demande à mon programme de me filtrer toutes données d'une entreprise quelqueconque...à l'année X.
Quand le filtrage sera fait, j'aimerai que dans les codes suivants de sauvegarde...qu'il y est une sauvegarde separée. Cela veut dire tous les comptes de 1 à 5 du champ "money" de la Table1 devrait être enregistrés dans la table2. Mais ça ne marche pas!

procedure TForm1.Button1Click(Sender: TObject);
begin
  case Table1.FieldValues['money'] of // le plantage commence ici
    0..5 : begin
           adotable2.Append;
           adotable2.fieldvalues['money'] := adotable1.fieldvalues['money'];
           adotable2.post;
       end;
    end;


Merci,
LunaSoft

10 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 juin 2008 à 22:10
Bonsoir,

N'ayant pas toutes les données du problème, je te propose néanmoins ceci :

il faut d'abord ouvrir les deux tables
...
Table1.Open;
adotable2.Open;
...
et ensuite
ta procédure :TForm1.Button1Click(Sender: TObject);
ne stocke qu'un seul enregistrement..

il faut donc lui introduite une boucle :
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.First;
While not Table1.Eof do
    begin
        case Table1.FieldValues['money'] of 
          0..5 : 
           begin
           adotable2.Append;
           adotable2.fieldvalues['money'] := adotable1.fieldvalues['money'];
           adotable2.post;
            end;

       Table1.Next;
    end; 
end;

cantador
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 juin 2008 à 22:32
Et dire que ça serait bien plus simple et plus rapide avec une requête SQL :
INSERT INTO table2 ('money') SELECT money FROM table1 WHERE money BETWEEN 0 AND 5

Enfin, moi ce que j'en dis...

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Lunasoft Messages postés 75 Date d'inscription samedi 28 juin 2008 Statut Membre Dernière intervention 16 août 2011
29 juin 2008 à 00:45
Bonjour,
Merci de m'avoir donné toutes vos réponses.
Tous les codes ont fonctionné normalement (cantador et Delphiprog). Seulement, permettez-moi d'apprendre du moins toutes les voies possibles.
Au fait; je crois que j'ai dû omettre de dire à Cantador que mes intentions étaient de faire une sauvegarde en gros: toutes les données entre 0 à 5 devraient être enregistrées et non juste un enregistrement.(Pardon!).
Mais à l'entretemps, quand j'exécute tes codes (@cantador), ils marchent et par après il y a plantage! Donc, il faudra relancer le programme.
J'ai ajouté ce code : Table1.free mais ça plante toujours après avoir bien exécuté. Voila tout (@cantador).

@DelphiProg
Tes codes marchent bien. Seulement, il y a toujours un message demandant de bien voire si le nom de mon champ "money" aurait été bien écrit.
J'ai reverifié mais tout est correcte!
Je ne dis pas que tes codes ne marchent pas! Je crois que je devrais encore revoir ma Table. Et si ça persiste...je tâcherai de vous tenir informer.

Merci,
LunaSoft
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 juin 2008 à 11:54
Table1.free n'est pas valable car celle-ci n'est pas créee dynamiquement.
il y a plantage!
quel est le message d'erreur ?

info:
ton code ajoute des données dans adotable2, mais si tu recliques à nouveau, il te rajoute encore une fois les mêmes etc.etc.
J'imagine que ce n'est certainement pas ce que tu souhaites faire..

donc, il nous fait plus de précisions et d'informations sur les tables.

cantador
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
29 juin 2008 à 21:54
@lunasoft : selon la base de données utilisée, 'money' est peut-être un mot réservé pour le moteur SQL. Dans ce cas, il faut mettre le nom du champ entre guillemets doubles :
"INSERT INTO table2 ('money') SELECT "money" FROM table1 WHERE "money" BETWEEN 0 AND 5"
Mais, en règle générale, il ne faut jamais utiliser de mots réservés pour nommer les champs, les tables ou une base.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Lunasoft Messages postés 75 Date d'inscription samedi 28 juin 2008 Statut Membre Dernière intervention 16 août 2011
30 juin 2008 à 00:42
@Cantador
Tu sais quoi, je me rends compte maintenant que la sauvegarde en groupe (0 à 5) se fait sans problème! (j'en suis content!)
Revenons-en au plantage:
il y a plantage lorsque j'ajoute un chiffre en dehors dudit interval (0 à 5). C'est une réaction normale. Mais pas du tout normal aussi.
Pourquoi? Parce qu'il y fait sa recherche et quand il y a une infiltration d'un chiffre dans le champ en dehors dudit interval. Là, il se plante (mais sans message). Pour y remedier, Il faudra juste relancer le programme.
En un mot, s'il n' y a que les chiffres nageant dans cet interval (0 à 5). C'est sans problème et là, il enregistre (ou export) dans la table AdoTable2 (sans faire un plantage).
Voilà alors ce que j'ai essayé de faire pour obstruer ce plantage (coloré de rouge). Malgré ça, il y a toujours plantage.

procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.First;
While not Table1.Eof do
    begin
try
        case Table1.FieldValues['money'] of 
          0..5 : 
           begin
           adotable2.Append;
           adotable2.fieldvalues['money'] := adotable1.fieldvalues['money'];
           adotable2.post;
except
            end;

       Table1.Next;
    end; 
end;

@DelphiProg
J'ai dû changer le nom du champ. Mais ma maladie persiste toujours. Je veux encore m'epoumoner dessus et voire là où j'ai vraiment loupé. L'erreur viendrait probablement de moi...

Merci,
LunaSoft
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 juil. 2008 à 09:04
Attention le try except peut effectivement être utile lorsqu'on a maîtrisé totalement les conditions dans lesquelles l'erreur ou les erreurs se produisent.
Dans la négative, c'est très risqué, car ton programme pourrait ne pas fonctionner correctement et tu ne verras rien !

je ne comprens pas pour l'instant l'anomalie qui se produit :

il y a plantage lorsque j'ajoute un chiffre en dehors dudit interval (0 à 5).
oui mais que fais-tu exactement ?
car si un autre chiffre apparaît le programme doit l'ignorer et tomber sur le next.
il faut mettre un point d'arrêt et pister ce qu'il fait.

cantador
0
Lunasoft Messages postés 75 Date d'inscription samedi 28 juin 2008 Statut Membre Dernière intervention 16 août 2011
1 juil. 2008 à 16:13
Cantador, t'as raison. Au fait; quand je dis: il y a plantage lorsque j'ajoute un chiffre en dehors dudit interval (0 à 5).C'est dire qu'un chiffre enregistré dans la table qui n'est dans l'interval numérique demandé. Le programme se plante totalement. Ce point, ça va (je suis déjà sur la bonne voie de le résoudre).
Mon problème c'est d'avoir un code (ou des codes) qui me permettront d'éviter le redemarrage du programme.

ooooooh écoute, j'ai découvert quelque de bizarre (interessant d'une part et de l'autre non.)
Il arrive que, quand je clique mon boutton pour transferer les données demandées dans mes codes:
...OnClick....
while not......
case....
0..5 : begin....
...
le programme s'plante réellement. mais curieusemsent, lorsque je le relance. Je retrouve effectivement les données demandées d'être enregistrées dans la table voulues. C'est pertinent ça! Comment éviter juste ce plantage. Ce même "malheur" qui arrive fait au moins que les données sont enregistrées. Comment explique t-on ça.

Merci,LunaSoft
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 juil. 2008 à 17:04
Essaie de mettre un ELSE dans ton case de manière à le forcer à faire le next si ce n'est pas le bon chiffre.
En espérant que tu n'as que des chiffres dans ton champ bien sûr...

je vais tester de mon côté..

@+

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 juil. 2008 à 21:07
J'ai testé sur une de mes tables et çà marche sans plantage..

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  test: integer;
begin
  try
    screen.Cursor := CrHourGlass;
    test := 0;
    Iboquery1.First;


    while not Iboquery1.Eof do
    begin
      case Iboquery1ORDRE.Value of
        0..5:
          Inc(test);
      end;
      Iboquery1.Next;
    end;
  finally
    screen.Cursor := CrDefault;
    showmessage(intToStr(test));
  end;
end;

cantador
0
Rejoignez-nous