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

جربت هذا الكود لم يعمل مع العلم  أني أضفت ExecSQL ولكن يعطيني خطأ لو أضفتها ما المشكلة

كود :
procedure TfrmAdd.btnAddClick(Sender: TObject);
var studentId,STUDENTNumber : integer;
    lessonName :string;

begin

          STUDENTNumber := ('Select STUDENTNumber from student where STUDENTNumber = StrToInt(:edit1.text)');
          if ((STUDENTNumber =null )then
            Begin
             Dmdata.qryadd.SQL.Text:='INSERT INTO Student (FName,LName,BDay,PBirth)'+
             'VALUES (:fname,:LName,:Bday,:PBirth)' ;
             Dmdata.qryadd.Params.ParamByName('FNAME').AsString:= edtFName.Text;
             Dmdata.qryadd.Params.ParamByName('LNAME').AsString:= edtLName.Text;
             Dmdata.qryadd.params.ParamByName('BDay').AsDate:= StrToDate(edtBDay.Text);
             Dmdata.qryadd.Params.ParamByName('PBirth').AsString:= edtPBirth.Text;
             studentId :=  (SELECT GEN_ID( GEN_studentID, 0 ) FROM RDB$DATABASE);
            End  ;

        lessonName := ('Select lessonName from lessons where lessonName = :combox.text');
          if ((lessonName =null )then
            Begin
             Dmdata.qryadd.SQL.Text:='Insert into lessons (lessonName) values (:lessonName)';
             Dmdata.qryadd.Params.ParamByName('lessonName').AsString:= ComboBox1.Text;
             LessonId :=  (SELECT GEN_ID( GEN_LESSONSID, 0 ) FROM RDB$DATABASE);
            end;

        Dmdata.qryadd.SQL.Text:='Insert into Studlessons (studentId,lessonId) values (:studentId,:lessonId)';


end;

وكذلك عندما أريد إختصار الكود بإضافة with Dmdata.qryadd Do يعطيني خطأ في سطر البارميتر ؟

أريد أن أكتب الكود كمحترف هل هذه الطريقة صحيحة أعرف أنه يمكن كتابة الكود بأكثر من طريقة هل هذه الطريقة جيدة ؟
الرد
#2
السلام عليكم
اذا كان الاستعلام يعيد نتائج مثلا كـ select استخدم Open بدل من ExecSQL
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#3
وعليكم السلام ورحمة الله تعالى  وبركاته

ما هو نص الخطأ الذي تحصلت عليه ، حسب علمي ExecSql تعمل عادي

كود :
STUDENTNumber := ('Select STUDENTNumber from student where STUDENTNumber = StrToInt(:edit1.text)');

studentId :=  (SELECT GEN_ID( GEN_studentID, 0 ) FROM RDB$DATABASE);

lessonName := ('Select lessonName from lessons where lessonName = :combox.text');

LessonId :=  (SELECT GEN_ID( GEN_LESSONSID, 0 ) FROM RDB$DATABASE);

لكن هناك ملاحظة بالنسبة للكود الذي وضعته ، حيث حسب الكود فإنك لا تقوم بتنفيذ الإستعلام بل تحاول وضع الإستعلام في المتغير من نوع integer و string وهذا خطأ 
حيث بإمكانك كتابة function تعطيك القيم التي تريدها مثلا GetStudentNumber, GetStudentId, GetLessonName, GetLessonId
الرد
#4
(05-08-2020, 08:02 AM)S.FATEH كتب : السلام عليكم
اذا كان الاستعلام يعيد نتائج مثلا كـ select استخدم Open بدل من ExecSQL

و لكن نحن بصدد الكتابة في الجدول قلت دعني أجرب Open نفس الشيء لا يتعرف عليها فإنتبهت أنها تكون بعد Qryadd.ExecSQL 
بارك الله فيك أحيانا نقع في أخطأ ما كانت لتحصل  Blush

(05-08-2020, 09:44 AM)ghostdz كتب : وعليكم السلام ورحمة الله تعالى  وبركاته

ما هو نص الخطأ الذي تحصلت عليه ، حسب علمي ExecSql تعمل عادي

نسيت أن أضع قبلها Qryadd.ExecSQL  Blush

كود :
STUDENTNumber := ('Select STUDENTNumber from student where STUDENTNumber = StrToInt(:edit1.text)');

studentId :=  (SELECT GEN_ID( GEN_studentID, 0 ) FROM RDB$DATABASE);

lessonName := ('Select lessonName from lessons where lessonName = :combox.text');

LessonId :=  (SELECT GEN_ID( GEN_LESSONSID, 0 ) FROM RDB$DATABASE);

لكن هناك ملاحظة بالنسبة للكود الذي وضعته ، حيث حسب الكود فإنك لا تقوم بتنفيذ الإستعلام بل تحاول وضع الإستعلام في المتغير من نوع integer و string وهذا خطأ 
حيث بإمكانك كتابة function تعطيك القيم التي تريدها مثلا GetStudentNumber, GetStudentId, GetLessonName, GetLessonId

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

والأسطر التي أشرت إليها هي المسببة في الخطأ 

عدلت الكود ولكن لا يقوم بالإدخال ويعطيني 0 في StudentId كما هو موضح في الصورة
[صورة: 821799264.png]


ولم أعرف أن أجلب رقم التلميذ أول سطر في الكود لأقارنه إن كان موجود من قبل أم لا
الرد
#5
لم أقصد function  في قاعدة البيانات بل في الدلفي حيث يمكنك وضع  أربعة TQuery في الوحدة التي تحوي DmData  و قم بوضع  الإستعلام في Sql الخاص بها  حسب التالي
StudentNumberQuery  :
Select STUDENTNumber from student where STUDENTNumber = :StudentNumber

StudentIdQuery :
SELECT GEN_ID( GEN_studentID, 0 ) FROM RDB$DATABASE

LessonNameQuery :
Select lessonName from lessons where lessonName = :LessonName

LessonIdQuery :
SELECT GEN_ID( GEN_LESSONSID, 0 ) FROM RDB$DATABASE

ثم قم بإنشاء الدوال كما الكود التالي في DmData 


كود :
Function GetStudentNumber(StudentNumber: Integer): Integer;
Begin
   StudentNumberQuery.Active:= False;
   StudentNumberQuery.Params.ParamByName('StudentNumber').AsInteger:= StudentNumber;
StudentNumberQuery.Active:= True;
Result:= StudentNumberQuery.FieldByName(‘StudentNumber’).AsInteger;
End;

Function GetStudentId: Integer;
Begin
StudentIdQuery.Active:= False;
StudentIdQuery.Active:= True;
Result:= StudentIdQuery.Fields[0].AsInteger;
End;

Function GetLessonName(LessonName: string): string;
Begin
   LessonNameQuery.Active:= False;
   LessonNameQuery.Params.ParamByName('LessonName').AsString:= LessonName;
LessonNameQuery.Active:= True;
Result:= LessonNameQuery.FieldByName(‘LessonName’).AsString;
End;

Function  GetLessonId: Integer;
Begin
LessonIdQuery.Active:= False;
LessonIdQuery.Active:= True;
Result:= LessonIdQuery.Fields[0].AsInteger;
End;

وفي حالة إستدعاء الدالة هو إستخدام الكود التالي
كود :
STUDENTNumber := GetStudentNumber(StrToInt(edit1.text));

studentId :=  GetStudentId;

lessonName := GetLessonName(combox.text);

LessonId :=  GetLessonId;
[-] كل من 1 user says قال شكرا ل ghostdz على المشاركة المفيدة
  • ALG2009
الرد
#6
بارك الله فيك أخي ghostdz

من مدة وأنا أحاول مع هذا الكود حيث قررت أن أضيف إجراء في قاعدة البيانات ليتأكد من تكرار الإسم واللقب وتاريخ الميلاد في قاعدة  البيانات ولكن لا أدري لماذا هناك خطأ إستعملت Case و Exist ولكن دون فائدة
من بعض المحاولات
كود :
create procedure aa(
v1 varchar(20),
V2 varchar(20),
d date)
returns(vv integer)
AS
BEGIN
  case when SELECT  1 FROM table1  where FName=:v1 and LName=:v2 and BDay=:d )) THEN
  result = 1 -- or true
  END
end

الطريقة الثانية
كود :
create procedure aa(
v1 varchar(20)
V2 varchar(20),
d
date)
returns(vv integer)
begin

  if (exists(select fname,lfname,bday from STUDENT  where fname=:v1 and lfname=:v2 and bday=:d) )then 
  result = 1 -- or true
end
end

الطريقة الثالثة
كود :
select fname,lfname,bday from STUDENT

where not exists (select fname,lfname,bday from STUDENT  where fname=:v and lfname=:g and bday=:H)end

كل الإجراءات لا تعمل لا أدري أين الخطأ
الرد


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


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