الترشيح في قواعد البيانات الدالفي

lila88 · 12 · 7391

lila88

  • Full Member
  • ***
    • مشاركة: 164
    • مشاهدة الملف الشخصي
في: نيسـان 28, 2010, 07:51:16 صباحاً
السلام عليكم , أرجو أن تجيبني على هذه الأسئلة
مثلا عندي جدول الطالب و الذي يحوي الخصائص التالية:
num,nom , prenom,sexe,adresse,date_nةlieu_n
ما هي كيفية حساب : عدد الإناث, عدد الدكور, عدد الطلبة
كل في edit خاص به
و شكرا


Amir_Kader

  • Newbie
  • *
    • مشاركة: 16
    • مشاهدة الملف الشخصي
رد #1 في: أيار 02, 2010, 12:11:28 مسائاً
السلام عليكم و رحمة الله و بركاته
في البداية آسف على الإنقطاع عن المنتدى لأسباب مهنية.
بخصوص السؤال، إذا كنت تتكلمين عن قاعدة بيانات Database تحتوي على هذه المعلومات، فالحل الأسهل يكون بالترشيح filtrage و يكون ذلك على النحو الآتي :
Var I:Integer; //déclarer l'entier
Begin
Table1.Filter:='sexe = '+QuotedStr('F'); //utiliser "M" et "F" par exemple
Table1.Filtered:=True; //activer le filtrage de données
I:=Table1.RecordCount; //la table va contenir les enregistrements en F
Edit1.Text:=IntToStr(I); //convertir l'Integer en String

Table1.Filter:='sexe = '+QuotedStr('M'); //utiliser "M" et "F" par exemple
Table1.Filtered:=True; //activer le filtrage de données
I:=Table1.RecordCount; //la table va contenir les enregistrements en M
Edit2.Text:=IntToStr(I); //convertir l'Integer en String

Table1.Filtered:=False; //désactiver le filtrage de données
I:=Table1.RecordCount; //la table va contenir tous les enregistrements
Edit3.Text:=IntToStr(I); //convertir l'Integer en String
End; //fin de la procédure
المبدأ هو ترشيح التسجيلات enregistrements التي يكون فيها النطاق champ الذي يحوي جنس الطالب sexe حيث يجب أن يكون M أو F و إلا تغيير القيم حسب الإختيار، و الطريقة هي :
1- تحديد شروط الترشيح
2- تفعيل الترشيح
3- القيام بالعمليات اللازمة على التسجيلات المرشحة
4- إلغاء الترشيح
edit1 سيحتوي على عدد الإناث، edit2 على عدد الذكور و edit3 على العدد الكلي، و إذا لم يكن العدد الكلي يساوي المجموع فهذا يعني أن هنالك معلومات ناقصة أو تسجيلات فارغة.
ملاحظة أخيرة، و هي أنه من الأفضل إضافة تعليمة تسمح بإزالة التسجيلات الفارغة، مثلا :
Table1.Filtered:=False; //o
Table1.first; //o
For I:=1 To Table1.RecordCount Do
Begin
If Table1.FieldByName('Nom').AsString='' Then //il faut reprendre le nom du champ exactement, différence majuscules minuscules aussi
Table1.Delete; //o
Table1.Next; //o
End; //o

و هنالك طريقة ثانية (أسهل) دون استعمال الترشيح :
Var I:Integer,NM,NF,NT; //déclarer l'entier
Begin
Table1.first; //remettre en première position
NM:=0; //initialiser le nombre des masculins
NF:=0; //initialiser le nombre des féminins
 
For I:=1 To Table1.RecordCount Do
Begin
If Table1.FieldByName('sexe').asString='F' Then
NF:=NF+1
Else If Table1.FieldByName('sexe').asString='M' Then
NM:=NM+1
Else
Application.MassageBox('Il y a une erreur de données','ERREUR',MB_OK); //message d'erreur si ce n'est ni F ni M
Table1.Next; //passer à l'enregistrement suivant
End; //o
Edit1.text:=IntToStr(NF); // nombre de femmes dans Edit1
Edit2.text:=IntToStr(NM); // nombre d'hommes dans Edit2
NT:=NF+NM; //nombre total
Edit3.text:=IntToStr(NT); // nombre total dans Edit3
If NT<>Table1.RecordCount Then
Application.MassageBox('Il y a une erreur de données','ERREUR',MB_OK); //message d'erreur si ce n'est ni F+M n'est pas égal au total
End; //o

آمل أن أكون قد وفقت في الإجابة على السؤال، و ما توفيقي إلا بالله.
السلام عليكم و رحمة الله و بركاته


lila88

  • Full Member
  • ***
    • مشاركة: 164
    • مشاهدة الملف الشخصي
رد #2 في: أيار 02, 2010, 02:13:04 مسائاً
بارك الله فيك و جزاك ألف خير
شرح واضح جدا ومفهوم


يوسف الضادي

  • Hero Member
  • *****
    • مشاركة: 5333
    • مشاهدة الملف الشخصي
    • http://www.sou9dz.com
رد #3 في: أيار 06, 2010, 05:41:45 مسائاً
بارك الله فيكم
مناقشة جيدة و اجابة كافية شافية
بالتوفيق اخواني


Virtuelis

  • Newbie
  • *
    • مشاركة: 6
    • مشاهدة الملف الشخصي
رد #4 في: أيار 07, 2010, 04:49:24 مسائاً
Var I:Integer; //déclarer l'entier
Begin
Table1.Filter:='sexe = '+QuotedStr('F'); //utiliser "M" et "F" par exemple
Table1.Filtered:=True; //activer le filtrage de données
I:=Table1.RecordCount; //la table va contenir les enregistrements en F
Edit1.Text:=IntToStr(I); //convertir l'Integer en String

1. Aiez pitiédu processeur ! il a beaucoup de choses à faire ! réduisez votre code  
Edit1.Text := IntToStr(Table1.RecordCount).
2. Un composant TEdit n'est pas fait pour afficher les données, c'est fait pour la saisie, alors essayer de ne pas l'utiliser, mais utiliser des TLabel à la place : (Label1.Caption := IntToStr(Table1.RecordCount);

Table1.Filter:='sexe = '+QuotedStr('M'); //utiliser "M" et "F" par exemple
Table1.Filtered:=True; //activer le filtrage de données
I:=Table1.RecordCount; //la table va contenir les enregistrements en M
Edit2.Text:=IntToStr(I); //convertir l'Integer en String

Table1.Filtered:=False; //désactiver le filtrage de données
I:=Table1.RecordCount; //la table va contenir tous les enregistrements
Edit3.Text:=IntToStr(I); //convertir l'Integer en String

*. Mon ami, n'oublie pas d'ôter le filtre avant de quitter la procédure, dans un grand travail ça peut créer des complications trop dures à contrôler !

End; //fin de la procédure

----------------------------------------------------

 
 
Table1.Filtered:=False; //o
Table1.first; //o
For I:=1 To Table1.RecordCount Do
Begin
If Table1.FieldByName('Nom').AsString='' Then //il faut reprendre le nom du champ exactement, différence majuscules minuscules aussi
Table1.Delete; //o
Table1.Next; //o
End; //o

 
 
 
Var I:Integer,NM,NF,NT; //déclarer l'entier
Begin
Table1.first; //remettre en première position
NM:=0; //initialiser le nombre des masculins
NF:=0; //initialiser le nombre des féminins

For I:=1 To Table1.RecordCount Do
Begin
If Table1.FieldByName('sexe').asString='F' Then
NF:=NF+1
Else If Table1.FieldByName('sexe').asString='M' Then
NM:=NM+1
Else
Application.MassageBox('Il y a une erreur de données','ERREUR',MB_OK); //message d'erreur si ce n'est ni F ni M
Table1.Next; //passer à l'enregistrement suivant
End; //o
Edit1.text:=IntToStr(NF); // nombre de femmes dans Edit1
Edit2.text:=IntToStr(NM); // nombre d'hommes dans Edit2
NT:=NF+NM; //nombre total
Edit3.text:=IntToStr(NT); // nombre total dans Edit3
If NT<>Table1.RecordCount Then
Application.MassageBox('Il y a une erreur de données','ERREUR',MB_OK); //message d'erreur si ce n'est ni F+M n'est pas égal au total
End; //o

 
[/QUOTE]
 
Une application de gestion d'une base de données doit être solide en matière de contrôle de données, alors il faut pas apprendre une mauvaise habitude dès le début et laisser l'occasion à une mauvaise donnée de se faire enregistrée dans la base, si nous avons un champs qui doit porter M ou F, il faut jamais que l'application permette à une autre valeur de venir prendre la place ! et il ne faut jamais apprendre à quelqu'un d'une façon de lui faire admettre que ça base peut avoir une rendandance de données ou des données incorrectes qui ne doivent pas y être enregistrées, alors, il faut répondre en prenant en compte que les données sont bonne sur la base et faire la remarque qu'il faut faire attention pour contrôler les données le temps qu'on les introduise.


ING_HYD

  • Hero Member
  • *****
    • مشاركة: 1124
    • مشاهدة الملف الشخصي
رد #5 في: أيار 08, 2010, 09:07:38 مسائاً
salam
il n'est pas très commode d'utiliser un composant Table quand les critères de sélections se multiplie. Pour cela le composant TQuery est plus pratique car il donne usage à l'utilisation du code SQL qui est robuste et très puissant en matière de rapidité et de ressources  


Virtuelis

  • Newbie
  • *
    • مشاركة: 6
    • مشاهدة الملف الشخصي
رد #6 في: أيار 09, 2010, 08:48:06 صباحاً
مقتبس من: ING_HYD;457406
salam

il n'est pas très commode d'utiliser un composant Table quand les critères de sélections se multiplie. Pour cela le composant TQuery est plus pratique car il donne usage à l'utilisation du code SQL qui est robuste et très puissant en matière de rapidité et de ressources
Salut l'ami
J'utilise Delphi depuis sa version 1.0, et je m'occupe toujours de ces nouveautés est-ce jusqu'à présent, depuis 1996, et j'ai conçu plus de 30 applications commerciales avec Delphi, qui sont déployé sur l'Est et le centre algériens dans de divers établissements, durant cette expérience, j'ai appris que l'utilisation des TQuery sous Delphi a quelques incovénients, et le filtratge de données par la propriété "Filter" des tables est beaucoup plus efficace et plus rapide, car, les composants TQuery utilisent des fichiers temporaires qui rend le fonctionnement de l'application un peu plus lourd, car quand on traite une base de données de 1 Mo c'est pas le cas comme lorsqu'on traite une base de donnée de 100Mo, l'utilisation des TQuery est nécessaire quand il s'agit d'une imprission de données issues de plusieurs tables suivant plusieurs critère de tri, mais concernant le filtrage, d'après mon expérience, lobjet TQuery n'est pas assez fort avec les bases de données volumineuses.


Amir_Kader

  • Newbie
  • *
    • مشاركة: 16
    • مشاهدة الملف الشخصي
رد #7 في: أيار 10, 2010, 10:59:42 صباحاً
مقتبس من: Virtuelis;456929
Var I:Integer; //déclarer l'entier

Begin
Table1.Filter:='sexe = '+QuotedStr('F'); //utiliser "M" et "F" par exemple
Table1.Filtered:=True; //activer le filtrage de données
I:=Table1.RecordCount; //la table va contenir les enregistrements en F
Edit1.Text:=IntToStr(I); //convertir l'Integer en String

1. Aiez pitiédu processeur ! il a beaucoup de choses à faire ! réduisez votre code
Edit1.Text := IntToStr(Table1.RecordCount).
2. Un composant TEdit n'est pas fait pour afficher les données, c'est fait pour la saisie, alors essayer de ne pas l'utiliser, mais utiliser des TLabel à la place : (Label1.Caption := IntToStr(Table1.RecordCount);

Table1.Filter:='sexe = '+QuotedStr('M'); //utiliser "M" et "F" par exemple
Table1.Filtered:=True; //activer le filtrage de données
I:=Table1.RecordCount; //la table va contenir les enregistrements en M
Edit2.Text:=IntToStr(I); //convertir l'Integer en String

Table1.Filtered:=False; //désactiver le filtrage de données
I:=Table1.RecordCount; //la table va contenir tous les enregistrements
Edit3.Text:=IntToStr(I); //convertir l'Integer en String

*. Mon ami, n'oublie pas d'ôter le filtre avant de quitter la procédure, dans un grand travail ça peut créer des complications trop dures à contrôler !

End; //fin de la procédure

----------------------------------------------------

 
 
Table1.Filtered:=False; //o
Table1.first; //o
For I:=1 To Table1.RecordCount Do
Begin
If Table1.FieldByName('Nom').AsString='' Then //il faut reprendre le nom du champ exactement, différence majuscules minuscules aussi
Table1.Delete; //o
Table1.Next; //o
End; //o

 
 
 
Var I:Integer,NM,NF,NT; //déclarer l'entier
Begin
Table1.first; //remettre en première position
NM:=0; //initialiser le nombre des masculins
NF:=0; //initialiser le nombre des féminins

For I:=1 To Table1.RecordCount Do
Begin
If Table1.FieldByName('sexe').asString='F' Then
NF:=NF+1
Else If Table1.FieldByName('sexe').asString='M' Then
NM:=NM+1
Else
Application.MassageBox('Il y a une erreur de données','ERREUR',MB_OK); //message d'erreur si ce n'est ni F ni M
Table1.Next; //passer à l'enregistrement suivant
End; //o
Edit1.text:=IntToStr(NF); // nombre de femmes dans Edit1
Edit2.text:=IntToStr(NM); // nombre d'hommes dans Edit2
NT:=NF+NM; //nombre total
Edit3.text:=IntToStr(NT); // nombre total dans Edit3
If NT<>Table1.RecordCount Then
Application.MassageBox('Il y a une erreur de données','ERREUR',MB_OK); //message d'erreur si ce n'est ni F+M n'est pas égal au total
End; //o

 

Une application de gestion d'une base de données doit être solide en matière de contrôle de données, alors il faut pas apprendre une mauvaise habitude dès le début et laisser l'occasion à une mauvaise donnée de se faire enregistrée dans la base, si nous avons un champs qui doit porter M ou F, il faut jamais que l'application permette à une autre valeur de venir prendre la place ! et il ne faut jamais apprendre à quelqu'un d'une façon de lui faire admettre que ça base peut avoir une rendandance de données ou des données incorrectes qui ne doivent pas y être enregistrées, alors, il faut répondre en prenant en compte que les données sont bonne sur la base et faire la remarque qu'il faut faire attention pour contrôler les données le temps qu'on les introduise. [/QUOTE]
Mon cher frère, je ne suis pas contre les critique et reprises/corrections car nul n'est parfait, loin de là, mais avant d'avancer certaine remarques, veuillez consulter la question dans tous ses détails
1- l'utilisation du TEdit pour afficher le nombre ne vien pas de moi, mais c'est la réponse à la question dont il est stipulé que l'utilisateur veut les résultats dans Edit1, Edit2 et Edit3, même si je suis d'accord avec vous, les gens on besoin de commencer pas à pas quand même.
2- pour ce qui est d'ôter le filtre, je suis désolé mais ce n'est pas tellement nécessaire, nous avons déjà désactiver le filtrage et si on affect un nouveau filtre sans cumul (affectation directe) il va remplacer l'ancien tout simplement, et je l'ai déjà dit, il faut que les gens puissent avancer pas à pas, ne serait-ce que pour mieux métriser et apprécier les modes évolués puis avancer de la gestion de DB, je n'ai par exemple pas parlé des mode d'activation et de fermeture de la table avant fermeture du programme...etc
J'espère que vous comprenez que je ne vous attaque en rien, mais avant de courir il faut d'abaord apprendre à se dresser puis à marcher, et bien au contraire, ça me ferais bien plaisir de vous rencontrer si vous êtes au niveau d'alger, peut-être que nous pourrions trouver des projets communs. Salam


lila88

  • Full Member
  • ***
    • مشاركة: 164
    • مشاهدة الملف الشخصي
رد #8 في: أيار 11, 2010, 09:43:05 صباحاً
salam
merci pour tous ces proposotions


laoubi_adel

  • Sr. Member
  • ****
    • مشاركة: 333
    • مشاهدة الملف الشخصي
رد #9 في: أيار 19, 2010, 11:26:13 صباحاً
ملاحظة :
كل المشاركات السابقة صحيحة لكن لمذا لاتستعملون لغةالاستعلامات البنيوية وينتهي الامر
فهي تساعد على القيام بعدة عملية مععععععقدة في اسطر فقط
او تصميم برنامج تنفيذ sql وضمه الى تطبيقك كي يسهل على المستعمل احضار مجموعة من ععمليات الترشيح
وتسهيل عملية البحث


ING_HYD

  • Hero Member
  • *****
    • مشاركة: 1124
    • مشاهدة الملف الشخصي
رد #10 في: أيار 20, 2010, 04:18:16 صباحاً
Salam
je tiens à souligner que les SGBDR en général permettent de contrôler la données saisie sans avoir besoin de faire ça par programmation, prenons le cas du PARADOXE qui est le moins robuste, vous pouvez restreindre les données d'un champs dans la partie structure de votre BD


ING_HYD

  • Hero Member
  • *****
    • مشاركة: 1124
    • مشاهدة الملف الشخصي
رد #11 في: أيار 30, 2010, 05:28:43 صباحاً
مقتبس من: Virtuelis;457467
Salut l'ami
J'utilise Delphi depuis sa version 1.0, et je m'occupe toujours de ces nouveautés est-ce jusqu'à présent, depuis 1996, et j'ai conçu plus de 30 applications commerciales avec Delphi, qui sont déployé sur l'Est et le centre algériens dans de divers établissements, durant cette expérience, j'ai appris que l'utilisation des TQuery sous Delphi a quelques incovénients, et le filtratge de données par la propriété "Filter" des tables est beaucoup plus efficace et plus rapide, car, les composants TQuery utilisent des fichiers temporaires qui rend le fonctionnement de l'application un peu plus lourd, car quand on traite une base de données de 1 Mo c'est pas le cas comme lorsqu'on traite une base de donnée de 100Mo, l'utilisation des TQuery est nécessaire quand il s'agit d'une imprission de données issues de plusieurs tables suivant plusieurs critère de tri, mais concernant le filtrage, d'après mon expérience, lobjet TQuery n'est pas assez fort avec les bases de données volumineuses.
salam
très juste ce que tu dis mais faudrait-il encore préciser deux points essentiels
1. j'ai comme l'impression que tu utilise le BDE, si c'est le cas alors je te dis sans hésitation que le problème que tu évoques vient de là, le BDE n'est plus soutenu depuis la version 5 de Delphi, il a été abandonné et remplacé par ADO
2. en fait j'ai répondu sans connaitre les contrainte de l'application sinon je dirais qu'il faut utiliser les composant dbGo mais faudrait-il encore que je sache le SGBD avec lequel notre ami travail, les composants d'accès et la taille de sa bd

merci de me lire