Positionner sur un enregistrement à patir d'un n° et d'une date

Signaler
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
24 décembre 2012
-
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
24 décembre 2012
-
Bonjours à tous,
je bute sur un petit problème dans une base de données d'une bibliothèque. Je cherche à me positionné sur un enregistrement déjà créé et voici le code que j'utilise.
procedure TForm1.Edit13Change(Sender: TObject);
begin // saisie automatique à partir d'un code barre
// pour entrer et/ou sortir un livre
If Length(Edit13.Text)=6 then
begin
// Sélection par le N° code barre du n° du livre avec la douchette
Table12.SetKey;
Table12.Fields[5].AsString := Edit13.Text;
Table12.Fields[4].AsString := '[Rendule]=null'; //Edit14.Text;
Table12.GotoNearest;
end;
end;

j'arrive sans difficulté à me positionné sur le premier enregistrement qu'il trouve avec le N° du livre que je cherche, mais je souhaiterais pouvoir lui demandé aussi de me positionné sur le champ date qui est vide parmi plusieurs même enregistrements du même N° mais un seul champ date est resté vide ce qui veux dire que le livre est sorti de la bibliothèque. Le problème réside dans le retour du livre.
Merci du coup de main et espère avoir été assez clair.
Amitiés...
AEC1

7 réponses

Messages postés
106
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
25 octobre 2020
2
Bonjour,
Je ne connait pas comment est construite la base de données ni son type, (champs indexés?) J'utiliserai la méthode Locate qui permet de travailler sur des champs non indexés pour faire la recherche sur les deux champs.
Le champs contenant le N° du livre saisi et le champs Date == à vide.
La méthode locate est moins rapide car travaillant sur des champs non indexés.
Sinon il y a FindKey si N° livre et date sont indexés
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
24 décembre 2012

Bonjour cher ami,
merci de me répondre. Effectivement j'utilise des champs indexés, mais la première difficulté est de se positionné sur l'enregistrement s'il est existant dans une liste qui est l'inventaire des livres sorties de la bibliothèque. Si telle est le cas alors le code profite d'être sur l'enregistrement afin de complété la date de retour du livre et si celui-ci n'est pas sorti alors je crée automatiquement une nouvel enregistrement dans cette liste d'inventaire en mettant le N° du livre, son titre et la date de pris le.
Finalement mon premier souci est de trouver l'enregistrement existant ou non. Dans cette liste d'inventaire ne paraissent que les livres sortis, mais j'ai 4 champs dont le N° du livre, le titre, la date pris le et la date rendu le qui elle reste toujours vide.
Puisque c'est elle qui me permet de filtrer la liste. Donc je pensais que je pouvais faire la même chose avec la recherche d'un enregistrement mais sans filtrer la liste seulement en indiquant que le champ date rendu le est vide.
Merci pour votre aide si cela est possible ni trop tordu dans mon explication.
Amitiés...
AEC1
Messages postés
106
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
25 octobre 2020
2
Avec un peu de retard pour cause de rando en montagne voilà comment je vois le PB

Var NumeroLivre: String;
begin
// NumLivre := Resultat de la saisie du numéro du livre
With tLivre do begin // tLivre est le nom de la table
// NumLivre et DateRendu sont les noms des champs de la table tLivre
If Locate('NumLivre;DateRendu', VarArrayOf([NumLivre, null]), [loCaseInsensitive]) then
// Le livre est sortie mais pas encore rentrée
// Mettre la date du jour dans le champs DateRendu
else
// Ajouter un nouvel enregistrement et le remplir avec les références du livre
// et la date du jour qui est la date de sortie
end;

En espérant vous avoir aidé
Cordialement
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
24 décembre 2012

Merci de me répondre, je vais essayer cela car il est vrai il y a pas mal de paramètres dont il faut aussi que je tienne compte. Je vous tiens informé de ce que j'ai pu faire.
Merci encore pour votre aide, au plaisir...
AEC1
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
24 décembre 2012

Bonsoir cher ami, je me permet de vous adressez un petit mot pour vous remerciez de votre aide car j'ai enfin réaliser les entrées / sorties des livres d'un bibliothèque avec codes barres ou en mode manuel. Je me permet de vous sollicité dans la foulée par une autre question:
voilà, je souhaiterais pour terminer cette appli. de pouvoir éliminé automatiquement tous les livres de mon fichier suivi pour les livres sorties / rentrés et cela en indiquant juste: soit à partir d'une date et tout ce qui est antérieur est vidé du fichier ou soit indiqué une durée par exemple de 5 ans et donc tout ce qui est antérieur à ce calcul seras supprimé du fichier.
Merci encore pour votre aide qui me permet de finaliser ce appli.
Amitiés...
AEC1
Messages postés
106
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
25 octobre 2020
2
Bonjour,
Voici une routine de purge dans un fichier que j'avais réalisé lorsque je travaillait. Voilà 5 ans que j'ai abandonné le boulot et Delphi, mais parfois je regarde les forums pour le fun. (comme disent les jeunes).
La routine suppose que la table soit indexée sur la date de fin. Elle était lancée depuis le menu principal. [Options Utilitaires\Purge des FA\]
Reste à adapter à votre application celle ci.
On peut certainement faire mieux car je n'était pas un pro de la programmation. Je m'y était mis par un peu par obligation car mon travail au service "méthodes" évoluait dans ce sens.
J'ai commencé avec le basic d'Apple, puis ensuite avec Clipper quand les PC sont arrivés dans les ateliers, et enfin avec Delphi lors de l'arrivée de Windows
Amicalement

procedure TMainForm.mnu_UtilPurgeClick(Sender: TObject);
Function SaisieDate: String;
// Fonction de saisie et de controle de la date de début de purge
Var cDate: String;
Begin
cDate := '';
If InputQuery('SAV * Purge des FA',
'FA antérieures à la date du', cDate) then begin
Try
// Délai 3 ans = 1095 jours
If StrToDate(cDate) > (Date - 1095) then begin
MessageDlg('Délai des 3 ans non respecté !',mtWarning, [mbOk],0);
Result := 'DATE_ERR';
end
else
Result := cDate;
Except
On E:EConvertError do begin
ShowMessage(E.ClassName + CRLF + E.Message);
Result := 'DATE_ERR';
end;
End;
End // EndTry
Else
Result := 'DATE_ERR';
end; // End fonction SaisieDate

Function NbEnregAEffacer(tFa: TTable; cDate: string): Integer;
{* Calculer le Nb d'enreg satisfaisant la condition d'effacement
pour initialiser la borne MAX de la jauge *}
Var n: Integer;
begin
n := 0;
DM.tFa.First;
While DM.tFa.FieldByName('DATEFIN').AsDateTime < StrToDate(cDate) do begin
Inc(n);
DM.tFa.Next;
End;
DM.tFa.First;
If n = 0 then
MessageDlg('Aucun enregistrement à effacer', mtInformation, [mbOk],0);
Result := n;
end; // End fonction NbEnregAEffacer
// ----------------------------------------------------------
Var cDate: String;
nRec, nDel: Integer;
Jauge: TProgressBar;
begin
cDate := SaisieDate;
If cDate = 'DATE_ERR' then
Exit;
DM.tFa.IndexFieldNames := 'DateFin'; // Brancher l'index sur DateFin
nRec := NbEnregAEffacer(DM.tFa, cDate);
if nRec = 0 then
Exit;
Jauge := TProgressBar.Create(Self);
Try
With Jauge do begin
Parent := MainForm;
Align := alBottom;
Height := 25;
Min := 1;
Max := nRec;
Step := 1;
end;
With DM.tFa do begin
// ATTENTION : DisableControls détruit la relation maitre détail
nDel := 0;
While (FieldByName('DATEFIN').AsDateTime < StrToDate(cDate))
and (not eof) do begin
Jauge.StepIt;
If DM.tFaDateFin.IsNull then // Champ DateFin vide on n'efface pas
Next
Else begin
Inc(nDel);
Delete;
End;
End; // EndWhile
IndexFieldNames := 'NumFa'; // Rebrancher l'index primaire
First;
End; // EndWith DM.tFa
Finally
Jauge.Free;
End; // EndTry
MessageDlg(IntToStr(nDel) + ' enregistrement(s) supprimé(s)',
mtInformation,[mbOk],0);
end;
Messages postés
98
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
24 décembre 2012

Bonjour,
je vous remercie de votre rapidité à me répondre. Je vais donc intégré cette dernière procédure dans le code actuel afin d'en terminé une fois pour toute avec cette appli. qui m'a déjà demandé beaucoup d'amélioration de la part des utilisateurs.
Encore grand merci pour votre aide et au plaisir.
AEC1