04-03-2017, 11:02 PM (آخر تعديل لهذه المشاركة: 05-03-2017, 02:27 AM بواسطة Admin.)
السلام عليكم اخواني،
عند الغاء التسجيل من فاتورة ، أريد أن يرجع الكمية المحذوفة الى جدول المواد المخزنة؟؟؟؟؟
ما الخطأ في السورس لأنه يتوقف البرنامج عند الضغط على زر الحذف التسجيل من جدول الفاتورة
كود :
if spSkinMessage.messagedlg('Recuperer les quantité du stock?',mtconfirmation,[mbyes,mbno],0)=mryes then
begin
TArticleX4.First;
while not TArticleX4.eof do
begin
if (TArticleX4.fieldbyname('Désignation_Art').asstring=TLigne_Comptoire.FieldByName('Designation_LC').asstring) then
begin
TArticleX4.Edit;
TArticleX4.FieldByName('Quantité_Art').asinteger:=TArticleX4.FieldByName('Quantité_Art').asinteger-
TLigne_Comptoire.FieldByName('Qte_LC').asinteger;
TArticleX4.Post;
TArticle.Refresh;
Break;
end;
end;
TArticleX4.Next;
end;
وعليكم السلام ورحمة الله وبركاته ،
أظن أن حلقة التكرار تكون على مستوى جدول الفاتورة و ليس جدول المواد.
كود :
While Not
[code]TLigne_Comptoire.eof do
begin
....
.....
.....
TLigne_Comptoire.next
end;
[/code]
كود :
لاحظ أيضا أن القيمة المرجعة تكون بالزائد و ليس ناقص :
Article.qte := Article.qte + TLigne_Comptoire.qte
ثم أنني لم أفهم وظيفة Break
و حبذا لو تعيطنا نوع قاعدة البيانات المستعملة.
بالتوفيق.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك. تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
بسم الله الرحمن الرحيم
الصلاة والسلام على رسول الله
جرب هذا المثال : ربما تجد الحل
كان جوابي حسب الكود الذي وضعته
ولكن تقوم ببعض تغيرات فقط كي تستطيع تطبيقيه
على قاعدة البيانات التي تعمل عليها
كود :
unit Bachirsoft;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;
type
TForm1 = class(TForm)
Button1: TButton;
TArticleX4: TTable;
TLigne_Comptoire: TTable;
TArticle: TDBGrid;
Query1: TQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DataSource2: TDataSource;
Table1: TTable;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin //spSkinMessage.
if messagedlg('Recuperer les quantité du stock?',mtconfirmation,[mbyes,mbno],0)=mryes then
begin
TArticleX4.DisableControls; // من أجل تسريع
TLigne_Comptoire.DisableControls;
try
TLigne_Comptoire.First;
while not TLigne_Comptoire.eof do
begin
TArticleX4.First;
while not TArticleX4.eof do
begin
if TArticleX4.fieldbyname('Designation_Art').asstring=
TLigne_Comptoire.FieldByName('Designation_LC').asstring
then
begin
TArticleX4.Edit;
TArticleX4.FieldByName('Quantite_Art').asinteger:=
TArticleX4.FieldByName('Quantite_Art').asinteger-
TLigne_Comptoire.FieldByName('Qte_LC').asinteger;
TArticleX4.Post;
TArticle.Refresh;
Break; //الخروج من الحلقة عند أول تساوي للكميتين
// اذا كنت تريد مقارنة عدة قيم أقف عمل
// Break;
TArticleX4.Next; // يضع داخل شرط وخارج شرط
end;
TArticleX4.Next; // يضع داخل شرط وخارج شرط
end; // وداخل الحلقة;
TLigne_Comptoire.Next; // وداخل الحلقة
end;
finally
TArticleX4.EnableControls;
TLigne_Comptoire.EnableControls;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if not fileExists('fat_LC.db') then
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('CREATE TABLE "fat_LC.db"(Designation_LC CHAR(20),Qte_LC CHAR(20))');
Query1.ExecSQL;
end;
if not fileExists('fat_Art.db') then
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('CREATE TABLE "fat_Art.db"(Designation_Art CHAR(20),Quantite_Art CHAR(20))');
Query1.ExecSQL;
end;
Query1.Close;
if (fileExists('fat_Art.db'))and(fileExists('fat_LC.db')) then
begin
TArticleX4.TableName := 'fat_Art.db';
TLigne_Comptoire.TableName := 'fat_LC.db';
DataSource1.DataSet := TArticleX4;
DataSource2.DataSet := TLigne_Comptoire;
TArticle.DataSource := DataSource1;
dbgrid1.DataSource := DataSource2;
TArticleX4.Open;
TLigne_Comptoire.Open;
end;
end;
end.
خطأ في الكود السابق
يضع خارج شرط في هذه الحالة
لأنه شرط بسيط أي غير متعدد
كود :
..
....
TArticleX4.DisableControls; // من أجل تسريع
TLigne_Comptoire.DisableControls;
try
TLigne_Comptoire.First;
while not TLigne_Comptoire.eof d
begin
TArticleX4.First;
while not TArticleX4.eof do
begin
if TArticleX4.fieldbyname('Designation_Art').asstring=
TLigne_Comptoire.FieldByName('Designation_LC').asstring
then
begin
TArticleX4.Edit;
TArticleX4.FieldByName('Quantite_Art').asinteger:=
TArticleX4.FieldByName('Quantite_Art').asinteger-
TLigne_Comptoire.FieldByName('Qte_LC').asinteger;
TArticleX4.Post;
TArticle.Refresh;
//Break; //الخروج من الحلقة عند أول تساوي للكميتين
// اذا كنت تريد مقارنة عدة قيم أقف عمل
// Break;
//TArticleX4.Next; //أوقف هذا لأنه خاطئ
end;
TArticleX4.Next; // يضع خارج شرط في هذه الحالة
end; // وداخل الحلقة;
TLigne_Comptoire.Next; // وداخل الحلقة
end;
finally
TArticleX4.EnableControls;
TLigne_Comptoire.EnableControls;
end;
..
.