كود للترقيم برمجيا حسب كل مجموع (للتعديل)
#1
السلام عليكم ورحمة الله تعالى وبركاته
فيما يتعلق بإضافة ترقيم برمجيا حسب كل مجموع شريطة ان لايتجاوز الترقيم 5 حتى ولوكانت المجموعة تحتوي على اكثر من 5
يعني اذا كانت المجموعة تساوي 10 سجلات فالخمسة الاولى تكون من 1 الى 5
والخمسة الثانية تكون من 1 الى 5
وهذا هو الكود للتعديل عليه بارك الله فيكم
كود :
Var D500,D501,D000, R500,R501,R000: Word;   sga1,sga2: string;   sgb1,sgb2: string;   sgc1,sgc2: string; begin D500:=0; D501:=0; D000:=0; R500:=0; R501:=0; R000:=0;   With Dm do   Begin     Tab1.Open;     Tab1.First;     Tab1.DisableControls;     while not Tab1.Eof do     begin       if (Tab1Grp.Text = '500')and(Tab1Tpe.Text ='A') then       begin           sga1 := Tab1Opt.Text;           if (sga1 <> sga2) then D500 := D500 + 1;           Tab1.Edit;           Tab1Cln.Value := D500;           Tab1.Post;           sga2 := sga1; اذا كانت قيمة هذا الحقل تصل الى اكثر من 5 سجلات بنفس القيمة يكون الترتيب المطلوب من 1 الى 5 لكل  خمس سجلات       end       else if (Tab1Grp.Text = '500')and(Tab1Tpe.Text ='B') then       begin           sgb1 := Tab1Opt.Text;           if (sgb1 <> sgb2) then R500 := R500 + 1;           Tab1.Edit;           Tab1Cln.Value := R500;           Tab1.Post;           sgb2 := sgb1; اذا كانت قيمة هذا الحقل تصل الى اكثر من 5 سجلات بنفس القيمة يكون الترتيب المطلوب من 1 الى 5 لكل  خمس سجلات            end       else if (Tab1Grp.Text = '501')and(Tab1Tpe.Text = 'A') then       begin           sga1 := Tab1Opt.Text;           if (sga1 <> sga2) then D501 := D501 + 1;           Tab1.Edit;           Tab1Cln.Value := D501;           Tab1.Post;           sga2 := sga1; اذا كانت قيمة هذا الحقل تصل الى اكثر من 5 سجلات بنفس القيمة يكون الترتيب المطلوب من 1 الى 5 لكل  خمس سجلات            end       else if (Tab1Grp.Text = '501')and(Tab1Tpe.Text = 'B') then       begin           sgb1 := Tab1Opt.Text;           if (sgb1 <> sgb2)then R501 := R501 + 1;           Tab1.Edit;           Tab1Cln.Value := R501;           Tab1.Post;           sgb2 := sgb1; اذا كانت قيمة هذا الحقل تصل الى اكثر من 5 سجلات بنفس القيمة يكون الترتيب المطلوب من 1 الى 5 لكل  خمس سجلات            end       else       begin           sgc1 := Tab1Opt.Text;           if (sgc1 <> sgc2) then D000 := D000 + 1;           Tab1.Edit;           Tab1Cln.Value := D000;           Tab1.Post;           sgc2 := sgc1;           sgc1 := Tab1Opt.Text;           if (sgc1 <> sgc2) then R000 := R000 + 1;           Tab1.Edit;           Tab1Cln.Value := R000;           Tab1.Post;           sgc2 := sgc1;       end;       Tab1.Next;     end;     Tab1.EnableControls;   end;
الرد
#2

السلام عليكم
لو ارفقت مثال به قاعدة البيانات بشيئ من البيانات احسن حتى يمكن التجربية
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
الرد
#3
شكرا على المرور
اليكم المرفق للتعديل

[attachment=4063]
الرد
#4

صراحة لم افهم جيدا ما تود القيام به،
جرب اعادة المتغيرات الى صفر مباشرة بعد
Tab1.Next
كود :
Tab1.Next; if D500>=5 then D500:=0; if D501>=5 then D501:=0; if D000>=5 then D000:=0; if R000>=5 then R000:=0; if R501>=5 then R501:=0; if R500>=5 then R500:=0; if C500>=5 then C500:=0; if D501>=5 then D501:=0; if C000>=5 then C000:=0; if H500>=5 then H500:=0; if H501>=5 then H501:=0; if H000>=5 then H000:=0;
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
الرد
#5
أضف إلى برنامجك TABSquery و سمها AQuery1

الكود الجديد
PHP كود :
var
  i: integer;
begin
  DM
.AQuery1.Close;
  DM.AQuery1.SQL.Text := 'select distinct grp, tpe from dequipbp;';
  DM.AQuery1.Open;
  DM.AQuery1.DisableControls;
  DM.AQuery1.First;
  DM.Tab1.DisableControls;
  while not DM.AQuery1.Eof do
  begin
    DM
.Tab1.Filter := 'Grp=' + quotedStr(DM.AQuery1grp.AsString) + ' and Tpe=' +
      quotedStr(DM.AQuery1tpe.AsString);
    DM.Tab1.Filtered := True;
    DM.Tab1.First;
    i := 1;
    while not DM.Tab1.Eof do
    begin
      DM
.Tab1.Edit;
      if i < 6 then
      begin
        DM
.Tab1my.Value := inttostr(i);
        i := i + 1;
      end
      
else
      begin
        DM
.Tab1my.Value := inttostr(1);
        i := 2;
      end;
      DM.Tab1.Post;
      DM.Tab1.Next;
    end;
    DM.AQuery1.Next;
  end;
  DM.Tab1.Filtered := false;
  DM.Tab1.EnableControls;
  DM.Tab1.IndexName := 'Grp';
  DM.AQuery1.Close;
end; 
الرد
#6
بارك الله فيكم
لكن هناك مشكلة
اولا ماذا تقصد بـ Tab1my.value
ثانيا
لايقبل تحويل المتغير inttostr(i)
ثالثا
يشير الى الحق Opt على انه غير موجود
وعندما احذفه من داخل aquery1 يتحول الى الحقل الذي بعده ويشير الى انه هو ايضا غير موجود
هل الكود الذي وضعته يوضع داخل SQL
ام يوضع في زر
ام يضاف الى الكود الاول
واذا كان الكود في زر
ماهي التعليمة او الكود التي توضع داخل SQL
جزاكم الله عنا كل خير
الرد
#7
[size=small]السلام عليكم ورحمة الله تعالى وبركاته[/size]
[size=small][size=small]اسف على تكرار المشاركة اذا كان سبب السحب هو التكرار[/size]
[size=small]اعذروني لم انتبه قد نسيت وفي الأخير انا بشر اصيب واخطأ[/size]
جمعة مباركة انشاء الله تقبل الله منا ومنكم صالح الاعمال
وبعد
كل ما احتاجه هو كيف لي ان اضع ترقيم برمجي الى مجموعة حسب شرط معين كما يلي :
اولا لدي جدول Table1 يتكون من 6 حقول
Grp  من نوع String
Cat من نوع String  هذا الحقل يخضع للحقل Grp  مع قيمة الحقل Tpe ‘A’ او ‘B’
Tpe من نوع String  وهذا الحقل يأخذ قيمتان لا اكثر القيمة ‘A’  و القيمة ‘B’
Num من نوع Smallint
Pge من نوع  Smallint
Lgn من نوع  Smallint  هذا الحقل يخضع للحقل  Cat  مع قيمة الحقل Tpe  ‘A’ أو ‘B’
المطلوب :
1- ترتيب قيمة الحقل Cat من الأصغر الى الأكبر  مع قيمة الحقل Tpe ‘A’
2- ترتيب قيمة الحقل Cat من الأصغر الى الأكبر  مع قيمة الحقل Tpe ‘B’
3- ترقيم برمجي لقيمة الحقل Lgn  حسب قيمة الحقل Cat من الصغر الى الاكبر لكل قيمة الحقل Tpe الترقيم يكون يبدأ من 1
اذا وصل الحقل Grp الى خمس سجلات أو اكثر يحملون نفس القيمة  مع الحقل Tpe  بقيمة ‘A’
فالقيمة المطلوبة من الحقل Num هي الترقيم من 1 إلى 5
والقيمة المطلوبة بالنسبة للحقل Pge هي الترقيم لكن رقم يتكرر حسب عدد سجلات الحقل Numعلى ان لا تتجاوز 5 سجلات
ملاحظة اذا كان عدد سجلات الحقل Grp اكثر من 5 سجلات لهم نفس القيمة ولنفترض ان عدد السجلات 13 سجل بنفس القيمة
في هذه الحالة الحقل Num  يبدأ الترقيم من 1 الى 5 ثم من 1 الى 5 ثم من 1 الى 3
والحقل Pge  يأخذ القيمة 1 مكررة 5 مرات والقيمة 2 مكررة 5 مرات والقيمة 3 مكررة 3 مرات وهكذا
ونفس الشيئ بالنسة لقيمة الحقل Tpe  بقيمة ‘B’
وهذا مثال مرفق لوضع الكود المناسب لهذه العملية مع صورة توضيحية للمطلوب
اعرف بأنه لا يمكن ان اوفي حقكم على هذه المساعدات القيمة التي لا تثمين لها من دون الدعاء لصاحبها وكل ما اقوله او افعله من اجلها لا يكفي لذا اسأل الله العلي القدير وبجاه سيد المخلوقات سيدنا محمد عليه أذكى الصلاة والسلام وعلى آله وصحبه الكرام وبجاه هذا اليوم العظيم يوم الجمعة ان يرزق كل من ساعدناسواء من قريب او من بعيد ماديا او معنويا اوحتى بكلمة طيبة الحسنات ومحو السيئات وان يغفر له ولمن يحب ولجميع المسلمين خطاياه جميعا ويشفيه ويعافيه ويشفي والديه ويعافيهم آمين آمــين آمين.
بارك الله فيكم جميعا اعضاء منتدانا العظيم القيِّم بأعضائه مشرفين وغيرهم جزاكم الله عنا كل خير.
[/size]
الرد
#8
(06-08-2019, 02:14 PM)merouane كتب : أضف إلى برنامجك TABSquery و سمها AQuery1

الكود الجديد
PHP كود :
var
  i: integer;
begin
  DM
.AQuery1.Close;
  DM.AQuery1.SQL.Text := 'select distinct grp, tpe from dequipbp;';
  DM.AQuery1.Open;
  DM.AQuery1.DisableControls;
  DM.AQuery1.First;
  DM.Tab1.DisableControls;
  while not DM.AQuery1.Eof do
  begin
    DM
.Tab1.Filter := 'Grp=' + quotedStr(DM.AQuery1grp.AsString) + ' and Tpe=' +
      quotedStr(DM.AQuery1tpe.AsString);
    DM.Tab1.Filtered := True;
    DM.Tab1.First;
    i := 1;
    while not DM.Tab1.Eof do
    begin
      DM
.Tab1.Edit;
      if i < 6 then
      begin
        DM
.Tab1my.Value := inttostr(i);
        i := i + 1;
      end
      
else
      begin
        DM
.Tab1my.Value := inttostr(1);
        i := 2;
      end;
      DM.Tab1.Post;
      DM.Tab1.Next;
    end;
    DM.AQuery1.Next;
  end;
  DM.Tab1.Filtered := false;
  DM.Tab1.EnableControls;
  DM.Tab1.IndexName := 'Grp';
  DM.AQuery1.Close;
end; 

بارك الله فيك اخي لقد فهمت ما تقصده من Tab1my
العملية الى حد الان 100/100 بالنسبة للحقل Cln
والان جاء دور الحقل Pge و Lgn
سارفق لك صورة بالنتيجة المطلوبة بالنسبة للحقلين
بارك الله فيكم

هذه هي الصورة المرفقة للتوضيح
[attachment=4165]
بارك الله فيكم

(11-11-2019, 09:40 PM)medreg كتب :
(06-08-2019, 02:14 PM)merouane كتب : أضف إلى برنامجك TABSquery و سمها AQuery1

الكود الجديد
PHP كود :
var
  i: integer;
begin
  DM
.AQuery1.Close;
  DM.AQuery1.SQL.Text := 'select distinct grp, tpe from dequipbp;';
  DM.AQuery1.Open;
  DM.AQuery1.DisableControls;
  DM.AQuery1.First;
  DM.Tab1.DisableControls;
  while not DM.AQuery1.Eof do
  begin
    DM
.Tab1.Filter := 'Grp=' + quotedStr(DM.AQuery1grp.AsString) + ' and Tpe=' +
      quotedStr(DM.AQuery1tpe.AsString);
    DM.Tab1.Filtered := True;
    DM.Tab1.First;
    i := 1;
    while not DM.Tab1.Eof do
    begin
      DM
.Tab1.Edit;
      if i < 6 then
      begin
        DM
.Tab1my.Value := inttostr(i);
        i := i + 1;
      end
      
else
      begin
        DM
.Tab1my.Value := inttostr(1);
        i := 2;
      end;
      DM.Tab1.Post;
      DM.Tab1.Next;
    end;
    DM.AQuery1.Next;
  end;
  DM.Tab1.Filtered := false;
  DM.Tab1.EnableControls;
  DM.Tab1.IndexName := 'Grp';
  DM.AQuery1.Close;
end; 

بارك الله فيك اخي لقد فهمت ما تقصده من Tab1my
العملية الى حد الان 100/100 بالنسبة للحقل Cln
والان جاء دور الحقل Pge و Lgn
سارفق لك صورة بالنتيجة المطلوبة بالنسبة للحقلين
بارك الله فيكم

هذه هي الصورة المرفقة للتوضيح

بارك الله فيكم
ملاحظة
اثناء عملية الحجز لاحظت انه عندما يكون التكرار للحقل Opt بنفس Tpe  لايعمل بالشكل المطلوب او ربما لم الفت انتباهكم مسبقا
فهناك في بعض الأحيان يكون التكرار والإختلاف يكون فقط في الحقل Cat
حاولت اضافة الحقل Opt في التعليمة SQL مع الحقل Grp, Opt, Tpe
لكن لم يعمل بشكل جيد إذا كيف لي ان اجعله يعط النتيجة حسب الصور ة المرفقة
[attachment=4166]
الرد
#9
السلام عليكم لقد اضفت الى التعليمة السابقة حقلان
الحقل Opt و Cat
لكن لم يعمل بالشكل المطلوب
هذا هو التعديل
كود :
var   i: integer; begin   DM.AQuery1.Close;   DM.AQuery1.SQL.Text := 'select distinct grp, opt, cat, tpe from dequipbp;';   DM.AQuery1.Open;   DM.AQuery1.DisableControls;   DM.AQuery1.First;   DM.Tab1.DisableControls;   while not DM.AQuery1.Eof do   begin     DM.Tab1.Filter := 'Grp=' + quotedStr(DM.AQuery1grp.AsString)+ ' and opt=' +       quotedStr(DM.AQuery1Opt.AsString)+ ' and cat=' +       quotedStr(DM.AQuery1Cat.AsString) + ' and Tpe=' +       quotedStr(DM.AQuery1tpe.AsString);     DM.Tab1.Filtered := True;     DM.Tab1.First;     i := 1;     while not DM.Tab1.Eof do     begin       DM.Tab1.Edit;       if i < 6 then       begin         DM.Tab1my.Value := inttostr(i);         i := i + 1;       end       else       begin         DM.Tab1my.Value := inttostr(1);         i := 2;       end;       DM.Tab1.Post;       DM.Tab1.Next;     end;     DM.AQuery1.Next;   end;   DM.Tab1.Filtered := false;   DM.Tab1.EnableControls;   DM.Tab1.IndexName := 'Grp';   DM.AQuery1.Close; end;
الرد


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


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