الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية تسجيل الرصيد في كشف الحساب ؟

بدأه Sozana في 2 مايو 2008 · 16 رد · 3,012 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أرجو من الأخوة الأكارم مساعدتفي في تنقيح طريقة إظهاري لكشف الحساب في برنامج محاسبي بسيط لحسابات الزبائن

حيث أني قد قمت بصنع جدول للحركات المالية اسميته Inv يحوي رقم الفاتورة او الدفعة وقيمة الفاتورة او الدفعة ورقم الزبون كما قمت بإضافة الرصيد لكل سجل

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

في المرفقات البرنامج بشكله البدائي للعمليات الأساسية فيه

أرجو إرشادي إلى أية أخطاء أو هفوات برمجية داخله من أصحاب العقول والقلوب النيرة

ولكم جزيل الشكر

عملية حساب وتسجيل الرصيد

function Get_Clint_balanc(Clint_id:integer):integer;
var
bal :integer;
begin
Result:=0;
bal:=0;

inv_.DisableControls;
inv_.First;
while not inv_.Eof do
if inv_cust_id.AsInteger =Clint_id then
begin
bal := bal+ inv_inv_value.AsInteger - inv_pay_val.AsInteger;
inv_.Edit;
inv_balanc.AsInteger := bal;
inv_.Post;
inv_.next;
end
else inv_.next;

Result:=bal;
inv_.EnableControls;

end;

عملية إدخال الفاتورة

procedure Tfm_inv.New_inv(numb:integer;inv_dat:real;custom_nam:string;custom_id,valu:integer);
var
bal:integer;
begin

if  numb >0 then
if  not daba.Inv_.Locate('inv_id',numb,[]) then
with daba do
begin
   bal:= Get_Clint_balanc(custom_id);
   Inv_.Insert;
   inv_inv_id.AsString := IntToStr( numb );
   inv_date.AsString := DateToStr(inv_dat);
   Inv_cust_id.AsInteger := custom_id;
   Inv_cus_name.AsString := custom_nam;
   inv_inv_value.AsInteger := valu;
   inv_desc.AsString:='Invoice';
   inv_balanc.AsInteger:=bal+valu;
   Inv_.Post;
end

end;

عملية إدخال الدفعة

procedure Tfm_pay.New_pay(numb:integer;pay_dat:real;custom_nam,bank,chiq_dat,chiq_num,desc:string;custom_id,valu:integer);
var
bal:integer;
begin

if numb >0 then
if  not daba.inv_.Locate('Pay_id',numb,[]) then
with daba do
begin
   bal:= Get_Clint_balanc(custom_id);
   Inv_.Insert;
   inv_pay_id.AsString   := IntToStr(numb);
   Inv_date_real.AsFloat := pay_dat;
   inv_date.AsString	 := DateToStr(pay_dat);
   Inv_cust_id.AsInteger := custom_id;
   Inv_cus_name.AsString := custom_nam;
   inv_pay_val.AsInteger  := valu;
   inv_chiq_num.AsString := chiq_num;
   inv_chiq_dat.AsString := chiq_dat;
   inv_chiq_bank.AsString :=bank;
   inv_desc.AsString :=desc;
   inv_balanc.AsInteger:= bal - valu ;
   Inv_.Post;
end;

end;

عملية إظهار كشف الحساب

 daba.q_stat.Close;
 daba.q_stat.sql.Clear;
 daba.q_stat.sql.add('SELECT inv.*,custm.name from inv,custm where inv.cust_id=custm.id'+' and inv.cust_id ='+edb_id.text );
 daba.q_stat.open;

custmer_2.5.08.rar

#2

السلام عليكم الصورة توضح كيف ان شاء حقل خيالي حسابي كما انه يمكن انشاء نوعين اخرين الاول حقل عادي والثاني ياخد قيمة من جدول اخر مرتبط به على العموم لحساب الحقول المحسوبة

في الحدث CalcFields نقوم بكتابه الكود

مثلا

procedure TDaba.clintCalcFields(DataSet: TDataSet);
begin
 clintCalc.Value:=clintnum.Value * 10;
end;

post-1034-1209719138_thumb.jpg

#3

شكرا لك أخ زكيري

ولكن لم أعرف كيف ستحل مشكلتي بطريقتك تلك وانت لم توضح طريقة الحل

أرجو من الأخوة الاكارم الراغبين بمساعدتي فتح المرفقات وتطبيق حلهم على البرنامج فهذه هي الغاية من إرفاقه

بحثت في المنتديات البرمجية الأخرى ورأيت ما أظن أنه الحل لمشكلتي ولكني اواجه صعوبات فيها لا اعرف اسبابها

الحل اللذ رأيته هومن خلال الاستعلام نفسه بوضع حقل لمجموع حقل ما

ولكن تظهر لي مشاكل متعددة وأخطاء لم أفهم سببها

الاستعلام هو كالتالي

daba.q_stat.sql.add('SELECT inv.*,custm.name,SUM(inv.balanc) as "Total" from inv,custm where inv.cust_id=custm.id'+' and inv.cust_id ='+edb_id.text);

ولكنه يعمل ويظهر الرصيد كخلية واحدة فقط عند وضع الاستعلام كالتالي

 daba.q_stat.sql.add('SELECT SUM(balanc) as "Total" from inv where cust_id ='+edb_id.text );

لا أعرف لم لا يقبل إضافة أي عامود آخر اليه كرقم الفاتورة والدفعة وتاريخها ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

ملاحظة قاعدة البيانات أكسيس

تم تعديل هذه المشاركة بواسطة Sozana في 3 مايو 2008 في 09:29

#4

ملاحظة بسيطة يجب على المبرمج إضافة كافة الحقول كما في الصورة ولايمكنه اضافة حقل جديد قبل ذلك

<FONT size=7><FONT color=#9932cc>

رغـــــــــــــ,,,ــــــــــدونة

<DIV align=center>

#5

توصلت لهذا الاستعلام

ولكن يبدو أنه لا يقوم بإظهار المجموع للعمود ضمن تعليمة Sum بل لرقم فاتورة واحدة او تاريخ واحد

'SELECT inv_value,SUM(inv.balanc) As TotalBalance from inv where inv.cust_id='+edb_id.text +' group by inv_value'

لا أدري أن كان طلبي قد توضح حتى الآن

كل ما أطلبه هو الحصول على الشكل التالي لإظهار الرصيد ولكن لم أحصل منكم على هذا الجواب أرجو ممن لديه الخبرة ببرامج المحاسبة الرد

post-148004-1209816248_thumb.jpg

تم تعديل هذه المشاركة بواسطة Sozana في 3 مايو 2008 في 15:04

#6

الأخت العزيزة

أرجو أن أكون قد فهمت المطلوب

يمكنك تجريب الأتي

procedure TForm1.Button1Click(Sender: TObject);

var a:integer;

begin

عمل فلترة على الجدول بحيث يكون التاريخ يساوي تاريخ اليوم الحالي

Table1.Filtered :=false;

Table1.Filter :='dat ='''+datetostr(now)+'''';

Table1.First ;

Table1.Filtered :=true;

Table1.First ;

a:=0;

while Table1.Eof =false do

begin

جمع قيم كل خلية بعد الفلترة في عمود الرصيد مع ملاحظة أن قيمة العامود هي نص

a:=a+strtoint(Table1.FieldValues['total']);

Table1.Next ;

end;

edit1.Text :=inttostr(a);

end;

يمكنك عمل هذه العملية على أحد الجداول و أخذ القيمة و وضعها في جدول أخر

أرجوك أعذريني إن كان فهمي خاطئ و أرجو منك الإيضاح أكثر إن لم أكن قد أصبت

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#7

الأخوة الأكارم

يبدو أن الموضوع لم يتوضح للآن

لدي الجدول رقم 1 فيه البيانات التالية قيمة الدفعة ورقمها وقيمة الفاتورة ورقمها كل ما ابغيه إضافة عامود الرصيد بحيث يبين الرصيد بعد كل حركة ليصبح الجدول كالجدول رقم 2

هل هناك طريقة للحصول على الجدول رقم 2 عن طريق إستعلام SQL أو غير الطريقة اللتي أوردتها في البرنامج الموجود في المرفقات

post-148004-1209884088_thumb.jpg

post-148004-1209884106_thumb.jpg

#8

الأخت الكريمة يرجى مراجعة الكود و ملاحظة النتيجة

البداية ستكون على شكل الصورة رقم 1

و عند الأدخال في الجدول الأول و الضغط على الزر تكن النتيجة هي الصورة رقم 2

الصور موجودة بالمرفقات

procedure TForm1.Button1Click(Sender: TObject);
var a1,a2,a3,a4:integer;
begin
table1.Post ;
//أختبار في حال كان التشغيل لأول مرة
if table2.RecordCount =0 then
begin
table1.Last ;
table2.Last ;
a1:=strtoint(table1.FieldValues ['pay']) ;
a2:=strtoint(table1.FieldValues ['invoice']) ;
//وضع قيمة مبدأية لأول خلية في جدول الرصيد نظرا لعدم وجود قيمة فيه في البداية
a3:=0;
a4:=a3+a2-a1;
table2.Insert ;
table2.edit ;
//وضع القيمة الجديدة في أول خلية للرصيد عند إضافة أول بند في الجدول الأول
table2.FieldValues ['balance'] :=inttostr(a4) ;
table2.Post ;
end
else
begin
table1.Last ;
table2.Last ;
a1:=strtoint(table1.FieldValues ['pay']) ;
a2:=strtoint(table1.FieldValues ['invoice']) ;
a3:=strtoint(table2.FieldValues ['balance']) ;
a4:=a3+a2-a1;
table2.Last ;
table2.Insert ;
table2.FieldValues ['balance'] :=inttostr(a4) ;
table2.Post ;
end;
end;
[code/]
أرجو أن أكون قد أصبت في هذه المرة
المرفقات
1.JPG2.JPG

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#9

أخي الكريم روبر

إن راجعت الكود اللذي في أول الموضوع سترى أني أتبعت هذه الطريقة وحصلت على النتيجة اللتي في الصورة الثانية ويمكنك أجراء تجربة على البرنامج المرفق لترى أن الرصيد يسجل بطريقة صحيحة

ولكن ما أرغب به هو عدم الكتابة في الجدول لأن هذا غير منطقي بنظري وغير أحترافي أن اكتب كل مرة إدخال أو تعديل على فاتورة أو الدفعة في كامل الجدول

لذا فأنا أبحث عن كود لا يجعلني أكتب في كامل الجدول

والحل أظن سيكون بأحد أتجاهين :

1- استعلام SQL

2- حقل حسابي يضاف للاستعلام او للجدول ( الاخ زكيري شرح طريقة إضافته ولم يشرح طريقة إظهار الرصيد؟؟؟)

تم تعديل هذه المشاركة بواسطة Sozana في 5 مايو 2008 في 09:35

#10

أختي سوزانة ,,,,,,,,,,,,,,,

ممكن تعملي استرجاع لرقم السجل

وبعدينتعملي حلقة من بداية الجدول وحتى الرقم المسترجع لرقم السجل ناقص واحد وفي الحلقة هذه قومي بجمع عمود قيمة الفاتورة وعمود قيمة الدفعة وفي النهاية اطرحيهم من بعض ليوضع في حقل الرصيد

جربي هذه الفكرة والله غير أن خط الانترنت عندي شبه ميت وإلا كنت نزلت مرفقاتك وحاولت تطبيقها عليها.

تحياتي

رغدونة

سلام سلام

<FONT size=7><FONT color=#9932cc>

رغـــــــــــــ,,,ــــــــــدونة

<DIV align=center>

#11

أختي رغدونة

الأخوة الأكارم

الطريقة اللتي تقولينها هي التي موجودة في البرنامج المرفق هذا ما قلته واقوله في كل تعقيب

الطريقة التي طبقتها تقوم على اساس البدء من اول سجل لاخر سجل وكتابة الرصيد في كل سجل في عمود الرصيد عن طريق اضافة الفاتورة او انقاص الدفعة من الرصيد في السجل السابق

ولكن هذه الطريقة تعني أني يجب أن اقوم بالكتابة وتحرير كل السجلات التابعة لزبون ما عند كل اضافة او تعديل على كل فاتورة او دفعة وهذا لا أرى أنه طريقة أحترافية

الرجاء ممن يملكون خبرة احترافية في مجال البرامج المحاسبية إرشادي أن كانت هناك طريقة تعتمد على أو - استعلام SQL

أو حقل حسابي يضاف للاستعلام او للجدول

وللكل من شارك برأيه جزيل الشكر والتقدير وأنتظر ردا من المشرفين السيد وائل والسيد B.M.AbdelAziZ على أمل أن يكون لديهم فكرة عن الحل

تم تعديل هذه المشاركة بواسطة Sozana في 5 مايو 2008 في 21:33

#12

السلام عليكم

الأخت الكريمة أعتذر عن سوء الفهم لكن الفكرة غير كاملة

المطلوب هو عمل كشف حساب لكل عميل على حدى و حساب الرصيد الكامل لكل واحد ؟؟؟؟؟؟؟؟؟؟؟

تم تعديل هذه المشاركة بواسطة rober في 6 مايو 2008 في 01:11

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#13

هل لحد الآن السؤال لم يتوضح

سابسط المسألة لأخر حد

لدي جدول ليس فيه الا عمودان عمود فيه قيمة الفواتير وعمود فيه قيمة الدفعات وليس لدي الا هذا الزبون (الجدول المبين في الصورة 1)

أريد الحصول على الرصيد بعد كل حركة في عمود ثالث وهذا العمود أريد أن لايكون من أصل الجدول الاساسي لان الجدول الاساسي فيه فقط عمودان

أي يجب أن يكون العمود الثالث من أنتاج استعلام SQl أو عن طريق إضافة حقل تخيلي حسابي يوضع فقط للحساب وليس للتخزين !!!!!!!!!!

أرجو أن تكون توضحت الفكرة

post-148004-1210060444_thumb.jpg

post-148004-1210060453_thumb.jpg

تم تعديل هذه المشاركة بواسطة Sozana في 6 مايو 2008 في 10:54

#14

بعد اطلاع سريع على الجداول يمكن عمل analsis بطريقة مختلفة وافضل

كان تضعي الدفعات بجدول منفصل ! واستعمال تعليمة In لتجلب الداتا من التيبل الاخر

على العموم لحل المشكل يمكن استعمال تقنيا sql في الحل بدون الدخول في تفاصيل كثيرة

مارايكم بعمل التالي

SELECT custm.name, inv.chiq_dat,SUM(inv.inv_value)-sum(inv.pay_val)  as "Total" from inv,custm group by custm.name ,inv.chiq_dat

يمكن ايضا الاستغناء عن customer name بعمل inner join لل tables

نصيحتي قومي بعمل normalizationg لل tables وستصبح الامور اسهل بكثير واوضح

#15

شكرا لك أخ رضا على ردك

بالنسبة للاستعلام اللذي وضعته فأنه لايقوم بحل المشكلة ولا يحصل على المطلوب

بالنسبة للnormalization ستكون هذه خطوة قادمة إن شاء الله ولكن مشكلتي الآن ليست في ال normalization والأمور واضحة لا أعرف لماذا للآن لم تتوضح

اعتبرو أن كل ما لديكم هو جدول فيه المصروفات والمقبوضات نريدعمود أخر للحركات بعد كل قبض أو صرف ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

لقد يأست من إيجاد الحل وأظن أني سأستغني عن عمود الرصيد هذا في النهاية ولكن هل فعلا لايوجد حل في الSQL لهذا الأمر ؟؟؟أو أن خبراء ال SQL وقواعد البيانات بخلاء علينا به ؟

تم تعديل هذه المشاركة بواسطة Sozana في 7 مايو 2008 في 12:08

#16

الأخت الكريمة أنظري الرابط لعل فيه ما تطلبين

http://www.techonthenet.com/sql/sum.php

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#17

شكرا جزيلا لجميع من أهتم بالموضوع

والحمد لله بعد جهد وبحث وتجارب كثيرة حصلت على الجواب الشافي اللذي أود أشراككم به وأرجو أضافته إلى منتدى قواعد البيانات لان أحد هناك أيضا لم يجبني على سؤالي

الحل هو الاستعلام التالي

Select cust_id,inv_id,pay_id,inv_value,pay_val,(SELECT SUM(inv.inv_value-inv.pay_val) AS Total From inv where inv.id<= T1.id and inv.cust_id=t1.cust_id) AS Total From inv as T1 where t1.cust_id='+edb_id.text;

وأكرر شكري الجزيل لجميع الأخوة لكل من أبدى أهتماما بالموضوع

post-148004-1210235514_thumb.jpg

تم تعديل هذه المشاركة بواسطة Sozana في 8 مايو 2008 في 11:31

مواضيع مشابهة