delphi4arab منتديات دلفي للعرب

نسخة كاملة : كيف التحكم في عناصر جملة SQL؟
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم
أريد التحكم في عناصر جملة الـ SQL يدويا بمعنى عندي جملة Select Name,BirthDay,Mark from Table order by Name,BirthDay,Mark
أريد مثلا وضع في الفورم عدة CheckBox بهم عناصر الـ (order( Name,BirthDay,Mark أنا الذي يتحكم على أي أساس يتم الترتيب على حساب الإسم أولا أو على حساب تاريخ الميلاد ثانيا وعند إزالة التحديد وإعادة التحديد يصبح العنصر المختار هو الأخير في قائمة الـ order
وعليكم السلام ورحمة الله وبركاته
إليك الكود التالي قم بتجريبه 
ملاحظة : عليك إعطاء كل checkbox.tag قيمة حسب الجدول aFieldName

 
كود :
unit Unit2; interface uses   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Grids,   Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB, Vcl.Mask, Vcl.DBCtrls; type   TForm2 = class(TForm)     Query: TADOQuery;     NameCheckBox: TCheckBox;     BirthDayCheckBox: TCheckBox;     MarkCheckBox: TCheckBox;     procedure NameCheckBoxClick(Sender: TObject);   private     { Déclarations privées }   public     { Déclarations publiques }     aOrder: array of string;     function GenerateSQL: string;     procedure AddFieldToOrder(FieldName: string);     procedure RemoveFieldFromOrder(FieldName: string);   end; var   Form2: TForm2; implementation {$R *.dfm} procedure TForm2.NameCheckBoxClick(Sender: TObject); const    aFieldName: array[1..3] of string = ('Name', 'BirthDay', 'Mark'); var   Order: string; begin   Query.Active:= False;   if TCheckBox(Sender).Checked then     AddFieldToOrder(aFieldName[TCheckBox(Sender).Tag])   else RemoveFieldFromOrder(aFieldName[TCheckBox(Sender).Tag]);   Query.SQL.Text:= GenerateSQL;   Query.Active:= True; end; function TForm2.GenerateSQL: string; var   Order: string;   I: Integer; begin   Result:= 'SELECT * FROM Table ';   if Length(aOrder) > 0 then   begin     Result:= Result + 'ORDER BY ' + aOrder[0];     for I:= 1 to High(aOrder) do        Result:= Result + ', ' + aOrder[I];   end; end; procedure TForm2.AddFieldToOrder(FieldName: string); var   I: Integer; begin   I:= 0;   begin     while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do       I:= I + 1;   end;   if I >= Length(aOrder) then   begin     SetLength(aOrder, I + 1);     aOrder[I]:= FieldName;   end; end; procedure TForm2.RemoveFieldFromOrder(FieldName: string); var   I: Integer; begin   I:= 0;   while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do     I:= I + 1;   if I <= High(aOrder) then     Delete(aOrder, I, 1); end; end.
(04-03-2020, 12:38 PM)ghostdz كتب : [ -> ]وعليكم السلام ورحمة الله وبركاته
إليك الكود التالي قم بتجريبه 
ملاحظة : عليك إعطاء كل checkbox.tag قيمة حسب الجدول aFieldName

 
كود :
unit Unit2; interface uses   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Grids,   Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB, Vcl.Mask, Vcl.DBCtrls; type   TForm2 = class(TForm)     Query: TADOQuery;     NameCheckBox: TCheckBox;     BirthDayCheckBox: TCheckBox;     MarkCheckBox: TCheckBox;     procedure NameCheckBoxClick(Sender: TObject);   private     { Déclarations privées }   public     { Déclarations publiques }     aOrder: array of string;     function GenerateSQL: string;     procedure AddFieldToOrder(FieldName: string);     procedure RemoveFieldFromOrder(FieldName: string);   end; var   Form2: TForm2; implementation {$R *.dfm} procedure TForm2.NameCheckBoxClick(Sender: TObject); const    aFieldName: array[1..3] of string = ('Name', 'BirthDay', 'Mark'); var   Order: string; begin   Query.Active:= False;   if TCheckBox(Sender).Checked then     AddFieldToOrder(aFieldName[TCheckBox(Sender).Tag])   else RemoveFieldFromOrder(aFieldName[TCheckBox(Sender).Tag]);   Query.SQL.Text:= GenerateSQL;   Query.Active:= True; end; function TForm2.GenerateSQL: string; var   Order: string;   I: Integer; begin   Result:= 'SELECT * FROM Table ';   if Length(aOrder) > 0 then   begin     Result:= Result + 'ORDER BY ' + aOrder[0];     for I:= 1 to High(aOrder) do        Result:= Result + ', ' + aOrder[I];   end; end; procedure TForm2.AddFieldToOrder(FieldName: string); var   I: Integer; begin   I:= 0;   begin     while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do       I:= I + 1;   end;   if I >= Length(aOrder) then   begin     SetLength(aOrder, I + 1);     aOrder[I]:= FieldName;   end; end; procedure TForm2.RemoveFieldFromOrder(FieldName: string); var   I: Integer; begin   I:= 0;   while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do     I:= I + 1;   if I <= High(aOrder) then     Delete(aOrder, I, 1); end; end.

جزاك الله خير ولكن عمل معي في الترتيب بالإسم فقط ولم يعمل مع تاريخ الميلاد و العلامه لا أدري أين الخلل
وهل ممكن معرفة الترتيب على أي checkbox أولا ؟هل يمكن إضافة Label على الفورم بجانب كل checkbox ليبين ترتيبه ،هل تم الترتيب به في المرتبة الأولى أو المرتبة الثانية أو الثالثة؟

هل لك قناة تعليمية أخي الكريم؟
أعذرني البرنامج يعمل بكل كفاءة جزاك الله خيرا 
هل ممكن معرفة الترتيب على أي checkbox أولا ؟هل يمكن إضافة Label على الفورم بجانب كل checkbox ليبين ترتيبه ،هل تم الترتيب به في المرتبة الأولى أو المرتبة الثانية أو الثالثة؟

هل لك قناة تعليمية أخي الكريم؟
(05-03-2020, 12:42 AM)ALG2009 كتب : [ -> ]أعذرني البرنامج يعمل بكل كفاءة جزاك الله خيرا                                                                                                                                                           هل ممكن معرفة الترتيب على أي checkbox أولا ؟هل يمكن إضافة Label على الفورم بجانب كل checkbox ليبين ترتيبه ،هل تم الترتيب به في المرتبة الأولى أو المرتبة الثانية أو الثالثة؟

هل لك قناة تعليمية أخي الكريم؟

إليك الكود التالي حيث قمت ببعض التغييرات على الكود السابق وأضفت فيه عرض الترتيب

لا أملك قناة تعليمية  Big Grin

كود :
unit Unit2; interface uses   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Grids,   Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB, Vcl.Mask, Vcl.DBCtrls; const   aFieldName: array[1..3] of string = ('Name', 'BirthDay', 'Mark'); type   TForm2 = class(TForm)     Query: TADOQuery;     NameCheckBox: TCheckBox;     BirthDayCheckBox: TCheckBox;     MarkCheckBox: TCheckBox;     NameLabel: TLabel;     BirthdayLabel: TLabel;     MarkLabel: TLabel;     procedure NameCheckBoxClick(Sender: TObject);   private     { Déclarations privées }   public     { Déclarations publiques }     aOrder: array of string;     function GenerateSQL: string;     procedure AddFieldToOrder(FieldName: string);     procedure RemoveFieldFromOrder(FieldName: string);     function GetFieldOrderPos(FieldName: string): Integer;     procedure ShowFieldOrder;   end; var   Form2: TForm2; implementation {$R *.dfm} procedure TForm2.NameCheckBoxClick(Sender: TObject); var   Order: string; begin   Query.Active:= False;   if TCheckBox(Sender).Checked then     AddFieldToOrder(aFieldName[TCheckBox(Sender).Tag])   else RemoveFieldFromOrder(aFieldName[TCheckBox(Sender).Tag]);   Query.SQL.Text:= GenerateSQL;   Query.Active:= True;   ShowFieldOrder; end; function TForm2.GenerateSQL: string; var   Order: string;   I: Integer; begin   Result:= 'SELECT * FROM Table ';   if Length(aOrder) > 0 then   begin     Result:= Result + 'ORDER BY ' + aOrder[0];     for I:= 1 to High(aOrder) do       Result:= Result + ', ' + aOrder[I];   end; end; procedure TForm2.AddFieldToOrder(FieldName: string); var   I: Integer; begin   I:= 0;   begin     while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do       I:= I + 1;   end;   if I >= Length(aOrder) then   begin     SetLength(aOrder, I + 1);     aOrder[I]:= FieldName;   end; end; procedure TForm2.RemoveFieldFromOrder(FieldName: string); var   I: Integer; begin   I:= 0;   while (I <= High(aOrder)) and (UpperCase(aOrder[I]) <> UpperCase(FieldName)) do     I:= I + 1;   if I <= High(aOrder) then     Delete(aOrder, I, 1); end; function TForm2.GetFieldOrderPos(FieldName: string): Integer; var   I: Integer; begin   Result:= 0;   for I := 0 to High(aOrder) do     if UpperCase(aOrder[I]) = UpperCase(FieldName) then       Result:= I + 1; end; procedure TForm2.ShowFieldOrder; begin   NameLabel.Caption:= IntToStr(GetFieldOrderPos(aFieldName[1]));   BirthdayLabel.Caption:= IntToStr(GetFieldOrderPos(aFieldName[2]));   MarkLabel.Caption:= IntToStr(GetFieldOrderPos(aFieldName[3])); end; end.
الله يرضى عليك ويزيدك من علمه


(05-03-2020, 11:01 AM)ghostdz كتب : [ -> ]لا أملك قناة تعليمية  Big Grin 


عليك بوضع بعض الدروس كأفكار برمجية  Blush

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

بالمناسبة 

PHP كود :
(aFieldName[TCheckBox(Sender).Tag 

ماذا يقصد بالسندر Sender يمرر كباراميتر دائما في الاجراءات هل من أمثله لفهمه
السلام عليكم

بالنسبة للـ Sender

Parent, Sender,Owner, ControlCount, ComponentCount


هذا حل اخر باستخدام TStringList لم اجرب كثيرا عليه يمكنك تعديله بما يناسبك
PHP كود :
unit Unit1;

interface

uses
  Windows
, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 
= class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    OrderByClause: TStringList;
    S: string;
    function BuildSql(ASQl: string): string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function 
TForm1.BuildSql(ASQl: string): string;
var
  I: Integer;
begin
  
if OrderByClause.Count = 0 then
  begin
    
Exit;
    S := '';
  end;
  S := 'order by ';
  I := 0;
  while OrderByClause.Count - 1 <> I  do
  begin
    S 
:= S + OrderByClause[I] + ', ';
    Inc(I);
  end;
  S := S + OrderByClause[OrderByClause.Count - 1];
  Result := ASQl + ' ' + S;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1
.Caption := BuildSql('select from table');
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
var
  CheckBoxComponent: TCheckBox;
begin
  CheckBoxComponent 
:= TCheckBox(Sender);
  if CheckBoxComponent.Checked then
    OrderByClause
.Add(CheckBoxComponent.Caption)
  else
    OrderByClause.Delete(OrderByClause.IndexOf(CheckBoxComponent.Caption));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OrderByClause 
:= TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  OrderByClause
.Free;
end;

end. 
(05-03-2020, 06:18 PM)S.FATEH كتب : [ -> ]السلام عليكم

بالنسبة للـ Sender

Parent, Sender,Owner, ControlCount, ComponentCount


هذا حل اخر باستخدام TStringList لم اجرب كثيرا عليه يمكنك تعديله بما يناسبك
PHP كود :
unit Unit1;

interface

uses
  Windows
, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 
= class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    OrderByClause: TStringList;
    S: string;
    function BuildSql(ASQl: string): string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function 
TForm1.BuildSql(ASQl: string): string;
var
  I: Integer;
begin
  
if OrderByClause.Count = 0 then
  begin
    
Exit;
    S := '';
  end;
  S := 'order by ';
  I := 0;
  while OrderByClause.Count - 1 <> I  do
  begin
    S 
:= S + OrderByClause[I] + ', ';
    Inc(I);
  end;
  S := S + OrderByClause[OrderByClause.Count - 1];
  Result := ASQl + ' ' + S;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1
.Caption := BuildSql('select from table');
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
var
  CheckBoxComponent: TCheckBox;
begin
  CheckBoxComponent 
:= TCheckBox(Sender);
  if CheckBoxComponent.Checked then
    OrderByClause
.Add(CheckBoxComponent.Caption)
  else
    OrderByClause.Delete(OrderByClause.IndexOf(CheckBoxComponent.Caption));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OrderByClause 
:= TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  OrderByClause
.Free;
end;

end. 

جزاك الله خير
جاري التجربه