تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق
#31
- الجزء 5 و الأخيــــــــــــــر من الدرس العاشر

على الفورم FFactureEtStatistique دائما ، نمر إلى الصفحة : Consultation De Cesse
على هذه الأخيرة نريد إظهار المبلغ الإجمالي لكل المبيعات ، المبلغ الإجمالي لكل الديون ، كل المبالغ المدفوعة ، و عليه نعرف كم يوجد في رصيد مؤسستنا (لهذه الأخيرة أقصد الرصيد نضيف sEdit أخرى ستأخذ الإسم sEdit21 )

- نحدد TabSheet6 و في الحدث OnShow لهذه الأخيرة نكتب :
كود :
(* Majmoo3e SommeVentes_Cesse *) RecordPlaceSommeVentes_Cesse := FGSM.table2.GetBookmark; MajmoueSommeVentes_Cesse:=0; FGSM.table2.First; while not FGSM.table2.Eof Do begin MajmoueSommeVentes_Cesse:=MajmoueSommeVentes_Cesse +FGSM.table2.FieldByName('Prix_TTC').AsCurrency; FGSM.table2.Next; end; sEdit18.Text:=CurrToStr(MajmoueSommeVentes_Cesse); sEdit18.Text:=formatfloat('0.00',strtofloat(sEdit18.Text))+' DA'; (* Majmoo3e SommeDettes_Clients *) RecordPlaceSommeDettes_Clients := FGSM.table7.GetBookmark; MajmoueSommeDettes_Clients:=0; FGSM.table7.First; while not FGSM.table7.Eof Do begin MajmoueSommeDettes_Clients:=MajmoueSommeDettes_Clients +FGSM.table7.FieldByName('Valeur_Reste').AsCurrency; FGSM.table7.Next; end; sEdit19.Text:=CurrToStr(MajmoueSommeDettes_Clients); sEdit19.Text:=formatfloat('0.00',strtofloat(sEdit19.Text))+' DA'; (* Majmoo3e SommeVersements_Clients *) RecordPlaceSommeVersements_Clients := FGSM.table8.GetBookmark; MajmoueSommeVersements_Clients:=0; FGSM.table8.First; while not FGSM.table8.Eof Do begin MajmoueSommeVersements_Clients:=MajmoueSommeVersements_Clients +FGSM.table8.FieldByName('Somme_Versée').AsCurrency; FGSM.table8.Next; end; sEdit20.Text:=CurrToStr(MajmoueSommeVersements_Clients); sEdit20.Text:=formatfloat('0.00',strtofloat(sEdit20.Text))+' DA'; sEdit21.Text:=floattostr(strtofloat(CurrToStr(MajmoueSommeVentes_Cesse)) - (strtofloat(CurrToStr(MajmoueSommeDettes_Clients)) - strtofloat(CurrToStr(MajmoueSommeVersements_Clients)) )); sEdit21.Text:=FormatFloat('0.00',StrToFloat(sEdit21.Text))+' DA';

قبل implementation نكتب :
كود :
(* Majmoo3e SommeSommeVentes_Cesse *) MajmoueSommeVentes_Cesse: Currency; RecordPlaceSommeVentes_Cesse: TBookmark ; (* Majmoo3e SommeDettes_Clients *) MajmoueSommeDettes_Clients: Currency; RecordPlaceSommeDettes_Clients: TBookmark ; (* Majmoo3e SommeVersements_Clients *) MajmoueSommeVersements_Clients: Currency; RecordPlaceSommeVersements_Clients: TBookmark ;



*
إقتباس : - المطلوب : هناك شبه كامل و واضح بالنسبة لهذا العمل و ما يلزم فعله على الصفحة Historique Fournisseur ، المطلوب استعمال Query8-9 على التوالي و اتمام مايلزم .

المطلوب رفقة ما تقدم طرحه ، كل شيء بالمرفقات.
في المرة القادمة نبدأ في الطباعة .

بالتوفيق.

.../ يتبع / ....


الملفات المرفقة
.rar   14_ GSM.rar (الحجم : 42.7 ك ب / التحميلات : 1,158)
الرد
#32
السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 11 أو الدرس الحادي عشر و الأخير من مشروع انجاز برنامج لتسيير المخزون و التسويق (GSM) .
الجزء1

الموضوع : الطباعة

للطباعة هناك عدة تقارير منها ماهو مجاني و منها العكس ، منها ماهو صعب و منها العكس ، و لعل أشهرها و أبسطها (و مجاني أيضا_مرفق مع الدلفي) هو QuickRep ، يأتي مع دلفي6 بشكل أوتوماتيكي بعد التنصيب ، و مع دلفي7 يتم إضافته.

الآن لدينا عدة أمور حسب مشروعنا تتطلب الطباعة أما أنا فسأكتفي بطباعة شيء واحد أو إثنين ، و الباقي بنفس الأسلوب هو مهمتك أنت.
سنقوم باتاحة امكانية طباعة الفاتورة.


نقوم أولا بانشاء فورم جديد نسميه ( FPrintFacture ) و احفظ السورس الخاص بها تحت نفس الإسم مع تبديل أول حرف F بــ U .على هذا الفورم أو الصفحة نضيف QuickRep1 ، نحدد هذا الأخير و نذهب للخواص ، هناك عدة خواص أهمها و التي سنستخدمها :

1- الخاصية Bands :
تضم هذه الأخير ستة أقسام للصفحة المراد طباعتها ، نقوم بتفعيلها كلها إلا الأخير (HasTiltle) ، إذن نفعل خمسة:
- HasPageHeader هذه الأخيرة أو En-Tete de page هي القسم العلوي من صفحة الطباعة و التي ستبقى تظهر في كل صفحات الطباعة يعني هذا القسم سنقوم عليه باضافة معلومات المؤسسة من هاتف و اسمها التجاري و العنوان و غير ذلك و ممكن اسم الزبون و رقم الفاتورة و التاريخ لنستطيع تمييز الصفحة الثانية بأنها تابعة للأولى فلا تختلط الأمور ، فإذا اشترى الزبون سلعا كثيرة في فاتورة واحدة حيث تمثلت الطباعة في صفحتين يبقى رأس الصفحة هذا يتكرر في الصفحة الأولى و كل مايليها من صفحات مطبوعة .

HasColumnHeader : أو En-Tete de colonne : من تسمية هذا الأخير فهو واضح مثل الذي سبق و لكن يخص هذا عنوان الحقل في الجدول و يتكرر أيضا في كل الصفحات .

- HasDetail : هو جسم و تفاصيل الصفحة يعني يربط مع محتويات الحقول في الجدول المراد طباعتها .
- HasSummary يعني الخلاصة Résumé و في هذا القسم نضع المبلغ الإجمالي و ما إلى ذلك و لا يظهر هذا القسم أثناء الطباعة إلا في الصفحة الأخيرة ، سواء كانت الطباعة متمثلة في صفحة أو أكثر .

- HasPageFooter يعني Bas de Page أسفل الصفحة و يتكرر هذا القسم في كل الصفحات مثل الأول الذي يتكرر بالأعلى ، هذا يتكرر بالأسفل و نضع فيه رقم الصفحة .


كان هاذا عن الخاصية Bands ، الآن تملئ هذه الأقسام كل حسب مايراه و يقوم بالتجميل و كأنه في الوارد باستعمال العناصر مثلا : QRLabel-QRDBtext- QRShape ، و لكي لا نخوض في كل شيء هذا المرفق أدناه به مشروع من فورم واحد فقط و يحتوي تقرير الطباعة يمكنك عمل مثله أو بزيادة فيه حسب ماتره مناسبا ، لكن المهم نتفق على تسمية العناصر باللون الأحمر و الأزرق نثل التي عندي ، لكي لا نختلف على أسمائها أثناء البرمجة.
[صورة: 21cysf8.jpg]
إذا كنت متمكنا من الأمر (تقريري كويكراب) يمكنك نسخه مباشرة بتحديده و الصاقه في مشروعنا على الصفحة أو الفورم FPrintFacture .

بالتوفيق

.../ يتبع /....


الملفات المرفقة
.rar   Dpr_QuickRep.rar (الحجم : 4.4 ك ب / التحميلات : 975)
الرد
#33
السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 11 أو الدرس الحادي عشر و الأخير من مشروع انجاز برنامج لتسيير المخزون و التسويق (GSM) .
الجزء 2

لازلنـا مع طباعة الفاتورة ، طيب الآن العنصر QuickRep1 يتعلق بالفاتورة ، و بيانات الفاتورة نجدها بكل تأكيد بــجدول المبيعات Vente و الذي جعلنا له في الفورم FFactureEtStatistique العنصر Query1 ، و على هذا يتوجب ربط QuickRep1 مع هذا الأخير ، يعني الخاصية DataSet للعنصر QuickRep1 نعطيها القيمة:
كود :
[COLOR=DarkRed]FFactureEtStatistique[/COLOR].Query1
لدينا العناصر QrLabel اسمها يدل عليها ، هي مثل العناصر Label فقط هي خاصة بـ Quickrep ، و لدينا العناصر QrDBText اسمها أيضا كفيل بشرحها يعني هي خاصة بـ QuickRep و هي متعلقة بقاعدة البيانات (DB يعني DataBase) و على هذا فهذه الأخيرة يتوجب ربها مع قاعدة معينة ، و بكل تأكيد يتم ربطها كما تم مع QuickRep1 عن طريق الخاصية DataSet و نعطيها نفس القيمة :
كود :
[COLOR=DarkRed]FFactureEtStatistique[/COLOR].Query1
يكون هذا مع كل العناصر الستة (QrDBText) و نحدد حقل كل واحد الذي يختلف عن غيره / مثلا QrDBText1 الذي يمثل رقم الفاتورة نعين الخاصية DataField باعطائها القيمة:
كود :
DataField=N_Fact
و نفس الشيء مع البقية .
ملاحظة : لانكتب يدويا N_Fact ، فقط بمجرد تحديد قيمة DataSet ، نتمكن بــ DataField من رؤية كل الحقول المتضمنة ، و سنجد حتمــا الحقل N_Fact أو إذا سميته باسم غير ذلك فستجده ، المهم تقوم بتحديد الحقل المناسب ، و إن لم تظهر الحقول فتفقد الخلل ، هذا لنكون منهجيين و نتدارك الخلل في حينه .

- بعد اتمام ما سلف نحدد العنصر QuickRep1 و من الحدث OnStartPage نكتب :
كود :
QrLabel001.Caption:=FFactureEtStatistique.query1.fieldbyname('Date_Vente').AsString; QrLabel002.Caption:=formatdatetime('yy',now)+' / '; QrLabel003.Caption:=FFactureEtStatistique.query1.fieldbyname('Code_Client').AsString; QrLabel004.Caption:=FFactureEtStatistique.query1.fieldbyname('Code_Com_C').AsString; QrLabel005.Caption:= FFactureEtStatistique.sEdit2.text +' DA'; QrLabel006.Caption:= FFactureEtStatistique.sEdit3.text +' DA'; QrLabel007.Caption:= FFactureEtStatistique.sEdit4.text +' DA'; QrLabel008.Caption:=formatfloat('0.00',strtofloat(FFactureEtStatistique.sEdit5.text)) +' DA' ; QrLabel009.Caption:=formatfloat('0.00',strtofloat(FFactureEtStatistique.sEdit6.text)) +' DA' ; QrLabel010.Caption:=FFactureEtStatistique.Memo1.text;
- في الزر sBitBtn2 الذي أعطيناه الكابشن Apercu L'impression ، في الفورم FFactureEtStatistique نكتب :
كود :
FPrint_Facture.QuickRep1.Preview;
لعرض تقرير الطباعة (موضوع العمل) .


- هذا ببساطة تقريبا كل شيء عن طباعة الفاتورة ، جرب لترى (قم ببيع مواد معينة لفاتورة جديدة بملأ الحقول ، ثم جرب موضوع الطباعة) .

المشروع إلى هذه المرحلة مرفق (فقط ملاحظة السكين و مجلد قواعد البيانات غير مرفق _ نظرا لادراجه مسبقا و تقليصا في حجم المرفق).

بالتوفيق.


.../ يتبع / ....


الملفات المرفقة
.rar   15_GSM.rar (الحجم : 58.15 ك ب / التحميلات : 1,638)
الرد
#34
السلام عليكم ورحمة الله
بارك الله لك أخي نبيل
مجهودك رائع يثمر عن موضوع أروع Smile
كمساهمة صغيرة، رأيت في التقرير عبارة:
كود :
Arrêter la présente facture à la somme de:
أحسن ما وجدت لتحويل الأرقام إلى حروف (بالفرنسية) هذه الدالة:
كود :
function NombreEnLettres(n: Integer): string; Const unite: array [1 .. 19] of string = ('un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix sept', 'dix huit', 'dix neuf'); dizaineF: array [2 .. 9] of string = ('vingt', 'trente', 'quarante', 'cinquante', 'soixante', '', 'quatre-vingt', ''); dizaineB: array [2 .. 9] of string = ('vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'septante', 'octante', 'nonante'); coefs: array [0 .. 3] of string = ('cent', 'mille', 'million', 'milliard'); Var temp: String; c, d, u: Integer; coef: Integer; I: Integer; neg: Boolean; Begin Result := ''; // Cas particulier de zéro If n = 0 then begin Result := ' zero'; Exit; end; // Mémorisation du signe neg := n < 0; If neg then n := -n; coef := 0; Repeat // Récupération de l'unité du bloc de trois chiffres en cours u := n mod 10; n := n div 10; // Récupération de la dizaine du bloc de trois chiffres en cours d := n mod 10; n := n div 10; // Traitement des dizaines temp := ''; // Passage sur la dizaine inférieure pour 10 à 19 // et pour 70-79 90-99 dans le cas de la France If (d = 1) Or ((d in [7, 9])) then begin Dec(d); Inc(u, 10); end; if d > 1 then begin temp := ' ' + dizaineF[d]; // Ajout du cas particulier de 'et' entre la dizaine et 1 if (d < 8) and ((u = 1) or (u = 11)) then temp := temp + ' et'; end; // ajout du texte de l'unité if u > 0 then temp := temp + ' ' + unite[u]; // ajout du 's' à Quatre-vingt si rien ne suit If (Result = '') and (d = 8) and (u = 0) then Result := 's'; Result := temp + Result; // Récupération de la centaine du bloc de trois chiffres en cours c := n mod 10; n := n div 10; { Récupère centaine } If c > 0 then begin temp := ''; if c > 1 then temp := ' ' + unite[c] + temp; temp := temp + ' ' + coefs[0]; // Traitement du cas particulier du 's' à cent si rien ne suit If (Result = '') and (c > 1) then Result := 's'; Result := temp + Result; end; // Traitement du prochain groupe de 3 chiffres if n > 0 then begin Inc(coef); I := n mod 1000; If (I > 1) and (coef > 1) then Result := 's' + Result; If I > 0 then Result := ' ' + coefs[coef] + Result; // Traitement du cas particulier 'mille' ( non pas 'un mille' ) If (I = 1) and (coef = 1) then Dec(n); end; until n = 0; Result := Trim(Result); // Ajout du signe en cas de besoin if neg then Result := 'moins ' + Result; End;
المميز فيها مراعاة دقيقة للقواعد النحوية الفرنسية والحالات الخاصة.
أيضا السرعة واختصار في الكود، غير أنها لا تأخذ الفواصل في الحسبان
المصدر: Developpez.com بتصرف (حذفت الجزء المتعلق بحالة استثنائية للفرنسيين).

ملاحظة: طرح أسئلتك في قسم الأسئلة، وأي سؤال خارج عن الموضوع هنا سيحذف، كما قد تحذف المشاركات التي لا تضيف إلى الموضوع
بالتوفيق أخي نبيل.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#35
السلام عليكم و رحمة الله تعالى و بركاته :

أخي العزيز أتينا الآن إلأى نهاية الطرح للدروس الخاصة بموضوعنا هذا ، و قد تتساءل أن المشروع غير مكتمل بعد؟
الجواب : تركت لك المبادرة بعد أن تم التعرف على الأساسيات لذلك ، فمثلا في موضوع الطباعة ، بعد تعرضنا لكيفية طباعة الفاتورة ، و شرح تقرير الطباعة المستخدم ، أكيد أنه صار بوسعك إكمال ماتبقى في هذا الشأن.
ملاحظة أخرى ممكن بشأن خاصية ملئ الشاشة و العكس في القائمة على الصفحة الرئيسية ، في هذا الصدد ممكن أن أدلك على هــــذا الرابط الذي سيغنيك عن أي طرح و شرح .
- لكتابة الصيغة الحرفية لمجموع قيم الحقول العددية (Memo1+2 في فورم الفاتورة) إليك هذا الرابط

ممكن أضيف نقطة أخرى مثلا جعل كل أو بعض الصفحات تتطلب كلمة مرور للعرض ، مثلا و تكون كلمة المرور تختلف عن غيرها ، يعني أنت مثلا يستعمل هذا البرنامج موظف لك لا تريده أن يطلع على صفحة الممونين أو صفحة المواد (المخزن) التي تتضمن تفاصيل الشراء و سعر شراء كل مادة ( مثال عن هذا الأمر بالذات بسيتم إرفاقه قريبا ) ، و ممكن تريد .... و تريد ....

أقول لك أخي الكريم لا يمكن لأحد الإحاطة بكل الإحتمالات الواردة و كل الإحتياجات إلا أنت في حد ذاتك ، لماذا ؟ بكل بساطة لأنك الأدرى بما تحتاج إليه و ماهو مطلوب منك لتضعه في يد زبونك.
أقصد أن نقطة البداية الحقيقية لك بدأت الآن و لابد لزاما أن تشمر عن ساعديك للجد و العلم و العمل .

الشيء الذي سيكون خاتمة الموضوع بالنسبة لي لأفسح المجال للأعضاء و الإخوة الأعزاء في إبداء آرائهم و نصائحهم و ملاحظاتهم و كذا العيوب و الأخطاء و تصحيحها ، لنتعلم منهم و تعم الفائدة ، هو البداية مني على عجالة بطرح ملاحظة أو تعليق هام :

- قواعد البيانات:
ممكن أهم ملاحظة أطرحها تتمثل في تكرار واضح في حقول الجداول من عير فائدة.
طيب سأعطي مثال للتضح الفكرة و تفهم أخي ماعليك عمله لتحصد فوائد لبرنامجك أهمها سرعة البرنامج خصوصا أثناء البحث و كذا توفير مساحة التخزين و التقليل من نسبة الوقوع في الخطأ.
المثــال: ليكن لدينا جدول للكتب بمشروع تسيير مكتبة مثلا ، به 3 حقول هي : رقم الكتاب-اسم الكتاب-اسم المؤلف . وجدول آخر للمؤلفين يتكون من حقلين : رقم المؤلف - اسم المؤلف .
سنركز على الجدول الأخير و كذا الحقل الأخير بالجدول الأول.
أثناء استغلال قاعدة البيانات ، تلاحظ أنه عليك أولا تحديد المؤلفين بالجدول الثاني ، بالنسبة للجدول الأول أي كتاب تقوم بادراجه يتطل منك الأمر كتابة اسم المؤلف لهذا الكتاب على أن يكون المؤلف ضمن المؤلفين لديك بالجدول الثاني .
ماذا نلاحظ : أولا حقل المؤلف في كلا الجدولين هو من النوع النصي ، يعني لابد عليك كتابة الإسم الكامل للمؤلف أثناء إدراجك لكتاب ما بالجدول الأول ، و مع العلم أنه يحتمل أن يكون لديك عدة كتب للمؤلف الواحد فإنه عليك في كل مرة كتابة اسم المؤلف ، ماذا سيترتب عن هذا ؟
- احتمال الوقوع في الخطأ : إذا كان لديك مثلا المؤلف (طه حسين) فإنك ستكرر كتابة هذا الإسم عدد الكتب التي لديك له ، و أيضا في كل مرة تقتني كتابا لهذا المؤلف ، ما يقربك للخطأ فتكتب مثلا (طه حسن) . افرض معي أنك اعتقدت أن اسمه كذلك و كررت هذا الإسم الخاطئ في كل كتبه ، كم من سجل عليك تعديل اسم المؤلف فيه ؟
- بطئ البحث في قاعدة البيانات: معلوم أن البحث في الحقول العددية أسرع منه في الحقول النصية ، ستقول و ما دخل هذا الأمر مادام لزوما سيكون اسم المؤلف من النوع النصي ؟ لكن تابع معي لتتضح الفكرة و الغاية .
- استهلاك مساحة تخزين أكبر : للعلم أنه فب الحقل النصي كل حرف يخزن في بايت واحد ، يعني (طه حسين ) 7 بايت باعتبار الفراغ ، و لو تكرر هذا الإسم معنـا 20 مرة مثلا فستكون مساحة التخزين 140 بايت ، بينما تخزين رقم يصل إلى 32000 يحتاج إلى 2 بايت فقط ، و لكن الأمر لن يقتصر على هذه الملاحظة فحسب لأن الحقل النصي لا بد أن تحجز له مثلا 25 حرفا ، مما يعني 25 بايت ، و إذا كان لديك بالمكتبة 2000 كتاب مثلا فستكون المساحة 2000*25 = 50000 بايت ، بينما لو كان الحقل عددي (2000*2 = 4000بايت) فقط ، و الفرق واضح.
* الحل ببساطة في الجدول الأول اسم المؤلف نجعله رقم المؤلف (حقل عددي) ، بحيث نكتب اسم المؤلف مرة واحدة بجدول المؤلفين ، و بجدول الكتب يتكرر المؤلف على اعتبار رقمه بجدول المؤلفين فقط ، يعني يربط كلا الجدولين عن طريق هذا الحقل ( و للطريقة و المزيد ابحث بالمنتدى) و هذه الطريقة تعرف بالتطبيع Normalization .
إذا استوعبت المثال و الفكرة فبامكانك التمعن في قواعد البيانات لمشروعنــا هذا ، و ستعرف ما عليك فعله .

و أكيد أن هناك ملاحظات و تعقيبات أخرى ، أفضل كرم الإخوة معنا هنا ، أو في في أقسام أخرى كما ترى إدرة المنتدى .
الرد
#36
ماهذا الخمول يا إخوان ، لم يتكرم إلى حد الساعة أحد بتدخلات و تعقيبات نافعة .

ليس كل الإخوة بطبيعة الحال ، لكني أرى الكثير لا يدخل و يتصفح إلا بحثا عما ينفعه و يريده فقط ، رغم أنه بوسعه أن ينفعنا بتدخلات و ملاحظات قيمة .

أتمنى ممن رأى في هذا العمل مجهودا ، أن يتفضل و يتكرم بالمشاركة.
الرد
#37
السلام عليكم و رحمة الله تعالى و بركاته
اخي نبيل اردت فقط المشاركة و شكرك على مجهودك
اطلعت على برنامجك و اردت اضافةهذا الكود الخاص بالتفقيط
كود :
Function Convert_ch_let(chiffre: real; SM: String): string; var tab_1_19 : array[0..19] of string[10]; tab_20_90: array[2..9] of string[20]; tab: array[1..5] of string[10]; ch_int: string[20]; ch, ch_r: string; i, fin_I : integer; Function result_1_99(ch: string): string; begin result_1_99 := ''; case strtoint(ch) of 0..19 : result_1_99 := tab_1_19[strtoint(ch)]; 20..99 : case strtoint(ch) of 20,30,40,50,60: result_1_99 := tab_20_90[strtoint(copy(ch,1,1))]; 21,31,41,51,61: result_1_99 := tab_20_90[strtoint(copy(ch,1,1))] + ' et' + tab_1_19[strtoint(copy(ch,2,1))]; 80: result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) ]; 70..79 : result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) - 1] + '-' + copy(tab_1_19[strtoint(ch) - 60],2,length(tab_1_19[strtoint(ch) - 60]) -1); 81..89 : result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) ] + '-' + copy(tab_1_19[strtoint(ch) - 80],2,length(tab_1_19[strtoint(ch) - 80]) -1); 90..99 : result_1_99 := tab_20_90[strtoint(copy(ch,1,1)) - 1] + '-' + copy(tab_1_19[strtoint(ch) - 80],2,length(tab_1_19[strtoint(ch) - 80])-1 ); else result_1_99 := tab_20_90[strtoint(copy(ch,1,1))] + '-' + copy(tab_1_19[strtoint(copy(ch,2,1))],2,length(tab_1_19[strtoint(copy(ch,2,1))]) -1); end; end; end; begin if length(floattostr(int(chiffre))) > 15 then // s'il y a autre chose après le Billion, alors remplacer le 15 par 18 begin messagedlg('Valeur incorrecte ',mtinformation,[mbok],0); exit; end; tab_1_19[0] := ''; tab_1_19[1] := ' un'; tab_1_19[2] := ' deux'; tab_1_19[3] := ' trois'; tab_1_19[4] := ' quatre'; tab_1_19[5] := ' cinq'; tab_1_19[6] := ' six'; tab_1_19[7] := ' sept'; tab_1_19[8] := ' huit'; tab_1_19[9] := ' neuf'; tab_1_19[10] := ' dix'; tab_1_19[11] := ' onze'; tab_1_19[12] := ' douze'; tab_1_19[13] := ' treize'; tab_1_19[14] := ' quatorze'; tab_1_19[15] := ' quinze'; tab_1_19[16] := ' seize'; tab_1_19[17] := ' dix-sept'; tab_1_19[18] := ' dix-huit'; tab_1_19[19] := ' dix-neuf'; tab_20_90[2] := ' vingt'; tab_20_90[3] := ' trente'; tab_20_90[4] := ' quarante'; tab_20_90[5] := ' cinquante'; tab_20_90[6] := ' soixante'; tab_20_90[7] := ' soixante-dix'; tab_20_90[8] := ' quatre-vingt'; tab_20_90[9] := ' quatre-vingt-dix'; tab[1] := ' cent'; tab[2] := ' mille'; tab[3] := ' million'; tab[4] := ' milliard'; tab[5] := ' billion'; ch_int := floattostr(int(chiffre)); ch_r := ''; fin_i := length(ch_int) div 3; if length(ch_int) > fin_i * 3 then begin ch := copy(ch_int,1, length(ch_int) - fin_i * 3); ch_r := result_1_99(ch); if (strtoint(ch) = 1) and (fin_i = 1) then ch_r := tab[fin_i + 1] else if length(ch_int) > 2 then ch_r := ch_r + tab[fin_i + 1]; end; For i := fin_i downto 1 do begin ch := copy(ch_int, length(ch_int) - i * 3 + 1 , 3); case strtoint(copy(ch,1,1)) of 0: ch_r := ch_r + result_1_99(copy(ch,1,1)); // dans le cas 0, on peut remplacer result_1_99(copy(ch,1,1)) par une chaine vide. C'est à dire ch_r := ch_r + ''; 1: ch_r := ch_r + tab[1]; // là aussi on peut mettre cent à la place de tab[1] else ch_r := ch_r + result_1_99(copy(ch,1,1)) + tab[1]; end; if (i = 2) and (strtoint(ch) = 1) then // pour le cas de: par ex 125001489 ch_r := ch_r + copy(result_1_99(copy(ch,2,2)),3,length(result_1_99(copy(ch,2,2))) - 3 ) else ch_r := ch_r + result_1_99(copy(ch,2,2)); if (i > 1) and (strtoint(ch) > 0) then ch_r := ch_r + tab[i]; end; if SM <> '' then begin ch_r := Uppercase(copy(ch_r,2,1)) + copy(ch_r,3,length(ch_r) - 2) + SM; if frac(chiffre) > 0 then ch_r := ch_r + ', et ' + copy(floattostr(frac(chiffre) + 1.005 ),3,2) + ' cts.'; // le 1.005 pour obtenir le bon resultat, enlever le et essayer avec les montants suivants: par ex 15,20 ou 147,50 end; Convert_ch_let := ch_r; end;

كود :
procedure TForm1.DBEdit1Change(Sender: TObject); begin If (DbEdit15.text = '') then // si la chaine S est vide Erreur begin Application.MessageBox('Veuillez Saisir une somme d''abord.', 'Erreur: Rien à convertir !',mb_IconError+mb_Ok); end else DbEdit17.text := Convert_ch_let(strtofloat(DbEdit15.text),' Dinars'); end; end.
الرد
#38
السلام علكيم ورحمة الله وبركاته
تحية طيبة وبعد
شرح وافى وقوى جدا
حاولت ان استخدم مكون الskins المرفق فى بداية المشروع ولكن بشتى الطرق لم يعمل معى الا بعد ان قمت بتنزيل النسخة الجديدة هذه:
كود :
http://www.alphaskins.com/sfiles/alite.zip
اشكرك جدا انا بدات اتابع الموضوع وربنا يسهل ان شاء الله ويكون فيه استفسارات ومشركات قد تكون فعالة
ما يؤخرنى هو انى لا اجيد الفرنسية
ولكن مع البحث واستخدام المترجمات قد نصل الى المراد
شكرا لك حبيب قلبى واتمنى ان يكون هناك قاعدة بيانات portable لتسهيل نقل البرامج
شكرا لك وان شاء الله لنا عودة
الرد
#39
السلام عليكم ورحمة الله وبركاته
تحية طيبة وبعد
وصلت الى ربط قاعدة البانات وكل شئ على ما يرام (انشات جدول للمنتجات فقط وذلك لصعوبة الترجمة من الفرنسية لاسماء الحقول )

إقتباس :تظهر لكل كل الجداول تقوم بتحديد produit.db ، و أخيرا active تعطيها true .
هل يعنى هذا اننا بمجرد نقل الملف التنفيزى ووضع قاعدة البيانات فى المسار المحدد مسبقا هل سيعمل بدون الحاجة الى تثبيت برامج اضافية تهتم بقاعدة البيانات الخاصة بنا ؟؟
انتظر منك الاجابة
الرد
#40
سيعمل بجهازك فقط ، لتوفر محرك قواعد البيانات ، و أي جهاز آخر لا يتوفر عليه ، لن يعمل
قضية إنشاء setup للبرنامج (تجميعه ليصبح يتنصب في أي جهاز و يعمل عادي ) هذا أمر آخر ، ابحث في المنتدى عن
InstallShield

بالتوفيق
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم